OSDN Git Service

ENC: add AUD nal unit at the beginning of picture
authorPengfei Qu <Pengfei.Qu@intel.com>
Wed, 5 Apr 2017 02:59:48 +0000 (10:59 +0800)
committerXiang, Haihao <haihao.xiang@intel.com>
Thu, 13 Apr 2017 04:30:55 +0000 (12:30 +0800)
v0:parse nal type with generic method

Fixes #110

Signed-off-by: Pengfei Qu <Pengfei.Qu@intel.com>
src/gen9_avc_encoder.c
src/i965_avc_encoder_common.h

index 13fae55..79e9070 100644 (file)
@@ -6322,6 +6322,50 @@ gen9_mfc_avc_insert_object(VADriverContextP ctx,
 }
 
 static void
+gen9_mfc_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;
+
+    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 ) {
+            gen9_mfc_avc_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,
+                                       0,
+                                       batch);
+            break;
+        }
+    }
+}
+
+static void
 gen9_mfc_avc_insert_slice_packed_data(VADriverContextP ctx,
                                       struct encode_state *encode_state,
                                       struct intel_encoder_context *encoder_context,
@@ -6333,6 +6377,7 @@ gen9_mfc_avc_insert_slice_packed_data(VADriverContextP ctx,
     unsigned int *header_data = NULL;
     int count, i, start_index;
     int slice_header_index;
+    unsigned char *nal_type = NULL;
 
     if (encode_state->slice_header_index[slice_index] == 0)
         slice_header_index = -1;
@@ -6346,17 +6391,18 @@ gen9_mfc_avc_insert_slice_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 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.
          */
@@ -6441,6 +6487,10 @@ gen9_mfc_avc_inset_headers(VADriverContextP ctx,
     unsigned int skip_emul_byte_cnt;
 
     if (slice_index == 0) {
+
+        /* if AUD exist and insert it firstly */
+        gen9_mfc_avc_insert_aud_packed_data(ctx,encode_state,encoder_context,batch);
+
         if (encode_state->packed_header_data[idx]) {
             VAEncPackedHeaderParameterBuffer *param = NULL;
             unsigned int *header_data = (unsigned int *)encode_state->packed_header_data[idx]->buffer;
index 872dc4e..1fb4fa6 100644 (file)
@@ -57,6 +57,8 @@
 #define INTEL_AVC_WP_MODE_EXPLICIT 1
 #define INTEL_AVC_WP_MODE_IMPLICIT 2
 
+#define AVC_NAL_DELIMITER           9
+
 struct avc_param {
 
     // original width/height