OSDN Git Service

Fix AUD insert issue in AVC encoder with GEN6/7.5/8.
authorJun Zhao <jun.zhao@intel.com>
Tue, 16 May 2017 15:26:34 +0000 (23:26 +0800)
committerXiang, Haihao <haihao.xiang@intel.com>
Mon, 22 May 2017 07:51:44 +0000 (15:51 +0800)
If find the AUD NAL in raw data list, it will insert AUD first in
the bitstream.

Fix #155

Signed-off-by: Jun Zhao <jun.zhao@intel.com>
src/gen6_mfc.c
src/gen6_mfc.h
src/gen6_mfc_common.c
src/gen75_mfc.c
src/gen8_mfc.c

index 147a1cf..c79053d 100644 (file)
@@ -823,7 +823,7 @@ gen6_mfc_avc_pipeline_slice_programing(VADriverContextP ctx,
 
     intel_avc_slice_insert_packed_data(ctx, encode_state, encoder_context, slice_index, slice_batch);
 
-    dri_bo_map(vme_context->vme_output.bo , 1);
+    dri_bo_map(vme_context->vme_output.bo, 1);
     msg = (unsigned int *)vme_context->vme_output.bo->virtual;
 
     if (is_intra) {
@@ -1213,8 +1213,10 @@ gen6_mfc_avc_batchbuffer_slice(VADriverContextP ctx,
                              qp_slice,
                              slice_batch);
 
-    if (slice_index == 0)
+    if (slice_index == 0) {
+        intel_avc_insert_aud_packed_data(ctx, encode_state, encoder_context, slice_batch);
         intel_mfc_avc_pipeline_header_programing(ctx, encode_state, encoder_context, slice_batch);
+    }
 
     intel_avc_slice_insert_packed_data(ctx, encode_state, encoder_context, slice_index, slice_batch);
 
@@ -1404,7 +1406,6 @@ gen6_mfc_pipeline(VADriverContextP ctx,
         vaStatus = gen6_mfc_avc_encode_picture(ctx, encode_state, encoder_context);
         break;
 
-        /* FIXME: add for other profile */
     default:
         vaStatus = VA_STATUS_ERROR_UNSUPPORTED_PROFILE;
         break;
index 9161c0e..efe3cab 100644 (file)
@@ -376,6 +376,12 @@ extern
 Bool gen8_mfc_context_init(VADriverContextP ctx, struct intel_encoder_context *encoder_context);
 
 extern void
+intel_avc_insert_aud_packed_data(VADriverContextP ctx,
+                                 struct encode_state *encode_state,
+                                 struct intel_encoder_context *encoder_context,
+                                 struct intel_batchbuffer *batch);
+
+extern void
 intel_avc_slice_insert_packed_data(VADriverContextP ctx,
                                    struct encode_state *encode_state,
                                    struct intel_encoder_context *encoder_context,
index f5a68cb..29f3154 100644 (file)
@@ -1704,6 +1704,52 @@ intel_avc_vme_reference_state(VADriverContextP ctx,
     }
 }
 
+#define AVC_NAL_DELIMITER           9
+void
+intel_avc_insert_aud_packed_data(VADriverContextP ctx,
+                                 struct encode_state *encode_state,
+                                 struct intel_encoder_context *encoder_context,
+                                 struct intel_batchbuffer *batch)
+{
+    VAEncPackedHeaderParameterBuffer *param = NULL;
+    unsigned int length_in_bits;
+    unsigned int *header_data = NULL;
+    unsigned char *nal_type = NULL;
+    int count, i, start_index;
+    struct gen6_mfc_context *mfc_context = encoder_context->mfc_context;
+
+    count = encode_state->slice_rawdata_count[0];
+    start_index = (encode_state->slice_rawdata_index[0] & SLICE_PACKED_DATA_INDEX_MASK);
+
+    for (i = 0; i < count; i++) {
+        unsigned int skip_emul_byte_cnt;
+
+        header_data = (unsigned int *)encode_state->packed_header_data_ext[start_index + i]->buffer;
+        nal_type = (unsigned char *)header_data;
+
+        param = (VAEncPackedHeaderParameterBuffer *)(encode_state->packed_header_params_ext[start_index + i]->buffer);
+
+        length_in_bits = param->bit_length;
+
+        skip_emul_byte_cnt = intel_avc_find_skipemulcnt((unsigned char *)header_data, length_in_bits);
+
+        if ((*(nal_type + skip_emul_byte_cnt - 1) & 0x1f) == AVC_NAL_DELIMITER) {
+            mfc_context->insert_object(ctx,
+                                       encoder_context,
+                                       header_data,
+                                       ALIGN(length_in_bits, 32) >> 5,
+                                       length_in_bits & 0x1f,
+                                       skip_emul_byte_cnt,
+                                       0,
+                                       0,
+                                       !param->has_emulation_bytes,
+                                       batch);
+            break;
+        }
+    }
+}
+
+
 void intel_avc_slice_insert_packed_data(VADriverContextP ctx,
                                         struct encode_state *encode_state,
                                         struct intel_encoder_context *encoder_context,
@@ -1716,6 +1762,7 @@ void intel_avc_slice_insert_packed_data(VADriverContextP ctx,
     unsigned int *header_data = NULL;
     struct gen6_mfc_context *mfc_context = encoder_context->mfc_context;
     int slice_header_index;
+    unsigned char *nal_type = NULL;
 
     if (encode_state->slice_header_index[slice_index] == 0)
         slice_header_index = -1;
@@ -1729,18 +1776,19 @@ void intel_avc_slice_insert_packed_data(VADriverContextP ctx,
         unsigned int skip_emul_byte_cnt;
 
         header_data = (unsigned int *)encode_state->packed_header_data_ext[start_index + i]->buffer;
+        nal_type = (unsigned char *)header_data;
 
         param = (VAEncPackedHeaderParameterBuffer *)
                 (encode_state->packed_header_params_ext[start_index + i]->buffer);
 
-        /* skip the slice header packed data type as it is lastly inserted */
-        if (param->type == VAEncPackedHeaderSlice)
-            continue;
-
         length_in_bits = param->bit_length;
 
         skip_emul_byte_cnt = intel_avc_find_skipemulcnt((unsigned char *)header_data, length_in_bits);
 
+        /* skip the slice header/AUD packed data type as it is lastly inserted */
+        if (param->type == VAEncPackedHeaderSlice || (*(nal_type + skip_emul_byte_cnt - 1) & 0x1f) == AVC_NAL_DELIMITER)
+            continue;
+
         /* as the slice header is still required, the last header flag is set to
          * zero.
          */
index 2f65f1b..aa291d5 100644 (file)
@@ -1194,12 +1194,14 @@ gen75_mfc_avc_pipeline_slice_programing(VADriverContextP ctx,
                               encode_state, encoder_context,
                               (rate_control_mode != VA_RC_CQP), qp_slice, slice_batch);
 
-    if (slice_index == 0)
+    if (slice_index == 0) {
+        intel_avc_insert_aud_packed_data(ctx, encode_state, encoder_context, slice_batch);
         intel_mfc_avc_pipeline_header_programing(ctx, encode_state, encoder_context, slice_batch);
+    }
 
     intel_avc_slice_insert_packed_data(ctx, encode_state, encoder_context, slice_index, slice_batch);
 
-    dri_bo_map(vme_context->vme_output.bo , 1);
+    dri_bo_map(vme_context->vme_output.bo, 1);
     msg_ptr = (unsigned char *)vme_context->vme_output.bo->virtual;
 
     if (is_intra) {
@@ -1442,7 +1444,7 @@ gen75_mfc_avc_batchbuffer_slice_command(VADriverContextP ctx,
     int mb_x, mb_y;
     int last_mb, slice_end_x, slice_end_y;
     int remaining_mb = total_mbs;
-    uint32_t fwd_ref , bwd_ref, mb_flag;
+    uint32_t fwd_ref, bwd_ref, mb_flag;
 
     last_mb = slice_param->macroblock_address + total_mbs - 1;
     slice_end_x = last_mb % width_in_mbs;
@@ -1544,8 +1546,10 @@ gen75_mfc_avc_batchbuffer_slice(VADriverContextP ctx,
                               qp_slice,
                               slice_batch);
 
-    if (slice_index == 0)
+    if (slice_index == 0) {
+        intel_avc_insert_aud_packed_data(ctx, encode_state, encoder_context, slice_batch);
         intel_mfc_avc_pipeline_header_programing(ctx, encode_state, encoder_context, slice_batch);
+    }
 
     intel_avc_slice_insert_packed_data(ctx, encode_state, encoder_context, slice_index, slice_batch);
 
@@ -2143,7 +2147,7 @@ gen75_mfc_mpeg2_pipeline_slice_group(VADriverContextP ctx,
     v_start_pos = slice_param->macroblock_address / width_in_mbs;
     assert(h_start_pos + slice_param->num_macroblocks <= width_in_mbs);
 
-    dri_bo_map(vme_context->vme_output.bo , 0);
+    dri_bo_map(vme_context->vme_output.bo, 0);
     msg_ptr = (unsigned char *)vme_context->vme_output.bo->virtual;
 
     if (next_slice_group_param) {
@@ -2527,7 +2531,6 @@ static VAStatus gen75_mfc_pipeline(VADriverContextP ctx,
         vaStatus = gen75_mfc_avc_encode_picture(ctx, encode_state, encoder_context);
         break;
 
-        /* FIXME: add for other profile */
     case VAProfileMPEG2Simple:
     case VAProfileMPEG2Main:
         vaStatus = gen75_mfc_mpeg2_encode_picture(ctx, encode_state, encoder_context);
index 6ed17db..b6bf4a0 100644 (file)
@@ -1190,12 +1190,14 @@ gen8_mfc_avc_pipeline_slice_programing(VADriverContextP ctx,
                              encode_state, encoder_context,
                              (rate_control_mode != VA_RC_CQP), qp_slice, slice_batch);
 
-    if (slice_index == 0)
+    if (slice_index == 0) {
+        intel_avc_insert_aud_packed_data(ctx, encode_state, encoder_context, slice_batch);
         intel_mfc_avc_pipeline_header_programing(ctx, encode_state, encoder_context, slice_batch);
+    }
 
     intel_avc_slice_insert_packed_data(ctx, encode_state, encoder_context, slice_index, slice_batch);
 
-    dri_bo_map(vme_context->vme_output.bo , 1);
+    dri_bo_map(vme_context->vme_output.bo, 1);
     msg_ptr = (unsigned char *)vme_context->vme_output.bo->virtual;
 
     if (is_intra) {
@@ -1430,7 +1432,7 @@ gen8_mfc_avc_batchbuffer_slice_command(VADriverContextP ctx,
     int mb_x, mb_y;
     int last_mb, slice_end_x, slice_end_y;
     int remaining_mb = total_mbs;
-    uint32_t fwd_ref , bwd_ref, mb_flag;
+    uint32_t fwd_ref, bwd_ref, mb_flag;
     char tmp_qp;
     int number_roi_mbs, max_mb_cmds, i;
 
@@ -1550,8 +1552,10 @@ gen8_mfc_avc_batchbuffer_slice(VADriverContextP ctx,
                              qp_slice,
                              slice_batch);
 
-    if (slice_index == 0)
+    if (slice_index == 0) {
+        intel_avc_insert_aud_packed_data(ctx, encode_state, encoder_context, slice_batch);
         intel_mfc_avc_pipeline_header_programing(ctx, encode_state, encoder_context, slice_batch);
+    }
 
     intel_avc_slice_insert_packed_data(ctx, encode_state, encoder_context, slice_index, slice_batch);
 
@@ -2168,7 +2172,7 @@ gen8_mfc_mpeg2_pipeline_slice_group(VADriverContextP ctx,
     v_start_pos = slice_param->macroblock_address / width_in_mbs;
     assert(h_start_pos + slice_param->num_macroblocks <= width_in_mbs);
 
-    dri_bo_map(vme_context->vme_output.bo , 0);
+    dri_bo_map(vme_context->vme_output.bo, 0);
     msg_ptr = (unsigned char *)vme_context->vme_output.bo->virtual;
 
     if (next_slice_group_param) {
@@ -4264,7 +4268,7 @@ gen8_mfc_vp8_pak_pipeline(VADriverContextP ctx,
 
     is_intra_frame = !pic_param->pic_flags.bits.frame_type;
 
-    dri_bo_map(vme_context->vme_output.bo , 1);
+    dri_bo_map(vme_context->vme_output.bo, 1);
     msg_ptr = (unsigned char *)vme_context->vme_output.bo->virtual;
 
     for (i = 0; i < width_in_mbs * height_in_mbs; i++) {
@@ -4529,7 +4533,6 @@ static VAStatus gen8_mfc_pipeline(VADriverContextP ctx,
         vaStatus = gen8_mfc_avc_encode_picture(ctx, encode_state, encoder_context);
         break;
 
-        /* FIXME: add for other profile */
     case VAProfileMPEG2Simple:
     case VAProfileMPEG2Main:
         vaStatus = gen8_mfc_mpeg2_encode_picture(ctx, encode_state, encoder_context);