34 int type,
char *
data,
size_t bit_len)
38 VABufferID param_buffer, data_buffer;
39 VAEncPackedHeaderParameterBuffer
params = {
41 .bit_length = bit_len,
42 .has_emulation_bytes = 1,
48 VAEncPackedHeaderParameterBufferType,
49 sizeof(params), 1, ¶ms, ¶m_buffer);
50 if (vas != VA_STATUS_SUCCESS) {
52 "for packed header (type %d): %d (%s).\n",
53 type, vas, vaErrorStr(vas));
59 VAEncPackedHeaderDataBufferType,
60 (bit_len + 7) / 8, 1, data, &data_buffer);
61 if (vas != VA_STATUS_SUCCESS) {
63 "for packed header (type %d): %d (%s).\n",
64 type, vas, vaErrorStr(vas));
70 "(%zu bits).\n", type, param_buffer, data_buffer, bit_len);
85 type, len, 1, data, &buffer);
86 if (vas != VA_STATUS_SUCCESS) {
88 "(type %d): %d (%s).\n", type, vas, vaErrorStr(vas));
116 if (vas != VA_STATUS_SUCCESS) {
118 "%d (%s).\n", vas, vaErrorStr(vas));
146 for (i = 0; i < pic->
nb_refs; i++) {
154 for (i = 0; i < pic->
nb_refs; i++) {
159 if (ctx->
issue_mode == ISSUE_MODE_SERIALISE_EVERYTHING)
207 VAEncMiscParameterBufferType,
217 VAEncSequenceParameterBufferType,
228 "parameters: %d.\n", err);
232 VAEncPictureParameterBufferType,
242 bit_len = 8 *
sizeof(
data);
246 "header: %d.\n", err);
259 bit_len = 8 *
sizeof(
data);
263 "header: %d.\n", err);
283 "buffer %d: %d.\n", i, err);
298 bit_len = 8 *
sizeof(
data);
305 "header %d: %d.\n", i, err);
338 "parameters: %d.\n", err);
345 bit_len = 8 *
sizeof(
data);
350 "header: %d.\n", err);
362 VAEncSliceParameterBufferType,
372 if (vas != VA_STATUS_SUCCESS) {
374 "%d (%s).\n", vas, vaErrorStr(vas));
376 goto fail_with_picture;
381 if (vas != VA_STATUS_SUCCESS) {
383 "%d (%s).\n", vas, vaErrorStr(vas));
385 goto fail_with_picture;
389 if (vas != VA_STATUS_SUCCESS) {
391 "%d (%s).\n", vas, vaErrorStr(vas));
407 if (vas != VA_STATUS_SUCCESS) {
409 "param buffer %#x: %d (%s).\n",
418 if (ctx->
issue_mode == ISSUE_MODE_SERIALISE_EVERYTHING)
438 VACodedBufferSegment *buf_list, *
buf;
449 if (vas != VA_STATUS_SUCCESS) {
451 "%d (%s).\n", vas, vaErrorStr(vas));
456 for (buf = buf_list;
buf; buf = buf->next) {
458 "(status %08x).\n", buf->size, buf->status);
464 memcpy(pkt->
data, buf->buf, buf->size);
473 if (vas != VA_STATUS_SUCCESS) {
475 "%d (%s).\n", vas, vaErrorStr(vas));
502 "%"PRId64
"/%"PRId64
".\n",
563 if (ctx->
issue_mode == ISSUE_MODE_SERIALISE_EVERYTHING ||
564 ctx->
issue_mode == ISSUE_MODE_MINIMISE_LATENCY) {
579 for (i = 0; i < pic->
nb_refs; i++) {
591 }
else if (ctx->
issue_mode == ISSUE_MODE_MAXIMISE_THROUGHPUT) {
603 for (i = 0; i < pic->
nb_refs; i++) {
607 if (i < pic->nb_refs)
676 for (i = 0; i < ctx->
b_per_p &&
703 for (i = 0, pic = start; pic; i++, pic = pic->
next) {
761 for (pic = ctx->
pic_start; pic != last_pic; pic = pic->
next) {
764 pic->
refs[1] = last_pic;
775 for (pic = last_pic->
next; pic; pic = next) {
810 for (pic = old->
next; pic; pic = pic->
next) {
813 for (i = 0; i < pic->
nb_refs; i++) {
814 if (pic->
refs[i] == old) {
832 const AVFrame *input_image,
int *got_packet)
864 pic->
pts = input_image->
pts;
915 pkt->
dts = INT64_MIN;
947 VAEntrypoint *entrypoints =
NULL;
948 VAConfigAttrib attr[] = {
949 { VAConfigAttribRTFormat },
950 { VAConfigAttribRateControl },
951 { VAConfigAttribEncMaxRefFrames },
952 { VAConfigAttribEncPackedHeaders },
961 vas = vaQueryConfigProfiles(ctx->
hwctx->
display, profiles, &n);
962 if (vas != VA_STATUS_SUCCESS) {
964 vas, vaErrorStr(vas));
968 for (i = 0; i <
n; i++) {
987 if (vas != VA_STATUS_SUCCESS) {
990 vas, vaErrorStr(vas));
994 for (i = 0; i <
n; i++) {
1008 if (vas != VA_STATUS_SUCCESS) {
1010 "attributes: %d (%s).\n", vas, vaErrorStr(vas));
1015 if (attr[i].
value == VA_ATTRIB_NOT_SUPPORTED) {
1021 switch (attr[i].
type) {
1022 case VAConfigAttribRTFormat:
1025 "is not supported (mask %#x).\n",
1032 .type = VAConfigAttribRTFormat,
1036 case VAConfigAttribRateControl:
1043 !(attr[i].value & VA_RC_VBR) &&
1044 (attr[i].value & VA_RC_CBR)) {
1046 "not supported with this driver version; "
1047 "using CBR instead.\n");
1052 "is not supported (mask: %#x).\n",
1059 .type = VAConfigAttribRateControl,
1063 case VAConfigAttribEncMaxRefFrames:
1065 unsigned int ref_l0 = attr[i].value & 0xffff;
1066 unsigned int ref_l1 = (attr[i].value >> 16) & 0xffff;
1068 if (avctx->
gop_size > 1 && ref_l0 < 1) {
1070 "supported (%#x).\n", attr[i].
value);
1076 "supported (%#x).\n", attr[i].
value);
1082 case VAConfigAttribEncPackedHeaders:
1089 "headers are not supported (want %#x, got %#x).\n",
1095 .type = VAConfigAttribEncPackedHeaders,
1100 av_assert0(0 &&
"Unexpected config attribute.");
1114 int rc_bits_per_second;
1115 int rc_target_percentage;
1117 int hrd_buffer_size;
1118 int hrd_initial_buffer_fullness;
1123 "higher is not supported.\n");
1134 hrd_initial_buffer_fullness = hrd_buffer_size * 3 / 4;
1137 rc_bits_per_second = avctx->
bit_rate;
1138 rc_target_percentage = 100;
1139 rc_window_size = 1000;
1143 rc_bits_per_second = avctx->
bit_rate;
1144 rc_target_percentage = 100;
1147 rc_target_percentage = (avctx->
bit_rate * 100) / rc_bits_per_second;
1149 rc_window_size = (hrd_buffer_size * 1000) / avctx->
bit_rate;
1152 ctx->
rc_params.
misc.type = VAEncMiscParameterTypeRateControl;
1153 ctx->
rc_params.
rc = (VAEncMiscParameterRateControl) {
1154 .bits_per_second = rc_bits_per_second,
1155 .target_percentage = rc_target_percentage,
1156 .window_size = rc_window_size,
1158 .min_qp = (avctx->
qmin > 0 ? avctx->
qmin : 0),
1159 .basic_unit_size = 0,
1168 .initial_buffer_fullness = hrd_initial_buffer_fullness,
1169 .buffer_size = hrd_buffer_size,
1184 ctx->
fr_params.
fr.framerate = (
unsigned int)fr_den << 16 | fr_num;
1186 #if VA_CHECK_VERSION(0, 40, 0)
1201 VABufferID buffer_id;
1203 buffer_id = (VABufferID)(uintptr_t)
data;
1215 VABufferID buffer_id;
1224 VAEncCodedBufferType,
1226 (1 << 16), 1, 0, &buffer_id);
1227 if (vas != VA_STATUS_SUCCESS) {
1229 "output buffer: %d (%s).\n", vas, vaErrorStr(vas));
1298 "size %dx%d (constraints: width %d-%d height %d-%d).\n",
1327 "frame context: %d.\n", err);
1347 "required to associate the encoding device.\n");
1385 if (vas != VA_STATUS_SUCCESS) {
1387 "configuration: %d (%s).\n", vas, vaErrorStr(vas));
1403 if (vas != VA_STATUS_SUCCESS) {
1405 "context: %d (%s).\n", vas, vaErrorStr(vas));
1461 "failed: %d.\n", err);
1468 ctx->
issue_mode = ISSUE_MODE_MAXIMISE_THROUGHPUT;
1473 size_t bit_len = 8 *
sizeof(
data);
1478 "for extradata: %d.\n", err);
1504 for (pic = ctx->
pic_start; pic; pic = next) {
This struct aggregates all the (hardware/vendor-specific) "high-level" state, i.e.
static av_cold int vaapi_encode_config_attributes(AVCodecContext *avctx)
VASurfaceID input_surface
VAEncMiscParameterBuffer misc
void av_buffer_unref(AVBufferRef **buf)
Free a given reference and automatically free the buffer if there are no more references to it...
VAAPI-specific data associated with a frame pool.
This structure describes decoded (raw) audio or video data.
VAAPIEncodeSlice * slices[MAX_PICTURE_SLICES]
VAEntrypoint va_entrypoint
ptrdiff_t const GLvoid * data
static const char * picture_type_name[]
static int vaapi_encode_free(AVCodecContext *avctx, VAAPIEncodePicture *pic)
char codec_options_data[0]
#define AV_LOG_WARNING
Something somehow does not look correct.
int64_t bit_rate
the average bitrate
av_cold int ff_vaapi_encode_init(AVCodecContext *avctx)
int max_b_frames
maximum number of B-frames between non-B-frames Note: The output will be delayed by max_b_frames+1 re...
int rc_initial_buffer_occupancy
Number of bits which should be loaded into the rc buffer before decoding starts.
av_cold int ff_vaapi_encode_close(AVCodecContext *avctx)
int width
The allocated dimensions of the frames in this pool.
void * av_hwdevice_hwconfig_alloc(AVBufferRef *ref)
Allocate a HW-specific configuration structure for a given HW device.
enum AVPixelFormat format
The pixel format identifying the underlying HW surface type.
static void vaapi_encode_free_output_buffer(void *opaque, uint8_t *data)
int(* write_slice_header)(AVCodecContext *avctx, VAAPIEncodePicture *pic, VAAPIEncodeSlice *slice, char *data, size_t *data_len)
void * av_mallocz(size_t size)
Allocate a memory block with alignment suitable for all memory accesses (including vectors if availab...
void * codec_sequence_params
AVBufferRef * input_frames_ref
VAEncMiscParameterHRD hrd
size_t picture_params_size
AVHWDeviceContext * device
int max_width
The maximum size of frames in this hw_frames_ctx.
struct VAAPIEncodeContext::@129 hrd_params
AVRational time_base
This is the fundamental unit of time (in seconds) in terms of which frame timestamps are represented...
void av_hwframe_constraints_free(AVHWFramesConstraints **constraints)
Free an AVHWFrameConstraints structure.
unsigned int va_packed_headers
#define av_assert0(cond)
assert() equivalent, that is always enabled.
VAEncMiscParameterFrameRate fr
AVFrame * av_frame_alloc(void)
Allocate an AVFrame and set its fields to default values.
static av_cold int end(AVCodecContext *avctx)
int(* write_picture_header)(AVCodecContext *avctx, VAAPIEncodePicture *pic, char *data, size_t *data_len)
int av_frame_ref(AVFrame *dst, const AVFrame *src)
Set up a new reference to the data described by the source frame.
int64_t pts
Presentation timestamp in time_base units (time when frame should be shown to user).
uint8_t * extradata
some codecs need / can use extradata like Huffman tables.
AVBufferRef * output_buffer_ref
void * hwctx
The format-specific data, allocated and freed by libavutil along with this context.
#define AVERROR_EOF
End of file.
VASurfaceID recon_surface
#define AV_BUFFER_FLAG_READONLY
Always treat the buffer as read-only, even when it has only one reference.
int av_reduce(int *dst_num, int *dst_den, int64_t num, int64_t den, int64_t max)
Reduce a fraction.
static int vaapi_encode_truncate_gop(AVCodecContext *avctx)
#define AV_PKT_FLAG_KEY
The packet contains a keyframe.
int av_new_packet(AVPacket *pkt, int size)
Allocate the payload of a packet and initialize its fields with default values.
VAConfigAttrib config_attributes[MAX_CONFIG_ATTRIBUTES]
AVHWFramesContext * input_frames
int width
width and height of the video frame
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
VAAPI hardware pipeline configuration details.
static int vaapi_encode_step(AVCodecContext *avctx, VAAPIEncodePicture *target)
void av_frame_free(AVFrame **frame)
Free the frame and any dynamically allocated objects in it, e.g.
int ff_vaapi_encode2(AVCodecContext *avctx, AVPacket *pkt, const AVFrame *input_image, int *got_packet)
#define AV_LOG_DEBUG
Stuff which is only useful for libav* developers.
VAEncMiscParameterBuffer * global_params[MAX_GLOBAL_PARAMS]
int(* configure)(AVCodecContext *avctx)
simple assert() macros that are a bit more flexible than ISO C assert().
AVBufferRef * av_buffer_create(uint8_t *data, int size, void(*free)(void *opaque, uint8_t *data), void *opaque, int flags)
Create an AVBuffer from an existing array.
int av_hwframe_ctx_init(AVBufferRef *ref)
Finalize the context before use.
int(* init_picture_params)(AVCodecContext *avctx, VAAPIEncodePicture *pic)
void * codec_picture_params
int av_hwframe_get_buffer(AVBufferRef *hwframe_ref, AVFrame *frame, int flags)
Allocate a new frame attached to the given AVHWFramesContext.
int(* write_extra_header)(AVCodecContext *avctx, VAAPIEncodePicture *pic, int index, int *type, char *data, size_t *data_len)
AVHWFramesContext * recon_frames
int flags
A combination of AV_PKT_FLAG values.
int rc_buffer_size
decoder bitstream buffer size
int initial_pool_size
Initial size of the frame pool.
enum AVPictureType pict_type
Picture type of the frame.
static int vaapi_encode_get_next(AVCodecContext *avctx, VAAPIEncodePicture **pic_out)
AVBufferRef * hw_frames_ctx
A reference to the AVHWFramesContext describing the input (for encoding) or output (decoding) frames...
static int vaapi_encode_make_param_buffer(AVCodecContext *avctx, VAAPIEncodePicture *pic, int type, char *data, size_t len)
GLsizei GLboolean const GLfloat * value
unsigned int va_rt_format
struct VAAPIEncodePicture * next
static int vaapi_encode_discard(AVCodecContext *avctx, VAAPIEncodePicture *pic)
void * codec_picture_params
int64_t ts_ring[MAX_REORDER_DELAY *3]
AVBufferPool * output_buffer_pool
AVBufferPool * av_buffer_pool_init2(int size, void *opaque, AVBufferRef *(*alloc)(void *opaque, int size), void(*pool_free)(void *opaque))
Allocate and initialize a buffer pool with a more complex allocator.
#define FF_ARRAY_ELEMS(a)
static av_cold int vaapi_encode_create_recon_frames(AVCodecContext *avctx)
VADisplay display
The VADisplay handle, to be filled by the user.
int(* write_sequence_header)(AVCodecContext *avctx, char *data, size_t *data_len)
struct VAAPIEncodePicture * refs[MAX_PICTURE_REFERENCES]
int min_width
The minimum size of frames in this hw_frames_ctx.
const struct VAAPIEncodeType * codec
Libavcodec external API header.
This struct describes the constraints on hardware frames attached to a given device with a hardware-s...
VAAPIEncodePicture * pic_start
main external API structure.
AVHWFramesConstraints * av_hwdevice_get_hwframe_constraints(AVBufferRef *ref, const void *hwconfig)
Get the constraints on HW frames given a device and the HW-specific configuration to be used with tha...
uint8_t * data
The data buffer.
int(* write_extra_buffer)(AVCodecContext *avctx, VAAPIEncodePicture *pic, int index, int *type, char *data, size_t *data_len)
int qmin
minimum quantizer
static VAAPIEncodePicture * vaapi_encode_alloc(void)
VABufferID param_buffers[MAX_PARAM_BUFFERS]
void * hwctx
The format-specific data, allocated and freed automatically along with this context.
unsigned int driver_quirks
Driver quirks to apply - this is filled by av_hwdevice_ctx_init(), with reference to a table of known...
static const AVProfile profiles[]
void av_buffer_pool_uninit(AVBufferPool **ppool)
Mark the pool as being available for freeing.
This struct describes a set or pool of "hardware" frames (i.e.
AVBufferRef * recon_frames_ref
VAAPIEncodePicture * pic_end
uint8_t * data[AV_NUM_DATA_POINTERS]
pointer to the picture/channel planes.
AVBufferRef * device_ref
A reference to the parent AVHWDeviceContext.
size_t global_params_size[MAX_GLOBAL_PARAMS]
static int vaapi_encode_issue(AVCodecContext *avctx, VAAPIEncodePicture *pic)
int gop_size
the number of pictures in a group of pictures, or 0 for intra_only
VAEncMiscParameterRateControl rc
A reference to a data buffer.
size_t sequence_params_size
static int vaapi_encode_clear_old(AVCodecContext *avctx)
common internal and external API header
static int ref[MAX_W *MAX_W]
static int vaapi_encode_output(AVCodecContext *avctx, VAAPIEncodePicture *pic, AVPacket *pkt)
AVBufferRef * av_hwframe_ctx_alloc(AVBufferRef *device_ref_in)
Allocate an AVHWFramesContext tied to a given device context.
AVBufferRef * av_buffer_ref(AVBufferRef *buf)
Create a new reference to an AVBuffer.
#define AV_INPUT_BUFFER_PADDING_SIZE
Required number of additionally allocated bytes at the end of the input bitstream for decoding...
The driver does not destroy parameter buffers when they are used by vaRenderPicture().
static av_cold int vaapi_encode_init_rate_control(AVCodecContext *avctx)
enum AVPixelFormat * valid_sw_formats
A list of possible values for sw_format in the hw_frames_ctx, terminated by AV_PIX_FMT_NONE.
void * codec_slice_params
int(* init_slice_params)(AVCodecContext *avctx, VAAPIEncodePicture *pic, VAAPIEncodeSlice *slice)
static AVBufferRef * vaapi_encode_alloc_output_buffer(void *opaque, int size)
static int vaapi_encode_wait(AVCodecContext *avctx, VAAPIEncodePicture *pic)
enum VAAPIEncodeContext::@131 issue_mode
VAConfigID config_id
ID of a VAAPI pipeline configuration.
int(* init_sequence_params)(AVCodecContext *avctx)
int64_t dts
Decompression timestamp in AVStream->time_base units; the time at which the packet is decompressed...
struct VAAPIEncodeContext::@128 rc_params
static int vaapi_encode_make_packed_header(AVCodecContext *avctx, VAAPIEncodePicture *pic, int type, char *data, size_t bit_len)
VASurfaceID * surface_ids
The surfaces IDs of all surfaces in the pool after creation.
AVBufferRef * av_buffer_pool_get(AVBufferPool *pool)
Allocate a new AVBuffer, reusing an old buffer from the pool when available.
#define av_malloc_array(a, b)
const char * av_get_pix_fmt_name(enum AVPixelFormat pix_fmt)
Return the short name for a pixel format, NULL in case pix_fmt is unknown.
enum AVPixelFormat sw_format
The pixel format identifying the actual data layout of the hardware frames.
AVPixelFormat
Pixel format.
This structure stores compressed data.
struct VAAPIEncodeContext::@130 fr_params
int64_t pts
Presentation timestamp in AVStream->time_base units; the time at which the decompressed packet will b...
int64_t rc_max_rate
maximum bitrate
AVVAAPIDeviceContext * hwctx