Commit e269e69c authored by Emircan Uysaler's avatar Emircan Uysaler Committed by Commit Bot

Refactor GpuMemoryBufferVideoFramePool usage in WebMediaPlayerMS

- Posts GpuMemoryBufferVideoFramePool::Abort() calls on the correct thread.
- Avoids unnecessary Abort calls when there isn't an active task.
- Renames FrameReady() to EnqueueFrame().

Bug: 653200
Change-Id: Iaa98be89f34cf4d76855c51b6121b877bf44a6c5
Reviewed-on: https://chromium-review.googlesource.com/974308Reviewed-by: default avatarDale Curtis <dalecurtis@chromium.org>
Commit-Queue: Emircan Uysaler <emircan@chromium.org>
Cr-Commit-Position: refs/heads/master@{#545168}
parent 061ce628
...@@ -88,7 +88,7 @@ class WebMediaPlayerMS::FrameDeliverer { ...@@ -88,7 +88,7 @@ class WebMediaPlayerMS::FrameDeliverer {
~FrameDeliverer() { ~FrameDeliverer() {
DCHECK(io_thread_checker_.CalledOnValidThread()); DCHECK(io_thread_checker_.CalledOnValidThread());
if (gpu_memory_buffer_pool_) { if (gpu_memory_buffer_pool_) {
gpu_memory_buffer_pool_->Abort(); DropCurrentPoolTasks();
media_task_runner_->DeleteSoon(FROM_HERE, media_task_runner_->DeleteSoon(FROM_HERE,
gpu_memory_buffer_pool_.release()); gpu_memory_buffer_pool_.release());
} }
...@@ -104,7 +104,7 @@ class WebMediaPlayerMS::FrameDeliverer { ...@@ -104,7 +104,7 @@ class WebMediaPlayerMS::FrameDeliverer {
#endif // defined(OS_ANDROID) #endif // defined(OS_ANDROID)
if (!gpu_memory_buffer_pool_) { if (!gpu_memory_buffer_pool_) {
FrameReady(frame); EnqueueFrame(std::move(frame));
return; return;
} }
...@@ -113,38 +113,50 @@ class WebMediaPlayerMS::FrameDeliverer { ...@@ -113,38 +113,50 @@ class WebMediaPlayerMS::FrameDeliverer {
// frames is unnecessary, because the frames are not going to be shown for // frames is unnecessary, because the frames are not going to be shown for
// the time period. // the time period.
if (render_frame_suspended_) { if (render_frame_suspended_) {
FrameReady(frame); EnqueueFrame(std::move(frame));
// If there are any existing MaybeCreateHardwareFrame() calls, we do not // If there are any existing MaybeCreateHardwareFrame() calls, we do not
// want those frames to be placed after the current one, so just drop // want those frames to be placed after the current one, so just drop
// them. // them.
gpu_memory_buffer_pool_->Abort(); DropCurrentPoolTasks();
weak_factory_for_pool_.InvalidateWeakPtrs();
return; return;
} }
// |gpu_memory_buffer_pool_| deletion is going to be posted to // |gpu_memory_buffer_pool_| deletion is going to be posted to
// |media_task_runner_|. base::Unretained() usage is fine since // |media_task_runner_|. base::Unretained() usage is fine since
// |gpu_memory_buffer_pool_| outlives the task. // |gpu_memory_buffer_pool_| outlives the task.
media_task_runner_->PostTask( media_task_runner_->PostTask(
FROM_HERE, FROM_HERE,
base::BindOnce( base::BindOnce(
&media::GpuMemoryBufferVideoFramePool::MaybeCreateHardwareFrame, &media::GpuMemoryBufferVideoFramePool::MaybeCreateHardwareFrame,
base::Unretained(gpu_memory_buffer_pool_.get()), frame, base::Unretained(gpu_memory_buffer_pool_.get()), frame,
media::BindToCurrentLoop( media::BindToCurrentLoop(
base::BindOnce(&FrameDeliverer::FrameReady, base::BindOnce(&FrameDeliverer::EnqueueFrame,
weak_factory_for_pool_.GetWeakPtr())))); weak_factory_for_pool_.GetWeakPtr()))));
} }
void FrameReady(const scoped_refptr<media::VideoFrame>& frame) { void SetRenderFrameSuspended(bool render_frame_suspended) {
DCHECK(io_thread_checker_.CalledOnValidThread());
render_frame_suspended_ = render_frame_suspended;
}
MediaStreamVideoRenderer::RepaintCB GetRepaintCallback() {
return base::Bind(&FrameDeliverer::OnVideoFrame,
weak_factory_.GetWeakPtr());
}
private:
friend class WebMediaPlayerMS;
void EnqueueFrame(const scoped_refptr<media::VideoFrame>& frame) {
DCHECK(io_thread_checker_.CalledOnValidThread()); DCHECK(io_thread_checker_.CalledOnValidThread());
base::TimeTicks render_time; base::TimeTicks render_time;
if (frame->metadata()->GetTimeTicks( if (frame->metadata()->GetTimeTicks(
media::VideoFrameMetadata::REFERENCE_TIME, &render_time)) { media::VideoFrameMetadata::REFERENCE_TIME, &render_time)) {
TRACE_EVENT1("media", "FrameReady", "Ideal Render Instant", TRACE_EVENT1("media", "EnqueueFrame", "Ideal Render Instant",
render_time.ToInternalValue()); render_time.ToInternalValue());
} else { } else {
TRACE_EVENT0("media", "FrameReady"); TRACE_EVENT0("media", "EnqueueFrame");
} }
const bool is_opaque = media::IsOpaque(frame->format()); const bool is_opaque = media::IsOpaque(frame->format());
...@@ -177,18 +189,22 @@ class WebMediaPlayerMS::FrameDeliverer { ...@@ -177,18 +189,22 @@ class WebMediaPlayerMS::FrameDeliverer {
enqueue_frame_cb_.Run(frame); enqueue_frame_cb_.Run(frame);
} }
void SetRenderFrameSuspended(bool render_frame_suspended) { void DropCurrentPoolTasks() {
DCHECK(io_thread_checker_.CalledOnValidThread()); DCHECK(io_thread_checker_.CalledOnValidThread());
render_frame_suspended_ = render_frame_suspended; DCHECK(gpu_memory_buffer_pool_);
}
MediaStreamVideoRenderer::RepaintCB GetRepaintCallback() { if (!weak_factory_for_pool_.HasWeakPtrs())
return base::Bind(&FrameDeliverer::OnVideoFrame, return;
weak_factory_.GetWeakPtr());
}
private: // |gpu_memory_buffer_pool_| deletion is going to be posted to
friend class WebMediaPlayerMS; // |media_task_runner_|. base::Unretained() usage is fine since
// |gpu_memory_buffer_pool_| outlives the task.
media_task_runner_->PostTask(
FROM_HERE,
base::BindOnce(&media::GpuMemoryBufferVideoFramePool::Abort,
base::Unretained(gpu_memory_buffer_pool_.get())));
weak_factory_for_pool_.InvalidateWeakPtrs();
}
bool last_frame_opaque_; bool last_frame_opaque_;
media::VideoRotation last_frame_rotation_; media::VideoRotation last_frame_rotation_;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment