FFmpeg
Loading...
Searching...
No Matches
d3d12va_encode.c File Reference
#include "libavutil/avassert.h"
#include "libavutil/common.h"
#include "libavutil/internal.h"
#include "libavutil/log.h"
#include "libavutil/mem.h"
#include "libavutil/pixdesc.h"
#include "libavutil/hwcontext_d3d12va_internal.h"
#include "libavutil/hwcontext_d3d12va.h"
#include "config_components.h"
#include "avcodec.h"
#include "d3d12va_encode.h"
#include "encode.h"

Go to the source code of this file.

Data Structures

struct  CommandAllocator
 

Macros

#define TRANSITION_BARRIER(res, subres, before, after)
 
#define SET_QP_RANGE(ctl)
 
#define SET_MAX_FRAME_SIZE(ctl)
 
#define TRY_RC_MODE(mode, fail)
 

Functions

void ff_d3d12va_encode_check_encoder_feature_flags (void *log_ctx, D3D12_VIDEO_ENCODER_VALIDATION_FLAGS flags)
 
static int d3d12va_fence_completion (AVD3D12VASyncContext *psync_ctx)
 
static int d3d12va_sync_with_gpu (AVCodecContext *avctx)
 
static int d3d12va_get_valid_command_allocator (AVCodecContext *avctx, ID3D12CommandAllocator **ppAllocator)
 
static int d3d12va_discard_command_allocator (AVCodecContext *avctx, ID3D12CommandAllocator *pAllocator, uint64_t fence_value)
 
static int d3d12va_encode_wait (AVCodecContext *avctx, FFHWBaseEncodePicture *base_pic)
 
static int d3d12va_encode_setup_roi (AVCodecContext *avctx, D3D12VAEncodePicture *pic, const uint8_t *data, size_t size)
 
static int d3d12va_encode_create_metadata_buffers (AVCodecContext *avctx, D3D12VAEncodePicture *pic)
 
static int d3d12va_encode_issue (AVCodecContext *avctx, FFHWBaseEncodePicture *base_pic)
 
static int d3d12va_encode_discard (AVCodecContext *avctx, FFHWBaseEncodePicture *base_pic)
 
static int d3d12va_encode_free_rc_params (AVCodecContext *avctx)
 
static int d3d12va_encode_init (AVCodecContext *avctx, FFHWBaseEncodePicture *pic)
 
static int d3d12va_encode_free (AVCodecContext *avctx, FFHWBaseEncodePicture *pic)
 
static int d3d12va_encode_get_buffer_size (AVCodecContext *avctx, D3D12VAEncodePicture *pic, size_t *size)
 
static int d3d12va_encode_get_coded_data (AVCodecContext *avctx, D3D12VAEncodePicture *pic, AVPacket *pkt)
 
static int d3d12va_encode_output (AVCodecContext *avctx, FFHWBaseEncodePicture *base_pic, AVPacket *pkt)
 
static int d3d12va_encode_set_profile (AVCodecContext *avctx)
 
static int check_rate_control_support (AVCodecContext *avctx, const D3D12VAEncodeRCMode *rc_mode)
 
static int d3d12va_encode_init_rate_control (AVCodecContext *avctx)
 
static int d3d12va_encode_init_gop_structure (AVCodecContext *avctx)
 
static int d3d12va_encode_init_intra_refresh (AVCodecContext *avctx)
 
static int d3d12va_create_encoder (AVCodecContext *avctx)
 
static int d3d12va_create_encoder_heap (AVCodecContext *avctx)
 
static void d3d12va_encode_free_buffer (void *opaque, uint8_t *data)
 
static AVBufferRefd3d12va_encode_alloc_output_buffer (void *opaque, size_t size)
 
static int d3d12va_encode_prepare_output_buffers (AVCodecContext *avctx)
 
static int d3d12va_encode_create_command_objects (AVCodecContext *avctx)
 
static int d3d12va_encode_create_recon_frames (AVCodecContext *avctx)
 
int ff_d3d12va_encode_receive_packet (AVCodecContext *avctx, AVPacket *pkt)
 
int ff_d3d12va_encode_init (AVCodecContext *avctx)
 
int ff_d3d12va_encode_close (AVCodecContext *avctx)
 

Variables

const AVCodecHWConfigInternal *const ff_d3d12va_encode_hw_configs []
 
