st/va: add preset values for VAAPI encode
authorBoyuan Zhang <boyuan.zhang@amd.com>
Thu, 21 Jul 2016 23:40:19 +0000 (19:40 -0400)
committerChristian König <christian.koenig@amd.com>
Mon, 25 Jul 2016 11:39:52 +0000 (13:39 +0200)
Add some hardcoded values hardware needs mainly for rate control purpose. With previously hardcoded values for OMX, the rate control result is not correct. This change fixed the rate control result by setting correct values for Vaapi.

Signed-off-by: Boyuan Zhang <boyuan.zhang@amd.com>
src/gallium/state_trackers/va/picture.c

index 4bb60f20d9d6898e88c6c263b9fde79363f4153a..4abf1555819c1aeb8127749d719afcb1f9d89fcf 100644 (file)
@@ -95,6 +95,32 @@ vlVaGetReferenceFrame(vlVaDriver *drv, VASurfaceID surface_id,
       *ref_frame = NULL;
 }
 
+static void
+getEncParamPreset(vlVaContext *context)
+{
+   //motion estimation preset
+   context->desc.h264enc.motion_est.motion_est_quarter_pixel = 0x00000001;
+   context->desc.h264enc.motion_est.lsmvert = 0x00000002;
+   context->desc.h264enc.motion_est.enc_disable_sub_mode = 0x00000078;
+   context->desc.h264enc.motion_est.enc_en_ime_overw_dis_subm = 0x00000001;
+   context->desc.h264enc.motion_est.enc_ime_overw_dis_subm_no = 0x00000001;
+   context->desc.h264enc.motion_est.enc_ime2_search_range_x = 0x00000004;
+   context->desc.h264enc.motion_est.enc_ime2_search_range_y = 0x00000004;
+
+   //pic control preset
+   context->desc.h264enc.pic_ctrl.enc_cabac_enable = 0x00000001;
+   context->desc.h264enc.pic_ctrl.enc_constraint_set_flags = 0x00000040;
+
+   //rate control
+   context->desc.h264enc.rate_ctrl.vbv_buffer_size = 20000000;
+   context->desc.h264enc.rate_ctrl.vbv_buf_lv = 48;
+   context->desc.h264enc.rate_ctrl.fill_data_enable = 1;
+   context->desc.h264enc.rate_ctrl.enforce_hrd = 1;
+   context->desc.h264enc.enable_vui = false;
+
+   context->desc.h264enc.ref_pic_mode = 0x00000201;
+}
+
 static VAStatus
 handlePictureParameterBuffer(vlVaDriver *drv, vlVaContext *context, vlVaBuffer *buf)
 {
@@ -524,6 +550,7 @@ vlVaEndPicture(VADriverContextP ctx, VAContextID context_id)
 
    if (context->decoder->entrypoint == PIPE_VIDEO_ENTRYPOINT_ENCODE) {
       coded_buf = context->coded_buf;
+      getEncParamPreset(context);
       context->decoder->begin_frame(context->decoder, context->target, &context->desc.base);
       context->decoder->encode_bitstream(context->decoder, context->target,
                                          coded_buf->derived_surface.resource, &feedback);