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 |