static const D3D12VAEncodeRCMode d3d12va_encode_rc_modes []
 
static const FFHWEncodePictureOperation d3d12va_type
 

Macro Definition Documentation

◆ TRANSITION_BARRIER

#define TRANSITION_BARRIER ( res,
subres,
before,
after )
Value:
(D3D12_RESOURCE_BARRIER) { \
.Type = D3D12_RESOURCE_BARRIER_TYPE_TRANSITION, \
.Flags = D3D12_RESOURCE_BARRIER_FLAG_NONE, \
.Transition = { \
.pResource = res, \
.Subresource = subres, \
.StateBefore = before, \
.StateAfter = after, \
}, \
}

Referenced by d3d12va_encode_issue().

◆ SET_QP_RANGE

#define SET_QP_RANGE ( ctl)
Value:
do { \
if (avctx->qmin > 0 || avctx->qmax > 0) { \
ctl->MinQP = avctx->qmin; \
ctl->MaxQP = avctx->qmax; \
ctx->rc.Flags |= D3D12_VIDEO_ENCODER_RATE_CONTROL_FLAG_ENABLE_QP_RANGE; \
} \
} while(0)
static AVFormatContext * ctx
Definition movenc.c:49

Referenced by d3d12va_encode_init_rate_control().

◆ SET_MAX_FRAME_SIZE

#define SET_MAX_FRAME_SIZE ( ctl)
Value:
do { \
if (ctx->max_frame_size > 0) { \
ctl->MaxFrameBitSize = ctx->max_frame_size * 8; \
ctx->rc.Flags |= D3D12_VIDEO_ENCODER_RATE_CONTROL_FLAG_ENABLE_MAX_FRAME_SIZE; \
} \
} while(0)

Referenced by d3d12va_encode_init_rate_control().

◆ TRY_RC_MODE

#define TRY_RC_MODE ( mode,
fail )
Value:
do { \
if (!(rc_mode->d3d12_mode && check_rate_control_support(avctx, rc_mode))) { \
if (fail) { \
av_log(avctx, AV_LOG_ERROR, "Driver does not support %s " \
"RC mode.\n", rc_mode->name); \
return AVERROR(EINVAL); \
} \
av_log(avctx, AV_LOG_DEBUG, "Driver does not support %s " \
"RC mode.\n", rc_mode->name); \
} else { \
goto rc_mode_found; \
} \
} while (0)
#define NULL
Definition coverity.c:32
static const D3D12VAEncodeRCMode d3d12va_encode_rc_modes[]
static int check_rate_control_support(AVCodecContext *avctx, const D3D12VAEncodeRCMode *rc_mode)
#define fail
Definition test.h:479
#define AVERROR(e)
Definition error.h:45
#define AV_LOG_DEBUG
Stuff which is only useful for libav* developers.
Definition log.h:231
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
Definition log.h:210
mfxU16 rc_mode
Definition qsvenc.c:141
Definition swscale.c:71

Referenced by d3d12va_encode_init_rate_control().

Function Documentation

◆ ff_d3d12va_encode_check_encoder_feature_flags()

void ff_d3d12va_encode_check_encoder_feature_flags ( void * log_ctx,
D3D12_VIDEO_ENCODER_VALIDATION_FLAGS flags )

◆ d3d12va_fence_completion()

static int d3d12va_fence_completion ( AVD3D12VASyncContext * psync_ctx)
static

Definition at line 65 of file d3d12va_encode.c.

Referenced by d3d12va_sync_with_gpu().

◆ d3d12va_sync_with_gpu()

static int d3d12va_sync_with_gpu ( AVCodecContext * avctx)
static

Definition at line 78 of file d3d12va_encode.c.

Referenced by d3d12va_encode_create_command_objects().

◆ d3d12va_get_valid_command_allocator()

static int d3d12va_get_valid_command_allocator ( AVCodecContext * avctx,
ID3D12CommandAllocator ** ppAllocator )
static

Definition at line 94 of file d3d12va_encode.c.

Referenced by d3d12va_encode_create_command_objects(), and d3d12va_encode_issue().

◆ d3d12va_discard_command_allocator()

static int d3d12va_discard_command_allocator ( AVCodecContext * avctx,
ID3D12CommandAllocator * pAllocator,
uint64_t fence_value )
static

◆ d3d12va_encode_wait()

static int d3d12va_encode_wait ( AVCodecContext * avctx,
FFHWBaseEncodePicture * base_pic )
static

Definition at line 133 of file d3d12va_encode.c.

Referenced by d3d12va_encode_discard(), and d3d12va_encode_output().

◆ d3d12va_encode_setup_roi()

static int d3d12va_encode_setup_roi ( AVCodecContext * avctx,
D3D12VAEncodePicture * pic,
const uint8_t * data,
size_t size )
static

Definition at line 166 of file d3d12va_encode.c.

Referenced by d3d12va_encode_issue().

◆ d3d12va_encode_create_metadata_buffers()

static int d3d12va_encode_create_metadata_buffers ( AVCodecContext * avctx,
D3D12VAEncodePicture * pic )
static

Definition at line 265 of file d3d12va_encode.c.

Referenced by d3d12va_encode_issue().

◆ d3d12va_encode_issue()

static int d3d12va_encode_issue ( AVCodecContext * avctx,
FFHWBaseEncodePicture * base_pic )
static

Definition at line 319 of file d3d12va_encode.c.

◆ d3d12va_encode_discard()

static int d3d12va_encode_discard ( AVCodecContext * avctx,
FFHWBaseEncodePicture * base_pic )
static

Definition at line 735 of file d3d12va_encode.c.

Referenced by d3d12va_encode_free().

◆ d3d12va_encode_free_rc_params()

static int d3d12va_encode_free_rc_params ( AVCodecContext * avctx)
static

Definition at line 757 of file d3d12va_encode.c.

Referenced by ff_d3d12va_encode_close().

◆ d3d12va_encode_init()

static int d3d12va_encode_init ( AVCodecContext * avctx,
FFHWBaseEncodePicture * pic )
static

Definition at line 782 of file d3d12va_encode.c.

◆ d3d12va_encode_free()

static int d3d12va_encode_free ( AVCodecContext * avctx,
FFHWBaseEncodePicture * pic )
static

Definition at line 799 of file d3d12va_encode.c.

Referenced by ff_d3d12va_encode_close().

◆ d3d12va_encode_get_buffer_size()

static int d3d12va_encode_get_buffer_size ( AVCodecContext * avctx,
D3D12VAEncodePicture * pic,
size_t * size )
static

Definition at line 816 of file d3d12va_encode.c.

Referenced by d3d12va_encode_get_coded_data().

◆ d3d12va_encode_get_coded_data()

static int d3d12va_encode_get_coded_data ( AVCodecContext * avctx,
D3D12VAEncodePicture * pic,
AVPacket * pkt )
static

Definition at line 851 of file d3d12va_encode.c.

Referenced by d3d12va_encode_output().

◆ d3d12va_encode_output()

static int d3d12va_encode_output ( AVCodecContext * avctx,
FFHWBaseEncodePicture * base_pic,
AVPacket * pkt )
static

Definition at line 893 of file d3d12va_encode.c.

◆ d3d12va_encode_set_profile()

static int d3d12va_encode_set_profile ( AVCodecContext * avctx)
static

Definition at line 923 of file d3d12va_encode.c.

Referenced by ff_d3d12va_encode_init().

◆ check_rate_control_support()

static int check_rate_control_support ( AVCodecContext * avctx,
const D3D12VAEncodeRCMode * rc_mode )
static

Definition at line 986 of file d3d12va_encode.c.

◆ d3d12va_encode_init_rate_control()

static int d3d12va_encode_init_rate_control ( AVCodecContext * avctx)
static

Definition at line 1011 of file d3d12va_encode.c.

Referenced by ff_d3d12va_encode_init().

◆ d3d12va_encode_init_gop_structure()

static int d3d12va_encode_init_gop_structure ( AVCodecContext * avctx)
static

Definition at line 1287 of file d3d12va_encode.c.

Referenced by ff_d3d12va_encode_init().

◆ d3d12va_encode_init_intra_refresh()

static int d3d12va_encode_init_intra_refresh ( AVCodecContext * avctx)
static

Definition at line 1377 of file d3d12va_encode.c.

Referenced by ff_d3d12va_encode_init().

◆ d3d12va_create_encoder()

static int d3d12va_create_encoder ( AVCodecContext * avctx)
static

Definition at line 1452 of file d3d12va_encode.c.

Referenced by ff_d3d12va_encode_init().

