// 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. #include "media/blink/video_frame_compositor.h" #include "media/base/video_frame.h" namespace media { static bool IsOpaque(const scoped_refptr& frame) { switch (frame->format()) { case VideoFrame::UNKNOWN: case VideoFrame::YV12: case VideoFrame::YV12J: case VideoFrame::YV12HD: case VideoFrame::YV16: case VideoFrame::I420: case VideoFrame::YV24: case VideoFrame::NV12: return true; case VideoFrame::YV12A: #if defined(VIDEO_HOLE) case VideoFrame::HOLE: #endif // defined(VIDEO_HOLE) case VideoFrame::NATIVE_TEXTURE: case VideoFrame::ARGB: break; } return false; } VideoFrameCompositor::VideoFrameCompositor( const base::Callback& natural_size_changed_cb, const base::Callback& opacity_changed_cb) : natural_size_changed_cb_(natural_size_changed_cb), opacity_changed_cb_(opacity_changed_cb), client_(NULL) { } VideoFrameCompositor::~VideoFrameCompositor() { if (client_) client_->StopUsingProvider(); } void VideoFrameCompositor::SetVideoFrameProviderClient( cc::VideoFrameProvider::Client* client) { if (client_) client_->StopUsingProvider(); client_ = client; } scoped_refptr VideoFrameCompositor::GetCurrentFrame() { return current_frame_; } void VideoFrameCompositor::PutCurrentFrame( const scoped_refptr& frame) { } void VideoFrameCompositor::UpdateCurrentFrame( const scoped_refptr& frame) { if (current_frame_.get() && current_frame_->natural_size() != frame->natural_size()) { natural_size_changed_cb_.Run(frame->natural_size()); } if (!current_frame_.get() || IsOpaque(current_frame_) != IsOpaque(frame)) { opacity_changed_cb_.Run(IsOpaque(frame)); } current_frame_ = frame; if (client_) client_->DidReceiveFrame(); } } // namespace media