}
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) {
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:
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)
{
VAStatus vaStatus = VA_STATUS_SUCCESS;
vaStatus = handleVAEncMiscParameterTypeMaxFrameSize(context, misc);
break;
+ case VAEncMiscParameterTypeHRD:
+ vaStatus = handleVAEncMiscParameterTypeHRD(context, misc);
+ break;
+
default:
break;
}
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 =
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;
}
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
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) {
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;
}
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
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;
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);
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
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
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