◆ d3d12va_create_encoder_heap()

static int d3d12va_create_encoder_heap ( AVCodecContext * avctx)
static

Definition at line 1479 of file d3d12va_encode.c.

Referenced by ff_d3d12va_encode_init().

◆ d3d12va_encode_free_buffer()

static void d3d12va_encode_free_buffer ( void * opaque,
uint8_t * data )
static

Definition at line 1504 of file d3d12va_encode.c.

Referenced by d3d12va_encode_alloc_output_buffer().

◆ d3d12va_encode_alloc_output_buffer()

static AVBufferRef * d3d12va_encode_alloc_output_buffer ( void * opaque,
size_t size )
static

Definition at line 1512 of file d3d12va_encode.c.

Referenced by d3d12va_encode_prepare_output_buffers().

◆ d3d12va_encode_prepare_output_buffers()

static int d3d12va_encode_prepare_output_buffers ( AVCodecContext * avctx)
static

Definition at line 1560 of file d3d12va_encode.c.

Referenced by ff_d3d12va_encode_init().

◆ d3d12va_encode_create_command_objects()

static int d3d12va_encode_create_command_objects ( AVCodecContext * avctx)
static

Definition at line 1594 of file d3d12va_encode.c.

Referenced by ff_d3d12va_encode_init().

◆ d3d12va_encode_create_recon_frames()

static int d3d12va_encode_create_recon_frames ( AVCodecContext * avctx)
static

Definition at line 1670 of file d3d12va_encode.c.

Referenced by ff_d3d12va_encode_init().

◆ ff_d3d12va_encode_receive_packet()

int ff_d3d12va_encode_receive_packet ( AVCodecContext * avctx,
AVPacket * pkt )

Definition at line 1723 of file d3d12va_encode.c.

◆ ff_d3d12va_encode_init()

int ff_d3d12va_encode_init ( AVCodecContext * avctx)

◆ ff_d3d12va_encode_close()

int ff_d3d12va_encode_close ( AVCodecContext * avctx)

Variable Documentation

◆ ff_d3d12va_encode_hw_configs

const AVCodecHWConfigInternal* const ff_d3d12va_encode_hw_configs[]
Initial value:
= {
HW_CONFIG_ENCODER_FRAMES(D3D12, D3D12VA),
}
#define HW_CONFIG_ENCODER_FRAMES(format, device_type_)
Definition hwconfig.h:100

Definition at line 37 of file d3d12va_encode.c.

◆ d3d12va_encode_rc_modes

const D3D12VAEncodeRCMode d3d12va_encode_rc_modes[]
static
Initial value:
= {
{ 0 },
{ RC_MODE_CQP, "CQP", 0, 0, 1, 0, D3D12_VIDEO_ENCODER_RATE_CONTROL_MODE_CQP },
{ RC_MODE_CBR, "CBR", 1, 0, 0, 1, D3D12_VIDEO_ENCODER_RATE_CONTROL_MODE_CBR },
{ RC_MODE_VBR, "VBR", 1, 1, 0, 1, D3D12_VIDEO_ENCODER_RATE_CONTROL_MODE_VBR },
{ RC_MODE_QVBR, "QVBR", 1, 1, 1, 1, D3D12_VIDEO_ENCODER_RATE_CONTROL_MODE_QVBR },
}
@ RC_MODE_CQP
@ RC_MODE_QVBR
@ RC_MODE_CBR
@ RC_MODE_VBR

Definition at line 976 of file d3d12va_encode.c.

◆ d3d12va_type

const FFHWEncodePictureOperation d3d12va_type
static
Initial value:
= {
.priv_size = sizeof(D3D12VAEncodePicture),
}
static int d3d12va_encode_free(AVCodecContext *avctx, FFHWBaseEncodePicture *pic)
static int d3d12va_encode_issue(AVCodecContext *avctx, FFHWBaseEncodePicture *base_pic)
static int d3d12va_encode_output(AVCodecContext *avctx, FFHWBaseEncodePicture *base_pic, AVPacket *pkt)
static int d3d12va_encode_init(AVCodecContext *avctx, FFHWBaseEncodePicture *pic)
int(* init)(AVBSFContext *ctx)
Definition dts2pts.c:608

Definition at line 1711 of file d3d12va_encode.c.

Referenced by ff_d3d12va_encode_init().