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, | 42 video_frame_stream_(nullptr), |
xhwang
2017/03/27 19:13:53
not needed
servolk
2017/03/27 22:34:13
Done.
| |
43 std::move(decoders), | |
44 media_log)), | |
45 gpu_memory_buffer_pool_(nullptr), | 43 gpu_memory_buffer_pool_(nullptr), |
46 media_log_(media_log), | 44 media_log_(media_log), |
47 low_delay_(false), | 45 low_delay_(false), |
48 received_end_of_stream_(false), | 46 received_end_of_stream_(false), |
49 rendered_end_of_stream_(false), | 47 rendered_end_of_stream_(false), |
50 state_(kUninitialized), | 48 state_(kUninitialized), |
49 create_video_decoders_cb_(create_video_decoders_cb), | |
50 gpu_factories_(gpu_factories), | |
51 worker_task_runner_(worker_task_runner), | |
51 pending_read_(false), | 52 pending_read_(false), |
52 drop_frames_(drop_frames), | 53 drop_frames_(drop_frames), |
53 buffering_state_(BUFFERING_HAVE_NOTHING), | 54 buffering_state_(BUFFERING_HAVE_NOTHING), |
54 frames_decoded_(0), | 55 frames_decoded_(0), |
55 frames_dropped_(0), | 56 frames_dropped_(0), |
56 tick_clock_(new base::DefaultTickClock()), | 57 tick_clock_(new base::DefaultTickClock()), |
57 was_background_rendering_(false), | 58 was_background_rendering_(false), |
58 time_progressing_(false), | 59 time_progressing_(false), |
59 last_video_memory_usage_(0), | 60 last_video_memory_usage_(0), |
60 have_renderered_frames_(false), | 61 have_renderered_frames_(false), |
61 last_frame_opaque_(false), | 62 last_frame_opaque_(false), |
62 painted_first_frame_(false), | 63 painted_first_frame_(false), |
63 max_buffered_frames_(limits::kMaxVideoFrames), | 64 max_buffered_frames_(limits::kMaxVideoFrames), |
64 weak_factory_(this), | 65 weak_factory_(this), |
65 frame_callback_weak_factory_(this) { | 66 frame_callback_weak_factory_(this) { |
66 if (gpu_factories && | 67 DCHECK(!create_video_decoders_cb_.is_null()); |
67 gpu_factories->ShouldUseGpuMemoryBuffersForVideoFrames()) { | |
68 gpu_memory_buffer_pool_.reset(new GpuMemoryBufferVideoFramePool( | |
69 media_task_runner, worker_task_runner, gpu_factories)); | |
70 } | |
71 } | 68 } |
72 | 69 |
73 VideoRendererImpl::~VideoRendererImpl() { | 70 VideoRendererImpl::~VideoRendererImpl() { |
74 DCHECK(task_runner_->BelongsToCurrentThread()); | 71 DCHECK(task_runner_->BelongsToCurrentThread()); |
75 | 72 |
76 if (!init_cb_.is_null()) | 73 if (!init_cb_.is_null()) |
77 base::ResetAndReturn(&init_cb_).Run(PIPELINE_ERROR_ABORT); | 74 base::ResetAndReturn(&init_cb_).Run(PIPELINE_ERROR_ABORT); |
78 | 75 |
79 if (!flush_cb_.is_null()) | 76 if (!flush_cb_.is_null()) |
80 base::ResetAndReturn(&flush_cb_).Run(); | 77 base::ResetAndReturn(&flush_cb_).Run(); |
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
143 CdmContext* cdm_context, | 140 CdmContext* cdm_context, |
144 RendererClient* client, | 141 RendererClient* client, |
145 const TimeSource::WallClockTimeCB& wall_clock_time_cb, | 142 const TimeSource::WallClockTimeCB& wall_clock_time_cb, |
146 const PipelineStatusCB& init_cb) { | 143 const PipelineStatusCB& init_cb) { |
147 DCHECK(task_runner_->BelongsToCurrentThread()); | 144 DCHECK(task_runner_->BelongsToCurrentThread()); |
148 base::AutoLock auto_lock(lock_); | 145 base::AutoLock auto_lock(lock_); |
149 DCHECK(stream); | 146 DCHECK(stream); |
150 DCHECK_EQ(stream->type(), DemuxerStream::VIDEO); | 147 DCHECK_EQ(stream->type(), DemuxerStream::VIDEO); |
151 DCHECK(!init_cb.is_null()); | 148 DCHECK(!init_cb.is_null()); |
152 DCHECK(!wall_clock_time_cb.is_null()); | 149 DCHECK(!wall_clock_time_cb.is_null()); |
153 DCHECK_EQ(kUninitialized, state_); | 150 DCHECK(kUninitialized == state_ || kFlushed == state_); |
154 DCHECK(!was_background_rendering_); | 151 DCHECK(!was_background_rendering_); |
155 DCHECK(!time_progressing_); | 152 DCHECK(!time_progressing_); |
156 DCHECK(!have_renderered_frames_); | 153 |
154 ScopedVector<VideoDecoder> decoders = create_video_decoders_cb_.Run(); | |
155 video_frame_stream_.reset( | |
156 new VideoFrameStream(task_runner_, std::move(decoders), media_log_)); | |
157 if (gpu_factories_ && | |
158 gpu_factories_->ShouldUseGpuMemoryBuffersForVideoFrames()) { | |
159 gpu_memory_buffer_pool_.reset(new GpuMemoryBufferVideoFramePool( | |
160 task_runner_, worker_task_runner_, gpu_factories_)); | |
xhwang
2017/03/27 19:13:53
OOC, why do we need to create a new GpuMemoryBuffe
servolk
2017/03/27 22:34:13
Well, if we are switching from let's say 8-bit H26
| |
161 } | |
157 | 162 |
158 low_delay_ = (stream->liveness() == DemuxerStream::LIVENESS_LIVE); | 163 low_delay_ = (stream->liveness() == DemuxerStream::LIVENESS_LIVE); |
159 UMA_HISTOGRAM_BOOLEAN("Media.VideoRenderer.LowDelay", low_delay_); | 164 UMA_HISTOGRAM_BOOLEAN("Media.VideoRenderer.LowDelay", low_delay_); |
160 if (low_delay_) | 165 if (low_delay_) |
161 MEDIA_LOG(DEBUG, media_log_) << "Video rendering in low delay mode."; | 166 MEDIA_LOG(DEBUG, media_log_) << "Video rendering in low delay mode."; |
162 | 167 |
163 // Always post |init_cb_| because |this| could be destroyed if initialization | 168 // Always post |init_cb_| because |this| could be destroyed if initialization |
164 // failed. | 169 // failed. |
165 init_cb_ = BindToCurrentLoop(init_cb); | 170 init_cb_ = BindToCurrentLoop(init_cb); |
166 | 171 |
(...skipping 558 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
725 | 730 |
726 void VideoRendererImpl::AttemptReadAndCheckForMetadataChanges( | 731 void VideoRendererImpl::AttemptReadAndCheckForMetadataChanges( |
727 VideoPixelFormat pixel_format, | 732 VideoPixelFormat pixel_format, |
728 const gfx::Size& natural_size) { | 733 const gfx::Size& natural_size) { |
729 base::AutoLock auto_lock(lock_); | 734 base::AutoLock auto_lock(lock_); |
730 CheckForMetadataChanges(pixel_format, natural_size); | 735 CheckForMetadataChanges(pixel_format, natural_size); |
731 AttemptRead_Locked(); | 736 AttemptRead_Locked(); |
732 } | 737 } |
733 | 738 |
734 } // namespace media | 739 } // namespace media |
OLD | NEW |