OSDN Git Service

Add the support of ROI for HEVC encoder on GEN9 SKL+
authorpeng.chen <peng.c.chen@intel.com>
Tue, 20 Jun 2017 06:25:58 +0000 (14:25 +0800)
committerXiang, Haihao <haihao.xiang@intel.com>
Thu, 13 Jul 2017 04:17:12 +0000 (12:17 +0800)
Fixes #179

Signed-off-by: peng.chen <peng.c.chen@intel.com>
src/gen9_hevc_encoder.c
src/gen9_hevc_encoder.h

index 03f19a7..2f4818c 100644 (file)
@@ -1658,6 +1658,29 @@ gen9_hevc_get_b_mbenc_default_curbe(enum HEVC_TU_MODE tu_mode,
 // BRC start
 
 static void
+gen9_hevc_configure_roi(struct encode_state *encode_state,
+                        struct intel_encoder_context *encoder_context)
+{
+    struct encoder_vme_mfc_context *vme_context = NULL;
+    struct gen9_hevc_encoder_state *priv_state = NULL;
+    int i = 0;
+
+    vme_context = (struct encoder_vme_mfc_context *)encoder_context->vme_context;
+    priv_state = (struct gen9_hevc_encoder_state *)vme_context->private_enc_state;
+
+    priv_state->num_roi = MIN(encoder_context->brc.num_roi, I965_MAX_NUM_ROI_REGIONS);
+    priv_state->roi_value_is_qp_delta = encoder_context->brc.roi_value_is_qp_delta;
+
+    for (i = 0; i < priv_state->num_roi; i++) {
+        priv_state->roi[i].left = encoder_context->brc.roi[i].left >> 4;
+        priv_state->roi[i].right = encoder_context->brc.roi[i].right >> 4;
+        priv_state->roi[i].top = encoder_context->brc.roi[i].top >> 4;
+        priv_state->roi[i].bottom = encoder_context->brc.roi[i].bottom >> 4;
+        priv_state->roi[i].value = encoder_context->brc.roi[i].value;
+    }
+}
+
+static void
 gen9_hevc_brc_prepare(struct encode_state *encode_state,
                       struct intel_encoder_context *encoder_context)
 {
@@ -1756,6 +1779,8 @@ gen9_hevc_brc_prepare(struct encode_state *encode_state,
         generic_state->brc_need_reset = brc_reset;
         encoder_context->brc.need_reset = 0;
     }
+
+    gen9_hevc_configure_roi(encode_state, encoder_context);
 }
 
 static void
@@ -2147,49 +2172,44 @@ gen9_hevc_brc_update_lcu_based_set_roi_parameters(VADriverContextP ctx,
         int cur_mb_x = i - cur_mb_y * priv_state->width_in_mb;
         int roi_idx = 0;
 
-        if (cur_mb_x > 1 && cur_mb_x < (priv_state->width_in_mb - 2) &&
-            cur_mb_y > 1 && cur_mb_y < (priv_state->width_in_mb - 2)) {
-            out_data = 0;
+        out_data = 0;
 
-            for (roi_idx = (priv_state->num_roi - 1); roi_idx >= 0; roi_idx--) {
-                roi_par = &priv_state->roi[roi_idx];
+        for (roi_idx = (priv_state->num_roi - 1); roi_idx >= 0; roi_idx--) {
+            roi_par = &priv_state->roi[roi_idx];
 
-                roi_level = qp_delta = 0;
-                if (generic_state->brc_enabled)
-                    roi_level = roi_par->value * 5;
-                else
-                    qp_delta = roi_par->value;
+            roi_level = qp_delta = 0;
+            if (generic_state->brc_enabled && !priv_state->roi_value_is_qp_delta)
+                roi_level = roi_par->value * 5;
+            else
+                qp_delta = roi_par->value;
 
-#if 0
-                if (roi_level == 0)
-                    continue;
-#endif
+            if (roi_level == 0 && qp_delta == 0)
+                continue;
 
-                if ((cur_mb_x >= roi_par->left) &&
-                    (cur_mb_x < roi_par->right) &&
-                    (cur_mb_y >= roi_par->top) &&
-                    (cur_mb_y < roi_par->bottom))
-                    out_data = 15 | (((roi_level) & 0xFF) << 8) | ((qp_delta & 0xFF) << 16);
-                else if ((cur_mb_x >= roi_par->left - 1) &&
-                         (cur_mb_x < roi_par->right + 1) &&
-                         (cur_mb_y >= roi_par->top - 1) &&
-                         (cur_mb_y < roi_par->top + 1))
-                    out_data = 14 | (((roi_level) & 0xFF) << 8) | ((qp_delta & 0xFF) << 16);
-                else if ((cur_mb_x >= roi_par->left - 2) &&
-                         (cur_mb_x < roi_par->right + 2) &&
-                         (cur_mb_y >= roi_par->top - 2) &&
-                         (cur_mb_y < roi_par->top + 2))
-                    out_data = 13 | (((roi_level) & 0xFF) << 8) | ((qp_delta & 0xFF) << 16);
-                else if ((cur_mb_x >= roi_par->left - 3) &&
-                         (cur_mb_x < roi_par->right + 3) &&
-                         (cur_mb_y >= roi_par->top - 3) &&
-                         (cur_mb_y < roi_par->top + 3)) {
-                    if (qp_delta >= 3)
-                        out_data = 12 | (((roi_level) & 0xFF) << 8) | ((qp_delta & 0xFF) << 16);
-                }
+            if ((cur_mb_x >= roi_par->left) &&
+                (cur_mb_x < roi_par->right) &&
+                (cur_mb_y >= roi_par->top) &&
+                (cur_mb_y < roi_par->bottom))
+                out_data = 15 | (((roi_level) & 0xFF) << 8) | ((qp_delta & 0xFF) << 16);
+            else if ((cur_mb_x >= roi_par->left - 1) &&
+                     (cur_mb_x < roi_par->right + 1) &&
+                     (cur_mb_y >= roi_par->top - 1) &&
+                     (cur_mb_y < roi_par->bottom + 1))
+                out_data = 14 | (((roi_level) & 0xFF) << 8) | ((qp_delta & 0xFF) << 16);
+            else if ((cur_mb_x >= roi_par->left - 2) &&
+                     (cur_mb_x < roi_par->right + 2) &&
+                     (cur_mb_y >= roi_par->top - 2) &&
+                     (cur_mb_y < roi_par->bottom + 2))
+                out_data = 13 | (((roi_level) & 0xFF) << 8) | ((qp_delta & 0xFF) << 16);
+            else if ((cur_mb_x >= roi_par->left - 3) &&
+                     (cur_mb_x < roi_par->right + 3) &&
+                     (cur_mb_y >= roi_par->top - 3) &&
+                     (cur_mb_y < roi_par->bottom + 3)) {
+                out_data = 12 | (((roi_level) & 0xFF) << 8) | ((qp_delta & 0xFF) << 16);
             }
-            pdata[(cur_mb_y * (width_in_mb_aligned >> 2)) + cur_mb_x] = out_data;
         }
+
+        pdata[(cur_mb_y * (width_in_mb_aligned >> 2)) + cur_mb_x] = out_data;
     }
 
     i965_unmap_gpe_resource(&priv_ctx->res_roi_buffer);
@@ -2228,11 +2248,11 @@ gen9_hevc_brc_update_lcu_based_set_curbe(VADriverContextP ctx,
     } else {
         memcpy((void *)cmd, GEN9_HEVC_BRCUPDATE_CURBE_DATA,
                sizeof(GEN9_HEVC_BRCUPDATE_CURBE_DATA));
-
-        if (priv_state->num_roi)
-            gen9_hevc_brc_update_set_roi_curbe(ctx, encode_state, encoder_context, cmd);
     }
 
+    if (priv_state->num_roi)
+        gen9_hevc_brc_update_set_roi_curbe(ctx, encode_state, encoder_context, cmd);
+
     i965_gpe_context_unmap_curbe(gpe_context);
 }
 
index 460295b..740421a 100644 (file)
@@ -481,6 +481,7 @@ struct gen9_hevc_encoder_state {
     unsigned int parallel_brc;
 
     unsigned int num_roi;
+    unsigned int roi_value_is_qp_delta;
     unsigned int max_delta_qp;
     unsigned int min_delta_qp;
     struct intel_roi roi[MAX_HEVC_MAX_NUM_ROI];