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), rate_(1.0f) { |
24 } | 74 } |
25 | 75 |
26 AudioPipelineDevice* MediaPipelineBackendDefault::GetAudio() { | 76 MediaPipelineBackendDefault::~MediaPipelineBackendDefault() { |
27 if (!audio_) | |
28 audio_.reset(new AudioPipelineDeviceDefault(params_, GetClock())); | |
29 return audio_.get(); | |
30 } | 77 } |
31 | 78 |
32 VideoPipelineDevice* MediaPipelineBackendDefault::GetVideo() { | 79 MediaPipelineBackend::AudioDecoder* |
33 if (!video_) | 80 MediaPipelineBackendDefault::CreateAudioDecoder() { |
34 video_.reset(new VideoPipelineDeviceDefault(params_, GetClock())); | 81 DCHECK(!audio_decoder_); |
35 return video_.get(); | 82 audio_decoder_.reset(new AudioDecoderDefault()); |
| 83 return audio_decoder_.get(); |
| 84 } |
| 85 |
| 86 MediaPipelineBackend::VideoDecoder* |
| 87 MediaPipelineBackendDefault::CreateVideoDecoder() { |
| 88 DCHECK(!video_decoder_); |
| 89 video_decoder_.reset(new VideoDecoderDefault()); |
| 90 return video_decoder_.get(); |
| 91 } |
| 92 |
| 93 bool MediaPipelineBackendDefault::Initialize(Delegate* delegate) { |
| 94 DCHECK(delegate); |
| 95 if (audio_decoder_) |
| 96 audio_decoder_->SetDelegate(delegate); |
| 97 if (video_decoder_) |
| 98 video_decoder_->SetDelegate(delegate); |
| 99 return true; |
| 100 } |
| 101 |
| 102 bool MediaPipelineBackendDefault::Start(int64_t start_pts) { |
| 103 DCHECK(!running_); |
| 104 start_pts_ = base::TimeDelta::FromMicroseconds(start_pts); |
| 105 start_clock_ = base::TimeTicks::Now(); |
| 106 running_ = true; |
| 107 return true; |
| 108 } |
| 109 |
| 110 bool MediaPipelineBackendDefault::Stop() { |
| 111 start_pts_ = base::TimeDelta::FromMicroseconds(GetCurrentPts()); |
| 112 running_ = false; |
| 113 return true; |
| 114 } |
| 115 |
| 116 bool MediaPipelineBackendDefault::Pause() { |
| 117 DCHECK(running_); |
| 118 start_pts_ = base::TimeDelta::FromMicroseconds(GetCurrentPts()); |
| 119 running_ = false; |
| 120 return true; |
| 121 } |
| 122 |
| 123 bool MediaPipelineBackendDefault::Resume() { |
| 124 DCHECK(!running_); |
| 125 running_ = true; |
| 126 start_clock_ = base::TimeTicks::Now(); |
| 127 return true; |
| 128 } |
| 129 |
| 130 int64_t MediaPipelineBackendDefault::GetCurrentPts() { |
| 131 if (!running_) |
| 132 return start_pts_.InMicroseconds(); |
| 133 |
| 134 base::TimeTicks now = base::TimeTicks::Now(); |
| 135 base::TimeDelta interpolated_media_time = |
| 136 start_pts_ + (now - start_clock_) * rate_; |
| 137 return interpolated_media_time.InMicroseconds(); |
| 138 } |
| 139 |
| 140 bool MediaPipelineBackendDefault::SetPlaybackRate(float rate) { |
| 141 DCHECK_GT(rate, 0.0f); |
| 142 start_pts_ = base::TimeDelta::FromMicroseconds(GetCurrentPts()); |
| 143 start_clock_ = base::TimeTicks::Now(); |
| 144 rate_ = rate; |
| 145 return true; |
36 } | 146 } |
37 | 147 |
38 } // namespace media | 148 } // namespace media |
39 } // namespace chromecast | 149 } // namespace chromecast |
OLD | NEW |