Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "chromecast/media/cma/backend/media_pipeline_backend_default.h" | 5 #include "chromecast/media/cma/backend/media_pipeline_backend_default.h" |
| 6 | 6 |
| 7 #include "chromecast/media/cma/backend/audio_pipeline_device_default.h" | 7 #include "chromecast/public/media/cast_decoder_buffer.h" |
| 8 #include "chromecast/media/cma/backend/media_clock_device_default.h" | |
| 9 #include "chromecast/media/cma/backend/video_pipeline_device_default.h" | |
| 10 | 8 |
| 11 namespace chromecast { | 9 namespace chromecast { |
| 12 namespace media { | 10 namespace media { |
| 13 | 11 |
| 14 MediaPipelineBackendDefault::MediaPipelineBackendDefault( | 12 class MediaPipelineBackendDefault::AudioDecoderDefault |
| 15 const MediaPipelineDeviceParams& params) | 13 : public MediaPipelineBackend::AudioDecoder { |
| 16 : params_(params) {} | 14 public: |
| 15 AudioDecoderDefault() : delegate_(nullptr) {} | |
| 16 ~AudioDecoderDefault() override {} | |
| 17 | 17 |
| 18 MediaPipelineBackendDefault::~MediaPipelineBackendDefault() {} | 18 void SetDelegate(MediaPipelineBackend::Delegate* delegate) { |
| 19 delegate_ = delegate; | |
| 20 } | |
| 19 | 21 |
| 20 MediaClockDevice* MediaPipelineBackendDefault::GetClock() { | 22 // MediaPipelineBackend::AudioDecoder implementation: |
| 21 if (!clock_) | 23 BufferStatus PushBuffer(DecryptContext* decrypt_context, |
| 22 clock_.reset(new MediaClockDeviceDefault()); | 24 CastDecoderBuffer* buffer) override { |
| 23 return clock_.get(); | 25 if (buffer->end_of_stream()) |
| 26 delegate_->OnEndOfStream(this); | |
| 27 return MediaPipelineBackend::kBufferSuccess; | |
| 28 } | |
| 29 | |
| 30 void GetStatistics(Statistics* statistics) override {} | |
| 31 | |
| 32 bool SetConfig(const AudioConfig& config) override { return true; } | |
| 33 | |
| 34 bool SetVolume(float multiplier) override { return true; } | |
| 35 | |
| 36 RenderingDelay GetRenderingDelay() override { return RenderingDelay(); } | |
| 37 | |
| 38 private: | |
| 39 MediaPipelineBackend::Delegate* delegate_; | |
| 40 | |
| 41 DISALLOW_COPY_AND_ASSIGN(AudioDecoderDefault); | |
| 42 }; | |
| 43 | |
| 44 class MediaPipelineBackendDefault::VideoDecoderDefault | |
| 45 : public MediaPipelineBackend::VideoDecoder { | |
| 46 public: | |
| 47 VideoDecoderDefault() : delegate_(nullptr) {} | |
| 48 ~VideoDecoderDefault() override {} | |
| 49 | |
| 50 void SetDelegate(MediaPipelineBackend::Delegate* delegate) { | |
| 51 delegate_ = delegate; | |
| 52 } | |
| 53 | |
| 54 // MediaPipelineBackend::VideoDecoder implementation: | |
| 55 BufferStatus PushBuffer(DecryptContext* decrypt_context, | |
| 56 CastDecoderBuffer* buffer) override { | |
| 57 if (buffer->end_of_stream()) | |
| 58 delegate_->OnEndOfStream(this); | |
| 59 return MediaPipelineBackend::kBufferSuccess; | |
| 60 } | |
| 61 | |
| 62 void GetStatistics(Statistics* statistics) override {} | |
| 63 | |
| 64 bool SetConfig(const VideoConfig& config) override { return true; } | |
| 65 | |
| 66 private: | |
| 67 MediaPipelineBackend::Delegate* delegate_; | |
| 68 | |
| 69 DISALLOW_COPY_AND_ASSIGN(VideoDecoderDefault); | |
| 70 }; | |
| 71 | |
| 72 MediaPipelineBackendDefault::MediaPipelineBackendDefault() | |
| 73 : running_(false), | |
| 74 rate_(1.0f), | |
| 75 audio_decoder_(nullptr), | |
| 76 video_decoder_(nullptr) { | |
| 24 } | 77 } |
| 25 | 78 |
| 26 AudioPipelineDevice* MediaPipelineBackendDefault::GetAudio() { | 79 MediaPipelineBackendDefault::~MediaPipelineBackendDefault() { |
| 27 if (!audio_) | 80 delete audio_decoder_; |
|
slan
2015/10/06 19:34:00
1) Since we already have //base deps, why not used
kmackay
2015/10/06 21:44:55
deleting nullptr is extremely valid.
slan
2015/10/06 22:15:05
TIL.
| |
| 28 audio_.reset(new AudioPipelineDeviceDefault(params_, GetClock())); | 81 delete video_decoder_; |
| 29 return audio_.get(); | |
| 30 } | 82 } |
| 31 | 83 |
| 32 VideoPipelineDevice* MediaPipelineBackendDefault::GetVideo() { | 84 MediaPipelineBackend::AudioDecoder* |
| 33 if (!video_) | 85 MediaPipelineBackendDefault::CreateAudioDecoder() { |
|
slan
2015/10/06 19:34:00
Don't the requirements state that the backend must
kmackay
2015/10/06 21:44:55
The requirement is that the vendor media shlib is
slan
2015/10/06 22:15:05
Ah much clearer, thanks!
| |
| 34 video_.reset(new VideoPipelineDeviceDefault(params_, GetClock())); | 86 DCHECK(!audio_decoder_); |
| 35 return video_.get(); | 87 audio_decoder_ = new AudioDecoderDefault(); |
| 88 return audio_decoder_; | |
| 89 } | |
| 90 | |
| 91 MediaPipelineBackend::VideoDecoder* | |
| 92 MediaPipelineBackendDefault::CreateVideoDecoder() { | |
| 93 DCHECK(!video_decoder_); | |
| 94 video_decoder_ = new VideoDecoderDefault(); | |
| 95 return video_decoder_; | |
| 96 } | |
| 97 | |
| 98 bool MediaPipelineBackendDefault::Initialize(Delegate* delegate) { | |
| 99 DCHECK(delegate); | |
| 100 if (audio_decoder_) | |
| 101 audio_decoder_->SetDelegate(delegate); | |
| 102 if (video_decoder_) | |
| 103 video_decoder_->SetDelegate(delegate); | |
| 104 return true; | |
| 105 } | |
| 106 | |
| 107 bool MediaPipelineBackendDefault::Start(int64_t start_pts) { | |
| 108 DCHECK(!running_); | |
| 109 start_pts_ = base::TimeDelta::FromMicroseconds(start_pts); | |
| 110 start_clock_ = base::TimeTicks::Now(); | |
| 111 running_ = true; | |
| 112 return true; | |
| 113 } | |
| 114 | |
| 115 bool MediaPipelineBackendDefault::Stop() { | |
| 116 running_ = false; | |
| 117 start_pts_ = base::TimeDelta::FromMicroseconds(GetCurrentPts()); | |
|
slan
2015/10/06 19:34:00
You want to call this before setting running_ to f
kmackay
2015/10/06 21:44:55
Done.
| |
| 118 return true; | |
| 119 } | |
| 120 | |
| 121 bool MediaPipelineBackendDefault::Pause() { | |
| 122 DCHECK(running_); | |
| 123 running_ = false; | |
| 124 start_pts_ = base::TimeDelta::FromMicroseconds(GetCurrentPts()); | |
| 125 return true; | |
| 126 } | |
| 127 | |
| 128 bool MediaPipelineBackendDefault::Resume() { | |
| 129 DCHECK(!running_); | |
| 130 running_ = true; | |
| 131 start_clock_ = base::TimeTicks::Now(); | |
| 132 return true; | |
| 133 } | |
| 134 | |
| 135 int64_t MediaPipelineBackendDefault::GetCurrentPts() { | |
| 136 if (!running_) | |
| 137 return start_pts_.InMicroseconds(); | |
| 138 | |
| 139 base::TimeTicks now = base::TimeTicks::Now(); | |
| 140 base::TimeDelta interpolated_media_time = | |
| 141 start_pts_ + (now - start_clock_) * rate_; | |
| 142 return interpolated_media_time.InMicroseconds(); | |
| 143 } | |
| 144 | |
| 145 bool MediaPipelineBackendDefault::SetPlaybackRate(float rate) { | |
| 146 DCHECK(rate != 0); | |
|
slan
2015/10/06 19:34:00
nit: rate > 0
kmackay
2015/10/06 21:44:55
0 is potentially valid here.
slan
2015/10/06 22:15:05
The comments in the header (pasted below) hold tha
kmackay
2015/10/07 16:37:58
Done.
| |
| 147 start_pts_ = base::TimeDelta::FromMicroseconds(GetCurrentPts()); | |
| 148 start_clock_ = base::TimeTicks::Now(); | |
| 149 rate_ = rate; | |
| 150 return true; | |
| 36 } | 151 } |
| 37 | 152 |
| 38 } // namespace media | 153 } // namespace media |
| 39 } // namespace chromecast | 154 } // namespace chromecast |
| OLD | NEW |