VME uses reference frame parsed from slice_param instead of hacked DPB
authorZhao Yakui <yakui.zhao@intel.com>
Thu, 9 May 2013 05:52:28 +0000 (13:52 +0800)
committerYakui Zhao <yakui.zhao@intel.com>
Thu, 9 May 2013 05:52:28 +0000 (13:52 +0800)
Signed-off-by: Zhao Yakui <yakui.zhao@intel.com>
src/gen6_vme.c
src/gen75_vme.c
src/gen7_vme.c

index 57311dc..69c667d 100644 (file)
@@ -204,6 +204,7 @@ gen6_vme_surface_setup(VADriverContextP ctx,
                        struct intel_encoder_context *encoder_context)
 {
     struct object_surface *obj_surface;
+    struct i965_driver_data *i965 = i965_driver_data(ctx);
 
     /*Setup surfaces state*/
     /* current picture for encoding */
@@ -212,17 +213,45 @@ gen6_vme_surface_setup(VADriverContextP ctx,
     gen6_vme_media_source_surface_state(ctx, 4, obj_surface, encoder_context);
 
     if (!is_intra) {
-        /* reference 0 */
-        obj_surface = encode_state->reference_objects[0];
-
-        if (obj_surface && obj_surface->bo)
-            gen6_vme_source_surface_state(ctx, 1, obj_surface, encoder_context);
-
-        /* reference 1 */
-        obj_surface = encode_state->reference_objects[1];
-
-        if (obj_surface && obj_surface->bo) 
-            gen6_vme_source_surface_state(ctx, 2, obj_surface, encoder_context);
+       VAEncSliceParameterBufferH264 *slice_param = (VAEncSliceParameterBufferH264 *)encode_state->slice_params_ext[0]->buffer;
+       int slice_type;
+       struct object_surface *slice_obj_surface;
+       int ref_surface_id;
+
+       slice_type = intel_avc_enc_slice_type_fixup(slice_param->slice_type);
+
+       if (slice_type == SLICE_TYPE_P || slice_type == SLICE_TYPE_B) {
+               slice_obj_surface = NULL;
+               ref_surface_id = slice_param->RefPicList0[0].picture_id;
+               if (ref_surface_id != 0 && ref_surface_id != VA_INVALID_SURFACE) {
+                       slice_obj_surface = SURFACE(ref_surface_id);
+               }
+               if (slice_obj_surface && slice_obj_surface->bo) {
+                       obj_surface = slice_obj_surface;
+               } else {
+                       obj_surface = encode_state->reference_objects[0];
+               }
+               /* reference 0 */
+               if (obj_surface && obj_surface->bo)
+                   gen6_vme_source_surface_state(ctx, 1, obj_surface, encoder_context);
+       }
+       if (slice_type == SLICE_TYPE_B) {
+               /* reference 1 */
+               slice_obj_surface = NULL;
+               ref_surface_id = slice_param->RefPicList1[0].picture_id;
+               if (ref_surface_id != 0 && ref_surface_id != VA_INVALID_SURFACE) {
+                       slice_obj_surface = SURFACE(ref_surface_id);
+               }
+               if (slice_obj_surface && slice_obj_surface->bo) {
+                       obj_surface = slice_obj_surface;
+               } else {
+                       obj_surface = encode_state->reference_objects[0];
+               }
+
+               obj_surface = encode_state->reference_objects[1];
+               if (obj_surface && obj_surface->bo)
+                       gen6_vme_source_surface_state(ctx, 2, obj_surface, encoder_context);
+       }
     }
 
     /* VME output */
index 7d13ec3..b796505 100644 (file)
@@ -264,6 +264,7 @@ gen75_vme_surface_setup(VADriverContextP ctx,
                         struct intel_encoder_context *encoder_context)
 {
     struct object_surface *obj_surface;
+    struct i965_driver_data *i965 = i965_driver_data(ctx);
 
     /*Setup surfaces state*/
     /* current picture for encoding */
@@ -273,17 +274,45 @@ gen75_vme_surface_setup(VADriverContextP ctx,
     gen75_vme_media_chroma_source_surface_state(ctx, 6, obj_surface, encoder_context);
 
     if (!is_intra) {
-        /* reference 0 */
-        obj_surface = encode_state->reference_objects[0];
-
-        if (obj_surface && obj_surface->bo)
-            gen75_vme_source_surface_state(ctx, 1, obj_surface, encoder_context);
-
-        /* reference 1 */
-        obj_surface = encode_state->reference_objects[1];
+       VAEncSliceParameterBufferH264 *slice_param = (VAEncSliceParameterBufferH264 *)encode_state->slice_params_ext[0]->buffer;
+       int slice_type;
+       struct object_surface *slice_obj_surface;
+       int ref_surface_id;
+
+       slice_type = intel_avc_enc_slice_type_fixup(slice_param->slice_type);
+
+       if (slice_type == SLICE_TYPE_P || slice_type == SLICE_TYPE_B) {
+               slice_obj_surface = NULL;
+               ref_surface_id = slice_param->RefPicList0[0].picture_id;
+               if (ref_surface_id != 0 && ref_surface_id != VA_INVALID_SURFACE) {
+                       slice_obj_surface = SURFACE(ref_surface_id);
+               }
+               if (slice_obj_surface && slice_obj_surface->bo) {
+                       obj_surface = slice_obj_surface;
+               } else {
+                       obj_surface = encode_state->reference_objects[0];
+               }
+               /* reference 0 */
+               if (obj_surface && obj_surface->bo)
+                       gen75_vme_source_surface_state(ctx, 1, obj_surface, encoder_context);
+       }
+       if (slice_type == SLICE_TYPE_B) {
+               /* reference 1 */
+               slice_obj_surface = NULL;
+               ref_surface_id = slice_param->RefPicList1[0].picture_id;
+               if (ref_surface_id != 0 && ref_surface_id != VA_INVALID_SURFACE) {
+                       slice_obj_surface = SURFACE(ref_surface_id);
+               }
+               if (slice_obj_surface && slice_obj_surface->bo) {
+                       obj_surface = slice_obj_surface;
+               } else {
+                       obj_surface = encode_state->reference_objects[0];
+               }
 
-        if (obj_surface && obj_surface->bo)
-            gen75_vme_source_surface_state(ctx, 2, obj_surface, encoder_context);
+               obj_surface = encode_state->reference_objects[1];
+               if (obj_surface && obj_surface->bo)
+                       gen75_vme_source_surface_state(ctx, 2, obj_surface, encoder_context);
+       }
     }
 
     /* VME output */
index 24a22c5..88eb484 100644 (file)
@@ -250,6 +250,7 @@ gen7_vme_surface_setup(VADriverContextP ctx,
                        struct intel_encoder_context *encoder_context)
 {
     struct object_surface *obj_surface;
+    struct i965_driver_data *i965 = i965_driver_data(ctx);
 
     /*Setup surfaces state*/
     /* current picture for encoding */
@@ -258,17 +259,45 @@ gen7_vme_surface_setup(VADriverContextP ctx,
     gen7_vme_media_source_surface_state(ctx, 4, obj_surface, encoder_context);
 
     if (!is_intra) {
-        /* reference 0 */
-        obj_surface = encode_state->reference_objects[0];
-
-        if (obj_surface && obj_surface->bo)
-            gen7_vme_source_surface_state(ctx, 1, obj_surface, encoder_context);
-
-        /* reference 1 */
-        obj_surface = encode_state->reference_objects[1];
-
-        if (obj_surface && obj_surface->bo)
-            gen7_vme_source_surface_state(ctx, 2, obj_surface, encoder_context);
+       VAEncSliceParameterBufferH264 *slice_param = (VAEncSliceParameterBufferH264 *)encode_state->slice_params_ext[0]->buffer;
+       int slice_type;
+       struct object_surface *slice_obj_surface;
+       int ref_surface_id;
+
+       slice_type = intel_avc_enc_slice_type_fixup(slice_param->slice_type);
+
+       if (slice_type == SLICE_TYPE_P || slice_type == SLICE_TYPE_B) {
+               slice_obj_surface = NULL;
+               ref_surface_id = slice_param->RefPicList0[0].picture_id;
+               if (ref_surface_id != 0 && ref_surface_id != VA_INVALID_SURFACE) {
+                       slice_obj_surface = SURFACE(ref_surface_id);
+               }
+               if (slice_obj_surface && slice_obj_surface->bo) {
+                       obj_surface = slice_obj_surface;
+               } else {
+                       obj_surface = encode_state->reference_objects[0];
+               }
+               /* reference 0 */
+               if (obj_surface && obj_surface->bo)
+                   gen7_vme_source_surface_state(ctx, 1, obj_surface, encoder_context);
+       }
+       if (slice_type == SLICE_TYPE_B) {
+               /* reference 1 */
+               slice_obj_surface = NULL;
+               ref_surface_id = slice_param->RefPicList1[0].picture_id;
+               if (ref_surface_id != 0 && ref_surface_id != VA_INVALID_SURFACE) {
+                       slice_obj_surface = SURFACE(ref_surface_id);
+               }
+               if (slice_obj_surface && slice_obj_surface->bo) {
+                       obj_surface = slice_obj_surface;
+               } else {
+                       obj_surface = encode_state->reference_objects[0];
+               }
+
+               obj_surface = encode_state->reference_objects[1];
+               if (obj_surface && obj_surface->bo)
+                       gen7_vme_source_surface_state(ctx, 2, obj_surface, encoder_context);
+       }
     }
 
     /* VME output */