OLD | NEW |
1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 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 "media/renderers/video_renderer_impl.h" | 5 #include "media/renderers/video_renderer_impl.h" |
6 | 6 |
7 #include <utility> | 7 #include <utility> |
8 | 8 |
9 #include "base/bind.h" | 9 #include "base/bind.h" |
10 #include "base/callback.h" | 10 #include "base/callback.h" |
(...skipping 13 matching lines...) Expand all Loading... |
24 #include "media/base/video_frame.h" | 24 #include "media/base/video_frame.h" |
25 #include "media/renderers/gpu_video_accelerator_factories.h" | 25 #include "media/renderers/gpu_video_accelerator_factories.h" |
26 #include "media/video/gpu_memory_buffer_video_frame_pool.h" | 26 #include "media/video/gpu_memory_buffer_video_frame_pool.h" |
27 | 27 |
28 namespace media { | 28 namespace media { |
29 | 29 |
30 VideoRendererImpl::VideoRendererImpl( | 30 VideoRendererImpl::VideoRendererImpl( |
31 const scoped_refptr<base::SingleThreadTaskRunner>& media_task_runner, | 31 const scoped_refptr<base::SingleThreadTaskRunner>& media_task_runner, |
32 const scoped_refptr<base::TaskRunner>& worker_task_runner, | 32 const scoped_refptr<base::TaskRunner>& worker_task_runner, |
33 VideoRendererSink* sink, | 33 VideoRendererSink* sink, |
34 ScopedVector<VideoDecoder> decoders, | 34 const CreateVideoDecodersCB& create_video_decoders_cb, |
35 bool drop_frames, | 35 bool drop_frames, |
36 GpuVideoAcceleratorFactories* gpu_factories, | 36 GpuVideoAcceleratorFactories* gpu_factories, |
37 const scoped_refptr<MediaLog>& media_log) | 37 const scoped_refptr<MediaLog>& media_log) |
38 : task_runner_(media_task_runner), | 38 : task_runner_(media_task_runner), |
39 sink_(sink), | 39 sink_(sink), |
40 sink_started_(false), | 40 sink_started_(false), |
41 client_(nullptr), | 41 client_(nullptr), |
42 video_frame_stream_(new VideoFrameStream(media_task_runner, | |
43 std::move(decoders), | |
44 media_log)), | |
45 gpu_memory_buffer_pool_(nullptr), | 42 gpu_memory_buffer_pool_(nullptr), |
46 media_log_(media_log), | 43 media_log_(media_log), |
47 low_delay_(false), | 44 low_delay_(false), |
48 received_end_of_stream_(false), | 45 received_end_of_stream_(false), |
49 rendered_end_of_stream_(false), | 46 rendered_end_of_stream_(false), |
50 state_(kUninitialized), | 47 state_(kUninitialized), |
| 48 create_video_decoders_cb_(create_video_decoders_cb), |
| 49 gpu_factories_(gpu_factories), |
| 50 worker_task_runner_(worker_task_runner), |
51 pending_read_(false), | 51 pending_read_(false), |
52 drop_frames_(drop_frames), | 52 drop_frames_(drop_frames), |
53 buffering_state_(BUFFERING_HAVE_NOTHING), | 53 buffering_state_(BUFFERING_HAVE_NOTHING), |
54 frames_decoded_(0), | 54 frames_decoded_(0), |
55 frames_dropped_(0), | 55 frames_dropped_(0), |
56 tick_clock_(new base::DefaultTickClock()), | 56 tick_clock_(new base::DefaultTickClock()), |
57 was_background_rendering_(false), | 57 was_background_rendering_(false), |
58 time_progressing_(false), | 58 time_progressing_(false), |
59 last_video_memory_usage_(0), | 59 last_video_memory_usage_(0), |
60 have_renderered_frames_(false), | 60 have_renderered_frames_(false), |
61 last_frame_opaque_(false), | 61 last_frame_opaque_(false), |
62 painted_first_frame_(false), | 62 painted_first_frame_(false), |
63 max_buffered_frames_(limits::kMaxVideoFrames), | 63 max_buffered_frames_(limits::kMaxVideoFrames), |
64 weak_factory_(this), | 64 weak_factory_(this), |
65 frame_callback_weak_factory_(this) { | 65 frame_callback_weak_factory_(this) { |
66 if (gpu_factories && | 66 DCHECK(create_video_decoders_cb_); |
67 gpu_factories->ShouldUseGpuMemoryBuffersForVideoFrames()) { | |
68 gpu_memory_buffer_pool_.reset(new GpuMemoryBufferVideoFramePool( | |
69 media_task_runner, worker_task_runner, gpu_factories)); | |
70 } | |
71 } | 67 } |
72 | 68 |
73 VideoRendererImpl::~VideoRendererImpl() { | 69 VideoRendererImpl::~VideoRendererImpl() { |
74 DCHECK(task_runner_->BelongsToCurrentThread()); | 70 DCHECK(task_runner_->BelongsToCurrentThread()); |
75 | 71 |
76 if (!init_cb_.is_null()) | 72 if (!init_cb_.is_null()) |
77 base::ResetAndReturn(&init_cb_).Run(PIPELINE_ERROR_ABORT); | 73 base::ResetAndReturn(&init_cb_).Run(PIPELINE_ERROR_ABORT); |
78 | 74 |
79 if (!flush_cb_.is_null()) | 75 if (!flush_cb_.is_null()) |
80 base::ResetAndReturn(&flush_cb_).Run(); | 76 base::ResetAndReturn(&flush_cb_).Run(); |
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
143 CdmContext* cdm_context, | 139 CdmContext* cdm_context, |
144 RendererClient* client, | 140 RendererClient* client, |
145 const TimeSource::WallClockTimeCB& wall_clock_time_cb, | 141 const TimeSource::WallClockTimeCB& wall_clock_time_cb, |
146 const PipelineStatusCB& init_cb) { | 142 const PipelineStatusCB& init_cb) { |
147 DCHECK(task_runner_->BelongsToCurrentThread()); | 143 DCHECK(task_runner_->BelongsToCurrentThread()); |
148 base::AutoLock auto_lock(lock_); | 144 base::AutoLock auto_lock(lock_); |
149 DCHECK(stream); | 145 DCHECK(stream); |
150 DCHECK_EQ(stream->type(), DemuxerStream::VIDEO); | 146 DCHECK_EQ(stream->type(), DemuxerStream::VIDEO); |
151 DCHECK(!init_cb.is_null()); | 147 DCHECK(!init_cb.is_null()); |
152 DCHECK(!wall_clock_time_cb.is_null()); | 148 DCHECK(!wall_clock_time_cb.is_null()); |
153 DCHECK_EQ(kUninitialized, state_); | 149 DCHECK(kUninitialized == state_ || kFlushed == state_); |
154 DCHECK(!was_background_rendering_); | 150 DCHECK(!was_background_rendering_); |
155 DCHECK(!time_progressing_); | 151 DCHECK(!time_progressing_); |
156 DCHECK(!have_renderered_frames_); | 152 |
| 153 ScopedVector<VideoDecoder> decoders = create_video_decoders_cb_.Run(); |
| 154 video_frame_stream_.reset( |
| 155 new VideoFrameStream(task_runner_, std::move(decoders), media_log_)); |
| 156 |
| 157 // Always re-initialize or reset the |gpu_memory_buffer_pool_| in case we are |
| 158 // switching between video tracks with incompatible video formats (e.g. 8-bit |
| 159 // H.264 to 10-bit H264 or vice versa). |
| 160 if (gpu_factories_ && |
| 161 gpu_factories_->ShouldUseGpuMemoryBuffersForVideoFrames()) { |
| 162 gpu_memory_buffer_pool_.reset(new GpuMemoryBufferVideoFramePool( |
| 163 task_runner_, worker_task_runner_, gpu_factories_)); |
| 164 } else { |
| 165 gpu_memory_buffer_pool_.reset(); |
| 166 } |
157 | 167 |
158 low_delay_ = (stream->liveness() == DemuxerStream::LIVENESS_LIVE); | 168 low_delay_ = (stream->liveness() == DemuxerStream::LIVENESS_LIVE); |
159 UMA_HISTOGRAM_BOOLEAN("Media.VideoRenderer.LowDelay", low_delay_); | 169 UMA_HISTOGRAM_BOOLEAN("Media.VideoRenderer.LowDelay", low_delay_); |
160 if (low_delay_) | 170 if (low_delay_) |
161 MEDIA_LOG(DEBUG, media_log_) << "Video rendering in low delay mode."; | 171 MEDIA_LOG(DEBUG, media_log_) << "Video rendering in low delay mode."; |
162 | 172 |
163 // Always post |init_cb_| because |this| could be destroyed if initialization | 173 // Always post |init_cb_| because |this| could be destroyed if initialization |
164 // failed. | 174 // failed. |
165 init_cb_ = BindToCurrentLoop(init_cb); | 175 init_cb_ = BindToCurrentLoop(init_cb); |
166 | 176 |
(...skipping 558 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
725 | 735 |
726 void VideoRendererImpl::AttemptReadAndCheckForMetadataChanges( | 736 void VideoRendererImpl::AttemptReadAndCheckForMetadataChanges( |
727 VideoPixelFormat pixel_format, | 737 VideoPixelFormat pixel_format, |
728 const gfx::Size& natural_size) { | 738 const gfx::Size& natural_size) { |
729 base::AutoLock auto_lock(lock_); | 739 base::AutoLock auto_lock(lock_); |
730 CheckForMetadataChanges(pixel_format, natural_size); | 740 CheckForMetadataChanges(pixel_format, natural_size); |
731 AttemptRead_Locked(); | 741 AttemptRead_Locked(); |
732 } | 742 } |
733 | 743 |
734 } // namespace media | 744 } // namespace media |
OLD | NEW |