| Index: content/renderer/media/video_frame_compositor.cc
|
| diff --git a/content/renderer/media/video_frame_compositor.cc b/content/renderer/media/video_frame_compositor.cc
|
| index e991357bb370b7f2f30b3778e222ca66a8100f98..9d534da7ff4229b4e06fdfcd835c9f84680fbacd 100644
|
| --- a/content/renderer/media/video_frame_compositor.cc
|
| +++ b/content/renderer/media/video_frame_compositor.cc
|
| @@ -4,11 +4,6 @@
|
|
|
| #include "content/renderer/media/video_frame_compositor.h"
|
|
|
| -#include "base/bind.h"
|
| -#include "base/location.h"
|
| -#include "base/single_thread_task_runner.h"
|
| -#include "cc/layers/video_frame_provider.h"
|
| -#include "content/renderer/render_thread_impl.h"
|
| #include "media/base/video_frame.h"
|
|
|
| namespace content {
|
| @@ -32,141 +27,52 @@ static bool IsOpaque(const scoped_refptr<media::VideoFrame>& frame) {
|
| return false;
|
| }
|
|
|
| -class VideoFrameCompositor::Internal : public cc::VideoFrameProvider {
|
| - public:
|
| - Internal(
|
| - const scoped_refptr<base::SingleThreadTaskRunner>& compositor_task_runner,
|
| - const base::Callback<void(gfx::Size)>& natural_size_changed_cb,
|
| - const base::Callback<void(bool)>& opacity_changed_cb)
|
| - : compositor_task_runner_(compositor_task_runner),
|
| - natural_size_changed_cb_(natural_size_changed_cb),
|
| - opacity_changed_cb_(opacity_changed_cb),
|
| - client_(NULL),
|
| - compositor_notification_pending_(false),
|
| - frames_dropped_before_compositor_was_notified_(0) {}
|
| -
|
| - virtual ~Internal() {
|
| - if (client_)
|
| - client_->StopUsingProvider();
|
| - }
|
| -
|
| - void DeleteSoon() {
|
| - compositor_task_runner_->DeleteSoon(FROM_HERE, this);
|
| - }
|
| -
|
| - void UpdateCurrentFrame(const scoped_refptr<media::VideoFrame>& frame) {
|
| - base::AutoLock auto_lock(lock_);
|
| -
|
| - if (current_frame_ &&
|
| - current_frame_->natural_size() != frame->natural_size()) {
|
| - natural_size_changed_cb_.Run(frame->natural_size());
|
| - }
|
| -
|
| - if (!current_frame_ || IsOpaque(current_frame_) != IsOpaque(frame)) {
|
| - opacity_changed_cb_.Run(IsOpaque(frame));
|
| - }
|
| -
|
| - current_frame_ = frame;
|
| -
|
| - // Count frames as dropped if and only if we updated the frame but didn't
|
| - // finish notifying the compositor for the previous frame.
|
| - if (compositor_notification_pending_) {
|
| - if (frames_dropped_before_compositor_was_notified_ < kuint32max)
|
| - ++frames_dropped_before_compositor_was_notified_;
|
| - return;
|
| - }
|
| -
|
| - compositor_notification_pending_ = true;
|
| - compositor_task_runner_->PostTask(
|
| - FROM_HERE,
|
| - base::Bind(&Internal::NotifyCompositorOfNewFrame,
|
| - base::Unretained(this)));
|
| - }
|
| -
|
| - uint32 GetFramesDroppedBeforeCompositorWasNotified() {
|
| - base::AutoLock auto_lock(lock_);
|
| - return frames_dropped_before_compositor_was_notified_;
|
| - }
|
| -
|
| - void SetFramesDroppedBeforeCompositorWasNotifiedForTesting(
|
| - uint32 dropped_frames) {
|
| - base::AutoLock auto_lock(lock_);
|
| - frames_dropped_before_compositor_was_notified_ = dropped_frames;
|
| - }
|
| -
|
| - // cc::VideoFrameProvider implementation.
|
| - virtual void SetVideoFrameProviderClient(
|
| - cc::VideoFrameProvider::Client* client) OVERRIDE {
|
| - if (client_)
|
| - client_->StopUsingProvider();
|
| - client_ = client;
|
| - }
|
| -
|
| - virtual scoped_refptr<media::VideoFrame> GetCurrentFrame() OVERRIDE {
|
| - base::AutoLock auto_lock(lock_);
|
| - return current_frame_;
|
| - }
|
| -
|
| - virtual void PutCurrentFrame(const scoped_refptr<media::VideoFrame>& frame)
|
| - OVERRIDE {}
|
| -
|
| - private:
|
| - void NotifyCompositorOfNewFrame() {
|
| - base::AutoLock auto_lock(lock_);
|
| - compositor_notification_pending_ = false;
|
| - if (client_)
|
| - client_->DidReceiveFrame();
|
| - }
|
| -
|
| - scoped_refptr<base::SingleThreadTaskRunner> compositor_task_runner_;
|
| - base::Callback<void(gfx::Size)> natural_size_changed_cb_;
|
| - base::Callback<void(bool)> opacity_changed_cb_;
|
| -
|
| - cc::VideoFrameProvider::Client* client_;
|
| -
|
| - base::Lock lock_;
|
| - scoped_refptr<media::VideoFrame> current_frame_;
|
| - bool compositor_notification_pending_;
|
| - uint32 frames_dropped_before_compositor_was_notified_;
|
| -
|
| - DISALLOW_COPY_AND_ASSIGN(Internal);
|
| -};
|
| -
|
| VideoFrameCompositor::VideoFrameCompositor(
|
| - const scoped_refptr<base::SingleThreadTaskRunner>& compositor_task_runner,
|
| const base::Callback<void(gfx::Size)>& natural_size_changed_cb,
|
| const base::Callback<void(bool)>& opacity_changed_cb)
|
| - : internal_(new Internal(compositor_task_runner,
|
| - natural_size_changed_cb,
|
| - opacity_changed_cb)) {
|
| + : natural_size_changed_cb_(natural_size_changed_cb),
|
| + opacity_changed_cb_(opacity_changed_cb),
|
| + client_(NULL) {
|
| }
|
|
|
| VideoFrameCompositor::~VideoFrameCompositor() {
|
| - internal_->DeleteSoon();
|
| + if (client_)
|
| + client_->StopUsingProvider();
|
| }
|
|
|
| -cc::VideoFrameProvider* VideoFrameCompositor::GetVideoFrameProvider() {
|
| - return internal_;
|
| -}
|
| -
|
| -void VideoFrameCompositor::UpdateCurrentFrame(
|
| - const scoped_refptr<media::VideoFrame>& frame) {
|
| - internal_->UpdateCurrentFrame(frame);
|
| +void VideoFrameCompositor::SetVideoFrameProviderClient(
|
| + cc::VideoFrameProvider::Client* client) {
|
| + if (client_)
|
| + client_->StopUsingProvider();
|
| + client_ = client;
|
| }
|
|
|
| scoped_refptr<media::VideoFrame> VideoFrameCompositor::GetCurrentFrame() {
|
| - return internal_->GetCurrentFrame();
|
| + base::AutoLock auto_lock(lock_);
|
| + return current_frame_;
|
| }
|
|
|
| -uint32 VideoFrameCompositor::GetFramesDroppedBeforeCompositorWasNotified() {
|
| - return internal_->GetFramesDroppedBeforeCompositorWasNotified();
|
| +void VideoFrameCompositor::PutCurrentFrame(
|
| + const scoped_refptr<media::VideoFrame>& frame) {
|
| }
|
|
|
| -void
|
| -VideoFrameCompositor::SetFramesDroppedBeforeCompositorWasNotifiedForTesting(
|
| - uint32 dropped_frames) {
|
| - internal_->SetFramesDroppedBeforeCompositorWasNotifiedForTesting(
|
| - dropped_frames);
|
| +void VideoFrameCompositor::UpdateCurrentFrame(
|
| + const scoped_refptr<media::VideoFrame>& frame) {
|
| + base::AutoLock auto_lock(lock_);
|
| +
|
| + if (current_frame_ &&
|
| + current_frame_->natural_size() != frame->natural_size()) {
|
| + natural_size_changed_cb_.Run(frame->natural_size());
|
| + }
|
| +
|
| + if (!current_frame_ || IsOpaque(current_frame_) != IsOpaque(frame)) {
|
| + opacity_changed_cb_.Run(IsOpaque(frame));
|
| + }
|
| +
|
| + current_frame_ = frame;
|
| +
|
| + if (client_)
|
| + client_->DidReceiveFrame();
|
| }
|
|
|
| } // namespace content
|
|
|