mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-05 00:58:05 +02:00
frontend/va: Parse VUI H264 parameters
Reviewed-by: Jesse Natalie <jenatali@microsoft.com> Reviewed-by: Ruijing Dong <ruijing.dong@amd.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/26223>
This commit is contained in:
parent
bee4a3683c
commit
4637f1db48
1 changed files with 63 additions and 40 deletions
|
|
@ -228,8 +228,27 @@ vlVaHandleVAEncSequenceParameterBufferTypeH264(vlVaDriver *drv, vlVaContext *con
|
|||
h264->vui_fields.bits.timing_info_present_flag;
|
||||
num_units_in_tick = h264->num_units_in_tick;
|
||||
time_scale = h264->time_scale;
|
||||
} else
|
||||
context->desc.h264enc.seq.vui_flags.fixed_frame_rate_flag =
|
||||
h264->vui_fields.bits.fixed_frame_rate_flag;
|
||||
context->desc.h264enc.seq.vui_flags.low_delay_hrd_flag =
|
||||
h264->vui_fields.bits.low_delay_hrd_flag;
|
||||
context->desc.h264enc.seq.vui_flags.bitstream_restriction_flag =
|
||||
h264->vui_fields.bits.bitstream_restriction_flag;
|
||||
context->desc.h264enc.seq.vui_flags.motion_vectors_over_pic_boundaries_flag =
|
||||
h264->vui_fields.bits.motion_vectors_over_pic_boundaries_flag;
|
||||
context->desc.h264enc.seq.log2_max_mv_length_vertical =
|
||||
h264->vui_fields.bits.log2_max_mv_length_vertical;
|
||||
context->desc.h264enc.seq.log2_max_mv_length_horizontal =
|
||||
h264->vui_fields.bits.log2_max_mv_length_horizontal;
|
||||
} else {
|
||||
context->desc.h264enc.seq.vui_flags.timing_info_present_flag = 0;
|
||||
context->desc.h264enc.seq.vui_flags.fixed_frame_rate_flag = 0;
|
||||
context->desc.h264enc.seq.vui_flags.low_delay_hrd_flag = 0;
|
||||
context->desc.h264enc.seq.vui_flags.bitstream_restriction_flag = 0;
|
||||
context->desc.h264enc.seq.vui_flags.motion_vectors_over_pic_boundaries_flag = 0;
|
||||
context->desc.h264enc.seq.log2_max_mv_length_vertical = 0;
|
||||
context->desc.h264enc.seq.log2_max_mv_length_horizontal = 0;
|
||||
}
|
||||
|
||||
if (!context->desc.h264enc.seq.vui_flags.timing_info_present_flag) {
|
||||
/* if not present, set default value */
|
||||
|
|
@ -331,28 +350,27 @@ vlVaHandleVAEncMiscParameterTypeFrameRateH264(vlVaContext *context, VAEncMiscPar
|
|||
return VA_STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
static void parseEncHrdParamsH264(struct vl_rbsp *rbsp)
|
||||
static void parseEncHrdParamsH264(struct vl_rbsp *rbsp, pipe_h264_enc_hrd_params* hrd_params)
|
||||
{
|
||||
unsigned i, cpb_cnt_minus1;
|
||||
unsigned i;
|
||||
|
||||
cpb_cnt_minus1 = vl_rbsp_ue(rbsp);
|
||||
vl_rbsp_u(rbsp, 4); /* bit_rate_scale */
|
||||
vl_rbsp_u(rbsp, 4); /* cpb_size_scale */
|
||||
for (i = 0; i <= cpb_cnt_minus1; ++i) {
|
||||
vl_rbsp_ue(rbsp); /* bit_rate_value_minus1[i] */
|
||||
vl_rbsp_ue(rbsp); /* cpb_size_value_minus1[i] */
|
||||
vl_rbsp_u(rbsp, 1); /* cbr_flag[i] */
|
||||
hrd_params->cpb_cnt_minus1 = vl_rbsp_ue(rbsp);
|
||||
hrd_params->bit_rate_scale = vl_rbsp_u(rbsp, 4);
|
||||
hrd_params->cpb_size_scale = vl_rbsp_u(rbsp, 4);
|
||||
for (i = 0; i <= hrd_params->cpb_cnt_minus1; ++i) {
|
||||
hrd_params->bit_rate_value_minus1[i] = vl_rbsp_ue(rbsp);
|
||||
hrd_params->cpb_size_value_minus1[i] = vl_rbsp_ue(rbsp);
|
||||
hrd_params->cbr_flag[i] = vl_rbsp_u(rbsp, 1);
|
||||
}
|
||||
vl_rbsp_u(rbsp, 5); /* initial_cpb_removal_delay_length_minus1 */
|
||||
vl_rbsp_u(rbsp, 5); /* cpb_removal_delay_length_minus1 */
|
||||
vl_rbsp_u(rbsp, 5); /* dpb_output_delay_length_minus1 */
|
||||
vl_rbsp_u(rbsp, 5); /* time_offset_length */
|
||||
hrd_params->initial_cpb_removal_delay_length_minus1 = vl_rbsp_u(rbsp, 5);
|
||||
hrd_params->cpb_removal_delay_length_minus1 = vl_rbsp_u(rbsp, 5);
|
||||
hrd_params->dpb_output_delay_length_minus1 = vl_rbsp_u(rbsp, 5);
|
||||
hrd_params->time_offset_length = vl_rbsp_u(rbsp, 5);
|
||||
}
|
||||
|
||||
static void parseEncSpsParamsH264(vlVaContext *context, struct vl_rbsp *rbsp)
|
||||
{
|
||||
unsigned i, profile_idc, num_ref_frames_in_pic_order_cnt_cycle;
|
||||
unsigned nal_hrd_parameters_present_flag, vcl_hrd_parameters_present_flag;
|
||||
|
||||
profile_idc = vl_rbsp_u(rbsp, 8);
|
||||
|
||||
|
|
@ -411,14 +429,16 @@ static void parseEncSpsParamsH264(vlVaContext *context, struct vl_rbsp *rbsp)
|
|||
if (context->desc.h264enc.seq.vui_parameters_present_flag) {
|
||||
context->desc.h264enc.seq.vui_flags.aspect_ratio_info_present_flag = vl_rbsp_u(rbsp, 1);
|
||||
if (context->desc.h264enc.seq.vui_flags.aspect_ratio_info_present_flag) {
|
||||
if (vl_rbsp_u(rbsp, 8) == 255) { /* aspect_ratio_idc == Extended_SAR */
|
||||
vl_rbsp_u(rbsp, 16); /* sar_width */
|
||||
vl_rbsp_u(rbsp, 16); /* sar_height */
|
||||
context->desc.h264enc.seq.aspect_ratio_idc = vl_rbsp_u(rbsp, 8);
|
||||
if (context->desc.h264enc.seq.aspect_ratio_idc == 255 /* Extended_SAR */) {
|
||||
context->desc.h264enc.seq.sar_width = vl_rbsp_u(rbsp, 16);
|
||||
context->desc.h264enc.seq.sar_height = vl_rbsp_u(rbsp, 16);
|
||||
}
|
||||
}
|
||||
|
||||
if (vl_rbsp_u(rbsp, 1)) /* overscan_info_present_flag */
|
||||
vl_rbsp_u(rbsp, 1); /* overscan_appropriate_flag */
|
||||
context->desc.h264enc.seq.vui_flags.overscan_info_present_flag = vl_rbsp_u(rbsp, 1);
|
||||
if (context->desc.h264enc.seq.vui_flags.overscan_info_present_flag)
|
||||
context->desc.h264enc.seq.vui_flags.overscan_appropriate_flag = vl_rbsp_u(rbsp, 1);
|
||||
|
||||
context->desc.h264enc.seq.vui_flags.video_signal_type_present_flag = vl_rbsp_u(rbsp, 1);
|
||||
if (context->desc.h264enc.seq.vui_flags.video_signal_type_present_flag) {
|
||||
|
|
@ -438,33 +458,36 @@ static void parseEncSpsParamsH264(vlVaContext *context, struct vl_rbsp *rbsp)
|
|||
context->desc.h264enc.seq.chroma_sample_loc_type_bottom_field = vl_rbsp_ue(rbsp);
|
||||
}
|
||||
|
||||
if (vl_rbsp_u(rbsp, 1)) { /* timing_info_present_flag */
|
||||
vl_rbsp_u(rbsp, 32); /* num_units_in_tick */
|
||||
vl_rbsp_u(rbsp, 32); /* time_scale */
|
||||
vl_rbsp_u(rbsp, 1); /* fixed_frame_rate_flag */
|
||||
context->desc.h264enc.seq.vui_flags.timing_info_present_flag = vl_rbsp_u(rbsp, 1);
|
||||
if (context->desc.h264enc.seq.vui_flags.timing_info_present_flag) {
|
||||
context->desc.h264enc.seq.num_units_in_tick = vl_rbsp_u(rbsp, 32);
|
||||
context->desc.h264enc.seq.time_scale = vl_rbsp_u(rbsp, 32);
|
||||
context->desc.h264enc.seq.vui_flags.fixed_frame_rate_flag = vl_rbsp_u(rbsp, 1);
|
||||
}
|
||||
|
||||
nal_hrd_parameters_present_flag = vl_rbsp_u(rbsp, 1);
|
||||
if (nal_hrd_parameters_present_flag)
|
||||
parseEncHrdParamsH264(rbsp);
|
||||
context->desc.h264enc.seq.vui_flags.nal_hrd_parameters_present_flag = vl_rbsp_u(rbsp, 1);
|
||||
if (context->desc.h264enc.seq.vui_flags.nal_hrd_parameters_present_flag)
|
||||
parseEncHrdParamsH264(rbsp, &context->desc.h264enc.seq.nal_hrd_parameters);
|
||||
|
||||
vcl_hrd_parameters_present_flag = vl_rbsp_u(rbsp, 1);
|
||||
if (vcl_hrd_parameters_present_flag)
|
||||
parseEncHrdParamsH264(rbsp);
|
||||
context->desc.h264enc.seq.vui_flags.vcl_hrd_parameters_present_flag = vl_rbsp_u(rbsp, 1);
|
||||
if (context->desc.h264enc.seq.vui_flags.vcl_hrd_parameters_present_flag)
|
||||
parseEncHrdParamsH264(rbsp, &context->desc.h264enc.seq.vcl_hrd_parameters);
|
||||
|
||||
if (nal_hrd_parameters_present_flag || vcl_hrd_parameters_present_flag)
|
||||
vl_rbsp_u(rbsp, 1); /* low_delay_hrd_flag */
|
||||
if (context->desc.h264enc.seq.vui_flags.nal_hrd_parameters_present_flag ||
|
||||
context->desc.h264enc.seq.vui_flags.vcl_hrd_parameters_present_flag)
|
||||
context->desc.h264enc.seq.vui_flags.low_delay_hrd_flag = vl_rbsp_u(rbsp, 1);
|
||||
|
||||
vl_rbsp_u(rbsp, 1); /* pic_struct_present_flag */
|
||||
context->desc.h264enc.seq.vui_flags.pic_struct_present_flag = vl_rbsp_u(rbsp, 1);
|
||||
|
||||
if (vl_rbsp_u(rbsp, 1)) { /* bitstream_restriction_flag */
|
||||
vl_rbsp_u(rbsp, 1); /* motion_vectors_over_pic_boundaries_flag */
|
||||
vl_rbsp_ue(rbsp); /* max_bytes_per_pic_denom */
|
||||
vl_rbsp_ue(rbsp); /* max_bits_per_mb_denom */
|
||||
vl_rbsp_ue(rbsp); /* log2_max_mv_length_horizontal */
|
||||
vl_rbsp_ue(rbsp); /* log2_max_mv_length_vertical */
|
||||
context->desc.h264enc.seq.vui_flags.bitstream_restriction_flag = vl_rbsp_u(rbsp, 1);
|
||||
if (context->desc.h264enc.seq.vui_flags.bitstream_restriction_flag) {
|
||||
context->desc.h264enc.seq.vui_flags.motion_vectors_over_pic_boundaries_flag = vl_rbsp_u(rbsp, 1);
|
||||
context->desc.h264enc.seq.max_bytes_per_pic_denom = vl_rbsp_ue(rbsp);
|
||||
context->desc.h264enc.seq.max_bits_per_mb_denom = vl_rbsp_ue(rbsp);
|
||||
context->desc.h264enc.seq.log2_max_mv_length_horizontal = vl_rbsp_ue(rbsp);
|
||||
context->desc.h264enc.seq.log2_max_mv_length_vertical = vl_rbsp_ue(rbsp);
|
||||
context->desc.h264enc.seq.max_num_reorder_frames = vl_rbsp_ue(rbsp);
|
||||
vl_rbsp_ue(rbsp); /* max_dec_frame_buffering */
|
||||
context->desc.h264enc.seq.max_dec_frame_buffering = vl_rbsp_ue(rbsp);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue