Accept packed misc data package such as SEI data
authorXiang, Haihao <haihao.xiang@intel.com>
Thu, 31 May 2012 10:49:44 +0000 (18:49 +0800)
committerXiang, Haihao <haihao.xiang@intel.com>
Thu, 31 May 2012 13:42:42 +0000 (21:42 +0800)
Signed-off-by: Xiang, Haihao <haihao.xiang@intel.com>
Tested-by: Dmitry Ermilov <dmitry.ermilov@intel.com>
src/gen6_mfc.c
src/i965_drv_video.c
src/i965_drv_video.h

index 7cb34fc..a730181 100644 (file)
@@ -624,16 +624,15 @@ static void gen6_mfc_avc_pipeline_header_programing(VADriverContextP ctx,
                                                     struct intel_batchbuffer *slice_batch)
 {
     struct gen6_mfc_context *mfc_context = encoder_context->mfc_context;
-    static int count = 0;
-    unsigned int rate_control_mode = encoder_context->rate_control_mode;
+    int idx = va_enc_packed_type_to_idx(VAEncPackedHeaderH264_SPS);
 
-    if (encode_state->packed_header_data[VAEncPackedHeaderH264_SPS]) {
+    if (encode_state->packed_header_data[idx]) {
         VAEncPackedHeaderParameterBuffer *param = NULL;
-        unsigned int *header_data = (unsigned int *)encode_state->packed_header_data[VAEncPackedHeaderH264_SPS]->buffer;
+        unsigned int *header_data = (unsigned int *)encode_state->packed_header_data[idx]->buffer;
         unsigned int length_in_bits;
 
-        assert(encode_state->packed_header_param[VAEncPackedHeaderH264_SPS]);
-        param = (VAEncPackedHeaderParameterBuffer *)encode_state->packed_header_param[VAEncPackedHeaderH264_SPS]->buffer;
+        assert(encode_state->packed_header_param[idx]);
+        param = (VAEncPackedHeaderParameterBuffer *)encode_state->packed_header_param[idx]->buffer;
         length_in_bits = param->bit_length;
 
         mfc_context->insert_object(ctx,
@@ -648,13 +647,15 @@ static void gen6_mfc_avc_pipeline_header_programing(VADriverContextP ctx,
                                    slice_batch);
     }
 
-    if (encode_state->packed_header_data[VAEncPackedHeaderH264_PPS]) {
+    idx = va_enc_packed_type_to_idx(VAEncPackedHeaderH264_PPS);
+
+    if (encode_state->packed_header_data[idx]) {
         VAEncPackedHeaderParameterBuffer *param = NULL;
-        unsigned int *header_data = (unsigned int *)encode_state->packed_header_data[VAEncPackedHeaderH264_PPS]->buffer;
+        unsigned int *header_data = (unsigned int *)encode_state->packed_header_data[idx]->buffer;
         unsigned int length_in_bits;
 
-        assert(encode_state->packed_header_param[VAEncPackedHeaderH264_PPS]);
-        param = (VAEncPackedHeaderParameterBuffer *)encode_state->packed_header_param[VAEncPackedHeaderH264_PPS]->buffer;
+        assert(encode_state->packed_header_param[idx]);
+        param = (VAEncPackedHeaderParameterBuffer *)encode_state->packed_header_param[idx]->buffer;
         length_in_bits = param->bit_length;
 
         mfc_context->insert_object(ctx,
@@ -669,47 +670,28 @@ static void gen6_mfc_avc_pipeline_header_programing(VADriverContextP ctx,
                                    slice_batch);
     }
     
-    if ( (rate_control_mode == VA_RC_CBR) && encode_state->packed_header_data[VAEncPackedHeaderH264_SPS]) {       // this is frist AU
-        struct gen6_mfc_context *mfc_context = encoder_context->mfc_context;
+    idx = va_enc_packed_type_to_idx(VAEncPackedHeaderH264_SEI);
 
-        unsigned char *sei_data = NULL;
-        int length_in_bits = build_avc_sei_buffering_period(mfc_context->vui_hrd.i_initial_cpb_removal_delay_length, 
-                                                            mfc_context->vui_hrd.i_initial_cpb_removal_delay, 0, &sei_data);
-        mfc_context->insert_object(ctx,
-                                   encoder_context,
-                                   (unsigned int *)sei_data,
-                                   ALIGN(length_in_bits, 32) >> 5,
-                                   length_in_bits & 0x1f,
-                                   4,   
-                                   0,   
-                                   0,   
-                                   1,
-                                   slice_batch);  
-        free(sei_data);
-    }    
+    if (encode_state->packed_header_data[idx]) {
+        VAEncPackedHeaderParameterBuffer *param = NULL;
+        unsigned int *header_data = (unsigned int *)encode_state->packed_header_data[idx]->buffer;
+        unsigned int length_in_bits;
+
+        assert(encode_state->packed_header_param[idx]);
+        param = (VAEncPackedHeaderParameterBuffer *)encode_state->packed_header_param[idx]->buffer;
+        length_in_bits = param->bit_length;
 
-    // SEI pic_timing header
-    if (rate_control_mode == VA_RC_CBR) {   
-        struct gen6_mfc_context *mfc_context = encoder_context->mfc_context;
-        unsigned char *sei_data = NULL;
-        int length_in_bits = build_avc_sei_pic_timing( mfc_context->vui_hrd.i_cpb_removal_delay_length,
-                                                       mfc_context->vui_hrd.i_cpb_removal_delay * mfc_context->vui_hrd.i_frame_number,
-                                                       mfc_context->vui_hrd.i_dpb_output_delay_length,
-                                                       0, &sei_data);
         mfc_context->insert_object(ctx,
                                    encoder_context,
-                                   (unsigned int *)sei_data,
+                                   header_data,
                                    ALIGN(length_in_bits, 32) >> 5,
                                    length_in_bits & 0x1f,
-                                   4,   
-                                   0,   
-                                   0,   
-                                   1,
-                                   slice_batch);  
-        free(sei_data);
-    }  
-    
-    count++;
+                                   5, /* FIXME: check it */
+                                   0,
+                                   0,
+                                   !param->has_emulation_bytes,
+                                   slice_batch);
+    }
 }
 
 static void gen6_mfc_avc_pipeline_picture_programing( VADriverContextP ctx,
index bf8450b..715605e 100755 (executable)
@@ -190,6 +190,47 @@ static struct hw_codec_info gen7_hw_codec_info = {
     .max_height = 4096,
 };
 
+#define I965_PACKED_HEADER_BASE         0
+#define I965_PACKED_MISC_HEADER_BASE    3
+
+int
+va_enc_packed_type_to_idx(int packed_type)
+{
+    int idx = 0;
+
+    if (packed_type & VAEncPackedHeaderMiscMask) {
+        idx = I965_PACKED_MISC_HEADER_BASE;
+        packed_type = (~VAEncPackedHeaderMiscMask & packed_type);
+        assert(packed_type > 0);
+        idx += (packed_type - 1);
+    } else {
+        idx = I965_PACKED_HEADER_BASE;
+
+        switch (packed_type) {
+        case VAEncPackedHeaderSequence:
+            idx = I965_PACKED_HEADER_BASE + 0;
+            break;
+
+        case VAEncPackedHeaderPicture:
+            idx = I965_PACKED_HEADER_BASE + 1;
+            break;
+
+        case VAEncPackedHeaderSlice:
+            idx = I965_PACKED_HEADER_BASE + 2;
+            break;
+
+        default:
+            /* Should not get here */
+            assert(0);
+            break;
+        }
+    }
+
+    assert(idx < 4);
+    return idx;
+}
+
+
 VAStatus 
 i965_QueryConfigProfiles(VADriverContextP ctx,
                          VAProfile *profile_list,       /* out */
@@ -309,7 +350,7 @@ i965_GetConfigAttributes(VADriverContextP ctx,
 
         case VAConfigAttribEncPackedHeaders:
             if (entrypoint == VAEntrypointEncSlice) {
-                attrib_list[i].value = VA_ENC_PACKED_HEADER_SEQUENCE | VA_ENC_PACKED_HEADER_PICTURE;
+                attrib_list[i].value = VA_ENC_PACKED_HEADER_SEQUENCE | VA_ENC_PACKED_HEADER_PICTURE | VA_ENC_PACKED_HEADER_MISC;
                 break;
             }
 
@@ -1585,14 +1626,14 @@ static VAStatus
 i965_encoder_render_packed_header_parameter_buffer(VADriverContextP ctx,
                                                    struct object_context *obj_context,
                                                    struct object_buffer *obj_buffer,
-                                                   VAEncPackedHeaderType type)
+                                                   int type_index)
 {
     struct encode_state *encode = &obj_context->codec_state.encode;
 
     assert(obj_buffer->buffer_store->bo == NULL);
     assert(obj_buffer->buffer_store->buffer);
-    i965_release_buffer_store(&encode->packed_header_param[type]);
-    i965_reference_buffer_store(&encode->packed_header_param[type], obj_buffer->buffer_store);
+    i965_release_buffer_store(&encode->packed_header_param[type_index]);
+    i965_reference_buffer_store(&encode->packed_header_param[type_index], obj_buffer->buffer_store);
 
     return VA_STATUS_SUCCESS;
 }
@@ -1601,14 +1642,14 @@ static VAStatus
 i965_encoder_render_packed_header_data_buffer(VADriverContextP ctx,
                                               struct object_context *obj_context,
                                               struct object_buffer *obj_buffer,
-                                              VAEncPackedHeaderType type)
+                                              int type_index)
 {
     struct encode_state *encode = &obj_context->codec_state.encode;
 
     assert(obj_buffer->buffer_store->bo == NULL);
     assert(obj_buffer->buffer_store->buffer);
-    i965_release_buffer_store(&encode->packed_header_data[type]);
-    i965_reference_buffer_store(&encode->packed_header_data[type], obj_buffer->buffer_store);
+    i965_release_buffer_store(&encode->packed_header_data[type_index]);
+    i965_reference_buffer_store(&encode->packed_header_data[type_index], obj_buffer->buffer_store);
 
     return VA_STATUS_SUCCESS;
 }
@@ -1676,7 +1717,7 @@ i965_encoder_render_picture(VADriverContextP ctx,
             vaStatus = i965_encoder_render_packed_header_parameter_buffer(ctx,
                                                                           obj_context,
                                                                           obj_buffer,
-                                                                          encode->last_packed_header_type);
+                                                                          va_enc_packed_type_to_idx(encode->last_packed_header_type));
             break;
         }
 
@@ -1686,11 +1727,13 @@ i965_encoder_render_picture(VADriverContextP ctx,
 
             assert(encode->last_packed_header_type == VAEncPackedHeaderSequence ||
                    encode->last_packed_header_type == VAEncPackedHeaderPicture ||
-                   encode->last_packed_header_type == VAEncPackedHeaderSlice);
+                   encode->last_packed_header_type == VAEncPackedHeaderSlice ||
+                   ((encode->last_packed_header_type & VAEncPackedHeaderMiscMask == VAEncPackedHeaderMiscMask) &&
+                    (encode->last_packed_header_type & (~VAEncPackedHeaderMiscMask) != 0)));
             vaStatus = i965_encoder_render_packed_header_data_buffer(ctx, 
                                                                      obj_context,
                                                                      obj_buffer,
-                                                                     encode->last_packed_header_type);
+                                                                     va_enc_packed_type_to_idx(encode->last_packed_header_type));
             break;       
         }
 
index ceb693a..fe363a8 100644 (file)
@@ -310,4 +310,7 @@ i965_check_alloc_surface_bo(VADriverContextP ctx,
                             unsigned int fourcc,
                             unsigned int subsampling);
 
+int
+va_enc_packed_type_to_idx(int packed_type);
+
 #endif /* _I965_DRV_VIDEO_H_ */