| 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 |