| Index: chromecast/media/cma/backend/media_pipeline_backend_default.cc
|
| diff --git a/chromecast/media/cma/backend/media_pipeline_backend_default.cc b/chromecast/media/cma/backend/media_pipeline_backend_default.cc
|
| index 498c5be257b58ad781fdf6a94cc97ae6d8e0cc80..bb0cc1e70ec713b669056cf95a2ae7c862bbb8f0 100644
|
| --- a/chromecast/media/cma/backend/media_pipeline_backend_default.cc
|
| +++ b/chromecast/media/cma/backend/media_pipeline_backend_default.cc
|
| @@ -4,35 +4,145 @@
|
|
|
| #include "chromecast/media/cma/backend/media_pipeline_backend_default.h"
|
|
|
| -#include "chromecast/media/cma/backend/audio_pipeline_device_default.h"
|
| -#include "chromecast/media/cma/backend/media_clock_device_default.h"
|
| -#include "chromecast/media/cma/backend/video_pipeline_device_default.h"
|
| +#include "chromecast/public/media/cast_decoder_buffer.h"
|
|
|
| namespace chromecast {
|
| namespace media {
|
|
|
| -MediaPipelineBackendDefault::MediaPipelineBackendDefault(
|
| - const MediaPipelineDeviceParams& params)
|
| - : params_(params) {}
|
| +class MediaPipelineBackendDefault::AudioDecoderDefault
|
| + : public MediaPipelineBackend::AudioDecoder {
|
| + public:
|
| + AudioDecoderDefault() : delegate_(nullptr) {}
|
| + ~AudioDecoderDefault() override {}
|
|
|
| -MediaPipelineBackendDefault::~MediaPipelineBackendDefault() {}
|
| + void SetDelegate(MediaPipelineBackend::Delegate* delegate) {
|
| + delegate_ = delegate;
|
| + }
|
|
|
| -MediaClockDevice* MediaPipelineBackendDefault::GetClock() {
|
| - if (!clock_)
|
| - clock_.reset(new MediaClockDeviceDefault());
|
| - return clock_.get();
|
| + // MediaPipelineBackend::AudioDecoder implementation:
|
| + BufferStatus PushBuffer(DecryptContext* decrypt_context,
|
| + CastDecoderBuffer* buffer) override {
|
| + if (buffer->end_of_stream())
|
| + delegate_->OnEndOfStream(this);
|
| + return MediaPipelineBackend::kBufferSuccess;
|
| + }
|
| +
|
| + void GetStatistics(Statistics* statistics) override {}
|
| +
|
| + bool SetConfig(const AudioConfig& config) override { return true; }
|
| +
|
| + bool SetVolume(float multiplier) override { return true; }
|
| +
|
| + RenderingDelay GetRenderingDelay() override { return RenderingDelay(); }
|
| +
|
| + private:
|
| + MediaPipelineBackend::Delegate* delegate_;
|
| +
|
| + DISALLOW_COPY_AND_ASSIGN(AudioDecoderDefault);
|
| +};
|
| +
|
| +class MediaPipelineBackendDefault::VideoDecoderDefault
|
| + : public MediaPipelineBackend::VideoDecoder {
|
| + public:
|
| + VideoDecoderDefault() : delegate_(nullptr) {}
|
| + ~VideoDecoderDefault() override {}
|
| +
|
| + void SetDelegate(MediaPipelineBackend::Delegate* delegate) {
|
| + delegate_ = delegate;
|
| + }
|
| +
|
| + // MediaPipelineBackend::VideoDecoder implementation:
|
| + BufferStatus PushBuffer(DecryptContext* decrypt_context,
|
| + CastDecoderBuffer* buffer) override {
|
| + if (buffer->end_of_stream())
|
| + delegate_->OnEndOfStream(this);
|
| + return MediaPipelineBackend::kBufferSuccess;
|
| + }
|
| +
|
| + void GetStatistics(Statistics* statistics) override {}
|
| +
|
| + bool SetConfig(const VideoConfig& config) override { return true; }
|
| +
|
| + private:
|
| + MediaPipelineBackend::Delegate* delegate_;
|
| +
|
| + DISALLOW_COPY_AND_ASSIGN(VideoDecoderDefault);
|
| +};
|
| +
|
| +MediaPipelineBackendDefault::MediaPipelineBackendDefault()
|
| + : running_(false), rate_(1.0f) {
|
| +}
|
| +
|
| +MediaPipelineBackendDefault::~MediaPipelineBackendDefault() {
|
| }
|
|
|
| -AudioPipelineDevice* MediaPipelineBackendDefault::GetAudio() {
|
| - if (!audio_)
|
| - audio_.reset(new AudioPipelineDeviceDefault(params_, GetClock()));
|
| - return audio_.get();
|
| +MediaPipelineBackend::AudioDecoder*
|
| +MediaPipelineBackendDefault::CreateAudioDecoder() {
|
| + DCHECK(!audio_decoder_);
|
| + audio_decoder_.reset(new AudioDecoderDefault());
|
| + return audio_decoder_.get();
|
| +}
|
| +
|
| +MediaPipelineBackend::VideoDecoder*
|
| +MediaPipelineBackendDefault::CreateVideoDecoder() {
|
| + DCHECK(!video_decoder_);
|
| + video_decoder_.reset(new VideoDecoderDefault());
|
| + return video_decoder_.get();
|
| +}
|
| +
|
| +bool MediaPipelineBackendDefault::Initialize(Delegate* delegate) {
|
| + DCHECK(delegate);
|
| + if (audio_decoder_)
|
| + audio_decoder_->SetDelegate(delegate);
|
| + if (video_decoder_)
|
| + video_decoder_->SetDelegate(delegate);
|
| + return true;
|
| +}
|
| +
|
| +bool MediaPipelineBackendDefault::Start(int64_t start_pts) {
|
| + DCHECK(!running_);
|
| + start_pts_ = base::TimeDelta::FromMicroseconds(start_pts);
|
| + start_clock_ = base::TimeTicks::Now();
|
| + running_ = true;
|
| + return true;
|
| +}
|
| +
|
| +bool MediaPipelineBackendDefault::Stop() {
|
| + start_pts_ = base::TimeDelta::FromMicroseconds(GetCurrentPts());
|
| + running_ = false;
|
| + return true;
|
| +}
|
| +
|
| +bool MediaPipelineBackendDefault::Pause() {
|
| + DCHECK(running_);
|
| + start_pts_ = base::TimeDelta::FromMicroseconds(GetCurrentPts());
|
| + running_ = false;
|
| + return true;
|
| +}
|
| +
|
| +bool MediaPipelineBackendDefault::Resume() {
|
| + DCHECK(!running_);
|
| + running_ = true;
|
| + start_clock_ = base::TimeTicks::Now();
|
| + return true;
|
| +}
|
| +
|
| +int64_t MediaPipelineBackendDefault::GetCurrentPts() {
|
| + if (!running_)
|
| + return start_pts_.InMicroseconds();
|
| +
|
| + base::TimeTicks now = base::TimeTicks::Now();
|
| + base::TimeDelta interpolated_media_time =
|
| + start_pts_ + (now - start_clock_) * rate_;
|
| + return interpolated_media_time.InMicroseconds();
|
| }
|
|
|
| -VideoPipelineDevice* MediaPipelineBackendDefault::GetVideo() {
|
| - if (!video_)
|
| - video_.reset(new VideoPipelineDeviceDefault(params_, GetClock()));
|
| - return video_.get();
|
| +bool MediaPipelineBackendDefault::SetPlaybackRate(float rate) {
|
| + DCHECK_GT(rate, 0.0f);
|
| + start_pts_ = base::TimeDelta::FromMicroseconds(GetCurrentPts());
|
| + start_clock_ = base::TimeTicks::Now();
|
| + rate_ = rate;
|
| + return true;
|
| }
|
|
|
| } // namespace media
|
|
|