frontends/va: Keep track if VPS/SPS/PPS/AUD was sent

FFmpeg sends AUD as part of VA_ENC_PACKED_HEADER_SEQUENCE and
VA_ENC_PACKED_HEADER_SLICE.
GStreamer sends it separately as VA_ENC_PACKED_HEADER_RAW_DATA.

It's now also needed to keep track what packed headers were enabled
to include VPS/SPS/PPS with VAEncSequenceParameterBuffer when sequence
packed headers are disabled.

Reviewed-By: Sil Vilerino <sivileri@microsoft.com>
Reviewed-by: Ruijing Dong <ruijing.dong@amd.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/30585>
This commit is contained in:
David Rosca
2024-07-24 10:00:46 +02:00
committed by Marge Bot
parent ba1bc7c495
commit 31f6fe1356
7 changed files with 59 additions and 5 deletions
+1
View File
@@ -744,6 +744,7 @@ vlVaCreateConfig(VADriverContextP ctx, VAProfile profile, VAEntrypoint entrypoin
FREE(config);
return VA_STATUS_ERROR_INVALID_VALUE;
}
config->packed_headers = attrib_value;
}
}
+1
View File
@@ -383,6 +383,7 @@ vlVaCreateContext(VADriverContextP ctx, VAConfigID config_id, int picture_width,
default:
break;
}
context->desc.base.packed_headers = config->packed_headers;
}
context->surfaces = _mesa_set_create(NULL, _mesa_hash_pointer, _mesa_key_pointer_equal);
+19 -1
View File
@@ -151,6 +151,8 @@ vlVaBeginPicture(VADriverContextP ctx, VAContextID context_id, VASurfaceID rende
context->desc.h265enc.header_flags.value = 0;
break;
case PIPE_VIDEO_FORMAT_MPEG4_AVC:
context->desc.h264enc.header_flags.value = 0;
break;
default:
break;
}
@@ -732,8 +734,24 @@ handleVAEncMiscParameterTypeRIR(vlVaContext *context, VAEncMiscParameterBuffer *
if (p_intra_refresh->mode) {
p_intra_refresh->region_size = ir->intra_insert_size;
p_intra_refresh->offset = ir->intra_insertion_location;
if (p_intra_refresh->offset == 0)
if (p_intra_refresh->offset == 0) {
p_intra_refresh->need_sequence_header = 1;
if (!(context->desc.base.packed_headers & VA_ENC_PACKED_HEADER_SEQUENCE)) {
switch (u_reduce_video_profile(context->templat.profile)) {
case PIPE_VIDEO_FORMAT_MPEG4_AVC:
context->desc.h264enc.header_flags.sps = 1;
context->desc.h264enc.header_flags.pps = 1;
break;
case PIPE_VIDEO_FORMAT_HEVC:
context->desc.h265enc.header_flags.vps = 1;
context->desc.h265enc.header_flags.sps = 1;
context->desc.h265enc.header_flags.pps = 1;
break;
default:
break;
}
}
}
}
} else {
p_intra_refresh->mode = INTRA_REFRESH_MODE_NONE;
@@ -34,6 +34,7 @@
enum H264NALUnitType {
H264_NAL_SPS = 7,
H264_NAL_PPS = 8,
H264_NAL_AUD = 9,
};
VAStatus
@@ -273,6 +274,12 @@ vlVaHandleVAEncSequenceParameterBufferTypeH264(vlVaDriver *drv, vlVaContext *con
context->desc.h264enc.seq.enc_frame_crop_top_offset = h264->frame_crop_top_offset;
context->desc.h264enc.seq.enc_frame_crop_bottom_offset = h264->frame_crop_bottom_offset;
}
if (!(context->desc.base.packed_headers & VA_ENC_PACKED_HEADER_SEQUENCE)) {
context->desc.h264enc.header_flags.sps = 1;
context->desc.h264enc.header_flags.pps = 1;
}
return VA_STATUS_SUCCESS;
}
@@ -527,8 +534,14 @@ vlVaHandleVAEncPackedHeaderDataBufferTypeH264(vlVaContext *context, vlVaBuffer *
switch(nal_unit_type) {
case H264_NAL_SPS:
parseEncSpsParamsH264(context, &rbsp);
context->desc.h264enc.header_flags.sps = 1;
break;
case H264_NAL_PPS:
context->desc.h264enc.header_flags.pps = 1;
break;
case H264_NAL_AUD:
context->desc.h264enc.header_flags.aud = 1;
break;
default:
break;
}
+15 -2
View File
@@ -35,6 +35,7 @@ enum HEVCNALUnitType {
HEVC_NAL_VPS = 32,
HEVC_NAL_SPS = 33,
HEVC_NAL_PPS = 34,
HEVC_NAL_AUD = 35,
HEVC_NAL_PREFIX_SEI = 39,
};
@@ -280,6 +281,12 @@ vlVaHandleVAEncSequenceParameterBufferTypeHEVC(vlVaDriver *drv, vlVaContext *con
context->desc.h265enc.rc.frame_rate_num = time_scale;
context->desc.h265enc.rc.frame_rate_den = num_units_in_tick;
if (!(context->desc.base.packed_headers & VA_ENC_PACKED_HEADER_SEQUENCE)) {
context->desc.h265enc.header_flags.vps = 1;
context->desc.h265enc.header_flags.sps = 1;
context->desc.h265enc.header_flags.pps = 1;
}
return VA_STATUS_SUCCESS;
}
@@ -761,12 +768,18 @@ vlVaHandleVAEncPackedHeaderDataBufferTypeHEVC(vlVaContext *context, vlVaBuffer *
vl_rbsp_init(&rbsp, &vlc, ~0, context->packed_header_emulation_bytes);
switch(nal_unit_type) {
case HEVC_NAL_VPS:
context->desc.h265enc.header_flags.vps = 1;
break;
case HEVC_NAL_SPS:
parseEncSpsParamsH265(context, &rbsp);
break;
case HEVC_NAL_VPS:
context->desc.h265enc.header_flags.sps = 1;
break;
case HEVC_NAL_PPS:
context->desc.h265enc.header_flags.pps = 1;
break;
case HEVC_NAL_AUD:
context->desc.h265enc.header_flags.aud = 1;
break;
case HEVC_NAL_PREFIX_SEI:
parseEncSeiH265(context, &rbsp);
+9 -2
View File
@@ -85,9 +85,15 @@
#define VBAQ_DISABLE (0)
#define VBAQ_AUTO (1)
#define ENC_PACKED_HEADERS_H264 (VA_ENC_PACKED_HEADER_SEQUENCE)
#define ENC_PACKED_HEADERS_H264 (VA_ENC_PACKED_HEADER_SEQUENCE | \
VA_ENC_PACKED_HEADER_PICTURE | \
VA_ENC_PACKED_HEADER_SLICE | \
VA_ENC_PACKED_HEADER_RAW_DATA)
#define ENC_PACKED_HEADERS_HEVC (VA_ENC_PACKED_HEADER_SEQUENCE | \
VA_ENC_PACKED_HEADER_MISC)
VA_ENC_PACKED_HEADER_PICTURE | \
VA_ENC_PACKED_HEADER_SLICE | \
VA_ENC_PACKED_HEADER_MISC | \
VA_ENC_PACKED_HEADER_RAW_DATA)
#define ENC_PACKED_HEADERS_AV1 (VA_ENC_PACKED_HEADER_SEQUENCE | \
VA_ENC_PACKED_HEADER_PICTURE | \
VA_ENC_PACKED_HEADER_MISC)
@@ -425,6 +431,7 @@ typedef struct {
enum pipe_video_entrypoint entrypoint;
enum pipe_h2645_enc_rate_control_method rc;
unsigned int rt_format;
unsigned int packed_headers;
} vlVaConfig;
typedef struct vlVaSurface {
+1
View File
@@ -195,6 +195,7 @@ struct pipe_picture_desc
unsigned flush_flags;
/* A fence used on PIPE_VIDEO_ENTRYPOINT_DECODE/PROCESSING to signal job completion */
struct pipe_fence_handle **fence;
unsigned packed_headers;
};
struct pipe_quant_matrix