i965_drv_video: use new buffers for encoding
authorXiang, Haihao <haihao.xiang@intel.com>
Mon, 20 Jun 2011 07:15:42 +0000 (15:15 +0800)
committerGwenole Beauchesne <gwenole.beauchesne@intel.com>
Thu, 25 Aug 2011 12:29:00 +0000 (14:29 +0200)
Signed-off-by: Xiang, Haihao <haihao.xiang@intel.com>
src/gen6_mfc.c
src/gen6_vme.c
src/i965_drv_video.c
src/i965_drv_video.h

index 948e8f5..ab525de 100644 (file)
@@ -800,9 +800,9 @@ void gen6_mfc_avc_pipeline_programing(VADriverContextP ctx,
     struct intel_batchbuffer *batch = gen6_encoder_context->base.batch;
     struct gen6_mfc_context *mfc_context = &gen6_encoder_context->mfc_context;
     struct gen6_vme_context *vme_context = &gen6_encoder_context->vme_context;
-    VAEncSequenceParameterBufferH264Ext *pSequenceParameter = (VAEncSequenceParameterBufferH264Ext *)encode_state->seq_param->buffer;
-    VAEncPictureParameterBufferH264Ext *pPicParameter = (VAEncPictureParameterBufferH264Ext *)encode_state->pic_param->buffer;
-    VAEncSliceParameterBufferH264Ext *pSliceParameter = (VAEncSliceParameterBufferH264Ext *)encode_state->slice_params[0]->buffer; /* FIXME: multi slices */
+    VAEncSequenceParameterBufferH264Ext *pSequenceParameter = (VAEncSequenceParameterBufferH264Ext *)encode_state->seq_param_ext->buffer;
+    VAEncPictureParameterBufferH264Ext *pPicParameter = (VAEncPictureParameterBufferH264Ext *)encode_state->pic_param_ext->buffer;
+    VAEncSliceParameterBufferH264Ext *pSliceParameter = (VAEncSliceParameterBufferH264Ext *)encode_state->slice_params_ext[0]->buffer; /* FIXME: multi slices */
     
     unsigned int *msg = NULL, offset = 0;
     int emit_new_state = 1, object_len_in_bytes;
@@ -900,7 +900,7 @@ static VAStatus gen6_mfc_avc_prepare(VADriverContextP ctx,
     struct object_surface *obj_surface;        
     struct object_buffer *obj_buffer;
     dri_bo *bo;
-    VAEncPictureParameterBufferH264Ext *pPicParameter = (VAEncPictureParameterBufferH264Ext *)encode_state->pic_param->buffer;
+    VAEncPictureParameterBufferH264Ext *pPicParameter = (VAEncPictureParameterBufferH264Ext *)encode_state->pic_param_ext->buffer;
     VAStatus vaStatus = VA_STATUS_SUCCESS;
        int i;
 
@@ -967,7 +967,7 @@ static VAStatus gen6_mfc_stop(VADriverContextP ctx,
     struct i965_driver_data *i965 = i965_driver_data(ctx);
     struct gen6_mfc_context *mfc_context = &gen6_encoder_context->mfc_context;
        
-    VAEncPictureParameterBufferH264 *pPicParameter = (VAEncPictureParameterBufferH264 *)encode_state->pic_param->buffer;
+    VAEncPictureParameterBufferH264Ext *pPicParameter = (VAEncPictureParameterBufferH264Ext *)encode_state->pic_param_ext->buffer;
        
     struct object_surface *obj_surface = SURFACE(pPicParameter->reconstructed_picture);
     //struct object_surface *obj_surface = SURFACE(pPicParameter->reference_picture[0]);
index 33cc2a0..73b3bb4 100644 (file)
@@ -255,8 +255,8 @@ gen6_vme_output_buffer_setup(VADriverContextP ctx,
     struct gen6_vme_context *vme_context = &gen6_encoder_context->vme_context;
     struct i965_surface_state *ss;
     dri_bo *bo;
-    VAEncSequenceParameterBufferH264 *pSequenceParameter = (VAEncSequenceParameterBufferH264 *)encode_state->seq_param->buffer;
-    VAEncSliceParameterBufferH264Ext *pSliceParameter = (VAEncSliceParameterBufferH264Ext *)encode_state->slice_params[0]->buffer;
+    VAEncSequenceParameterBufferH264Ext *pSequenceParameter = (VAEncSequenceParameterBufferH264Ext *)encode_state->seq_param_ext->buffer;
+    VAEncSliceParameterBufferH264Ext *pSliceParameter = (VAEncSliceParameterBufferH264Ext *)encode_state->slice_params_ext[0]->buffer;
     int is_intra = pSliceParameter->slice_type == SLICE_TYPE_I;
     int width_in_mbs = pSequenceParameter->picture_width_in_mbs;
     int height_in_mbs = pSequenceParameter->picture_height_in_mbs;
@@ -311,7 +311,7 @@ static VAStatus gen6_vme_surface_setup(VADriverContextP ctx,
 {
     struct i965_driver_data *i965 = i965_driver_data(ctx);
     struct object_surface *obj_surface;
-    VAEncPictureParameterBufferH264Ext *pPicParameter = (VAEncPictureParameterBufferH264Ext *)encode_state->pic_param->buffer;
+    VAEncPictureParameterBufferH264Ext *pPicParameter = (VAEncPictureParameterBufferH264Ext *)encode_state->pic_param_ext->buffer;
 
     /*Setup surfaces state*/
     /* current picture for encoding */
@@ -492,9 +492,9 @@ gen7_vme_output_buffer_setup(VADriverContextP ctx,
     struct gen6_vme_context *vme_context = &gen6_encoder_context->vme_context;
     struct gen7_surface_state *ss;
     dri_bo *bo;
-    VAEncSequenceParameterBufferH264 *pSequenceParameter = (VAEncSequenceParameterBufferH264 *)encode_state->seq_param->buffer;
-    VAEncSliceParameterBuffer *pSliceParameter = (VAEncSliceParameterBuffer *)encode_state->slice_params[0]->buffer;
-    int is_intra = pSliceParameter->slice_flags.bits.is_intra;
+    VAEncSequenceParameterBufferH264Ext *pSequenceParameter = (VAEncSequenceParameterBufferH264Ext *)encode_state->seq_param_ext->buffer;
+    VAEncSliceParameterBufferH264Ext *pSliceParameter = (VAEncSliceParameterBufferH264Ext *)encode_state->slice_params_ext[0]->buffer;
+    int is_intra = pSliceParameter->slice_type == SLICE_TYPE_I;
     int width_in_mbs = pSequenceParameter->picture_width_in_mbs;
     int height_in_mbs = pSequenceParameter->picture_height_in_mbs;
     int num_entries;
@@ -553,7 +553,7 @@ static VAStatus gen7_vme_surface_setup(VADriverContextP ctx,
 {
     struct i965_driver_data *i965 = i965_driver_data(ctx);
     struct object_surface *obj_surface;
-    VAEncPictureParameterBufferH264Ext *pPicParameter = (VAEncPictureParameterBufferH264Ext *)encode_state->pic_param->buffer;
+    VAEncPictureParameterBufferH264Ext *pPicParameter = (VAEncPictureParameterBufferH264Ext *)encode_state->pic_param_ext->buffer;
 
     /*Setup surfaces state*/
     /* current picture for encoding */
@@ -852,8 +852,8 @@ static void gen6_vme_pipeline_programing(VADriverContextP ctx,
                                          struct gen6_encoder_context *gen6_encoder_context)
 {
     struct intel_batchbuffer *batch = gen6_encoder_context->base.batch;
-    VAEncSliceParameterBufferH264Ext *pSliceParameter = (VAEncSliceParameterBufferH264Ext *)encode_state->slice_params[0]->buffer;
-    VAEncSequenceParameterBufferH264 *pSequenceParameter = (VAEncSequenceParameterBufferH264 *)encode_state->seq_param->buffer;
+    VAEncSliceParameterBufferH264Ext *pSliceParameter = (VAEncSliceParameterBufferH264Ext *)encode_state->slice_params_ext[0]->buffer;
+    VAEncSequenceParameterBufferH264Ext *pSequenceParameter = (VAEncSequenceParameterBufferH264Ext *)encode_state->seq_param_ext->buffer;
     int is_intra = pSliceParameter->slice_type == SLICE_TYPE_I;
     int width_in_mbs = pSequenceParameter->picture_width_in_mbs;
     int height_in_mbs = pSequenceParameter->picture_height_in_mbs;
@@ -903,7 +903,7 @@ static VAStatus gen6_vme_prepare(VADriverContextP ctx,
 {
     struct i965_driver_data *i965 = i965_driver_data(ctx);
     VAStatus vaStatus = VA_STATUS_SUCCESS;
-    VAEncSliceParameterBufferH264Ext *pSliceParameter = (VAEncSliceParameterBufferH264Ext *)encode_state->slice_params[0]->buffer;
+    VAEncSliceParameterBufferH264Ext *pSliceParameter = (VAEncSliceParameterBufferH264Ext *)encode_state->slice_params_ext[0]->buffer;
     int is_intra = pSliceParameter->slice_type == SLICE_TYPE_I;
        
     /*Setup all the memory object*/
index 6e962c7..43308db 100644 (file)
@@ -779,6 +779,19 @@ i965_destroy_context(struct object_heap *heap, struct object_base *obj)
             i965_release_buffer_store(&obj_context->codec_state.encode.slice_params[i]);
 
         free(obj_context->codec_state.encode.slice_params);
+
+        assert(obj_context->codec_state.encode.num_slice_params_ext <= obj_context->codec_state.encode.max_slice_params_ext);
+        i965_release_buffer_store(&obj_context->codec_state.encode.pic_param_ext);
+        i965_release_buffer_store(&obj_context->codec_state.encode.seq_param_ext);
+        i965_release_buffer_store(&obj_context->codec_state.encode.dec_ref_pic_marking);
+        i965_release_buffer_store(&obj_context->codec_state.encode.packed_sps);
+        i965_release_buffer_store(&obj_context->codec_state.encode.packed_pps);
+        i965_release_buffer_store(&obj_context->codec_state.encode.packed_slice_header);
+
+        for (i = 0; i < obj_context->codec_state.encode.num_slice_params_ext; i++)
+            i965_release_buffer_store(&obj_context->codec_state.encode.slice_params_ext[i]);
+
+        free(obj_context->codec_state.encode.slice_params_ext);
     } else {
         assert(obj_context->codec_state.decode.num_slice_params <= obj_context->codec_state.decode.max_slice_params);
         assert(obj_context->codec_state.decode.num_slice_datas <= obj_context->codec_state.decode.max_slice_datas);
@@ -956,6 +969,14 @@ i965_create_buffer_internal(VADriverContextP ctx,
     case VAEncSequenceParameterBufferType:
     case VAEncPictureParameterBufferType:
     case VAEncSliceParameterBufferType:
+    case VAEncSequenceParameterBufferH264ExtType:
+    case VAEncPictureParameterBufferH264ExtType:
+    case VAEncSliceParameterBufferH264ExtType:
+    case VAEncDecRefPicMarkingBufferH264Type:
+    case VAEncPackedSequenceParameterBufferType:
+    case VAEncPackedPictureParameterBufferType:
+    case VAEncPackedSliceParameterBufferType:
+
         /* Ok */
         break;
 
@@ -989,7 +1010,12 @@ i965_create_buffer_internal(VADriverContextP ctx,
         
         if (data)
             dri_bo_subdata(buffer_store->bo, 0, size * num_elements, data);
-    } else if (type == VASliceDataBufferType || type == VAImageBufferType || type == VAEncCodedBufferType) {
+    } else if (type == VASliceDataBufferType || 
+               type == VAImageBufferType || 
+               type == VAEncCodedBufferType ||
+               type == VAEncPackedSequenceParameterBufferType ||
+               type == VAEncPackedPictureParameterBufferType ||
+               type == VAEncPackedSliceParameterBufferType) {
         buffer_store->bo = dri_bo_alloc(i965->intel.bufmgr, 
                                         "Buffer", 
                                         size * num_elements, 64);
@@ -1197,6 +1223,20 @@ i965_BeginPicture(VADriverContextP ctx,
         }
 
         obj_context->codec_state.encode.num_slice_params = 0;
+
+        /* ext */
+        i965_release_buffer_store(&obj_context->codec_state.encode.pic_param_ext);
+        i965_release_buffer_store(&obj_context->codec_state.encode.seq_param_ext);
+        i965_release_buffer_store(&obj_context->codec_state.encode.dec_ref_pic_marking);
+        i965_release_buffer_store(&obj_context->codec_state.encode.packed_sps);
+        i965_release_buffer_store(&obj_context->codec_state.encode.packed_pps);
+        i965_release_buffer_store(&obj_context->codec_state.encode.packed_slice_header);
+
+        for (i = 0; i < obj_context->codec_state.encode.num_slice_params_ext; i++)
+            i965_release_buffer_store(&obj_context->codec_state.encode.slice_params_ext[i]);
+
+        obj_context->codec_state.encode.num_slice_params_ext = 0;
+
         obj_context->codec_state.encode.current_render_target = render_target;     /*This is input new frame*/
     } else {
         obj_context->codec_state.decode.current_render_target = render_target;
@@ -1314,9 +1354,17 @@ DEF_RENDER_ENCODE_SINGLE_BUFFER_FUNC(picture_parameter, pic_param)
 DEF_RENDER_ENCODE_SINGLE_BUFFER_FUNC(picture_control, pic_control)
 DEF_RENDER_ENCODE_SINGLE_BUFFER_FUNC(qmatrix, q_matrix)
 DEF_RENDER_ENCODE_SINGLE_BUFFER_FUNC(iqmatrix, iq_matrix)
+/* extended buffer */
+DEF_RENDER_ENCODE_SINGLE_BUFFER_FUNC(sequence_parameter_ext, seq_param_ext)
+DEF_RENDER_ENCODE_SINGLE_BUFFER_FUNC(picture_parameter_ext, pic_param_ext)
+DEF_RENDER_ENCODE_SINGLE_BUFFER_FUNC(dec_ref_pic_marking, dec_ref_pic_marking)
+DEF_RENDER_ENCODE_SINGLE_BUFFER_FUNC(packed_sps, packed_sps)
+DEF_RENDER_ENCODE_SINGLE_BUFFER_FUNC(packed_pps, packed_pps)
+DEF_RENDER_ENCODE_SINGLE_BUFFER_FUNC(packed_slice_header, packed_slice_header)
 
 #define DEF_RENDER_ENCODE_MULTI_BUFFER_FUNC(name, member) DEF_RENDER_MULTI_BUFFER_FUNC(encode, name, member)
 DEF_RENDER_ENCODE_MULTI_BUFFER_FUNC(slice_parameter, slice_params)
+DEF_RENDER_ENCODE_MULTI_BUFFER_FUNC(slice_parameter_ext, slice_params_ext)
 
 static VAStatus 
 i965_encoder_render_picture(VADriverContextP ctx,
@@ -1358,6 +1406,33 @@ i965_encoder_render_picture(VADriverContextP ctx,
             vaStatus = I965_RENDER_ENCODE_BUFFER(iqmatrix);
             break;
 
+        case VAEncSequenceParameterBufferH264ExtType:
+            vaStatus = I965_RENDER_ENCODE_BUFFER(sequence_parameter_ext);
+            break;
+
+        case VAEncPictureParameterBufferH264ExtType:
+            vaStatus = I965_RENDER_ENCODE_BUFFER(picture_parameter_ext);
+            break;
+
+        case VAEncSliceParameterBufferH264ExtType:
+            vaStatus = I965_RENDER_ENCODE_BUFFER(slice_parameter_ext);
+            break;
+
+        case VAEncDecRefPicMarkingBufferH264Type:
+            vaStatus = I965_RENDER_ENCODE_BUFFER(dec_ref_pic_marking);
+            break;
+
+        case VAEncPackedSequenceParameterBufferType:
+            vaStatus = I965_RENDER_ENCODE_BUFFER(packed_sps);
+            break;
+
+        case VAEncPackedPictureParameterBufferType:
+            vaStatus = I965_RENDER_ENCODE_BUFFER(packed_pps);
+            break;
+            
+        case VAEncPackedSliceParameterBufferType:
+            vaStatus = I965_RENDER_ENCODE_BUFFER(packed_slice_header);
+
         default:
             vaStatus = VA_STATUS_ERROR_UNSUPPORTED_BUFFERTYPE;
             break;
@@ -1411,9 +1486,12 @@ i965_EndPicture(VADriverContextP ctx, VAContextID context)
     if (obj_context->codec_type == CODEC_ENC) {
         assert(VAEntrypointEncSlice == obj_config->entrypoint);
 
-        assert(obj_context->codec_state.encode.pic_param);
-        assert(obj_context->codec_state.encode.seq_param);
-        assert(obj_context->codec_state.encode.num_slice_params >= 1);
+        assert(obj_context->codec_state.encode.pic_param ||
+               obj_context->codec_state.encode.pic_param_ext);
+        assert(obj_context->codec_state.encode.seq_param ||
+               obj_context->codec_state.encode.seq_param_ext);
+        assert(obj_context->codec_state.encode.num_slice_params >= 1 ||
+               obj_context->codec_state.encode.num_slice_params_ext >= 1);
     } else {
         assert(obj_context->codec_state.decode.pic_param);
         assert(obj_context->codec_state.decode.num_slice_params >= 1);
index 67ca6f6..dd6011d 100644 (file)
@@ -97,9 +97,21 @@ struct encode_state
     struct buffer_store *iq_matrix;
     struct buffer_store *q_matrix;
     struct buffer_store **slice_params;
-    VASurfaceID current_render_target;
     int max_slice_params;
     int num_slice_params;
+
+    /* for ext */
+    struct buffer_store *seq_param_ext;
+    struct buffer_store *pic_param_ext;
+    struct buffer_store *dec_ref_pic_marking;
+    struct buffer_store *packed_sps;
+    struct buffer_store *packed_pps;
+    struct buffer_store *packed_slice_header;
+    struct buffer_store **slice_params_ext;
+    int max_slice_params_ext;
+    int num_slice_params_ext;
+
+    VASurfaceID current_render_target;
 };
 
 #define CODEC_DEC       0