[Libva] [PATCH libva-intel-driver 14/18] encoding:use the qp per every macroblock on Ivy

Zhao, Yakui yakui.zhao at intel.com
Mon Jan 12 05:01:37 PST 2015


From: Zhao Yakui <yakui.zhao at intel.com>

Signed-off-by: Zhao Yakui <yakui.zhao at intel.com>
---
 src/gen6_mfc.c        |   13 ++++++++++---
 src/gen6_mfc_common.c |   16 ++++++++++++++--
 src/gen7_vme.c        |   11 ++++++++++-
 3 files changed, 34 insertions(+), 6 deletions(-)

diff --git a/src/gen6_mfc.c b/src/gen6_mfc.c
index a474182..e58e6a2 100644
--- a/src/gen6_mfc.c
+++ b/src/gen6_mfc.c
@@ -791,6 +791,7 @@ gen6_mfc_avc_pipeline_slice_programing(VADriverContextP ctx,
     int slice_type = intel_avc_enc_slice_type_fixup(pSliceParameter->slice_type);
     int is_intra = slice_type == SLICE_TYPE_I;
     int qp_slice;
+    int qp_mb;
 
     qp_slice = qp;
     if (rate_control_mode == VA_RC_CBR) {
@@ -835,15 +836,21 @@ gen6_mfc_avc_pipeline_slice_programing(VADriverContextP ctx,
         x = i % width_in_mbs;
         y = i / width_in_mbs;
 
+        if (vme_context->roi_enabled) {
+            qp_mb = *(vme_context->qp_per_mb + i);
+        } else
+            qp_mb = qp;
         if (is_intra) {
             assert(msg);
-            gen6_mfc_avc_pak_object_intra(ctx, x, y, last_mb, qp, msg, encoder_context, 0, 0, slice_batch);
+            gen6_mfc_avc_pak_object_intra(ctx, x, y, last_mb, qp_mb, msg, encoder_context, 0, 0, slice_batch);
             msg += INTRA_VME_OUTPUT_IN_DWS;
         } else {
             if (msg[0] & INTRA_MB_FLAG_MASK) {
-                gen6_mfc_avc_pak_object_intra(ctx, x, y, last_mb, qp, msg, encoder_context, 0, 0, slice_batch);
+                gen6_mfc_avc_pak_object_intra(ctx, x, y, last_mb, qp_mb, msg, encoder_context, 0, 0, slice_batch);
             } else {
-                gen6_mfc_avc_pak_object_inter(ctx, x, y, last_mb, qp, msg, offset, encoder_context, 0, 0, slice_type, slice_batch);
+                gen6_mfc_avc_pak_object_inter(ctx, x, y, last_mb, qp_mb,
+                                              msg, offset, encoder_context,
+                                              0, 0, slice_type, slice_batch);
             }
 
             msg += INTER_VME_OUTPUT_IN_DWS;
diff --git a/src/gen6_mfc_common.c b/src/gen6_mfc_common.c
index 991f820..9dfec15 100644
--- a/src/gen6_mfc_common.c
+++ b/src/gen6_mfc_common.c
@@ -1008,6 +1008,7 @@ gen7_vme_walker_fill_vme_batchbuffer(VADriverContextP ctx,
     VAEncSliceParameterBufferH264 *slice_param = (VAEncSliceParameterBufferH264 *)encode_state->slice_params_ext[0]->buffer;
     int qp;
     int slice_type = intel_avc_enc_slice_type_fixup(slice_param->slice_type);
+    int qp_mb, qp_index;
 
     if (encoder_context->rate_control_mode == VA_RC_CQP)
         qp = pic_param->pic_init_qp + slice_param->slice_qp_delta;
@@ -1064,7 +1065,13 @@ gen7_vme_walker_fill_vme_batchbuffer(VADriverContextP ctx,
 		*command_ptr++ = (mb_width << 16 | y_inner << 8 | x_inner);
 		*command_ptr++ = ((1 << 18) | (1 << 16) | transform_8x8_mode_flag | (mb_intra_ub << 8));
                 /* qp occupies one byte */
-                *command_ptr++ = qp;
+
+                if (vme_context->roi_enabled) {
+                    qp_index = y_inner * mb_width + x_inner;
+                    qp_mb = *(vme_context->qp_per_mb + qp_index);
+                } else
+                    qp_mb = qp;
+                *command_ptr++ = qp_mb;
 		x_inner -= 2;
 		y_inner += 1;
 	    }
@@ -1110,7 +1117,12 @@ gen7_vme_walker_fill_vme_batchbuffer(VADriverContextP ctx,
 		*command_ptr++ = (mb_width << 16 | y_inner << 8 | x_inner);
 		*command_ptr++ = ((1 << 18) | (1 << 16) | transform_8x8_mode_flag | (mb_intra_ub << 8));
                 /* qp occupies one byte */
-                *command_ptr++ = qp;
+                if (vme_context->roi_enabled) {
+                    qp_index = y_inner * mb_width + x_inner;
+                    qp_mb = *(vme_context->qp_per_mb + qp_index);
+                } else
+                    qp_mb = qp;
+                *command_ptr++ = qp_mb;
 
 		x_inner -= 2;
 		y_inner += 1;
diff --git a/src/gen7_vme.c b/src/gen7_vme.c
index f75498e..488cef6 100644
--- a/src/gen7_vme.c
+++ b/src/gen7_vme.c
@@ -550,6 +550,7 @@ gen7_vme_fill_vme_batchbuffer(VADriverContextP ctx,
     VAEncSliceParameterBufferH264 *slice_param = (VAEncSliceParameterBufferH264 *)encode_state->slice_params_ext[0]->buffer;
     int qp;
     int slice_type = intel_avc_enc_slice_type_fixup(slice_param->slice_type);
+    int qp_mb, qp_index;
 
     if (encoder_context->rate_control_mode == VA_RC_CQP)
         qp = pic_param->pic_init_qp + slice_param->slice_qp_delta;
@@ -615,7 +616,12 @@ gen7_vme_fill_vme_batchbuffer(VADriverContextP ctx,
                 *command_ptr++ = (mb_width << 16 | mb_y << 8 | mb_x);
                 *command_ptr++ = ((encoder_context->quality_level << 24) | (1 << 16) | transform_8x8_mode_flag | (mb_intra_ub << 8));
 
-                *command_ptr++ = qp;
+                if (vme_context->roi_enabled) {
+                    qp_index = mb_y * mb_width + mb_x;
+                    qp_mb = *(vme_context->qp_per_mb + qp_index);
+                } else
+                    qp_mb = qp;
+                *command_ptr++ = qp_mb;
                 i += 1;
             }
 
@@ -740,6 +746,9 @@ static VAStatus gen7_vme_prepare(VADriverContextP ctx,
 	
     intel_vme_update_mbmv_cost(ctx, encode_state, encoder_context);
     intel_h264_initialize_mbmv_cost(ctx, encode_state, encoder_context);
+
+    intel_h264_enc_roi_config(ctx, encode_state, encoder_context);
+
     /*Setup all the memory object*/
     gen7_vme_surface_setup(ctx, encode_state, is_intra, encoder_context);
     gen7_vme_interface_setup(ctx, encode_state, encoder_context);
-- 
1.7.10.1



More information about the Libva mailing list