Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(343)

Side by Side Diff: media/renderers/video_renderer_impl.cc

Issue 1874733002: media: split GpuMemoryBufferVideoFramePool into GpuMemoryBufferVideoFrameCopier/Pool Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: add GpuMemoryBufferVideoFramePoolTest Created 4 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « media/renderers/video_renderer_impl.h ('k') | media/renderers/video_renderer_impl_unittest.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
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
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
636 std::vector<base::TimeTicks> current_time; 636 std::vector<base::TimeTicks> current_time;
637 wall_clock_time_cb_.Run(std::vector<base::TimeDelta>(), &current_time); 637 wall_clock_time_cb_.Run(std::vector<base::TimeDelta>(), &current_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
OLDNEW
« no previous file with comments | « media/renderers/video_renderer_impl.h ('k') | media/renderers/video_renderer_impl_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698