mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-01-11 08:00:13 +01:00
frontends/va: add HRD, filler data enable and etc
HRD parameters and filler data enable and skip frame enable data are needed even though some application doesn't use them. Also for per picture rate control, max_qp and min_qp are added. Signed-off-by: Ruijing Dong <ruijing.dong@amd.com> Reviewed-By: Sil Vilerino <sivileri@microsoft.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/18534>
This commit is contained in:
parent
3c8937d363
commit
0308abbe46
6 changed files with 81 additions and 8 deletions
|
|
@ -115,11 +115,11 @@ static void radeon_vcn_enc_get_param(struct radeon_encoder *enc, struct pipe_pic
|
|||
}
|
||||
enc->enc_pic.rc_session_init.vbv_buffer_level = pic->rate_ctrl[0].vbv_buf_lv;
|
||||
enc->enc_pic.rc_per_pic.qp = pic->quant_i_frames;
|
||||
enc->enc_pic.rc_per_pic.min_qp_app = 0;
|
||||
enc->enc_pic.rc_per_pic.max_qp_app = 51;
|
||||
enc->enc_pic.rc_per_pic.max_au_size = 0;
|
||||
enc->enc_pic.rc_per_pic.min_qp_app = pic->rate_ctrl[0].min_qp;
|
||||
enc->enc_pic.rc_per_pic.max_qp_app = pic->rate_ctrl[0].max_qp ?
|
||||
pic->rate_ctrl[0].max_qp : 51;
|
||||
enc->enc_pic.rc_per_pic.enabled_filler_data = pic->rate_ctrl[0].fill_data_enable;
|
||||
enc->enc_pic.rc_per_pic.skip_frame_enable = false;
|
||||
enc->enc_pic.rc_per_pic.skip_frame_enable = pic->rate_ctrl[0].skip_frame_enable;
|
||||
enc->enc_pic.rc_per_pic.enforce_hrd = pic->rate_ctrl[0].enforce_hrd;
|
||||
|
||||
switch (pic->rate_ctrl[0].rate_ctrl_method) {
|
||||
|
|
@ -247,11 +247,10 @@ static void radeon_vcn_enc_get_param(struct radeon_encoder *enc, struct pipe_pic
|
|||
pic->rc.frame_rate_num);
|
||||
enc->enc_pic.rc_session_init.vbv_buffer_level = pic->rc.vbv_buf_lv;
|
||||
enc->enc_pic.rc_per_pic.qp = pic->rc.quant_i_frames;
|
||||
enc->enc_pic.rc_per_pic.min_qp_app = 0;
|
||||
enc->enc_pic.rc_per_pic.max_qp_app = 51;
|
||||
enc->enc_pic.rc_per_pic.max_au_size = 0;
|
||||
enc->enc_pic.rc_per_pic.min_qp_app = pic->rc.min_qp;
|
||||
enc->enc_pic.rc_per_pic.max_qp_app = pic->rc.max_qp ? pic->rc.max_qp : 51;
|
||||
enc->enc_pic.rc_per_pic.enabled_filler_data = pic->rc.fill_data_enable;
|
||||
enc->enc_pic.rc_per_pic.skip_frame_enable = false;
|
||||
enc->enc_pic.rc_per_pic.skip_frame_enable = pic->rc.skip_frame_enable;
|
||||
enc->enc_pic.rc_per_pic.enforce_hrd = pic->rc.enforce_hrd;
|
||||
switch (pic->rc.rate_ctrl_method) {
|
||||
case PIPE_H2645_ENC_RATE_CONTROL_METHOD_DISABLE:
|
||||
|
|
|
|||
|
|
@ -543,6 +543,27 @@ handleVAEncMiscParameterTypeMaxFrameSize(vlVaContext *context, VAEncMiscParamete
|
|||
|
||||
return status;
|
||||
}
|
||||
static VAStatus
|
||||
handleVAEncMiscParameterTypeHRD(vlVaContext *context, VAEncMiscParameterBuffer *misc)
|
||||
{
|
||||
VAStatus status = VA_STATUS_SUCCESS;
|
||||
|
||||
switch (u_reduce_video_profile(context->templat.profile)) {
|
||||
case PIPE_VIDEO_FORMAT_MPEG4_AVC:
|
||||
status = vlVaHandleVAEncMiscParameterTypeHRDH264(context, misc);
|
||||
break;
|
||||
|
||||
case PIPE_VIDEO_FORMAT_HEVC:
|
||||
status = vlVaHandleVAEncMiscParameterTypeHRDHEVC(context, misc);
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
return status;
|
||||
}
|
||||
|
||||
static VAStatus
|
||||
handleVAEncMiscParameterBufferType(vlVaContext *context, vlVaBuffer *buf)
|
||||
{
|
||||
|
|
@ -571,6 +592,10 @@ handleVAEncMiscParameterBufferType(vlVaContext *context, vlVaBuffer *buf)
|
|||
vaStatus = handleVAEncMiscParameterTypeMaxFrameSize(context, misc);
|
||||
break;
|
||||
|
||||
case VAEncMiscParameterTypeHRD:
|
||||
vaStatus = handleVAEncMiscParameterTypeHRD(context, misc);
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -202,6 +202,8 @@ vlVaHandleVAEncMiscParameterTypeRateControlH264(vlVaContext *context, VAEncMiscP
|
|||
temporal_id >= context->desc.h264enc.num_temporal_layers)
|
||||
return VA_STATUS_ERROR_INVALID_PARAMETER;
|
||||
|
||||
context->desc.h264enc.rate_ctrl[temporal_id].fill_data_enable = !(rc->rc_flags.bits.disable_bit_stuffing);
|
||||
context->desc.h264enc.rate_ctrl[temporal_id].skip_frame_enable = !(rc->rc_flags.bits.disable_frame_skip);
|
||||
context->desc.h264enc.rate_ctrl[temporal_id].peak_bitrate = rc->bits_per_second;
|
||||
if (context->desc.h264enc.rate_ctrl[temporal_id].target_bitrate < 2000000)
|
||||
context->desc.h264enc.rate_ctrl[temporal_id].vbv_buffer_size =
|
||||
|
|
@ -210,6 +212,9 @@ vlVaHandleVAEncMiscParameterTypeRateControlH264(vlVaContext *context, VAEncMiscP
|
|||
context->desc.h264enc.rate_ctrl[temporal_id].vbv_buffer_size =
|
||||
context->desc.h264enc.rate_ctrl[0].target_bitrate;
|
||||
|
||||
context->desc.h264enc.rate_ctrl[temporal_id].max_qp = rc->max_qp;
|
||||
context->desc.h264enc.rate_ctrl[temporal_id].min_qp = rc->min_qp;
|
||||
|
||||
return VA_STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
|
|
@ -267,6 +272,19 @@ vlVaHandleVAEncMiscParameterTypeMaxFrameSizeH264(vlVaContext *context, VAEncMisc
|
|||
return VA_STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
VAStatus
|
||||
vlVaHandleVAEncMiscParameterTypeHRDH264(vlVaContext *context, VAEncMiscParameterBuffer *misc)
|
||||
{
|
||||
VAEncMiscParameterHRD *ms = (VAEncMiscParameterHRD *)misc->data;
|
||||
|
||||
if (ms->buffer_size) {
|
||||
context->desc.h264enc.rate_ctrl[0].vbv_buffer_size = ms->buffer_size;
|
||||
context->desc.h264enc.rate_ctrl[0].vbv_buf_lv = (ms->initial_buffer_fullness << 6 ) / ms->buffer_size;
|
||||
}
|
||||
|
||||
return VA_STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
void getEncParamPresetH264(vlVaContext *context)
|
||||
{
|
||||
//rate control
|
||||
|
|
@ -274,6 +292,8 @@ void getEncParamPresetH264(vlVaContext *context)
|
|||
context->desc.h264enc.rate_ctrl[0].vbv_buf_lv = 48;
|
||||
context->desc.h264enc.rate_ctrl[0].fill_data_enable = 1;
|
||||
context->desc.h264enc.rate_ctrl[0].enforce_hrd = 1;
|
||||
context->desc.h264enc.rate_ctrl[0].max_qp = 51;
|
||||
context->desc.h264enc.rate_ctrl[0].min_qp = 0;
|
||||
context->desc.h264enc.enable_vui = false;
|
||||
if (context->desc.h264enc.rate_ctrl[0].frame_rate_num == 0 ||
|
||||
context->desc.h264enc.rate_ctrl[0].frame_rate_den == 0) {
|
||||
|
|
|
|||
|
|
@ -180,6 +180,11 @@ vlVaHandleVAEncMiscParameterTypeRateControlHEVC(vlVaContext *context, VAEncMiscP
|
|||
else
|
||||
context->desc.h265enc.rc.vbv_buffer_size = context->desc.h265enc.rc.target_bitrate;
|
||||
|
||||
context->desc.h265enc.rc.fill_data_enable = !(rc->rc_flags.bits.disable_bit_stuffing);
|
||||
context->desc.h265enc.rc.skip_frame_enable = !(rc->rc_flags.bits.disable_frame_skip);
|
||||
context->desc.h265enc.rc.max_qp = rc->max_qp;
|
||||
context->desc.h265enc.rc.min_qp = rc->min_qp;
|
||||
|
||||
return VA_STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
|
|
@ -339,6 +344,19 @@ vlVaHandleVAEncMiscParameterTypeMaxFrameSizeHEVC(vlVaContext *context, VAEncMisc
|
|||
return VA_STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
VAStatus
|
||||
vlVaHandleVAEncMiscParameterTypeHRDHEVC(vlVaContext *context, VAEncMiscParameterBuffer *misc)
|
||||
{
|
||||
VAEncMiscParameterHRD *ms = (VAEncMiscParameterHRD *)misc->data;
|
||||
|
||||
if (ms->buffer_size) {
|
||||
context->desc.h265enc.rc.vbv_buffer_size = ms->buffer_size;
|
||||
context->desc.h265enc.rc.vbv_buf_lv = (ms->initial_buffer_fullness << 6 ) / ms->buffer_size;
|
||||
}
|
||||
|
||||
return VA_STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
void getEncParamPresetH265(vlVaContext *context)
|
||||
{
|
||||
//rate control
|
||||
|
|
@ -346,6 +364,9 @@ void getEncParamPresetH265(vlVaContext *context)
|
|||
context->desc.h265enc.rc.vbv_buf_lv = 48;
|
||||
context->desc.h265enc.rc.fill_data_enable = 1;
|
||||
context->desc.h265enc.rc.enforce_hrd = 1;
|
||||
context->desc.h265enc.rc.max_qp = 51;
|
||||
context->desc.h265enc.rc.min_qp = 0;
|
||||
|
||||
if (context->desc.h265enc.rc.frame_rate_num == 0 ||
|
||||
context->desc.h265enc.rc.frame_rate_den == 0) {
|
||||
context->desc.h265enc.rc.frame_rate_num = 30;
|
||||
|
|
|
|||
|
|
@ -499,6 +499,7 @@ VAStatus vlVaHandleVAEncMiscParameterTypeFrameRateH264(vlVaContext *context, VAE
|
|||
VAStatus vlVaHandleVAEncMiscParameterTypeTemporalLayerH264(vlVaContext *context, VAEncMiscParameterBuffer *buf);
|
||||
VAStatus vlVaHandleVAEncMiscParameterTypeQualityLevelH264(vlVaContext *context, VAEncMiscParameterBuffer *buf);
|
||||
VAStatus vlVaHandleVAEncMiscParameterTypeMaxFrameSizeH264(vlVaContext *context, VAEncMiscParameterBuffer *buf);
|
||||
VAStatus vlVaHandleVAEncMiscParameterTypeHRDH264(vlVaContext *context, VAEncMiscParameterBuffer *buf);
|
||||
VAStatus vlVaHandleVAEncPictureParameterBufferTypeHEVC(vlVaDriver *drv, vlVaContext *context, vlVaBuffer *buf);
|
||||
VAStatus vlVaHandleVAEncSliceParameterBufferTypeHEVC(vlVaDriver *drv, vlVaContext *context, vlVaBuffer *buf);
|
||||
VAStatus vlVaHandleVAEncSequenceParameterBufferTypeHEVC(vlVaDriver *drv, vlVaContext *context, vlVaBuffer *buf);
|
||||
|
|
@ -507,4 +508,5 @@ VAStatus vlVaHandleVAEncMiscParameterTypeFrameRateHEVC(vlVaContext *context, VAE
|
|||
VAStatus vlVaHandleVAEncPackedHeaderDataBufferTypeHEVC(vlVaContext *context, vlVaBuffer *buf);
|
||||
VAStatus vlVaHandleVAEncMiscParameterTypeQualityLevelHEVC(vlVaContext *context, VAEncMiscParameterBuffer *buf);
|
||||
VAStatus vlVaHandleVAEncMiscParameterTypeMaxFrameSizeHEVC(vlVaContext *context, VAEncMiscParameterBuffer *buf);
|
||||
VAStatus vlVaHandleVAEncMiscParameterTypeHRDHEVC(vlVaContext *context, VAEncMiscParameterBuffer *buf);
|
||||
#endif //VA_PRIVATE_H
|
||||
|
|
|
|||
|
|
@ -383,8 +383,11 @@ struct pipe_h264_enc_rate_control
|
|||
unsigned peak_bits_picture_integer;
|
||||
unsigned peak_bits_picture_fraction;
|
||||
unsigned fill_data_enable;
|
||||
unsigned skip_frame_enable;
|
||||
unsigned enforce_hrd;
|
||||
unsigned max_au_size;
|
||||
unsigned max_qp;
|
||||
unsigned min_qp;
|
||||
};
|
||||
|
||||
struct pipe_h264_enc_motion_estimation
|
||||
|
|
@ -520,8 +523,11 @@ struct pipe_h265_enc_rate_control
|
|||
unsigned peak_bits_picture_integer;
|
||||
unsigned peak_bits_picture_fraction;
|
||||
unsigned fill_data_enable;
|
||||
unsigned skip_frame_enable;
|
||||
unsigned enforce_hrd;
|
||||
unsigned max_au_size;
|
||||
unsigned max_qp;
|
||||
unsigned min_qp;
|
||||
};
|
||||
|
||||
struct pipe_h265_enc_picture_desc
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue