// Copyright 2014 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef CONTENT_RENDERER_MEDIA_VIDEO_FRAME_COMPOSITOR_H_
#define CONTENT_RENDERER_MEDIA_VIDEO_FRAME_COMPOSITOR_H_
#include "base/callback.h"
#include "base/memory/ref_counted.h"
#include "base/synchronization/lock.h"
#include "content/common/content_export.h"
#include "ui/gfx/size.h"
namespace base {
class SingleThreadTaskRunner;
}
namespace cc {
class VideoFrameProvider;
}
namespace media {
class VideoFrame;
}
namespace content {
// VideoFrameCompositor handles incoming frames by notifying the compositor in a
// thread-safe manner.
//
// Typical usage is to deliver the output of VideoRendererImpl to
// UpdateCurrentFrame() so that VideoFrameCompositor can take care of tracking
// dropped frames and firing callbacks as needed.
//
// All APIs are callable from any thread.
class CONTENT_EXPORT VideoFrameCompositor {
public:
// |compositor_task_runner| is the task runner of the compositor.
//
// |natural_size_changed_cb| is run with the new natural size of the video
// frame whenever a change in natural size is detected. It is not called the
// first time UpdateCurrentFrame() is called. Run on the same thread as the
// caller of UpdateCurrentFrame().
VideoFrameCompositor(
const scoped_refptr<base::SingleThreadTaskRunner>& compositor_task_runner,
const base::Callback<void(gfx::Size)>& natural_size_changed_cb);
~VideoFrameCompositor();
cc::VideoFrameProvider* GetVideoFrameProvider();
// Updates the current frame and notifies the compositor.
void UpdateCurrentFrame(const scoped_refptr<media::VideoFrame>& frame);
// Retrieves the last frame set via UpdateCurrentFrame() for non-compositing
// purposes (e.g., painting to a canvas).
//
// Note that the compositor retrieves frames via the cc::VideoFrameProvider
// interface instead of using this method.
scoped_refptr<media::VideoFrame> GetCurrentFrame();
// Returns the number of frames dropped before the compositor was notified
// of a new frame.
uint32 GetFramesDroppedBeforeCompositorWasNotified();
void SetFramesDroppedBeforeCompositorWasNotifiedForTesting(
uint32 dropped_frames);
private:
class Internal;
Internal* internal_;
DISALLOW_COPY_AND_ASSIGN(VideoFrameCompositor);
};
} // namespace content
#endif // CONTENT_RENDERER_MEDIA_VIDEO_FRAME_COMPOSITOR_H_