#include "third_party/blink/renderer/platform/webrtc/webrtc_video_frame_adapter.h"
#include <cmath>
#include <vector>
#include "base/containers/contains.h"
#include "base/dcheck_is_on.h"
#include "base/memory/raw_ptr.h"
#include "base/synchronization/waitable_event.h"
#include "base/threading/thread_restrictions.h"
#include "cc/trees/raster_context_provider_wrapper.h"
#include "gpu/command_buffer/client/client_shared_image.h"
#include "gpu/command_buffer/client/gpu_memory_buffer_manager.h"
#include "gpu/command_buffer/client/raster_interface.h"
#include "gpu/command_buffer/client/shared_image_interface.h"
#include "gpu/command_buffer/common/shared_image_capabilities.h"
#include "gpu/command_buffer/common/shared_image_usage.h"
#include "media/base/simple_sync_token_client.h"
#include "media/base/video_frame.h"
#include "media/base/video_types.h"
#include "media/base/video_util.h"
#include "media/renderers/video_frame_rgba_to_yuva_converter.h"
#include "third_party/blink/public/platform/platform.h"
#include "third_party/blink/renderer/platform/graphics/web_graphics_context_3d_video_frame_pool.h"
#include "third_party/blink/renderer/platform/scheduler/public/main_thread.h"
#include "third_party/blink/renderer/platform/scheduler/public/post_cross_thread_task.h"
#include "third_party/blink/renderer/platform/webrtc/convert_to_webrtc_video_frame_buffer.h"
#include "third_party/blink/renderer/platform/wtf/cross_thread_functional.h"
#include "third_party/webrtc/rtc_base/ref_counted_object.h"
#include "ui/gfx/geometry/size.h"
namespace blink {
namespace {
bool IsApproxEquals(int a, int b) { … }
bool IsApproxEquals(const gfx::Rect& a, const gfx::Rect& b) { … }
static void CreateContextProviderOnMainThread(
scoped_refptr<viz::RasterContextProvider>* result,
base::WaitableEvent* waitable_event) { … }
class Context : public media::RenderableGpuMemoryBufferVideoFramePool::Context { … };
}
scoped_refptr<media::VideoFrame>
WebRtcVideoFrameAdapter::SharedResources::CreateFrame(
media::VideoPixelFormat format,
const gfx::Size& coded_size,
const gfx::Rect& visible_rect,
const gfx::Size& natural_size,
base::TimeDelta timestamp) { … }
media::EncoderStatus WebRtcVideoFrameAdapter::SharedResources::ConvertAndScale(
const media::VideoFrame& src_frame,
media::VideoFrame& dest_frame) { … }
scoped_refptr<viz::RasterContextProvider>
WebRtcVideoFrameAdapter::SharedResources::GetRasterContextProvider() { … }
bool CanUseGpuMemoryBufferReadback(
media::VideoPixelFormat format,
media::GpuVideoAcceleratorFactories* gpu_factories) { … }
scoped_refptr<media::VideoFrame>
WebRtcVideoFrameAdapter::SharedResources::ConstructVideoFrameFromTexture(
scoped_refptr<media::VideoFrame> source_frame) { … }
scoped_refptr<media::VideoFrame>
WebRtcVideoFrameAdapter::SharedResources::ConstructVideoFrameFromGpu(
scoped_refptr<media::VideoFrame> source_frame) { … }
void WebRtcVideoFrameAdapter::SharedResources::SetFeedback(
const media::VideoCaptureFeedback& feedback) { … }
media::VideoCaptureFeedback
WebRtcVideoFrameAdapter::SharedResources::GetFeedback() { … }
WebRtcVideoFrameAdapter::SharedResources::SharedResources(
media::GpuVideoAcceleratorFactories* gpu_factories)
: … { … }
WebRtcVideoFrameAdapter::SharedResources::~SharedResources() = default;
WebRtcVideoFrameAdapter::ScaledBufferSize::ScaledBufferSize(
gfx::Rect visible_rect,
gfx::Size natural_size)
: … { … }
bool WebRtcVideoFrameAdapter::ScaledBufferSize::operator==(
const ScaledBufferSize& rhs) const { … }
bool WebRtcVideoFrameAdapter::ScaledBufferSize::operator!=(
const ScaledBufferSize& rhs) const { … }
WebRtcVideoFrameAdapter::ScaledBufferSize
WebRtcVideoFrameAdapter::ScaledBufferSize::CropAndScale(
int offset_x,
int offset_y,
int crop_width,
int crop_height,
int scaled_width,
int scaled_height) const { … }
WebRtcVideoFrameAdapter::ScaledBuffer::ScaledBuffer(
scoped_refptr<WebRtcVideoFrameAdapter> parent,
ScaledBufferSize size)
: … { … }
rtc::scoped_refptr<webrtc::I420BufferInterface>
WebRtcVideoFrameAdapter::ScaledBuffer::ToI420() { … }
rtc::scoped_refptr<webrtc::VideoFrameBuffer>
WebRtcVideoFrameAdapter::ScaledBuffer::GetMappedFrameBuffer(
rtc::ArrayView<webrtc::VideoFrameBuffer::Type> types) { … }
rtc::scoped_refptr<webrtc::VideoFrameBuffer>
WebRtcVideoFrameAdapter::ScaledBuffer::CropAndScale(int offset_x,
int offset_y,
int crop_width,
int crop_height,
int scaled_width,
int scaled_height) { … }
std::string WebRtcVideoFrameAdapter::ScaledBuffer::storage_representation()
const { … }
WebRtcVideoFrameAdapter::WebRtcVideoFrameAdapter(
scoped_refptr<media::VideoFrame> frame)
: … { … }
WebRtcVideoFrameAdapter::WebRtcVideoFrameAdapter(
scoped_refptr<media::VideoFrame> frame,
scoped_refptr<SharedResources> shared_resources)
: … { … }
WebRtcVideoFrameAdapter::~WebRtcVideoFrameAdapter() { … }
rtc::scoped_refptr<webrtc::I420BufferInterface>
WebRtcVideoFrameAdapter::ToI420() { … }
rtc::scoped_refptr<webrtc::VideoFrameBuffer>
WebRtcVideoFrameAdapter::GetMappedFrameBuffer(
rtc::ArrayView<webrtc::VideoFrameBuffer::Type> types) { … }
rtc::scoped_refptr<webrtc::VideoFrameBuffer>
WebRtcVideoFrameAdapter::CropAndScale(int offset_x,
int offset_y,
int crop_width,
int crop_height,
int scaled_width,
int scaled_height) { … }
rtc::scoped_refptr<webrtc::VideoFrameBuffer>
WebRtcVideoFrameAdapter::GetOrCreateFrameBufferForSize(
const ScaledBufferSize& size) { … }
WebRtcVideoFrameAdapter::AdaptedFrame WebRtcVideoFrameAdapter::AdaptBestFrame(
const ScaledBufferSize& size) const { … }
scoped_refptr<media::VideoFrame>
WebRtcVideoFrameAdapter::GetAdaptedVideoBufferForTesting(
const ScaledBufferSize& size) { … }
std::string WebRtcVideoFrameAdapter::storage_representation() const { … }
}