Switch to the new interface in staging branch.
authorXiang, Haihao <haihao.xiang@intel.com>
Mon, 20 Feb 2012 05:42:34 +0000 (13:42 +0800)
committerXiang, Haihao <haihao.xiang@intel.com>
Wed, 22 Feb 2012 02:26:57 +0000 (10:26 +0800)
Only fix compile error in this commit

Signed-off-by: Xiang, Haihao <haihao.xiang@intel.com>
src/gen6_mfc.c
src/gen7_mfc.c
src/i965_drv_video.c
src/i965_drv_video.h
src/i965_encoder_utils.c
src/i965_encoder_utils.h
src/i965_post_processing.c

index 701fea0..20bd35c 100644 (file)
@@ -233,7 +233,7 @@ gen6_mfc_avc_img_state(VADriverContextP ctx,struct encode_state *encode_state,
                   (pPicParameter->pic_fields.bits.entropy_coding_mode_flag << 7)  |   /*0:CAVLC encoding mode,1:CABAC*/
                   (0 << 6)  |   /*Only valid for VLD decoding mode*/
                   (0 << 5)  |   /*Constrained Intra Predition Flag, from PPS*/
-                  (pSequenceParameter->direct_8x8_inference_flag << 4)  |   /*Direct 8x8 inference flag*/
+                  (pSequenceParameter->seq_fields.bits.direct_8x8_inference_flag << 4)  |   /*Direct 8x8 inference flag*/
                   (pPicParameter->pic_fields.bits.transform_8x8_mode_flag << 3)  |   /*8x8 or 4x4 IDCT Transform Mode Flag*/
                   (1 << 2)  |   /*Frame MB only flag*/
                   (0 << 1)  |   /*MBAFF mode is in active*/
@@ -304,13 +304,13 @@ static void gen6_mfc_avc_slice_state(VADriverContextP ctx,
     VAEncSliceParameterBufferH264 *pSliceParameter = (VAEncSliceParameterBufferH264 *)encode_state->slice_params_ext[0]->buffer; /* TODO: multi slices support */
     int width_in_mbs = (mfc_context->surface_state.width + 15) / 16;
     int height_in_mbs = (mfc_context->surface_state.height + 15) / 16;
-    int beginmb = pSliceParameter->starting_macroblock_address;
-    int endmb = beginmb + pSliceParameter->number_of_mbs;
+    int beginmb = pSliceParameter->macroblock_address;
+    int endmb = beginmb + pSliceParameter->num_macroblocks;
     int beginx = beginmb % width_in_mbs;
     int beginy = beginmb / width_in_mbs;
     int nextx =  endmb % width_in_mbs;
     int nexty = endmb / width_in_mbs;
-    int last_slice = (pSliceParameter->starting_macroblock_address + pSliceParameter->number_of_mbs) == (width_in_mbs * height_in_mbs);
+    int last_slice = (pSliceParameter->macroblock_address + pSliceParameter->num_macroblocks) == (width_in_mbs * height_in_mbs);
     int bit_rate_control_target;
     if ( slice_type == SLICE_TYPE_I )
         bit_rate_control_target = 0;
@@ -347,7 +347,7 @@ static void gen6_mfc_avc_slice_state(VADriverContextP ctx,
                   0x0202 );
     OUT_BCS_BATCH(batch, (beginy << 24) |                      /*First MB X&Y , the begin postion of current slice*/
                          (beginx << 16) |
-                         pSliceParameter->starting_macroblock_address );
+                         pSliceParameter->macroblock_address );
     OUT_BCS_BATCH(batch, (nexty << 16) | nextx);                       /*Next slice first MB X&Y*/
     OUT_BCS_BATCH(batch, 
                   (rate_control_enable<<31) |          /*in CBR mode RateControlCounterEnable = enable*/
@@ -633,49 +633,49 @@ static void gen6_mfc_avc_pipeline_header_programing(VADriverContextP ctx,
 {
     static int count = 0;
     VAEncSequenceParameterBufferH264 *pSequenceParameter = (VAEncSequenceParameterBufferH264 *)encode_state->seq_param_ext->buffer;
-    int rate_control_mode = pSequenceParameter->rate_control_method;   
+    int rate_control_mode = 0; /* FIXME: */
 
-    if (encode_state->packed_header_data[VAEncPackedHeaderSPS]) {
+    if (encode_state->packed_header_data[VAEncPackedHeaderH264_SPS]) {
         VAEncPackedHeaderParameterBuffer *param = NULL;
-        unsigned int *header_data = (unsigned int *)encode_state->packed_header_data[VAEncPackedHeaderSPS]->buffer;
+        unsigned int *header_data = (unsigned int *)encode_state->packed_header_data[VAEncPackedHeaderH264_SPS]->buffer;
         unsigned int length_in_bits;
 
-        assert(encode_state->packed_header_param[VAEncPackedHeaderSPS]);
-        param = (VAEncPackedHeaderParameterBuffer *)encode_state->packed_header_param[VAEncPackedHeaderSPS]->buffer;
-        length_in_bits = param->length_in_bits[0];
+        assert(encode_state->packed_header_param[VAEncPackedHeaderH264_SPS]);
+        param = (VAEncPackedHeaderParameterBuffer *)encode_state->packed_header_param[VAEncPackedHeaderH264_SPS]->buffer;
+        length_in_bits = param->bit_length;
 
         gen6_mfc_avc_insert_object(ctx, 
-                encoder_context,
-                header_data,
-                ALIGN(length_in_bits, 32) >> 5,
-                length_in_bits & 0x1f,
-                param->skip_emulation_check_count,
-                0,
-                0,
-                param->insert_emulation_bytes);
+                                   encoder_context,
+                                   header_data,
+                                   ALIGN(length_in_bits, 32) >> 5,
+                                   length_in_bits & 0x1f,
+                                   5,   /* FIXME: check it */
+                                   0,
+                                   0,
+                                   !param->has_emulation_bytes);
     }
 
-    if (encode_state->packed_header_data[VAEncPackedHeaderPPS]) {
+    if (encode_state->packed_header_data[VAEncPackedHeaderH264_PPS]) {
         VAEncPackedHeaderParameterBuffer *param = NULL;
-        unsigned int *header_data = (unsigned int *)encode_state->packed_header_data[VAEncPackedHeaderPPS]->buffer;
+        unsigned int *header_data = (unsigned int *)encode_state->packed_header_data[VAEncPackedHeaderH264_PPS]->buffer;
         unsigned int length_in_bits;
 
-        assert(encode_state->packed_header_param[VAEncPackedHeaderPPS]);
-        param = (VAEncPackedHeaderParameterBuffer *)encode_state->packed_header_param[VAEncPackedHeaderPPS]->buffer;
-        length_in_bits = param->length_in_bits[0];
+        assert(encode_state->packed_header_param[VAEncPackedHeaderH264_PPS]);
+        param = (VAEncPackedHeaderParameterBuffer *)encode_state->packed_header_param[VAEncPackedHeaderH264_PPS]->buffer;
+        length_in_bits = param->bit_length;
 
         gen6_mfc_avc_insert_object(ctx, 
-                encoder_context,
-                header_data,
-                ALIGN(length_in_bits, 32) >> 5,
-                length_in_bits & 0x1f,
-                param->skip_emulation_check_count,
-                0,
-                0,
-                param->insert_emulation_bytes);
+                                   encoder_context,
+                                   header_data,
+                                   ALIGN(length_in_bits, 32) >> 5,
+                                   length_in_bits & 0x1f,
+                                   5, /* FIXME: check it */
+                                   0,
+                                   0,
+                                   !param->has_emulation_bytes);
     }
     
-    if ( (rate_control_mode == 0) && encode_state->packed_header_data[VAEncPackedHeaderSPS]) {       // this is frist AU
+    if ( (rate_control_mode == 0) && encode_state->packed_header_data[VAEncPackedHeaderH264_SPS]) {       // this is frist AU
         struct gen6_mfc_context *mfc_context = encoder_context->mfc_context;
 
         unsigned char *sei_data = NULL;
@@ -743,15 +743,14 @@ gen6_mfc_avc_pipeline_slice_programing(VADriverContextP ctx,
     VAEncSequenceParameterBufferH264 *pSequenceParameter = (VAEncSequenceParameterBufferH264 *)encode_state->seq_param_ext->buffer;
     VAEncPictureParameterBufferH264 *pPicParameter = (VAEncPictureParameterBufferH264 *)encode_state->pic_param_ext->buffer;
     VAEncSliceParameterBufferH264 *pSliceParameter = (VAEncSliceParameterBufferH264 *)encode_state->slice_params_ext[slice_index]->buffer; 
-    VAEncH264DecRefPicMarkingBuffer *pDecRefPicMarking = NULL;
     unsigned int *msg = NULL, offset = 0;
     int is_intra = pSliceParameter->slice_type == SLICE_TYPE_I;
     int width_in_mbs = (mfc_context->surface_state.width + 15) / 16;
     int height_in_mbs = (mfc_context->surface_state.height + 15) / 16;
-    int last_slice = (pSliceParameter->starting_macroblock_address + pSliceParameter->number_of_mbs) == (width_in_mbs * height_in_mbs);
+    int last_slice = (pSliceParameter->macroblock_address + pSliceParameter->num_macroblocks) == (width_in_mbs * height_in_mbs);
     int i,x,y;
     int qp = pPicParameter->pic_init_qp + pSliceParameter->slice_qp_delta;
-    int rate_control_mode = pSequenceParameter->rate_control_method;   
+    int rate_control_mode = 0; /* FIXME: */
     unsigned char *slice_header = NULL;
     int slice_header_length_in_bits = 0;
     unsigned int tail_data[] = { 0x0, 0x0 };
@@ -763,9 +762,7 @@ gen6_mfc_avc_pipeline_slice_programing(VADriverContextP ctx,
     if ( slice_index == 0) 
         gen6_mfc_avc_pipeline_header_programing(ctx, encode_state, encoder_context);
 
-    if (encode_state->dec_ref_pic_marking)
-        pDecRefPicMarking = (VAEncH264DecRefPicMarkingBuffer *)encode_state->dec_ref_pic_marking->buffer;
-    slice_header_length_in_bits = build_avc_slice_header(pSequenceParameter, pPicParameter, pSliceParameter, pDecRefPicMarking, &slice_header);
+    slice_header_length_in_bits = build_avc_slice_header(pSequenceParameter, pPicParameter, pSliceParameter, &slice_header);
 
     // slice hander
     gen6_mfc_avc_insert_object(ctx, encoder_context,
@@ -782,9 +779,9 @@ gen6_mfc_avc_pipeline_slice_programing(VADriverContextP ctx,
         msg = (unsigned int *)vme_context->vme_output.bo->virtual;
     }
    
-    for (i = pSliceParameter->starting_macroblock_address; 
-         i < pSliceParameter->starting_macroblock_address + pSliceParameter->number_of_mbs; i++) {
-        int last_mb = (i == (pSliceParameter->starting_macroblock_address + pSliceParameter->number_of_mbs - 1) );
+    for (i = pSliceParameter->macroblock_address; 
+         i < pSliceParameter->macroblock_address + pSliceParameter->num_macroblocks; i++) {
+        int last_mb = (i == (pSliceParameter->macroblock_address + pSliceParameter->num_macroblocks - 1) );
         x = i % width_in_mbs;
         y = i / width_in_mbs;
 
@@ -944,7 +941,7 @@ gen6_mfc_hrd_context_init(struct encode_state *encode_state,
                           struct gen6_mfc_context *mfc_context) 
 {
     VAEncSequenceParameterBufferH264 *pSequenceParameter = (VAEncSequenceParameterBufferH264 *)encode_state->seq_param_ext->buffer;
-    int rate_control_mode = pSequenceParameter->rate_control_method;   
+    int rate_control_mode = 0; /* FIXME: */
     int target_bit_rate = pSequenceParameter->bits_per_second;
     
     // current we only support CBR mode.
@@ -988,7 +985,7 @@ static VAStatus gen6_mfc_avc_prepare(VADriverContextP ctx,
     dri_bo *bo;
     VAEncPictureParameterBufferH264 *pPicParameter = (VAEncPictureParameterBufferH264 *)encode_state->pic_param_ext->buffer;
     VAEncSequenceParameterBufferH264 *pSequenceParameter = (VAEncSequenceParameterBufferH264 *)encode_state->seq_param_ext->buffer;
-    int rate_control_mode = pSequenceParameter->rate_control_method;   
+    int rate_control_mode = 0; /* FIXME: */
     VAStatus vaStatus = VA_STATUS_SUCCESS;
     int i;
 
@@ -1075,7 +1072,7 @@ static VAStatus gen6_mfc_avc_prepare(VADriverContextP ctx,
     mfc_context->uncompressed_picture_source.bo = obj_surface->bo;
     dri_bo_reference(mfc_context->uncompressed_picture_source.bo);
 
-    obj_buffer = BUFFER (pPicParameter->CodedBuf); /* FIXME: fix this later */
+    obj_buffer = BUFFER (pPicParameter->coded_buf); /* FIXME: fix this later */
     bo = obj_buffer->buffer_store->bo;
     assert(bo);
     mfc_context->mfc_indirect_pak_bse_object.bo = bo;
@@ -1142,7 +1139,7 @@ gen6_mfc_avc_encode_picture(VADriverContextP ctx,
 {
     VAEncSequenceParameterBufferH264 *pSequenceParameter = (VAEncSequenceParameterBufferH264 *)encode_state->seq_param_ext->buffer;
     struct gen6_mfc_context *mfc_context = encoder_context->mfc_context;
-    int rate_control_mode = pSequenceParameter->rate_control_method;  
+    int rate_control_mode = 0; /* FIXME */
     int MAX_CBR_INTERATE = 4;
     int current_frame_bits_size;
     int i;
index d55ec54..fd42164 100644 (file)
@@ -683,14 +683,13 @@ gen7_mfc_avc_pipeline_programing(VADriverContextP ctx,
     VAEncSequenceParameterBufferH264 *pSequenceParameter = (VAEncSequenceParameterBufferH264 *)encode_state->seq_param_ext->buffer;
     VAEncPictureParameterBufferH264 *pPicParameter = (VAEncPictureParameterBufferH264 *)encode_state->pic_param_ext->buffer;
     VAEncSliceParameterBufferH264 *pSliceParameter = (VAEncSliceParameterBufferH264 *)encode_state->slice_params_ext[0]->buffer; /* FIXME: multi slices */
-    VAEncH264DecRefPicMarkingBuffer *pDecRefPicMarking = NULL;
     unsigned int *msg = NULL, offset = 0;
     int emit_new_state = 1, object_len_in_bytes;
     int is_intra = pSliceParameter->slice_type == SLICE_TYPE_I;
     int width_in_mbs = (mfc_context->surface_state.width + 15) / 16;
     int height_in_mbs = (mfc_context->surface_state.height + 15) / 16;
     int x,y;
-    int rate_control_mode = pSequenceParameter->rate_control_method; 
+    int rate_control_mode = 0; /* FIXME: */
     unsigned char target_mb_size = mfc_context->bit_rate_control_context[1-is_intra].TargetSizeInWord;
     unsigned char max_mb_size = mfc_context->bit_rate_control_context[1-is_intra].MaxSizeInWord;
     int qp = pPicParameter->pic_init_qp + pSliceParameter->slice_qp_delta;
@@ -698,10 +697,7 @@ gen7_mfc_avc_pipeline_programing(VADriverContextP ctx,
     int slice_header_length_in_bits = 0;
     unsigned int tail_data[] = { 0x0 };
 
-    if (encode_state->dec_ref_pic_marking)
-        pDecRefPicMarking = (VAEncH264DecRefPicMarkingBuffer *)encode_state->dec_ref_pic_marking->buffer;
-
-    slice_header_length_in_bits = build_avc_slice_header(pSequenceParameter, pPicParameter, pSliceParameter, pDecRefPicMarking, &slice_header);
+    slice_header_length_in_bits = build_avc_slice_header(pSequenceParameter, pPicParameter, pSliceParameter, &slice_header);
 
     if ( rate_control_mode == 0) {
         qp = mfc_context->bit_rate_control_context[1-is_intra].QpPrimeY;
@@ -735,44 +731,44 @@ gen7_mfc_avc_pipeline_programing(VADriverContextP ctx,
                                          encode_state, encoder_context, 
                                          rate_control_mode == 0, pPicParameter->pic_init_qp + pSliceParameter->slice_qp_delta);
 
-                if (encode_state->packed_header_data[VAEncPackedHeaderSPS]) {
+                if (encode_state->packed_header_data[VAEncPackedHeaderH264_SPS]) {
                     VAEncPackedHeaderParameterBuffer *param = NULL;
-                    unsigned int *header_data = (unsigned int *)encode_state->packed_header_data[VAEncPackedHeaderSPS]->buffer;
+                    unsigned int *header_data = (unsigned int *)encode_state->packed_header_data[VAEncPackedHeaderH264_SPS]->buffer;
                     unsigned int length_in_bits;
 
-                    assert(encode_state->packed_header_param[VAEncPackedHeaderSPS]);
-                    param = (VAEncPackedHeaderParameterBuffer *)encode_state->packed_header_param[VAEncPackedHeaderSPS]->buffer;
-                    length_in_bits = param->length_in_bits[0];
+                    assert(encode_state->packed_header_param[VAEncPackedHeaderH264_SPS]);
+                    param = (VAEncPackedHeaderParameterBuffer *)encode_state->packed_header_param[VAEncPackedHeaderH264_SPS]->buffer;
+                    length_in_bits = param->bit_length;
 
                     gen7_mfc_avc_insert_object(ctx, 
                                                encoder_context,
                                                header_data,
                                                ALIGN(length_in_bits, 32) >> 5,
                                                length_in_bits & 0x1f,
-                                               param->skip_emulation_check_count,
+                                               5, /* FIXME: check it */
                                                0,
                                                0,
-                                               param->insert_emulation_bytes);
+                                               !param->has_emulation_bytes);
                 }
 
-                if (encode_state->packed_header_data[VAEncPackedHeaderPPS]) {
+                if (encode_state->packed_header_data[VAEncPackedHeaderH264_PPS]) {
                     VAEncPackedHeaderParameterBuffer *param = NULL;
-                    unsigned int *header_data = (unsigned int *)encode_state->packed_header_data[VAEncPackedHeaderPPS]->buffer;
+                    unsigned int *header_data = (unsigned int *)encode_state->packed_header_data[VAEncPackedHeaderH264_PPS]->buffer;
                     unsigned int length_in_bits;
 
-                    assert(encode_state->packed_header_param[VAEncPackedHeaderPPS]);
-                    param = (VAEncPackedHeaderParameterBuffer *)encode_state->packed_header_param[VAEncPackedHeaderPPS]->buffer;
-                    length_in_bits = param->length_in_bits[0];
+                    assert(encode_state->packed_header_param[VAEncPackedHeaderH264_PPS]);
+                    param = (VAEncPackedHeaderParameterBuffer *)encode_state->packed_header_param[VAEncPackedHeaderH264_PPS]->buffer;
+                    length_in_bits = param->bit_length;
 
                     gen7_mfc_avc_insert_object(ctx, 
                                                encoder_context,
                                                header_data,
                                                ALIGN(length_in_bits, 32) >> 5,
                                                length_in_bits & 0x1f,
-                                               param->skip_emulation_check_count,
+                                               5, /* FIXME: check it */
                                                0,
                                                0,
-                                               param->insert_emulation_bytes);
+                                               !param->has_emulation_bytes);
                 }
 
                 gen7_mfc_avc_insert_object(ctx, encoder_context,
@@ -1007,7 +1003,7 @@ gen7_mfc_avc_prepare(VADriverContextP ctx,
     mfc_context->uncompressed_picture_source.bo = obj_surface->bo;
     dri_bo_reference(mfc_context->uncompressed_picture_source.bo);
 
-    obj_buffer = BUFFER (pPicParameter->CodedBuf); /* FIXME: fix this later */
+    obj_buffer = BUFFER (pPicParameter->coded_buf); /* FIXME: fix this later */
     bo = obj_buffer->buffer_store->bo;
     assert(bo);
     mfc_context->mfc_indirect_pak_bse_object.bo = bo;
@@ -1074,7 +1070,7 @@ gen7_mfc_avc_encode_picture(VADriverContextP ctx,
 {
     VAEncSequenceParameterBufferH264 *pSequenceParameter = (VAEncSequenceParameterBufferH264 *)encode_state->seq_param_ext->buffer;
     struct gen7_mfc_context *mfc_context = encoder_context->mfc_context;
-    int rate_control_mode = pSequenceParameter->rate_control_method;  
+    int rate_control_mode = 0; /* FIXME: */
     int MAX_CBR_INTERATE = 4;
     int current_frame_bits_size;
     int i;
index ea35ad2..1ddbda1 100644 (file)
@@ -292,12 +292,14 @@ i965_GetConfigAttributes(VADriverContextP ctx,
             break;
 
         case VAConfigAttribRateControl:
-            attrib_list[i].value = VA_RC_VBR;
-            break;
+            if (entrypoint == VAEntrypointEncSlice) {
+                attrib_list[i].value = VA_RC_VBR; /* FIXME: */
+                break;
+            }
 
-        case VAConfigAttribEncHeaderPacking:
+        case VAConfigAttribEncPackedHeaders:
             if (entrypoint == VAEntrypointEncSlice) {
-                attrib_list[i].value = VA_ENC_HEADER_PACKING_SLICE;
+                attrib_list[i].value = VA_ENC_PACKED_HEADER_SEQUENCE | VA_ENC_PACKED_HEADER_PICTURE;
                 break;
             }
 
@@ -862,9 +864,8 @@ i965_destroy_context(struct object_heap *heap, struct object_base *obj)
 
     if (obj_context->codec_type == CODEC_PROC) {
         i965_release_buffer_store(&obj_context->codec_state.proc.pipeline_param);
-        i965_release_buffer_store(&obj_context->codec_state.proc.input_param);
 
-        for (i = 0; i < VA_PROC_PIPELINE_MAX_NUM_FILTERS; i++)
+        for (i = 0; i < VAProcFilterCount; i++)
             i965_release_buffer_store(&obj_context->codec_state.proc.filter_param[i]);
     } else if (obj_context->codec_type == CODEC_ENC) {
         assert(obj_context->codec_state.encode.num_slice_params <= obj_context->codec_state.encode.max_slice_params);
@@ -879,7 +880,6 @@ i965_destroy_context(struct object_heap *heap, struct object_base *obj)
         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);
 
         for (i = 0; i < ARRAY_ELEMS(obj_context->codec_state.encode.packed_header_param); i++)
             i965_release_buffer_store(&obj_context->codec_state.encode.packed_header_param[i]);
@@ -1081,14 +1081,10 @@ i965_create_buffer_internal(VADriverContextP ctx,
     case VAEncSequenceParameterBufferType:
     case VAEncPictureParameterBufferType:
     case VAEncSliceParameterBufferType:
-    case VAEncDecRefPicMarkingBufferH264Type:
     case VAEncPackedHeaderParameterBufferType:
     case VAEncPackedHeaderDataBufferType:
     case VAProcPipelineParameterBufferType:
-    case VAProcInputParameterBufferType:
-    case VAProcFilterBaseParameterBufferType:
-    case VAProcFilterDeinterlacingParameterBufferType:
-    case VAProcFilterProcAmpParameterBufferType:
+    case VAProcFilterParameterBufferType:
 #ifdef HAVE_JPEG_DECODING
     case VAHuffmanTableBufferType:
 #endif
@@ -1150,30 +1146,15 @@ i965_create_buffer_internal(VADriverContextP ctx,
 
     } else if (type == VAEncPackedHeaderParameterBufferType) {
         VAEncPackedHeaderParameterBuffer *param;
-        int msize;
 
         assert(data);
         assert(num_elements == 1);
         assert(size == sizeof(*param));
 
         param = (VAEncPackedHeaderParameterBuffer *)data;
-        msize = ALIGN(size, 32) + param->num_headers * sizeof(int) * 2;
-        buffer_store->buffer = malloc(msize);
-        assert(buffer_store->buffer);
-
         memcpy(buffer_store->buffer,
                data, 
                size);
-        memcpy((unsigned char *)buffer_store->buffer + ALIGN(size, 32),
-               param->length_in_bits,
-               param->num_headers * sizeof(int));
-        memcpy((unsigned char *)buffer_store->buffer + ALIGN(size, 32) + param->num_headers * sizeof(int),
-               param->offset_in_bytes,
-               param->num_headers * sizeof(int));
-
-        param = (VAEncPackedHeaderParameterBuffer *)buffer_store->buffer;
-        param->length_in_bits = (unsigned int *)((unsigned char *)buffer_store->buffer + ALIGN(size, 32));
-        param->offset_in_bytes = (unsigned int *)((unsigned char *)buffer_store->buffer + ALIGN(size, 32) + param->num_headers * sizeof(int));
     } else {
         int msize = size;
         
@@ -1399,8 +1380,6 @@ i965_BeginPicture(VADriverContextP ctx,
         /* 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);
-
 
         for (i = 0; i < ARRAY_ELEMS(obj_context->codec_state.encode.packed_header_param); i++)
             i965_release_buffer_store(&obj_context->codec_state.encode.packed_header_param[i]);
@@ -1541,7 +1520,6 @@ 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)
 
 #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)
@@ -1615,10 +1593,6 @@ i965_encoder_render_picture(VADriverContextP ctx,
             vaStatus = I965_RENDER_ENCODE_BUFFER(slice_parameter_ext);
             break;
 
-        case VAEncDecRefPicMarkingBufferH264Type:
-            vaStatus = I965_RENDER_ENCODE_BUFFER(dec_ref_pic_marking);
-            break;
-
         case VAEncPackedHeaderParameterBufferType:
         {
             struct encode_state *encode = &obj_context->codec_state.encode;
@@ -1636,8 +1610,8 @@ i965_encoder_render_picture(VADriverContextP ctx,
         {
             struct encode_state *encode = &obj_context->codec_state.encode;
 
-            assert(encode->last_packed_header_type == VAEncPackedHeaderSPS ||
-                   encode->last_packed_header_type == VAEncPackedHeaderPPS ||
+            assert(encode->last_packed_header_type == VAEncPackedHeaderSequence ||
+                   encode->last_packed_header_type == VAEncPackedHeaderPicture ||
                    encode->last_packed_header_type == VAEncPackedHeaderSlice);
             vaStatus = i965_encoder_render_packed_header_data_buffer(ctx, 
                                                                      obj_context,
@@ -1659,7 +1633,6 @@ i965_encoder_render_picture(VADriverContextP ctx,
 
 #define DEF_RENDER_PROC_SINGLE_BUFFER_FUNC(name, member) DEF_RENDER_SINGLE_BUFFER_FUNC(proc, name, member)
 DEF_RENDER_PROC_SINGLE_BUFFER_FUNC(pipeline_parameter, pipeline_param)    
-DEF_RENDER_PROC_SINGLE_BUFFER_FUNC(input_parameter, input_param)
 
 static VAStatus
 i965_render_proc_filter_parameter_buffer(VADriverContextP ctx,
@@ -1694,28 +1667,18 @@ i965_proc_render_picture(VADriverContextP ctx,
 
         switch (obj_buffer->type) {
         case VAProcPipelineParameterBufferType:
+            /* FIXME: */
             vaStatus = I965_RENDER_PROC_BUFFER(pipeline_parameter);
             break;
 
-        case VAProcInputParameterBufferType:
-            vaStatus = I965_RENDER_PROC_BUFFER(input_parameter);
-            break;             
-
-        case VAProcFilterBaseParameterBufferType:
+        case VAProcFilterParameterBufferType:
         {
-            VAProcFilterBaseParameterBuffer *param = (VAProcFilterBaseParameterBuffer *)obj_buffer->buffer_store->buffer;
-            vaStatus = i965_render_proc_filter_parameter_buffer(ctx, obj_context, obj_buffer, param->filter);
+            /* FIXME: */
+            VAProcFilterParameterBuffer *param = (VAProcFilterParameterBuffer *)obj_buffer->buffer_store->buffer;
+            vaStatus = i965_render_proc_filter_parameter_buffer(ctx, obj_context, obj_buffer, param->type);
             break;
         }
 
-        case VAProcFilterDeinterlacingParameterBufferType:
-            vaStatus = i965_render_proc_filter_parameter_buffer(ctx, obj_context, obj_buffer, VAProcFilterDeinterlacing);
-            break;
-
-        case VAProcFilterProcAmpParameterBufferType:
-            vaStatus = i965_render_proc_filter_parameter_buffer(ctx, obj_context, obj_buffer, VAProcFilterProcAmp);
-            break;
-
         default:
             vaStatus = VA_STATUS_ERROR_UNSUPPORTED_BUFFERTYPE;
             break;
@@ -3307,60 +3270,95 @@ i965_UnlockSurface(
 /* 
  * Query video processing pipeline 
  */
-VAStatus i965_QueryVideoProcPipelineCap(
-    VADriverContextP ctx,
-    VAContextID context,
-    VAProcPipelineCap *pipeline_cap     /* out */
+VAStatus i965_QueryVideoProcFilters(
+    VADriverContextP    ctx,
+    VAContextID         context,
+    VAProcFilterType   *filters,
+    unsigned int       *num_filters
     )
 {
-    struct i965_driver_data * const i965 = i965_driver_data(ctx);
-    int i = 0;
-
+    struct i965_driver_data *const i965 = i965_driver_data(ctx);
+    unsigned int i = 0;
+    
     if (HAS_VPP(i965)) {
-        pipeline_cap->filter_pipeline[i] = VAProcFilterNoiseReduction;
-        pipeline_cap->bypass[i++] = 1;
-        pipeline_cap->filter_pipeline[i] = VAProcFilterDeinterlacing;
-        pipeline_cap->bypass[i++] = 1;
+        filters[i++] = VAProcFilterNoiseReduction;
+        filters[i++] = VAProcFilterDeinterlacing;
     }
 
-    for (; i < VA_PROC_PIPELINE_MAX_NUM_FILTERS; i++) {
-        pipeline_cap->filter_pipeline[i] = VAProcFilterNone;
-        pipeline_cap->bypass[i] = 1;
-    }
+    *num_filters = i;
 
     return VA_STATUS_SUCCESS;
 }
 
-VAStatus i965_QueryVideoProcFilterCap(
-    VADriverContextP ctx,
-    VAContextID context,
-    VAProcFilterType filter,
-    void *cap   /* out */
-    ) 
+VAStatus i965_QueryVideoProcFilterCaps(
+    VADriverContextP    ctx,
+    VAContextID         context,
+    VAProcFilterType    type,
+    void               *filter_caps,
+    unsigned int       *num_filter_caps
+    )
 {
-    assert(cap);
+    unsigned int i = 0;
 
-    if (filter == VAProcFilterNoiseReduction) {
-        VAProcFilterCapBase *base_cap = cap;
-        base_cap->range.min = 0.0;
-        base_cap->range.max = 1.0;
-        base_cap->range.default_value = 0.5;
-        base_cap->range.step = 0.03125; /* 1.0 / 32 */
+    if (type == VAProcFilterNoiseReduction) {
+        VAProcFilterCap *cap = filter_caps;
+
+        cap->range.min_value = 0.0;
+        cap->range.max_value = 1.0;
+        cap->range.default_value = 0.5;
+        cap->range.step = 0.03125; /* 1.0 / 32 */
+        i++;
+    } else if (type == VAProcFilterDeinterlacing) {
+        VAProcFilterCapDeinterlacing *cap = filter_caps;
+        
+        cap->type = VAProcDeinterlacingBob;
+        i++;
+        cap++;
+        cap->type = VAProcDeinterlacingWeave;
+        i++;
+        cap++;
     }
 
+    *num_filter_caps = i;
+
     return VA_STATUS_SUCCESS;
 }
 
-VAStatus i965_QueryVideoProcReferenceFramesCap(
+VAStatus i965_QueryVideoProcPipelineCaps(
     VADriverContextP ctx,
     VAContextID context,
-    unsigned int *num_forward_reference, /* out */
-    unsigned int *num_backward_reference /* out */
+    VABufferID *filters,
+    unsigned int num_filters,
+    VAProcPipelineCaps *pipeline_cap     /* out */
     )
 {
-
-    *num_forward_reference = 0;
-    *num_backward_reference = 0;
+    struct i965_driver_data * const i965 = i965_driver_data(ctx);
+    unsigned int i = 0;
+
+    pipeline_cap->flags = 0;
+    pipeline_cap->pipeline_flags = 0;
+    pipeline_cap->filter_flags = 0;
+    pipeline_cap->num_forward_references = 0;
+    pipeline_cap->num_backward_references = 0;
+    pipeline_cap->num_input_color_standards = 0;
+    pipeline_cap->input_color_standards[pipeline_cap->num_input_color_standards++] = VAProcColorStandardBT601;
+    pipeline_cap->num_output_color_standards = 0;
+    pipeline_cap->output_color_standards[pipeline_cap->num_output_color_standards++] = VAProcColorStandardBT601;
+
+    for (i = 0; i < num_filters; i++) {
+        struct object_buffer *obj_buffer = BUFFER(filters[i]);
+        VAProcFilterParameterBufferBase *base = (VAProcFilterParameterBufferBase *)obj_buffer->buffer_store->buffer;
+
+        if (base->type == VAProcFilterNoiseReduction) {
+            VAProcFilterParameterBuffer *denoise = (VAProcFilterParameterBuffer *)base;
+            (void)denoise;
+        } else if (base->type == VAProcFilterDeinterlacing) {
+            VAProcFilterParameterBufferDeinterlacing *deint = (VAProcFilterParameterBufferDeinterlacing *)base;
+
+            assert(deint->algorithm == VAProcDeinterlacingWeave ||
+                   deint->algorithm == VAProcDeinterlacingBob);
+        }
+    }
 
     return VA_STATUS_SUCCESS;
 }
@@ -3372,6 +3370,8 @@ VAStatus
 VA_DRIVER_INIT_FUNC(  VADriverContextP ctx )
 {
     struct VADriverVTable * const vtable = ctx->vtable;
+    struct VADriverVTableVPP * const vtable_vpp = ctx->vtable_vpp;
+
     struct i965_driver_data *i965;
     int result;
 
@@ -3428,11 +3428,10 @@ VA_DRIVER_INIT_FUNC(  VADriverContextP ctx )
     vtable->vaBufferInfo = i965_BufferInfo;
     vtable->vaLockSurface = i965_LockSurface;
     vtable->vaUnlockSurface = i965_UnlockSurface;
-    vtable->vaQueryVideoProcPipelineCap = i965_QueryVideoProcPipelineCap;
-    vtable->vaQueryVideoProcFilterCap = i965_QueryVideoProcFilterCap;
-    vtable->vaQueryVideoProcReferenceFramesCap = i965_QueryVideoProcReferenceFramesCap;
 
-    //    vtable->vaDbgCopySurfaceToBuffer = i965_DbgCopySurfaceToBuffer;
+    vtable_vpp->vaQueryVideoProcFilters = i965_QueryVideoProcFilters;
+    vtable_vpp->vaQueryVideoProcFilterCaps = i965_QueryVideoProcFilterCaps;
+    vtable_vpp->vaQueryVideoProcPipelineCaps = i965_QueryVideoProcPipelineCaps;
 
     i965 = (struct i965_driver_data *)calloc(1, sizeof(*i965));
     assert(i965);
index a6ec3ed..6a1ba8d 100644 (file)
 #define _I965_DRV_VIDEO_H_
 
 #include <va/va.h>
+#include <va/va_enc_h264.h>
+#include <va/va_vpp.h>
 #include <va/va_backend.h>
+#include <va/va_backend_vpp.h>
 
 #include "i965_mutext.h"
 #include "object_heap.h"
@@ -118,7 +121,6 @@ struct encode_state
     /* 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_header_param[4];
     struct buffer_store *packed_header_data[4];
     struct buffer_store **slice_params_ext;
@@ -132,8 +134,7 @@ struct encode_state
 struct proc_state
 {
     struct buffer_store *pipeline_param;
-    struct buffer_store *input_param;
-    struct buffer_store *filter_param[VA_PROC_PIPELINE_MAX_NUM_FILTERS];
+    struct buffer_store *filter_param[VAProcFilterCount];
 
     VASurfaceID current_render_target;
 };
index a177752..aeea6f6 100644 (file)
@@ -27,6 +27,7 @@
 #include <assert.h>
 
 #include <va/va.h>
+#include <va/va_enc_h264.h>
 
 #include "i965_encoder_utils.h"
 
@@ -198,18 +199,17 @@ static void
 slice_header(avc_bitstream *bs,
              VAEncSequenceParameterBufferH264 *sps_param,
              VAEncPictureParameterBufferH264 *pic_param,
-             VAEncSliceParameterBufferH264 *slice_param,
-             VAEncH264DecRefPicMarkingBuffer *dec_ref_pic_marking_param)
+             VAEncSliceParameterBufferH264 *slice_param)
 {
-    int first_mb_in_slice = slice_param->starting_macroblock_address;
+    int first_mb_in_slice = slice_param->macroblock_address;
 
     avc_bitstream_put_ue(bs, first_mb_in_slice);        /* first_mb_in_slice: 0 */
     avc_bitstream_put_ue(bs, slice_param->slice_type);  /* slice_type */
     avc_bitstream_put_ue(bs, slice_param->pic_parameter_set_id);        /* pic_parameter_set_id: 0 */
-    avc_bitstream_put_ui(bs, pic_param->frame_num, sps_param->log2_max_frame_num_minus4 + 4); /* frame_num */
+    avc_bitstream_put_ui(bs, pic_param->frame_num, sps_param->seq_fields.bits.log2_max_frame_num_minus4 + 4); /* frame_num */
 
     /* frame_mbs_only_flag == 1 */
-    if (!sps_param->frame_mbs_only_flag) {
+    if (!sps_param->seq_fields.bits.frame_mbs_only_flag) {
         /* FIXME: */
         assert(0);
     }
@@ -217,8 +217,8 @@ slice_header(avc_bitstream *bs,
     if (pic_param->pic_fields.bits.idr_pic_flag)
         avc_bitstream_put_ue(bs, slice_param->idr_pic_id);             /* idr_pic_id: 0 */
 
-    if (sps_param->pic_order_cnt_type == 0) {
-        avc_bitstream_put_ui(bs, pic_param->CurrPic.TopFieldOrderCnt, sps_param->log2_max_pic_order_cnt_lsb_minus4 + 4);
+    if (sps_param->seq_fields.bits.pic_order_cnt_type == 0) {
+        avc_bitstream_put_ui(bs, pic_param->CurrPic.TopFieldOrderCnt, sps_param->seq_fields.bits.log2_max_pic_order_cnt_lsb_minus4 + 4);
         /* pic_order_present_flag == 0 */
     } else {
         /* FIXME: */
@@ -232,17 +232,14 @@ slice_header(avc_bitstream *bs,
         avc_bitstream_put_ui(bs, 0, 1);            /* num_ref_idx_active_override_flag: 0 */
 
         /* ref_pic_list_reordering */
-        assert(slice_param->ref_pic_list_modification_flag_l0 == 0);
-        avc_bitstream_put_ui(bs, slice_param->ref_pic_list_modification_flag_l0, 1);            /* ref_pic_list_reordering_flag_l0: 0 */
+        avc_bitstream_put_ui(bs, 0, 1);            /* ref_pic_list_reordering_flag_l0: 0 */
     } else if (IS_B_SLICE(slice_param->slice_type)) {
         avc_bitstream_put_ui(bs, slice_param->direct_spatial_mv_pred_flag, 1);            /* direct_spatial_mv_pred: 1 */
         avc_bitstream_put_ui(bs, 0, 1);            /* num_ref_idx_active_override_flag: 0 */
 
         /* ref_pic_list_reordering */
-        assert(slice_param->ref_pic_list_modification_flag_l0 == 0);
-        assert(slice_param->ref_pic_list_modification_flag_l1 == 0);
-        avc_bitstream_put_ui(bs, slice_param->ref_pic_list_modification_flag_l0, 1);            /* ref_pic_list_reordering_flag_l0: 0 */
-        avc_bitstream_put_ui(bs, slice_param->ref_pic_list_modification_flag_l1, 1);            /* ref_pic_list_reordering_flag_l1: 0 */
+        avc_bitstream_put_ui(bs, 0, 1);            /* ref_pic_list_reordering_flag_l0: 0 */
+        avc_bitstream_put_ui(bs, 0, 1);            /* ref_pic_list_reordering_flag_l1: 0 */
     } 
 
     if ((pic_param->pic_fields.bits.weighted_pred_flag && 
@@ -259,14 +256,6 @@ slice_header(avc_bitstream *bs,
         unsigned char long_term_reference_flag = 0;
         unsigned char adaptive_ref_pic_marking_mode_flag = 0;
 
-        if (dec_ref_pic_marking_param) {
-            no_output_of_prior_pics_flag = dec_ref_pic_marking_param->no_output_of_prior_pics_flag;
-            long_term_reference_flag = dec_ref_pic_marking_param->long_term_reference_flag;
-            adaptive_ref_pic_marking_mode_flag = dec_ref_pic_marking_param->adaptive_ref_pic_marking_mode_flag;
-            /* FIXME: XXX */
-            assert(adaptive_ref_pic_marking_mode_flag == 0);
-        }
-
         if (pic_param->pic_fields.bits.idr_pic_flag) {
             avc_bitstream_put_ui(bs, no_output_of_prior_pics_flag, 1);            /* no_output_of_prior_pics_flag: 0 */
             avc_bitstream_put_ui(bs, long_term_reference_flag, 1);            /* long_term_reference_flag: 0 */
@@ -301,7 +290,6 @@ int
 build_avc_slice_header(VAEncSequenceParameterBufferH264 *sps_param,
                        VAEncPictureParameterBufferH264 *pic_param,
                        VAEncSliceParameterBufferH264 *slice_param,
-                       VAEncH264DecRefPicMarkingBuffer *dec_ref_pic_marking_param,
                        unsigned char **slice_header_buffer)
 {
     avc_bitstream bs;
@@ -319,7 +307,7 @@ build_avc_slice_header(VAEncSequenceParameterBufferH264 *sps_param,
         nal_header(&bs, NAL_REF_IDC_NONE, is_idr ? NAL_IDR : NAL_NON_IDR);
     }
 
-    slice_header(&bs, sps_param, pic_param, slice_param, dec_ref_pic_marking_param);
+    slice_header(&bs, sps_param, pic_param, slice_param);
 
     avc_bitstream_end(&bs);
     *slice_header_buffer = (unsigned char *)bs.buffer;
index 1397224..62de4f6 100644 (file)
@@ -2,10 +2,9 @@
 #define __I965_ENCODER_UTILS_H__
 
 int 
-build_avc_slice_header(VAEncSequenceParameterBufferH264 *sps_param,
+build_avc_slice_header(VAEncSequenceParameterBufferH264 *sps_param, 
                        VAEncPictureParameterBufferH264 *pic_param,
                        VAEncSliceParameterBufferH264 *slice_param,
-                       VAEncH264DecRefPicMarkingBuffer *dec_ref_pic_marking_param,
                        unsigned char **slice_header_buffer);
 int 
 build_avc_sei_buffering_period(int cpb_removal_length,
index e8c320d..1aadcdb 100644 (file)
@@ -2288,7 +2288,7 @@ pp_nv12_dn_initialize(VADriverContextP ctx, struct i965_post_processing_context
     struct i965_sampler_dndi *sampler_dndi;
     struct pp_static_parameter *pp_static_parameter = pp_context->pp_static_parameter;
     struct pp_inline_parameter *pp_inline_parameter = pp_context->pp_inline_parameter;
-    VAProcFilterBaseParameterBuffer *dn_filter_param = filter_param;
+    VAProcFilterParameterBuffer *dn_filter_param = filter_param; /* FIXME: parameter */
     int index;
     int w, h;
     int orig_w, orig_h;
@@ -2308,7 +2308,7 @@ pp_nv12_dn_initialize(VADriverContextP ctx, struct i965_post_processing_context
     }
 
     if (dn_filter_param) {
-        int value = dn_filter_param->value;
+        float value = dn_filter_param->value;
         
         if (value > 1.0)
             value = 1.0;
@@ -2722,7 +2722,7 @@ gen7_pp_nv12_dn_initialize(VADriverContextP ctx, struct i965_post_processing_con
     struct gen7_pp_static_parameter *pp_static_parameter = pp_context->pp_static_parameter;
     struct object_surface *obj_surface;
     struct gen7_sampler_dndi *sampler_dn;
-    VAProcFilterBaseParameterBuffer *dn_filter_param = filter_param;
+    VAProcFilterParameterBuffer *dn_filter_param = filter_param; /* FIXME: parameter */
     int index;
     int w, h;
     int orig_w, orig_h;
@@ -2742,7 +2742,7 @@ gen7_pp_nv12_dn_initialize(VADriverContextP ctx, struct i965_post_processing_con
     }
 
     if (dn_filter_param) {
-        int value = dn_filter_param->value;
+        float value = dn_filter_param->value;
         
         if (value > 1.0)
             value = 1.0;
@@ -3895,34 +3895,32 @@ i965_proc_picture(VADriverContextP ctx,
     struct i965_proc_context *proc_context = (struct i965_proc_context *)hw_context;
     struct proc_state *proc_state = &codec_state->proc;
     VAProcPipelineParameterBuffer *pipeline_param = (VAProcPipelineParameterBuffer *)proc_state->pipeline_param->buffer;
-    VAProcInputParameterBuffer *input_param = (VAProcInputParameterBuffer *)proc_state->input_param->buffer;
     struct object_surface *obj_surface;
     struct i965_surface src_surface, dst_surface;
+    VARectangle src_rect, dst_rect;
     VAStatus status;
     int i;
-    VASurfaceID tmp_surfaces[VA_PROC_PIPELINE_MAX_NUM_FILTERS + 4];
+    VASurfaceID tmp_surfaces[VAProcFilterCount + 4];
     int num_tmp_surfaces = 0;
     unsigned int tiling = 0, swizzle = 0;
     int in_width, in_height;
 
-    assert(input_param->surface != VA_INVALID_ID);
+    assert(pipeline_param->surface != VA_INVALID_ID);
     assert(proc_state->current_render_target != VA_INVALID_ID);
 
-    obj_surface = SURFACE(input_param->surface);
+    obj_surface = SURFACE(pipeline_param->surface);
     in_width = obj_surface->orig_width;
     in_height = obj_surface->orig_height;
     dri_bo_get_tiling(obj_surface->bo, &tiling, &swizzle);
 
-    src_surface.id = input_param->surface;
+    src_surface.id = pipeline_param->surface;
     src_surface.type = I965_SURFACE_TYPE_SURFACE;
-    src_surface.flags = proc_frame_to_pp_frame[input_param->flags];
+    src_surface.flags = proc_frame_to_pp_frame[pipeline_param->filter_flags & 0x3];
 
     if (obj_surface->fourcc != VA_FOURCC('N', 'V', '1', '2')) {
-        struct i965_surface src_surface, dst_surface;
-        VARectangle src_rect, dst_rect;
         VASurfaceID out_surface_id = VA_INVALID_ID;
 
-        src_surface.id = input_param->surface;
+        src_surface.id = pipeline_param->surface;
         src_surface.type = I965_SURFACE_TYPE_SURFACE;
         src_surface.flags = I965_SURFACE_FLAG_FRAME;
         src_rect.x = 0;
@@ -3958,14 +3956,40 @@ i965_proc_picture(VADriverContextP ctx,
 
         src_surface.id = out_surface_id;
         src_surface.type = I965_SURFACE_TYPE_SURFACE;
-        src_surface.flags = proc_frame_to_pp_frame[input_param->flags];
+        src_surface.flags = proc_frame_to_pp_frame[pipeline_param->filter_flags & 0x3];
+    }
+
+    if (pipeline_param->surface_region) {
+        src_rect.x = pipeline_param->surface_region->x;
+        src_rect.y = pipeline_param->surface_region->y;
+        src_rect.width = pipeline_param->surface_region->width;
+        src_rect.height = pipeline_param->surface_region->height;
+    } else {
+        src_rect.x = 0;
+        src_rect.y = 0;
+        src_rect.width = in_width;
+        src_rect.height = in_height;
+    }
+
+    if (pipeline_param->output_region) {
+        dst_rect.x = pipeline_param->output_region->x;
+        dst_rect.y = pipeline_param->output_region->y;
+        dst_rect.width = pipeline_param->output_region->width;
+        dst_rect.height = pipeline_param->output_region->height;
+    } else {
+        dst_rect.x = 0;
+        dst_rect.y = 0;
+        dst_rect.width = in_width;
+        dst_rect.height = in_height;
     }
 
     obj_surface = SURFACE(proc_state->current_render_target);
     i965_check_alloc_surface_bo(ctx, obj_surface, !!tiling, VA_FOURCC('N','V','1','2'), SUBSAMPLE_YUV420);
     
-    for (i = 0; i < VA_PROC_PIPELINE_MAX_NUM_FILTERS; i++) {
-        VAProcFilterType filter_type = pipeline_param->filter_pipeline[i];
+    for (i = 0; i < pipeline_param->num_filters; i++) {
+        struct object_buffer *obj_buffer = BUFFER(pipeline_param->filters[i]);
+        VAProcFilterParameterBufferBase *base = (VAProcFilterParameterBufferBase *)obj_buffer->buffer_store->buffer;
+        VAProcFilterType filter_type = base->type;
         VASurfaceID out_surface_id = VA_INVALID_ID;
         void *filter_param = NULL;
 
@@ -3987,9 +4011,9 @@ i965_proc_picture(VADriverContextP ctx,
             dst_surface.type = I965_SURFACE_TYPE_SURFACE;
             status = i965_post_processing_internal(ctx, &proc_context->pp_context,
                                                    &src_surface,
-                                                   &input_param->region,
+                                                   &src_rect,
                                                    &dst_surface,
-                                                   &input_param->region,
+                                                   &src_rect,
                                                    procfilter_to_pp_flag[filter_type],
                                                    filter_param);
 
@@ -4005,10 +4029,10 @@ i965_proc_picture(VADriverContextP ctx,
     dst_surface.type = I965_SURFACE_TYPE_SURFACE;
     i965_post_processing_internal(ctx, &proc_context->pp_context,
                                   &src_surface,
-                                  &input_param->region,
+                                  &src_rect,
                                   &dst_surface,
-                                  &pipeline_param->output_region,
-                                  (pipeline_param->flags & VA_FILTER_SCALING_MASK) == VA_FILTER_SCALING_NL_ANAMORPHIC ?
+                                  &dst_rect,
+                                  (pipeline_param->filter_flags & VA_FILTER_SCALING_MASK) == VA_FILTER_SCALING_NL_ANAMORPHIC ?
                                   PP_NV12_AVS : PP_NV12_SCALING,
                                   NULL);