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

Side by Side Diff: chromecast/renderer/media/cma_renderer.cc

Issue 1978973002: Moves video frame callbacks from VideoFrameCompositor to Renderer. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: addresses comments Created 4 years, 7 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
« no previous file with comments | « chromecast/renderer/media/cma_renderer.h ('k') | media/base/BUILD.gn » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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/renderer/media/cma_renderer.h" 5 #include "chromecast/renderer/media/cma_renderer.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 #include <utility> 8 #include <utility>
9 #include <vector> 9 #include <vector>
10 10
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
54 media_pipeline_(std::move(media_pipeline)), 54 media_pipeline_(std::move(media_pipeline)),
55 audio_pipeline_(media_pipeline_->GetAudioPipeline()), 55 audio_pipeline_(media_pipeline_->GetAudioPipeline()),
56 video_pipeline_(media_pipeline_->GetVideoPipeline()), 56 video_pipeline_(media_pipeline_->GetVideoPipeline()),
57 video_renderer_sink_(video_renderer_sink), 57 video_renderer_sink_(video_renderer_sink),
58 state_(kUninitialized), 58 state_(kUninitialized),
59 is_pending_transition_(false), 59 is_pending_transition_(false),
60 has_audio_(false), 60 has_audio_(false),
61 has_video_(false), 61 has_video_(false),
62 received_audio_eos_(false), 62 received_audio_eos_(false),
63 received_video_eos_(false), 63 received_video_eos_(false),
64 initial_natural_size_(gfx::Size()),
65 initial_video_hole_created_(false),
66 gpu_factories_(gpu_factories), 64 gpu_factories_(gpu_factories),
67 time_interpolator_( 65 time_interpolator_(
68 new ::media::TimeDeltaInterpolator(&default_tick_clock_)), 66 new ::media::TimeDeltaInterpolator(&default_tick_clock_)),
69 playback_rate_(1.0), 67 playback_rate_(1.0),
70 weak_factory_(this) { 68 weak_factory_(this) {
71 weak_this_ = weak_factory_.GetWeakPtr(); 69 weak_this_ = weak_factory_.GetWeakPtr();
72 thread_checker_.DetachFromThread(); 70 thread_checker_.DetachFromThread();
73 71
74 time_interpolator_->SetUpperBound(base::TimeDelta()); 72 time_interpolator_->SetUpperBound(base::TimeDelta());
75 } 73 }
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after
148 CMALOG(kLogControl) << __FUNCTION__ << ": " << time.InMilliseconds(); 146 CMALOG(kLogControl) << __FUNCTION__ << ": " << time.InMilliseconds();
149 DCHECK(thread_checker_.CalledOnValidThread()); 147 DCHECK(thread_checker_.CalledOnValidThread());
150 BeginStateTransition(); 148 BeginStateTransition();
151 149
152 if (state_ == kError) { 150 if (state_ == kError) {
153 client_->OnError(::media::PIPELINE_ERROR_ABORT); 151 client_->OnError(::media::PIPELINE_ERROR_ABORT);
154 CompleteStateTransition(kError); 152 CompleteStateTransition(kError);
155 return; 153 return;
156 } 154 }
157 155
158 // Create a video hole frame just before starting playback.
159 // Note that instead of creating the video hole frame in Initialize(), we do
160 // it here because paint_cb_ (which eventually calls OnOpacityChanged)
161 // expects the current state to not be HaveNothing. And the place where
162 // the ready state is changed to HaveMetadata (OnPipelineMetadata) is
163 // right before the pipeline calls StartPlayingFrom (in
164 // Pipeline::StateTransitionTask).
165 if (HasVideo() && !initial_video_hole_created_) {
166 initial_video_hole_created_ = true;
167 video_renderer_sink_->PaintFrameUsingOldRenderingPath(
168 hole_frame_factory_->CreateHoleFrame(initial_natural_size_));
169 }
170
171 { 156 {
172 base::AutoLock auto_lock(time_interpolator_lock_); 157 base::AutoLock auto_lock(time_interpolator_lock_);
173 time_interpolator_.reset( 158 time_interpolator_.reset(
174 new ::media::TimeDeltaInterpolator(&default_tick_clock_)); 159 new ::media::TimeDeltaInterpolator(&default_tick_clock_));
175 time_interpolator_->SetPlaybackRate(playback_rate_); 160 time_interpolator_->SetPlaybackRate(playback_rate_);
176 time_interpolator_->SetBounds(time, time); 161 time_interpolator_->SetBounds(time, time);
177 time_interpolator_->StartInterpolating(); 162 time_interpolator_->StartInterpolating();
178 } 163 }
179 164
180 received_audio_eos_ = false; 165 received_audio_eos_ = false;
(...skipping 142 matching lines...) Expand 10 before | Expand all | Expand 10 after
323 base::Bind(&CmaRenderer::OnNaturalSizeChanged, weak_this_)); 308 base::Bind(&CmaRenderer::OnNaturalSizeChanged, weak_this_));
324 video_pipeline_->SetClient(client); 309 video_pipeline_->SetClient(client);
325 310
326 std::unique_ptr<CodedFrameProvider> frame_provider(new DemuxerStreamAdapter( 311 std::unique_ptr<CodedFrameProvider> frame_provider(new DemuxerStreamAdapter(
327 base::ThreadTaskRunnerHandle::Get(), media_task_runner_factory_, stream)); 312 base::ThreadTaskRunnerHandle::Get(), media_task_runner_factory_, stream));
328 313
329 const ::media::VideoDecoderConfig& config = stream->video_decoder_config(); 314 const ::media::VideoDecoderConfig& config = stream->video_decoder_config();
330 if (config.codec() == ::media::kCodecH264) 315 if (config.codec() == ::media::kCodecH264)
331 stream->EnableBitstreamConverter(); 316 stream->EnableBitstreamConverter();
332 317
333 initial_natural_size_ = config.natural_size();
334
335 std::vector<::media::VideoDecoderConfig> configs; 318 std::vector<::media::VideoDecoderConfig> configs;
336 configs.push_back(config); 319 configs.push_back(config);
337 media_pipeline_->InitializeVideo(configs, std::move(frame_provider), 320 media_pipeline_->InitializeVideo(configs, std::move(frame_provider),
338 video_initialization_done_cb); 321 video_initialization_done_cb);
339 } 322 }
340 323
341 void CmaRenderer::OnVideoPipelineInitializeDone( 324 void CmaRenderer::OnVideoPipelineInitializeDone(
342 bool video_stream_present, 325 bool video_stream_present,
343 ::media::PipelineStatus status) { 326 ::media::PipelineStatus status) {
344 CMALOG(kLogControl) << __FUNCTION__ << ": state=" << state_; 327 CMALOG(kLogControl) << __FUNCTION__ << ": state=" << state_;
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after
390 void CmaRenderer::OnStatisticsUpdated( 373 void CmaRenderer::OnStatisticsUpdated(
391 const ::media::PipelineStatistics& stats) { 374 const ::media::PipelineStatistics& stats) {
392 DCHECK(thread_checker_.CalledOnValidThread()); 375 DCHECK(thread_checker_.CalledOnValidThread());
393 client_->OnStatisticsUpdate(stats); 376 client_->OnStatisticsUpdate(stats);
394 } 377 }
395 378
396 void CmaRenderer::OnNaturalSizeChanged(const gfx::Size& size) { 379 void CmaRenderer::OnNaturalSizeChanged(const gfx::Size& size) {
397 DCHECK(thread_checker_.CalledOnValidThread()); 380 DCHECK(thread_checker_.CalledOnValidThread());
398 video_renderer_sink_->PaintFrameUsingOldRenderingPath( 381 video_renderer_sink_->PaintFrameUsingOldRenderingPath(
399 hole_frame_factory_->CreateHoleFrame(size)); 382 hole_frame_factory_->CreateHoleFrame(size));
383 client_->OnVideoNaturalSizeChange(size);
400 } 384 }
401 385
402 void CmaRenderer::OnPlaybackTimeUpdated(base::TimeDelta time, 386 void CmaRenderer::OnPlaybackTimeUpdated(base::TimeDelta time,
403 base::TimeDelta max_time, 387 base::TimeDelta max_time,
404 base::TimeTicks capture_time) { 388 base::TimeTicks capture_time) {
405 DCHECK(thread_checker_.CalledOnValidThread()); 389 DCHECK(thread_checker_.CalledOnValidThread());
406 if (state_ != kPlaying) { 390 if (state_ != kPlaying) {
407 LOG(WARNING) << "Ignoring a late time update"; 391 LOG(WARNING) << "Ignoring a late time update";
408 return; 392 return;
409 } 393 }
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after
466 is_pending_transition_ = true; 450 is_pending_transition_ = true;
467 } 451 }
468 452
469 void CmaRenderer::CompleteStateTransition(State new_state) { 453 void CmaRenderer::CompleteStateTransition(State new_state) {
470 state_ = new_state; 454 state_ = new_state;
471 is_pending_transition_ = false; 455 is_pending_transition_ = false;
472 } 456 }
473 457
474 } // namespace media 458 } // namespace media
475 } // namespace chromecast 459 } // namespace chromecast
OLDNEW
« no previous file with comments | « chromecast/renderer/media/cma_renderer.h ('k') | media/base/BUILD.gn » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698