| OLD | NEW |
| 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 |
| 11 #include "base/bind.h" | 11 #include "base/bind.h" |
| 12 #include "base/callback_helpers.h" | 12 #include "base/callback_helpers.h" |
| 13 #include "base/location.h" | 13 #include "base/location.h" |
| 14 #include "base/single_thread_task_runner.h" | 14 #include "base/single_thread_task_runner.h" |
| 15 #include "base/threading/thread_task_runner_handle.h" | 15 #include "base/threading/thread_task_runner_handle.h" |
| 16 #include "chromecast/media/cma/base/balanced_media_task_runner_factory.h" | 16 #include "chromecast/media/cma/base/balanced_media_task_runner_factory.h" |
| 17 #include "chromecast/media/cma/base/cma_logging.h" | 17 #include "chromecast/media/cma/base/cma_logging.h" |
| 18 #include "chromecast/media/cma/base/demuxer_stream_adapter.h" | 18 #include "chromecast/media/cma/base/demuxer_stream_adapter.h" |
| 19 #include "chromecast/media/cma/pipeline/av_pipeline_client.h" | 19 #include "chromecast/media/cma/pipeline/av_pipeline_client.h" |
| 20 #include "chromecast/media/cma/pipeline/media_pipeline_client.h" | 20 #include "chromecast/media/cma/pipeline/media_pipeline_client.h" |
| 21 #include "chromecast/media/cma/pipeline/video_pipeline_client.h" | 21 #include "chromecast/media/cma/pipeline/video_pipeline_client.h" |
| 22 #include "chromecast/renderer/media/audio_pipeline_proxy.h" | 22 #include "chromecast/renderer/media/audio_pipeline_proxy.h" |
| 23 #include "chromecast/renderer/media/hole_frame_factory.h" | |
| 24 #include "chromecast/renderer/media/media_pipeline_proxy.h" | 23 #include "chromecast/renderer/media/media_pipeline_proxy.h" |
| 25 #include "chromecast/renderer/media/video_pipeline_proxy.h" | 24 #include "chromecast/renderer/media/video_pipeline_proxy.h" |
| 26 #include "media/base/bind_to_current_loop.h" | 25 #include "media/base/bind_to_current_loop.h" |
| 27 #include "media/base/demuxer_stream_provider.h" | 26 #include "media/base/demuxer_stream_provider.h" |
| 28 #include "media/base/pipeline_status.h" | 27 #include "media/base/pipeline_status.h" |
| 29 #include "media/base/renderer_client.h" | 28 #include "media/base/renderer_client.h" |
| 30 #include "media/base/time_delta_interpolator.h" | 29 #include "media/base/time_delta_interpolator.h" |
| 31 #include "media/base/video_renderer_sink.h" | 30 #include "media/base/video_renderer_sink.h" |
| 32 #include "media/renderers/gpu_video_accelerator_factories.h" | 31 #include "media/renderers/video_overlay_factory.h" |
| 33 #include "ui/gfx/geometry/size.h" | 32 #include "ui/gfx/geometry/size.h" |
| 34 | 33 |
| 35 namespace chromecast { | 34 namespace chromecast { |
| 36 namespace media { | 35 namespace media { |
| 37 | 36 |
| 38 namespace { | 37 namespace { |
| 39 | 38 |
| 40 // Maximum difference between audio frame PTS and video frame PTS | 39 // Maximum difference between audio frame PTS and video frame PTS |
| 41 // for frames read from the DemuxerStream. | 40 // for frames read from the DemuxerStream. |
| 42 const base::TimeDelta kMaxDeltaFetcher(base::TimeDelta::FromMilliseconds(2000)); | 41 const base::TimeDelta kMaxDeltaFetcher(base::TimeDelta::FromMilliseconds(2000)); |
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 88 ::media::RendererClient* client, | 87 ::media::RendererClient* client, |
| 89 const ::media::PipelineStatusCB& init_cb) { | 88 const ::media::PipelineStatusCB& init_cb) { |
| 90 CMALOG(kLogControl) << __FUNCTION__; | 89 CMALOG(kLogControl) << __FUNCTION__; |
| 91 DCHECK(thread_checker_.CalledOnValidThread()); | 90 DCHECK(thread_checker_.CalledOnValidThread()); |
| 92 DCHECK_EQ(state_, kUninitialized) << state_; | 91 DCHECK_EQ(state_, kUninitialized) << state_; |
| 93 DCHECK(!init_cb.is_null()); | 92 DCHECK(!init_cb.is_null()); |
| 94 DCHECK(demuxer_stream_provider->GetStream(::media::DemuxerStream::AUDIO) || | 93 DCHECK(demuxer_stream_provider->GetStream(::media::DemuxerStream::AUDIO) || |
| 95 demuxer_stream_provider->GetStream(::media::DemuxerStream::VIDEO)); | 94 demuxer_stream_provider->GetStream(::media::DemuxerStream::VIDEO)); |
| 96 | 95 |
| 97 // Deferred from ctor so as to initialise on correct thread. | 96 // Deferred from ctor so as to initialise on correct thread. |
| 98 hole_frame_factory_.reset(new HoleFrameFactory(gpu_factories_)); | 97 video_overlay_factory_.reset( |
| 98 new ::media::VideoOverlayFactory(gpu_factories_)); |
| 99 | 99 |
| 100 BeginStateTransition(); | 100 BeginStateTransition(); |
| 101 | 101 |
| 102 demuxer_stream_provider_ = demuxer_stream_provider; | 102 demuxer_stream_provider_ = demuxer_stream_provider; |
| 103 client_ = client; | 103 client_ = client; |
| 104 | 104 |
| 105 MediaPipelineClient media_pipeline_client; | 105 MediaPipelineClient media_pipeline_client; |
| 106 media_pipeline_client.error_cb = | 106 media_pipeline_client.error_cb = |
| 107 ::media::BindToCurrentLoop(base::Bind(&CmaRenderer::OnError, weak_this_)); | 107 ::media::BindToCurrentLoop(base::Bind(&CmaRenderer::OnError, weak_this_)); |
| 108 media_pipeline_client.buffering_state_cb = ::media::BindToCurrentLoop( | 108 media_pipeline_client.buffering_state_cb = ::media::BindToCurrentLoop( |
| (...skipping 263 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 372 | 372 |
| 373 void CmaRenderer::OnStatisticsUpdated( | 373 void CmaRenderer::OnStatisticsUpdated( |
| 374 const ::media::PipelineStatistics& stats) { | 374 const ::media::PipelineStatistics& stats) { |
| 375 DCHECK(thread_checker_.CalledOnValidThread()); | 375 DCHECK(thread_checker_.CalledOnValidThread()); |
| 376 client_->OnStatisticsUpdate(stats); | 376 client_->OnStatisticsUpdate(stats); |
| 377 } | 377 } |
| 378 | 378 |
| 379 void CmaRenderer::OnNaturalSizeChanged(const gfx::Size& size) { | 379 void CmaRenderer::OnNaturalSizeChanged(const gfx::Size& size) { |
| 380 DCHECK(thread_checker_.CalledOnValidThread()); | 380 DCHECK(thread_checker_.CalledOnValidThread()); |
| 381 video_renderer_sink_->PaintFrameUsingOldRenderingPath( | 381 video_renderer_sink_->PaintFrameUsingOldRenderingPath( |
| 382 hole_frame_factory_->CreateHoleFrame(size)); | 382 video_overlay_factory_->CreateFrame(size)); |
| 383 client_->OnVideoNaturalSizeChange(size); | 383 client_->OnVideoNaturalSizeChange(size); |
| 384 } | 384 } |
| 385 | 385 |
| 386 void CmaRenderer::OnPlaybackTimeUpdated(base::TimeDelta time, | 386 void CmaRenderer::OnPlaybackTimeUpdated(base::TimeDelta time, |
| 387 base::TimeDelta max_time, | 387 base::TimeDelta max_time, |
| 388 base::TimeTicks capture_time) { | 388 base::TimeTicks capture_time) { |
| 389 DCHECK(thread_checker_.CalledOnValidThread()); | 389 DCHECK(thread_checker_.CalledOnValidThread()); |
| 390 if (state_ != kPlaying) { | 390 if (state_ != kPlaying) { |
| 391 LOG(WARNING) << "Ignoring a late time update"; | 391 LOG(WARNING) << "Ignoring a late time update"; |
| 392 return; | 392 return; |
| (...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 450 is_pending_transition_ = true; | 450 is_pending_transition_ = true; |
| 451 } | 451 } |
| 452 | 452 |
| 453 void CmaRenderer::CompleteStateTransition(State new_state) { | 453 void CmaRenderer::CompleteStateTransition(State new_state) { |
| 454 state_ = new_state; | 454 state_ = new_state; |
| 455 is_pending_transition_ = false; | 455 is_pending_transition_ = false; |
| 456 } | 456 } |
| 457 | 457 |
| 458 } // namespace media | 458 } // namespace media |
| 459 } // namespace chromecast | 459 } // namespace chromecast |
| OLD | NEW |