Internal flag for the coded buffer
authorXiang, Haihao <haihao.xiang@intel.com>
Tue, 27 Nov 2012 08:08:26 +0000 (16:08 +0800)
committerXiang, Haihao <haihao.xiang@intel.com>
Fri, 14 Dec 2012 07:05:53 +0000 (15:05 +0800)
Signed-off-by: Xiang, Haihao <haihao.xiang@intel.com>
src/gen6_mfc_common.c
src/gen75_mfc.c
src/i965_drv_video.c
src/i965_drv_video.h

index fc62de2..2ece62b 100644 (file)
@@ -502,8 +502,7 @@ VAStatus intel_mfc_avc_prepare(VADriverContextP ctx,
     VAStatus vaStatus = VA_STATUS_SUCCESS;
     int i, j, enable_avc_ildb = 0;
     VAEncSliceParameterBufferH264 *slice_param;
-    VACodedBufferSegment *coded_buffer_segment;
-    unsigned char *flag = NULL;
+    struct i965_coded_buffer_segment *coded_buffer_segment;
     VAEncSequenceParameterBufferH264 *pSequenceParameter = (VAEncSequenceParameterBufferH264 *)encode_state->seq_param_ext->buffer;
     int width_in_mbs = pSequenceParameter->picture_width_in_mbs;
     int height_in_mbs = pSequenceParameter->picture_height_in_mbs;
@@ -630,9 +629,9 @@ VAStatus intel_mfc_avc_prepare(VADriverContextP ctx,
     dri_bo_reference(mfc_context->mfc_indirect_pak_bse_object.bo);
     
     dri_bo_map(bo, 1);
-    coded_buffer_segment = (VACodedBufferSegment *)bo->virtual;
-    flag = (unsigned char *)(coded_buffer_segment + 1);
-    *flag = 0;
+    coded_buffer_segment = (struct i965_coded_buffer_segment *)bo->virtual;
+    coded_buffer_segment->mapped = 0;
+    coded_buffer_segment->codec = CODED_H264;
     dri_bo_unmap(bo);
 
     return vaStatus;
index 7ba653f..28f18ec 100644 (file)
@@ -2043,7 +2043,8 @@ gen75_mfc_mpeg2_pipeline_slice_group(VADriverContextP ctx,
     struct gen6_mfc_context *mfc_context = encoder_context->mfc_context;
     VAEncSequenceParameterBufferMPEG2 *seq_param = (VAEncSequenceParameterBufferMPEG2 *)encode_state->seq_param_ext->buffer;
     VAEncSliceParameterBufferMPEG2 *slice_param = NULL;
-    unsigned int tail_data[] = {0x0, 0x0, 0x0, 0x0};
+    unsigned char tail_delimiter[] = {MPEG2_DELIMITER0, MPEG2_DELIMITER1, MPEG2_DELIMITER2, MPEG2_DELIMITER3, MPEG2_DELIMITER4, 0, 0, 0};
+    unsigned char section_delimiter[] = {0x0, 0x0, 0x0, 0x0};
     int width_in_mbs = ALIGN(seq_param->picture_width, 16) / 16;
     int height_in_mbs = ALIGN(seq_param->picture_height, 16) / 16;
     int i, j;
@@ -2077,13 +2078,13 @@ gen75_mfc_mpeg2_pipeline_slice_group(VADriverContextP ctx,
     if (slice_index == 0) 
         intel_mfc_mpeg2_pipeline_header_programing(ctx, encode_state, encoder_context, slice_batch);
 
-    /* FIXME: remove this insertion, instead insert slice header */
+    /* Insert '00' to make sure the header is valid */
     mfc_context->insert_object(ctx,
                                encoder_context,
-                               tail_data,
-                               1,
-                               8,
+                               (unsigned int*)section_delimiter,
                                1,
+                               8,   /* 8bits in the last DWORD */
+                               1,   /* 1 byte */
                                1,
                                0,
                                0,
@@ -2126,10 +2127,10 @@ gen75_mfc_mpeg2_pipeline_slice_group(VADriverContextP ctx,
     if (next_slice_group_param == NULL) { /* end of a picture */
         mfc_context->insert_object(ctx,
                                    encoder_context,
-                                   tail_data,
-                                   2,
-                                   8,
+                                   (unsigned int *)tail_delimiter,
                                    2,
+                                   8,   /* 8bits in the last DWORD */
+                                   5,   /* 5 bytes */
                                    1,
                                    1,
                                    0,
@@ -2137,10 +2138,10 @@ gen75_mfc_mpeg2_pipeline_slice_group(VADriverContextP ctx,
     } else {        /* end of a lsice group */
         mfc_context->insert_object(ctx,
                                    encoder_context,
-                                   tail_data,
-                                   1,
-                                   8,
+                                   (unsigned int *)section_delimiter,
                                    1,
+                                   8,   /* 8bits in the last DWORD */
+                                   1,   /* 1 byte */
                                    1,
                                    1,
                                    0,
@@ -2252,8 +2253,7 @@ intel_mfc_mpeg2_prepare(VADriverContextP ctx,
     struct object_surface *obj_surface;        
     struct object_buffer *obj_buffer;
     VAEncPictureParameterBufferMPEG2 *pic_param = (VAEncPictureParameterBufferMPEG2 *)encode_state->pic_param_ext->buffer;
-    VACodedBufferSegment *coded_buffer_segment;
-    unsigned char *flag = NULL;
+    struct i965_coded_buffer_segment *coded_buffer_segment;
     VAStatus vaStatus = VA_STATUS_SUCCESS;
     dri_bo *bo;
     int i;
@@ -2315,9 +2315,9 @@ intel_mfc_mpeg2_prepare(VADriverContextP ctx,
 
     /* set the internal flag to 0 to indicate the coded size is unknown */
     dri_bo_map(bo, 1);
-    coded_buffer_segment = (VACodedBufferSegment *)bo->virtual;
-    flag = (unsigned char *)(coded_buffer_segment + 1);
-    *flag = 0;
+    coded_buffer_segment = (struct i965_coded_buffer_segment *)bo->virtual;
+    coded_buffer_segment->mapped = 0;
+    coded_buffer_segment->codec = CODED_MPEG2;
     dri_bo_unmap(bo);
 
     return vaStatus;
index 86a4937..96c3cc7 100755 (executable)
@@ -1359,17 +1359,17 @@ i965_create_buffer_internal(VADriverContextP ctx,
         assert(buffer_store->bo);
 
         if (type == VAEncCodedBufferType) {
-            VACodedBufferSegment *coded_buffer_segment;
-            unsigned char *flag = NULL;
+            struct i965_coded_buffer_segment *coded_buffer_segment;
+
             dri_bo_map(buffer_store->bo, 1);
-            coded_buffer_segment = (VACodedBufferSegment *)buffer_store->bo->virtual;
-            coded_buffer_segment->size = size - I965_CODEDBUFFER_HEADER_SIZE;
-            coded_buffer_segment->bit_offset = 0;
-            coded_buffer_segment->status = 0;
-            coded_buffer_segment->buf = NULL;
-            coded_buffer_segment->next = NULL;
-            flag = (unsigned char *)(coded_buffer_segment + 1);
-            *flag = 0;
+            coded_buffer_segment = (struct i965_coded_buffer_segment *)buffer_store->bo->virtual;
+            coded_buffer_segment->base.size = size - I965_CODEDBUFFER_HEADER_SIZE;
+            coded_buffer_segment->base.bit_offset = 0;
+            coded_buffer_segment->base.status = 0;
+            coded_buffer_segment->base.buf = NULL;
+            coded_buffer_segment->base.next = NULL;
+            coded_buffer_segment->mapped = 0;
+            coded_buffer_segment->codec = 0;
             dri_bo_unmap(buffer_store->bo);
         } else if (data) {
             dri_bo_subdata(buffer_store->bo, 0, size * num_elements, data);
@@ -1463,29 +1463,46 @@ i965_MapBuffer(VADriverContextP ctx,
         if (obj_buffer->type == VAEncCodedBufferType) {
             int i;
             unsigned char *buffer = NULL;
-            VACodedBufferSegment *coded_buffer_segment = (VACodedBufferSegment *)(obj_buffer->buffer_store->bo->virtual);
-            unsigned char *flag = (unsigned char *)(coded_buffer_segment + 1);
+            struct i965_coded_buffer_segment *coded_buffer_segment = (struct i965_coded_buffer_segment *)(obj_buffer->buffer_store->bo->virtual);
+
+            if (!coded_buffer_segment->mapped) {
+                unsigned char delimiter0, delimiter1, delimiter2, delimiter3, delimiter4;
+
+                coded_buffer_segment->base.buf = buffer = (unsigned char *)(obj_buffer->buffer_store->bo->virtual) + I965_CODEDBUFFER_HEADER_SIZE;
+
+                if (coded_buffer_segment->codec == CODED_H264) {
+                    delimiter0 = H264_DELIMITER0;
+                    delimiter1 = H264_DELIMITER1;
+                    delimiter2 = H264_DELIMITER2;
+                    delimiter3 = H264_DELIMITER3;
+                    delimiter4 = H264_DELIMITER4;
+                } else if (coded_buffer_segment->codec == CODED_MPEG2) {
+                    delimiter0 = MPEG2_DELIMITER0;
+                    delimiter1 = MPEG2_DELIMITER1;
+                    delimiter2 = MPEG2_DELIMITER2;
+                    delimiter3 = MPEG2_DELIMITER3;
+                    delimiter4 = MPEG2_DELIMITER4;
+                } else {
+                    assert(0);
+                }
 
-            if (*flag != 1) {
-                coded_buffer_segment->buf = buffer = (unsigned char *)(obj_buffer->buffer_store->bo->virtual) + I965_CODEDBUFFER_HEADER_SIZE;
-            
                 for (i = 0; i < obj_buffer->size_element - I965_CODEDBUFFER_HEADER_SIZE - 3 - 0x1000; i++) {
-                    if (!buffer[i] &&
-                        !buffer[i + 1] &&
-                        !buffer[i + 2] &&
-                        !buffer[i + 3] &&
-                        !buffer[i + 4])
+                    if ((buffer[i] == delimiter0) &&
+                        (buffer[i + 1] == delimiter1) &&
+                        (buffer[i + 2] == delimiter2) &&
+                        (buffer[i + 3] == delimiter3) &&
+                        (buffer[i + 4] == delimiter4))
                         break;
                 }
 
                 if (i == obj_buffer->size_element - I965_CODEDBUFFER_HEADER_SIZE - 3 - 0x1000) {
-                    coded_buffer_segment->status |= VA_CODED_BUF_STATUS_SLICE_OVERFLOW_MASK;
+                    coded_buffer_segment->base.status |= VA_CODED_BUF_STATUS_SLICE_OVERFLOW_MASK;
                 }
 
-                coded_buffer_segment->size = i;
-                *flag = 1;
+                coded_buffer_segment->base.size = i;
+                coded_buffer_segment->mapped = 1;
             } else {
-                assert(coded_buffer_segment->buf);
+                assert(coded_buffer_segment->base.buf);
             }
         }
 
index b4ad5f2..3798e9e 100644 (file)
@@ -340,8 +340,30 @@ i965_check_alloc_surface_bo(VADriverContextP ctx,
 int
 va_enc_packed_type_to_idx(int packed_type);
 
-/* reserve 1 byte for internal using */
-#define I965_CODEDBUFFER_HEADER_SIZE   ALIGN(sizeof(VACodedBufferSegment) + 1, 64)
+/* reserve 2 byte for internal using */
+#define CODED_H264      0
+#define CODED_MPEG2     1
+
+#define H264_DELIMITER0 0x00
+#define H264_DELIMITER1 0x00
+#define H264_DELIMITER2 0x00
+#define H264_DELIMITER3 0x00
+#define H264_DELIMITER4 0x00
+
+#define MPEG2_DELIMITER0        0x00
+#define MPEG2_DELIMITER1        0x00
+#define MPEG2_DELIMITER2        0x00
+#define MPEG2_DELIMITER3        0x00
+#define MPEG2_DELIMITER4        0xb0
+
+struct i965_coded_buffer_segment
+{
+    VACodedBufferSegment base;
+    unsigned char mapped;
+    unsigned char codec;
+};
+
+#define I965_CODEDBUFFER_HEADER_SIZE   ALIGN(sizeof(struct i965_coded_buffer_segment), 64)
 
 
 extern VAStatus i965_MapBuffer(VADriverContextP ctx,