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 |