#include "media/video/video_encode_accelerator_adapter.h"
#include <limits>
#include <vector>
#include "base/functional/callback_helpers.h"
#include "base/logging.h"
#include "base/memory/ref_counted.h"
#include "base/numerics/checked_math.h"
#include "base/numerics/safe_conversions.h"
#include "base/synchronization/waitable_event.h"
#include "base/task/bind_post_task.h"
#include "base/task/sequenced_task_runner.h"
#include "base/time/time.h"
#include "base/trace_event/trace_event.h"
#include "build/build_config.h"
#include "components/viz/common/resources/shared_image_format_utils.h"
#include "gpu/ipc/common/gpu_memory_buffer_support.h"
#include "media/base/bitstream_buffer.h"
#include "media/base/media_log.h"
#include "media/base/media_switches.h"
#include "media/base/svc_scalability_mode.h"
#include "media/base/video_frame.h"
#include "media/base/video_util.h"
#if BUILDFLAG(USE_PROPRIETARY_CODECS)
#include "media/formats/mp4/h264_annex_b_to_avc_bitstream_converter.h"
#if BUILDFLAG(ENABLE_PLATFORM_HEVC) && \
BUILDFLAG(ENABLE_HEVC_PARSER_AND_HW_DECODER)
#include "media/formats/mp4/h265_annex_b_to_hevc_bitstream_converter.h"
#endif
#endif
#include "media/video/gpu_video_accelerator_factories.h"
#include "media/video/video_encoder_info.h"
namespace media {
namespace {
BASE_FEATURE(…);
constexpr int kVEADefaultBitratePerPixel = …;
uint32_t ComputeCheckedDefaultBitrate(const gfx::Size& frame_size) { … }
uint32_t ComputeCheckedPeakBitrate(uint32_t target_bitrate) { … }
Bitrate CreateBitrate(
const std::optional<Bitrate>& requested_bitrate,
const gfx::Size& frame_size,
VideoEncodeAccelerator::SupportedRateControlMode supported_rc_modes) { … }
VideoEncodeAccelerator::Config SetUpVeaConfig(
VideoCodecProfile profile,
const VideoEncoder::Options& opts,
VideoPixelFormat format,
VideoFrame::StorageType storage_type,
VideoEncodeAccelerator::SupportedRateControlMode supported_rc_modes,
VideoEncodeAccelerator::Config::EncoderType required_encoder_type) { … }
}
class VideoEncodeAcceleratorAdapter::GpuMemoryBufferVideoFramePool
: public base::RefCountedThreadSafe<GpuMemoryBufferVideoFramePool> { … };
class VideoEncodeAcceleratorAdapter::ReadOnlyRegionPool
: public base::RefCountedThreadSafe<ReadOnlyRegionPool> { … };
VideoEncodeAcceleratorAdapter::PendingOp::PendingOp() = default;
VideoEncodeAcceleratorAdapter::PendingOp::~PendingOp() = default;
VideoEncodeAcceleratorAdapter::VideoEncodeAcceleratorAdapter(
GpuVideoAcceleratorFactories* gpu_factories,
std::unique_ptr<MediaLog> media_log,
scoped_refptr<base::SequencedTaskRunner> callback_task_runner,
VideoEncodeAccelerator::Config::EncoderType required_encoder_type)
: … { … }
VideoEncodeAcceleratorAdapter::~VideoEncodeAcceleratorAdapter() { … }
void VideoEncodeAcceleratorAdapter::DestroyAsync(
std::unique_ptr<VideoEncodeAcceleratorAdapter> self) { … }
void VideoEncodeAcceleratorAdapter::SetInputBufferPreferenceForTesting(
InputBufferKind pref) { … }
void VideoEncodeAcceleratorAdapter::Initialize(VideoCodecProfile profile,
const Options& options,
EncoderInfoCB info_cb,
OutputCB output_cb,
EncoderStatusCB done_cb) { … }
void VideoEncodeAcceleratorAdapter::InitializeOnAcceleratorThread(
VideoCodecProfile profile,
const Options& options,
EncoderInfoCB info_cb,
OutputCB output_cb,
EncoderStatusCB done_cb) { … }
void VideoEncodeAcceleratorAdapter::InitializeInternalOnAcceleratorThread() { … }
void VideoEncodeAcceleratorAdapter::Encode(scoped_refptr<VideoFrame> frame,
const EncodeOptions& encode_options,
EncoderStatusCB done_cb) { … }
void VideoEncodeAcceleratorAdapter::EncodeOnAcceleratorThread(
scoped_refptr<VideoFrame> frame,
EncodeOptions encode_options,
EncoderStatusCB done_cb) { … }
void VideoEncodeAcceleratorAdapter::ChangeOptions(const Options& options,
OutputCB output_cb,
EncoderStatusCB done_cb) { … }
void VideoEncodeAcceleratorAdapter::ChangeOptionsOnAcceleratorThread(
const Options options,
OutputCB output_cb,
EncoderStatusCB done_cb) { … }
void VideoEncodeAcceleratorAdapter::Flush(EncoderStatusCB done_cb) { … }
void VideoEncodeAcceleratorAdapter::FlushOnAcceleratorThread(
EncoderStatusCB done_cb) { … }
void VideoEncodeAcceleratorAdapter::RequireBitstreamBuffers(
unsigned int input_count,
const gfx::Size& input_coded_size,
size_t output_buffer_size) { … }
void VideoEncodeAcceleratorAdapter::BitstreamBufferReady(
int32_t buffer_id,
const BitstreamBufferMetadata& metadata) { … }
void VideoEncodeAcceleratorAdapter::NotifyErrorStatus(
const EncoderStatus& status) { … }
void VideoEncodeAcceleratorAdapter::NotifyEncoderInfoChange(
const VideoEncoderInfo& info) { … }
void VideoEncodeAcceleratorAdapter::InitCompleted(EncoderStatus status) { … }
void VideoEncodeAcceleratorAdapter::FlushCompleted(bool success) { … }
template <class T>
T VideoEncodeAcceleratorAdapter::WrapCallback(T cb) { … }
EncoderStatus::Or<scoped_refptr<VideoFrame>>
VideoEncodeAcceleratorAdapter::PrepareCpuFrame(
scoped_refptr<VideoFrame> src_frame) { … }
EncoderStatus::Or<scoped_refptr<VideoFrame>>
VideoEncodeAcceleratorAdapter::PrepareGpuFrame(
scoped_refptr<VideoFrame> src_frame) { … }
}