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" |
11 #include "base/callback_helpers.h" | 11 #include "base/callback_helpers.h" |
12 #include "base/location.h" | 12 #include "base/location.h" |
13 #include "base/metrics/histogram_macros.h" | 13 #include "base/metrics/histogram_macros.h" |
14 #include "base/single_thread_task_runner.h" | 14 #include "base/single_thread_task_runner.h" |
15 #include "base/strings/string_util.h" | 15 #include "base/strings/string_util.h" |
16 #include "base/time/default_tick_clock.h" | 16 #include "base/time/default_tick_clock.h" |
17 #include "base/trace_event/trace_event.h" | 17 #include "base/trace_event/trace_event.h" |
18 #include "media/base/bind_to_current_loop.h" | 18 #include "media/base/bind_to_current_loop.h" |
19 #include "media/base/limits.h" | 19 #include "media/base/limits.h" |
20 #include "media/base/media_log.h" | 20 #include "media/base/media_log.h" |
21 #include "media/base/media_switches.h" | 21 #include "media/base/media_switches.h" |
22 #include "media/base/pipeline_status.h" | 22 #include "media/base/pipeline_status.h" |
23 #include "media/base/video_frame.h" | 23 #include "media/base/video_frame.h" |
24 #include "media/renderers/gpu_video_accelerator_factories.h" | 24 #include "media/renderers/gpu_video_accelerator_factories.h" |
25 #include "media/video/gpu_memory_buffer_video_frame_pool.h" | 25 #include "media/video/gpu_memory_buffer_video_frame_copier.h" |
26 | 26 |
27 namespace media { | 27 namespace media { |
28 | 28 |
29 VideoRendererImpl::VideoRendererImpl( | 29 VideoRendererImpl::VideoRendererImpl( |
30 const scoped_refptr<base::SingleThreadTaskRunner>& media_task_runner, | 30 const scoped_refptr<base::SingleThreadTaskRunner>& media_task_runner, |
31 const scoped_refptr<base::TaskRunner>& worker_task_runner, | 31 const scoped_refptr<base::TaskRunner>& worker_task_runner, |
32 VideoRendererSink* sink, | 32 VideoRendererSink* sink, |
33 ScopedVector<VideoDecoder> decoders, | 33 ScopedVector<VideoDecoder> decoders, |
34 bool drop_frames, | 34 bool drop_frames, |
35 GpuVideoAcceleratorFactories* gpu_factories, | 35 GpuVideoAcceleratorFactories* gpu_factories, |
36 const scoped_refptr<MediaLog>& media_log) | 36 const scoped_refptr<MediaLog>& media_log) |
37 : task_runner_(media_task_runner), | 37 : task_runner_(media_task_runner), |
38 sink_(sink), | 38 sink_(sink), |
39 sink_started_(false), | 39 sink_started_(false), |
40 video_frame_stream_(new VideoFrameStream(media_task_runner, | 40 video_frame_stream_(new VideoFrameStream(media_task_runner, |
41 std::move(decoders), | 41 std::move(decoders), |
42 media_log)), | 42 media_log)), |
43 gpu_memory_buffer_pool_(nullptr), | 43 gpu_memory_buffer_copier_(nullptr), |
44 media_log_(media_log), | 44 media_log_(media_log), |
45 low_delay_(false), | 45 low_delay_(false), |
46 received_end_of_stream_(false), | 46 received_end_of_stream_(false), |
47 rendered_end_of_stream_(false), | 47 rendered_end_of_stream_(false), |
48 state_(kUninitialized), | 48 state_(kUninitialized), |
49 sequence_token_(0), | 49 sequence_token_(0), |
50 pending_read_(false), | 50 pending_read_(false), |
51 drop_frames_(drop_frames), | 51 drop_frames_(drop_frames), |
52 buffering_state_(BUFFERING_HAVE_NOTHING), | 52 buffering_state_(BUFFERING_HAVE_NOTHING), |
53 frames_decoded_(0), | 53 frames_decoded_(0), |
54 frames_dropped_(0), | 54 frames_dropped_(0), |
55 tick_clock_(new base::DefaultTickClock()), | 55 tick_clock_(new base::DefaultTickClock()), |
56 was_background_rendering_(false), | 56 was_background_rendering_(false), |
57 time_progressing_(false), | 57 time_progressing_(false), |
58 render_first_frame_and_stop_(false), | 58 render_first_frame_and_stop_(false), |
59 posted_maybe_stop_after_first_paint_(false), | 59 posted_maybe_stop_after_first_paint_(false), |
60 last_video_memory_usage_(0), | 60 last_video_memory_usage_(0), |
61 weak_factory_(this) { | 61 weak_factory_(this) { |
62 if (gpu_factories && | 62 if (gpu_factories && |
63 gpu_factories->ShouldUseGpuMemoryBuffersForVideoFrames()) { | 63 gpu_factories->ShouldUseGpuMemoryBuffersForVideoFrames()) { |
64 gpu_memory_buffer_pool_.reset(new GpuMemoryBufferVideoFramePool( | 64 gpu_memory_buffer_copier_.reset(new GpuMemoryBufferVideoFrameCopier( |
65 media_task_runner, worker_task_runner, gpu_factories)); | 65 media_task_runner, worker_task_runner, gpu_factories)); |
66 } | 66 } |
67 } | 67 } |
68 | 68 |
69 VideoRendererImpl::~VideoRendererImpl() { | 69 VideoRendererImpl::~VideoRendererImpl() { |
70 DCHECK(task_runner_->BelongsToCurrentThread()); | 70 DCHECK(task_runner_->BelongsToCurrentThread()); |
71 | 71 |
72 if (!init_cb_.is_null()) | 72 if (!init_cb_.is_null()) |
73 base::ResetAndReturn(&init_cb_).Run(PIPELINE_ERROR_ABORT); | 73 base::ResetAndReturn(&init_cb_).Run(PIPELINE_ERROR_ABORT); |
74 | 74 |
(...skipping 200 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
275 | 275 |
276 base::ResetAndReturn(&init_cb_).Run(PIPELINE_OK); | 276 base::ResetAndReturn(&init_cb_).Run(PIPELINE_OK); |
277 } | 277 } |
278 | 278 |
279 void VideoRendererImpl::SetTickClockForTesting( | 279 void VideoRendererImpl::SetTickClockForTesting( |
280 scoped_ptr<base::TickClock> tick_clock) { | 280 scoped_ptr<base::TickClock> tick_clock) { |
281 tick_clock_.swap(tick_clock); | 281 tick_clock_.swap(tick_clock); |
282 } | 282 } |
283 | 283 |
284 void VideoRendererImpl::SetGpuMemoryBufferVideoForTesting( | 284 void VideoRendererImpl::SetGpuMemoryBufferVideoForTesting( |
285 scoped_ptr<GpuMemoryBufferVideoFramePool> gpu_memory_buffer_pool) { | 285 scoped_ptr<GpuMemoryBufferVideoFrameCopier> gpu_memory_buffer_copier) { |
286 gpu_memory_buffer_pool_.swap(gpu_memory_buffer_pool); | 286 gpu_memory_buffer_copier_.swap(gpu_memory_buffer_copier); |
287 } | 287 } |
288 | 288 |
289 void VideoRendererImpl::OnTimeStateChanged(bool time_progressing) { | 289 void VideoRendererImpl::OnTimeStateChanged(bool time_progressing) { |
290 DCHECK(task_runner_->BelongsToCurrentThread()); | 290 DCHECK(task_runner_->BelongsToCurrentThread()); |
291 time_progressing_ = time_progressing; | 291 time_progressing_ = time_progressing; |
292 | 292 |
293 // WARNING: Do not attempt to use |lock_| here as this may be a reentrant call | 293 // WARNING: Do not attempt to use |lock_| here as this may be a reentrant call |
294 // in response to callbacks firing above. | 294 // in response to callbacks firing above. |
295 | 295 |
296 if (sink_started_ == time_progressing_) | 296 if (sink_started_ == time_progressing_) |
(...skipping 11 matching lines...) Expand all Loading... |
308 | 308 |
309 void VideoRendererImpl::FrameReadyForCopyingToGpuMemoryBuffers( | 309 void VideoRendererImpl::FrameReadyForCopyingToGpuMemoryBuffers( |
310 VideoFrameStream::Status status, | 310 VideoFrameStream::Status status, |
311 const scoped_refptr<VideoFrame>& frame) { | 311 const scoped_refptr<VideoFrame>& frame) { |
312 if (status != VideoFrameStream::OK || IsBeforeStartTime(frame->timestamp())) { | 312 if (status != VideoFrameStream::OK || IsBeforeStartTime(frame->timestamp())) { |
313 VideoRendererImpl::FrameReady(sequence_token_, status, frame); | 313 VideoRendererImpl::FrameReady(sequence_token_, status, frame); |
314 return; | 314 return; |
315 } | 315 } |
316 | 316 |
317 DCHECK(frame); | 317 DCHECK(frame); |
318 gpu_memory_buffer_pool_->MaybeCreateHardwareFrame( | 318 gpu_memory_buffer_copier_->MaybeCreateHardwareFrame( |
319 frame, base::Bind(&VideoRendererImpl::FrameReady, | 319 frame, base::Bind(&VideoRendererImpl::FrameReady, |
320 weak_factory_.GetWeakPtr(), sequence_token_, status)); | 320 weak_factory_.GetWeakPtr(), sequence_token_, status)); |
321 } | 321 } |
322 | 322 |
323 void VideoRendererImpl::FrameReady(uint32_t sequence_token, | 323 void VideoRendererImpl::FrameReady(uint32_t sequence_token, |
324 VideoFrameStream::Status status, | 324 VideoFrameStream::Status status, |
325 const scoped_refptr<VideoFrame>& frame) { | 325 const scoped_refptr<VideoFrame>& frame) { |
326 DCHECK(task_runner_->BelongsToCurrentThread()); | 326 DCHECK(task_runner_->BelongsToCurrentThread()); |
327 bool start_sink = false; | 327 bool start_sink = false; |
328 { | 328 { |
(...skipping 170 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
499 | 499 |
500 if (pending_read_ || received_end_of_stream_) | 500 if (pending_read_ || received_end_of_stream_) |
501 return; | 501 return; |
502 | 502 |
503 if (HaveReachedBufferingCap()) | 503 if (HaveReachedBufferingCap()) |
504 return; | 504 return; |
505 | 505 |
506 switch (state_) { | 506 switch (state_) { |
507 case kPlaying: | 507 case kPlaying: |
508 pending_read_ = true; | 508 pending_read_ = true; |
509 if (gpu_memory_buffer_pool_) { | 509 if (gpu_memory_buffer_copier_) { |
510 video_frame_stream_->Read(base::Bind( | 510 video_frame_stream_->Read(base::Bind( |
511 &VideoRendererImpl::FrameReadyForCopyingToGpuMemoryBuffers, | 511 &VideoRendererImpl::FrameReadyForCopyingToGpuMemoryBuffers, |
512 weak_factory_.GetWeakPtr())); | 512 weak_factory_.GetWeakPtr())); |
513 } else { | 513 } else { |
514 video_frame_stream_->Read(base::Bind(&VideoRendererImpl::FrameReady, | 514 video_frame_stream_->Read(base::Bind(&VideoRendererImpl::FrameReady, |
515 weak_factory_.GetWeakPtr(), | 515 weak_factory_.GetWeakPtr(), |
516 sequence_token_)); | 516 sequence_token_)); |
517 } | 517 } |
518 return; | 518 return; |
519 case kUninitialized: | 519 case kUninitialized: |
(...skipping 116 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
636 std::vector<base::TimeTicks> current_time; | 636 std::vector<base::TimeTicks> current_time; |
637 wall_clock_time_cb_.Run(std::vector<base::TimeDelta>(), ¤t_time); | 637 wall_clock_time_cb_.Run(std::vector<base::TimeDelta>(), ¤t_time); |
638 return current_time[0]; | 638 return current_time[0]; |
639 } | 639 } |
640 | 640 |
641 bool VideoRendererImpl::IsBeforeStartTime(base::TimeDelta timestamp) { | 641 bool VideoRendererImpl::IsBeforeStartTime(base::TimeDelta timestamp) { |
642 return timestamp + video_frame_stream_->AverageDuration() < start_timestamp_; | 642 return timestamp + video_frame_stream_->AverageDuration() < start_timestamp_; |
643 } | 643 } |
644 | 644 |
645 } // namespace media | 645 } // namespace media |
OLD | NEW |