Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(278)

Side by Side Diff: chromecast/media/cma/pipeline/video_pipeline_impl.cc

Issue 1372393007: [Chromecast] Upgrade to new CMA backend API (Closed) Base URL: https://chromium.googlesource.com/chromium/src@master
Patch Set: Fix end_to_end test + address slan comments Created 5 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 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/pipeline/video_pipeline_impl.h" 5 #include "chromecast/media/cma/pipeline/video_pipeline_impl.h"
6 6
7 #include "base/bind.h" 7 #include "base/bind.h"
8 #include "chromecast/media/cma/base/buffering_defs.h" 8 #include "chromecast/media/cma/base/buffering_defs.h"
9 #include "chromecast/media/cma/base/cma_logging.h" 9 #include "chromecast/media/cma/base/cma_logging.h"
10 #include "chromecast/media/cma/base/coded_frame_provider.h" 10 #include "chromecast/media/cma/base/coded_frame_provider.h"
11 #include "chromecast/media/cma/base/decoder_config_adapter.h" 11 #include "chromecast/media/cma/base/decoder_config_adapter.h"
12 #include "chromecast/media/cma/pipeline/av_pipeline_impl.h" 12 #include "chromecast/media/cma/pipeline/av_pipeline_impl.h"
13 #include "chromecast/media/cma/pipeline/video_pipeline_device_client_impl.h"
14 #include "chromecast/public/graphics_types.h" 13 #include "chromecast/public/graphics_types.h"
15 #include "chromecast/public/media/decoder_config.h" 14 #include "chromecast/public/media/decoder_config.h"
16 #include "chromecast/public/media/video_pipeline_device.h"
17 #include "media/base/video_decoder_config.h" 15 #include "media/base/video_decoder_config.h"
18 16
19 namespace chromecast { 17 namespace chromecast {
20 namespace media { 18 namespace media {
21 19
22 namespace { 20 namespace {
23 const size_t kMaxVideoFrameSize = 1024 * 1024; 21 const size_t kMaxVideoFrameSize = 1024 * 1024;
24 } 22 }
25 23
26 VideoPipelineImpl::VideoPipelineImpl(VideoPipelineDevice* video_device) 24 VideoPipelineImpl::VideoPipelineImpl(
27 : video_device_(video_device), 25 MediaPipelineBackend::VideoDecoder* video_decoder,
26 const VideoPipelineClient& client)
27 : video_decoder_(video_decoder),
28 video_client_(client),
28 weak_factory_(this) { 29 weak_factory_(this) {
29 weak_this_ = weak_factory_.GetWeakPtr(); 30 weak_this_ = weak_factory_.GetWeakPtr();
30 av_pipeline_impl_.reset(new AvPipelineImpl( 31 av_pipeline_impl_.reset(new AvPipelineImpl(
31 video_device_, 32 video_decoder_,
32 base::Bind(&VideoPipelineImpl::OnUpdateConfig, base::Unretained(this)))); 33 base::Bind(&VideoPipelineImpl::OnUpdateConfig, base::Unretained(this))));
33 } 34 }
34 35
35 VideoPipelineImpl::~VideoPipelineImpl() { 36 VideoPipelineImpl::~VideoPipelineImpl() {
36 } 37 }
37 38
38 void VideoPipelineImpl::SetCodedFrameProvider( 39 void VideoPipelineImpl::SetCodedFrameProvider(
39 scoped_ptr<CodedFrameProvider> frame_provider) { 40 scoped_ptr<CodedFrameProvider> frame_provider) {
40 av_pipeline_impl_->SetCodedFrameProvider( 41 av_pipeline_impl_->SetCodedFrameProvider(
41 frame_provider.Pass(), kAppVideoBufferSize, kMaxVideoFrameSize); 42 frame_provider.Pass(), kAppVideoBufferSize, kMaxVideoFrameSize);
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after
90 void VideoPipelineImpl::Stop() { 91 void VideoPipelineImpl::Stop() {
91 CMALOG(kLogControl) << "VideoPipelineImpl::Stop"; 92 CMALOG(kLogControl) << "VideoPipelineImpl::Stop";
92 av_pipeline_impl_->Stop(); 93 av_pipeline_impl_->Stop();
93 av_pipeline_impl_->TransitionToState(AvPipelineImpl::kStopped); 94 av_pipeline_impl_->TransitionToState(AvPipelineImpl::kStopped);
94 } 95 }
95 96
96 void VideoPipelineImpl::SetCdm(BrowserCdmCast* media_keys) { 97 void VideoPipelineImpl::SetCdm(BrowserCdmCast* media_keys) {
97 av_pipeline_impl_->SetCdm(media_keys); 98 av_pipeline_impl_->SetCdm(media_keys);
98 } 99 }
99 100
100 void VideoPipelineImpl::SetClient(const VideoPipelineClient& client) { 101 void VideoPipelineImpl::OnBufferPushed(
101 video_client_ = client; 102 MediaPipelineBackend::BufferStatus status) {
102 av_pipeline_impl_->SetClient(client.av_pipeline_client); 103 av_pipeline_impl_->OnBufferPushed(status);
104 }
105
106 void VideoPipelineImpl::OnEndOfStream() {
107 if (!video_client_.av_pipeline_client.eos_cb.is_null())
108 video_client_.av_pipeline_client.eos_cb.Run();
109 }
110
111 void VideoPipelineImpl::OnError() {
112 if (!video_client_.av_pipeline_client.playback_error_cb.is_null()) {
113 video_client_.av_pipeline_client.playback_error_cb.Run(
114 ::media::PIPELINE_ERROR_COULD_NOT_RENDER);
115 }
103 } 116 }
104 117
105 void VideoPipelineImpl::Initialize( 118 void VideoPipelineImpl::Initialize(
106 const std::vector<::media::VideoDecoderConfig>& configs, 119 const std::vector<::media::VideoDecoderConfig>& configs,
107 scoped_ptr<CodedFrameProvider> frame_provider, 120 scoped_ptr<CodedFrameProvider> frame_provider,
108 const ::media::PipelineStatusCB& status_cb) { 121 const ::media::PipelineStatusCB& status_cb) {
109 DCHECK_GT(configs.size(), 0u); 122 DCHECK_GT(configs.size(), 0u);
110 for (const auto& config : configs) { 123 for (const auto& config : configs) {
111 CMALOG(kLogControl) << __FUNCTION__ << " " 124 CMALOG(kLogControl) << __FUNCTION__ << " "
112 << config.AsHumanReadableString(); 125 << config.AsHumanReadableString();
113 } 126 }
114 video_device_->SetVideoClient(new VideoPipelineDeviceClientImpl( 127
115 base::Bind(&VideoPipelineImpl::OnNaturalSizeChanged, weak_this_)));
116 if (frame_provider) 128 if (frame_provider)
117 SetCodedFrameProvider(frame_provider.Pass()); 129 SetCodedFrameProvider(frame_provider.Pass());
118 130
119 if (configs.empty()) { 131 if (configs.empty()) {
120 status_cb.Run(::media::PIPELINE_ERROR_INITIALIZATION_FAILED); 132 status_cb.Run(::media::PIPELINE_ERROR_INITIALIZATION_FAILED);
121 return; 133 return;
122 } 134 }
123 DCHECK(configs.size() <= 2); 135 DCHECK(configs.size() <= 2);
124 DCHECK(configs[0].IsValidConfig()); 136 DCHECK(configs[0].IsValidConfig());
125 VideoConfig video_config = 137 VideoConfig video_config =
126 DecoderConfigAdapter::ToCastVideoConfig(kPrimary, configs[0]); 138 DecoderConfigAdapter::ToCastVideoConfig(kPrimary, configs[0]);
127 VideoConfig secondary_config; 139 VideoConfig secondary_config;
128 if (configs.size() == 2) { 140 if (configs.size() == 2) {
129 DCHECK(configs[1].IsValidConfig()); 141 DCHECK(configs[1].IsValidConfig());
130 secondary_config = DecoderConfigAdapter::ToCastVideoConfig(kSecondary, 142 secondary_config = DecoderConfigAdapter::ToCastVideoConfig(kSecondary,
131 configs[1]); 143 configs[1]);
132 video_config.additional_config = &secondary_config; 144 video_config.additional_config = &secondary_config;
133 } 145 }
134 146
135 if (!video_device_->SetConfig(video_config) || 147 if (!video_decoder_->SetConfig(video_config)) {
136 !av_pipeline_impl_->Initialize()) {
137 status_cb.Run(::media::PIPELINE_ERROR_INITIALIZATION_FAILED); 148 status_cb.Run(::media::PIPELINE_ERROR_INITIALIZATION_FAILED);
138 return; 149 return;
139 } 150 }
140 av_pipeline_impl_->TransitionToState(AvPipelineImpl::kFlushed); 151 av_pipeline_impl_->TransitionToState(AvPipelineImpl::kFlushed);
141 status_cb.Run(::media::PIPELINE_OK); 152 status_cb.Run(::media::PIPELINE_OK);
142 } 153 }
143 154
144 void VideoPipelineImpl::OnUpdateConfig( 155 void VideoPipelineImpl::OnUpdateConfig(
145 StreamId id, 156 StreamId id,
146 const ::media::AudioDecoderConfig& audio_config, 157 const ::media::AudioDecoderConfig& audio_config,
147 const ::media::VideoDecoderConfig& video_config) { 158 const ::media::VideoDecoderConfig& video_config) {
148 if (video_config.IsValidConfig()) { 159 if (video_config.IsValidConfig()) {
149 CMALOG(kLogControl) << "VideoPipelineImpl::OnUpdateConfig id:" << id << " " 160 CMALOG(kLogControl) << "VideoPipelineImpl::OnUpdateConfig id:" << id << " "
150 << video_config.AsHumanReadableString(); 161 << video_config.AsHumanReadableString();
151 162
152 bool success = video_device_->SetConfig( 163 bool success = video_decoder_->SetConfig(
153 DecoderConfigAdapter::ToCastVideoConfig(id, video_config)); 164 DecoderConfigAdapter::ToCastVideoConfig(id, video_config));
154 if (!success && 165 if (!success &&
155 !video_client_.av_pipeline_client.playback_error_cb.is_null()) { 166 !video_client_.av_pipeline_client.playback_error_cb.is_null()) {
156 video_client_.av_pipeline_client.playback_error_cb.Run( 167 video_client_.av_pipeline_client.playback_error_cb.Run(
157 ::media::PIPELINE_ERROR_DECODE); 168 ::media::PIPELINE_ERROR_DECODE);
158 } 169 }
159 } 170 }
160 } 171 }
161 172
162 void VideoPipelineImpl::OnNaturalSizeChanged(const Size& size) { 173 void VideoPipelineImpl::OnNaturalSizeChanged(const Size& size) {
163 if (av_pipeline_impl_->GetState() != AvPipelineImpl::kPlaying) 174 if (av_pipeline_impl_->GetState() != AvPipelineImpl::kPlaying)
164 return; 175 return;
165 176
166 if (!video_client_.natural_size_changed_cb.is_null()) { 177 if (!video_client_.natural_size_changed_cb.is_null()) {
167 video_client_.natural_size_changed_cb.Run( 178 video_client_.natural_size_changed_cb.Run(
168 gfx::Size(size.width, size.height)); 179 gfx::Size(size.width, size.height));
169 } 180 }
170 } 181 }
171 182
172 void VideoPipelineImpl::UpdateStatistics() { 183 void VideoPipelineImpl::UpdateStatistics() {
173 if (video_client_.av_pipeline_client.statistics_cb.is_null()) 184 if (video_client_.av_pipeline_client.statistics_cb.is_null())
174 return; 185 return;
175 186
176 MediaComponentDevice::Statistics device_stats; 187 MediaPipelineBackend::Decoder::Statistics device_stats;
177 if (!video_device_->GetStatistics(&device_stats)) 188 video_decoder_->GetStatistics(&device_stats);
178 return;
179 189
180 ::media::PipelineStatistics current_stats; 190 ::media::PipelineStatistics current_stats;
181 current_stats.video_bytes_decoded = device_stats.decoded_bytes; 191 current_stats.video_bytes_decoded = device_stats.decoded_bytes;
182 current_stats.video_frames_decoded = device_stats.decoded_samples; 192 current_stats.video_frames_decoded = device_stats.decoded_samples;
183 current_stats.video_frames_dropped = device_stats.dropped_samples; 193 current_stats.video_frames_dropped = device_stats.dropped_samples;
184 194
185 ::media::PipelineStatistics delta_stats; 195 ::media::PipelineStatistics delta_stats;
186 delta_stats.video_bytes_decoded = 196 delta_stats.video_bytes_decoded =
187 current_stats.video_bytes_decoded - previous_stats_.video_bytes_decoded; 197 current_stats.video_bytes_decoded - previous_stats_.video_bytes_decoded;
188 delta_stats.video_frames_decoded = 198 delta_stats.video_frames_decoded =
189 current_stats.video_frames_decoded - previous_stats_.video_frames_decoded; 199 current_stats.video_frames_decoded - previous_stats_.video_frames_decoded;
190 delta_stats.video_frames_dropped = 200 delta_stats.video_frames_dropped =
191 current_stats.video_frames_dropped - previous_stats_.video_frames_dropped; 201 current_stats.video_frames_dropped - previous_stats_.video_frames_dropped;
192 202
193 previous_stats_ = current_stats; 203 previous_stats_ = current_stats;
194 204
195 video_client_.av_pipeline_client.statistics_cb.Run(delta_stats); 205 video_client_.av_pipeline_client.statistics_cb.Run(delta_stats);
196 } 206 }
197 207
198 } // namespace media 208 } // namespace media
199 } // namespace chromecast 209 } // namespace chromecast
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698