Add new avc_find_picture() helper function to search for a VAPictureH264 struct based on the supplied VA surface id.
Signed-off-by: Gwenole Beauchesne <gwenole.beauche...@intel.com> --- src/gen6_mfd.c | 26 +++++++---------------- src/gen75_mfd.c | 52 +++++++++++++--------------------------------- src/gen7_mfd.c | 26 +++++++---------------- src/gen8_mfd.c | 26 +++++++---------------- src/i965_avc_bsd.c | 48 ++++++++++-------------------------------- src/i965_decoder_utils.c | 17 +++++++++++++++ src/i965_decoder_utils.h | 3 +++ src/i965_media_h264.c | 30 ++++++++++---------------- 8 files changed, 77 insertions(+), 151 deletions(-) diff --git a/src/gen6_mfd.c b/src/gen6_mfd.c index f925d98..113561c 100755 --- a/src/gen6_mfd.c +++ b/src/gen6_mfd.c @@ -420,7 +420,7 @@ gen6_mfd_avc_directmode_state(VADriverContextP ctx, struct object_surface *obj_surface; GenAvcSurface *gen6_avc_surface; VAPictureH264 *va_pic; - int i, j; + int i; BEGIN_BCS_BATCH(batch, 69); OUT_BCS_BATCH(batch, MFX_AVC_DIRECTMODE_STATE | (69 - 2)); @@ -472,26 +472,14 @@ gen6_mfd_avc_directmode_state(VADriverContextP ctx, /* POC List */ for (i = 0; i < ARRAY_ELEMS(gen6_mfd_context->reference_surface); i++) { - if (gen6_mfd_context->reference_surface[i].surface_id != VA_INVALID_ID) { - int found = 0; + obj_surface = gen6_mfd_context->reference_surface[i].obj_surface; - assert(gen6_mfd_context->reference_surface[i].obj_surface != NULL); - - for (j = 0; j < ARRAY_ELEMS(pic_param->ReferenceFrames); j++) { - va_pic = &pic_param->ReferenceFrames[j]; - - if (va_pic->flags & VA_PICTURE_H264_INVALID) - continue; - - if (va_pic->picture_id == gen6_mfd_context->reference_surface[i].surface_id) { - found = 1; - break; - } - } + if (obj_surface) { + const VAPictureH264 * const va_pic = avc_find_picture( + obj_surface->base.id, pic_param->ReferenceFrames, + ARRAY_ELEMS(pic_param->ReferenceFrames)); - assert(found == 1); - assert(!(va_pic->flags & VA_PICTURE_H264_INVALID)); - + assert(va_pic != NULL); OUT_BCS_BATCH(batch, va_pic->TopFieldOrderCnt); OUT_BCS_BATCH(batch, va_pic->BottomFieldOrderCnt); } else { diff --git a/src/gen75_mfd.c b/src/gen75_mfd.c index 895b194..01db56c 100644 --- a/src/gen75_mfd.c +++ b/src/gen75_mfd.c @@ -664,7 +664,7 @@ gen75_mfd_avc_directmode_state_bplus(VADriverContextP ctx, struct object_surface *obj_surface; GenAvcSurface *gen7_avc_surface; VAPictureH264 *va_pic; - int i, j; + int i; BEGIN_BCS_BATCH(batch, 71); OUT_BCS_BATCH(batch, MFX_AVC_DIRECTMODE_STATE | (71 - 2)); @@ -704,26 +704,14 @@ gen75_mfd_avc_directmode_state_bplus(VADriverContextP ctx, /* POC List */ for (i = 0; i < ARRAY_ELEMS(gen7_mfd_context->reference_surface); i++) { - if (gen7_mfd_context->reference_surface[i].surface_id != VA_INVALID_ID) { - int found = 0; + obj_surface = gen7_mfd_context->reference_surface[i].obj_surface; - assert(gen7_mfd_context->reference_surface[i].obj_surface != NULL); - - for (j = 0; j < ARRAY_ELEMS(pic_param->ReferenceFrames); j++) { - va_pic = &pic_param->ReferenceFrames[j]; - - if (va_pic->flags & VA_PICTURE_H264_INVALID) - continue; - - if (va_pic->picture_id == gen7_mfd_context->reference_surface[i].surface_id) { - found = 1; - break; - } - } + if (obj_surface) { + const VAPictureH264 * const va_pic = avc_find_picture( + obj_surface->base.id, pic_param->ReferenceFrames, + ARRAY_ELEMS(pic_param->ReferenceFrames)); - assert(found == 1); - assert(!(va_pic->flags & VA_PICTURE_H264_INVALID)); - + assert(va_pic != NULL); OUT_BCS_BATCH(batch, va_pic->TopFieldOrderCnt); OUT_BCS_BATCH(batch, va_pic->BottomFieldOrderCnt); } else { @@ -751,7 +739,7 @@ gen75_mfd_avc_directmode_state(VADriverContextP ctx, struct object_surface *obj_surface; GenAvcSurface *gen7_avc_surface; VAPictureH264 *va_pic; - int i, j; + int i; if (IS_STEPPING_BPLUS(i965)) { gen75_mfd_avc_directmode_state_bplus(ctx, decode_state, pic_param, slice_param, @@ -811,26 +799,14 @@ gen75_mfd_avc_directmode_state(VADriverContextP ctx, /* POC List */ for (i = 0; i < ARRAY_ELEMS(gen7_mfd_context->reference_surface); i++) { - if (gen7_mfd_context->reference_surface[i].surface_id != VA_INVALID_ID) { - int found = 0; + obj_surface = gen7_mfd_context->reference_surface[i].obj_surface; - assert(gen7_mfd_context->reference_surface[i].obj_surface != NULL); - - for (j = 0; j < ARRAY_ELEMS(pic_param->ReferenceFrames); j++) { - va_pic = &pic_param->ReferenceFrames[j]; - - if (va_pic->flags & VA_PICTURE_H264_INVALID) - continue; - - if (va_pic->picture_id == gen7_mfd_context->reference_surface[i].surface_id) { - found = 1; - break; - } - } + if (obj_surface) { + const VAPictureH264 * const va_pic = avc_find_picture( + obj_surface->base.id, pic_param->ReferenceFrames, + ARRAY_ELEMS(pic_param->ReferenceFrames)); - assert(found == 1); - assert(!(va_pic->flags & VA_PICTURE_H264_INVALID)); - + assert(va_pic != NULL); OUT_BCS_BATCH(batch, va_pic->TopFieldOrderCnt); OUT_BCS_BATCH(batch, va_pic->BottomFieldOrderCnt); } else { diff --git a/src/gen7_mfd.c b/src/gen7_mfd.c index f9114e7..5fffcc9 100755 --- a/src/gen7_mfd.c +++ b/src/gen7_mfd.c @@ -429,7 +429,7 @@ gen7_mfd_avc_directmode_state(VADriverContextP ctx, struct object_surface *obj_surface; GenAvcSurface *gen7_avc_surface; VAPictureH264 *va_pic; - int i, j; + int i; BEGIN_BCS_BATCH(batch, 69); OUT_BCS_BATCH(batch, MFX_AVC_DIRECTMODE_STATE | (69 - 2)); @@ -481,26 +481,14 @@ gen7_mfd_avc_directmode_state(VADriverContextP ctx, /* POC List */ for (i = 0; i < ARRAY_ELEMS(gen7_mfd_context->reference_surface); i++) { - if (gen7_mfd_context->reference_surface[i].surface_id != VA_INVALID_ID) { - int found = 0; + obj_surface = gen7_mfd_context->reference_surface[i].obj_surface; - assert(gen7_mfd_context->reference_surface[i].obj_surface != NULL); - - for (j = 0; j < ARRAY_ELEMS(pic_param->ReferenceFrames); j++) { - va_pic = &pic_param->ReferenceFrames[j]; - - if (va_pic->flags & VA_PICTURE_H264_INVALID) - continue; - - if (va_pic->picture_id == gen7_mfd_context->reference_surface[i].surface_id) { - found = 1; - break; - } - } + if (obj_surface) { + const VAPictureH264 * const va_pic = avc_find_picture( + obj_surface->base.id, pic_param->ReferenceFrames, + ARRAY_ELEMS(pic_param->ReferenceFrames)); - assert(found == 1); - assert(!(va_pic->flags & VA_PICTURE_H264_INVALID)); - + assert(va_pic != NULL); OUT_BCS_BATCH(batch, va_pic->TopFieldOrderCnt); OUT_BCS_BATCH(batch, va_pic->BottomFieldOrderCnt); } else { diff --git a/src/gen8_mfd.c b/src/gen8_mfd.c index 10495d8..622e0f3 100644 --- a/src/gen8_mfd.c +++ b/src/gen8_mfd.c @@ -531,7 +531,7 @@ gen8_mfd_avc_directmode_state(VADriverContextP ctx, struct object_surface *obj_surface; GenAvcSurface *gen7_avc_surface; VAPictureH264 *va_pic; - int i, j; + int i; BEGIN_BCS_BATCH(batch, 71); OUT_BCS_BATCH(batch, MFX_AVC_DIRECTMODE_STATE | (71 - 2)); @@ -572,26 +572,14 @@ gen8_mfd_avc_directmode_state(VADriverContextP ctx, /* POC List */ for (i = 0; i < ARRAY_ELEMS(gen7_mfd_context->reference_surface); i++) { - if (gen7_mfd_context->reference_surface[i].surface_id != VA_INVALID_ID) { - int found = 0; + obj_surface = gen7_mfd_context->reference_surface[i].obj_surface; - assert(gen7_mfd_context->reference_surface[i].obj_surface != NULL); - - for (j = 0; j < ARRAY_ELEMS(pic_param->ReferenceFrames); j++) { - va_pic = &pic_param->ReferenceFrames[j]; - - if (va_pic->flags & VA_PICTURE_H264_INVALID) - continue; - - if (va_pic->picture_id == gen7_mfd_context->reference_surface[i].surface_id) { - found = 1; - break; - } - } + if (obj_surface) { + const VAPictureH264 * const va_pic = avc_find_picture( + obj_surface->base.id, pic_param->ReferenceFrames, + ARRAY_ELEMS(pic_param->ReferenceFrames)); - assert(found == 1); - assert(!(va_pic->flags & VA_PICTURE_H264_INVALID)); - + assert(va_pic != NULL); OUT_BCS_BATCH(batch, va_pic->TopFieldOrderCnt); OUT_BCS_BATCH(batch, va_pic->BottomFieldOrderCnt); } else { diff --git a/src/i965_avc_bsd.c b/src/i965_avc_bsd.c index 67c7c95..43bace6 100644 --- a/src/i965_avc_bsd.c +++ b/src/i965_avc_bsd.c @@ -378,7 +378,7 @@ i965_avc_bsd_buf_base_state(VADriverContextP ctx, { struct intel_batchbuffer *batch = i965_h264_context->batch; struct i965_avc_bsd_context *i965_avc_bsd_context; - int i, j; + int i; VAPictureH264 *va_pic; struct object_surface *obj_surface; GenAvcSurface *avc_bsd_surface; @@ -408,24 +408,8 @@ i965_avc_bsd_buf_base_state(VADriverContextP ctx, OUT_BCS_BATCH(batch, 0); for (i = 0; i < ARRAY_ELEMS(i965_h264_context->fsid_list); i++) { - if (i965_h264_context->fsid_list[i].surface_id != VA_INVALID_ID && - i965_h264_context->fsid_list[i].obj_surface && - i965_h264_context->fsid_list[i].obj_surface->private_data) { - int found = 0; - for (j = 0; j < ARRAY_ELEMS(pic_param->ReferenceFrames); j++) { - va_pic = &pic_param->ReferenceFrames[j]; - - if (va_pic->flags & VA_PICTURE_H264_INVALID) - continue; - - if (va_pic->picture_id == i965_h264_context->fsid_list[i].surface_id) { - found = 1; - break; - } - } - - assert(found == 1); - obj_surface = i965_h264_context->fsid_list[i].obj_surface; + obj_surface = i965_h264_context->fsid_list[i].obj_surface; + if (obj_surface && obj_surface->private_data) { avc_bsd_surface = obj_surface->private_data; OUT_BCS_RELOC(batch, avc_bsd_surface->dmv_top, @@ -480,26 +464,16 @@ i965_avc_bsd_buf_base_state(VADriverContextP ctx, /* POC List */ for (i = 0; i < ARRAY_ELEMS(i965_h264_context->fsid_list); i++) { - if (i965_h264_context->fsid_list[i].surface_id != VA_INVALID_ID) { - int found = 0; - for (j = 0; j < ARRAY_ELEMS(pic_param->ReferenceFrames); j++) { - va_pic = &pic_param->ReferenceFrames[j]; - - if (va_pic->flags & VA_PICTURE_H264_INVALID) - continue; - - if (va_pic->picture_id == i965_h264_context->fsid_list[i].surface_id) { - found = 1; - break; - } - } + obj_surface = i965_h264_context->fsid_list[i].obj_surface; - assert(found == 1); + if (obj_surface) { + const VAPictureH264 * const va_pic = avc_find_picture( + obj_surface->base.id, pic_param->ReferenceFrames, + ARRAY_ELEMS(pic_param->ReferenceFrames)); - if (!(va_pic->flags & VA_PICTURE_H264_INVALID)) { - OUT_BCS_BATCH(batch, va_pic->TopFieldOrderCnt); - OUT_BCS_BATCH(batch, va_pic->BottomFieldOrderCnt); - } + assert(va_pic != NULL); + OUT_BCS_BATCH(batch, va_pic->TopFieldOrderCnt); + OUT_BCS_BATCH(batch, va_pic->BottomFieldOrderCnt); } else { OUT_BCS_BATCH(batch, 0); OUT_BCS_BATCH(batch, 0); diff --git a/src/i965_decoder_utils.c b/src/i965_decoder_utils.c index e0593ea..13b717d 100644 --- a/src/i965_decoder_utils.c +++ b/src/i965_decoder_utils.c @@ -252,6 +252,23 @@ avc_gen_default_iq_matrix(VAIQMatrixBufferH264 *iq_matrix) memset(&iq_matrix->ScalingList8x8, 16, sizeof(iq_matrix->ScalingList8x8)); } +/* Finds the VA/H264 picture associated with the specified VA surface id */ +VAPictureH264 * +avc_find_picture(VASurfaceID id, VAPictureH264 *pic_list, int pic_list_count) +{ + int i; + + if (id != VA_INVALID_ID) { + for (i = 0; i < pic_list_count; i++) { + VAPictureH264 * const va_pic = &pic_list[i]; + if (va_pic->picture_id == id && + !(va_pic->flags & VA_PICTURE_H264_INVALID)) + return va_pic; + } + } + return NULL; +} + /* Get first macroblock bit offset for BSD, minus EPB count (AVC) */ /* XXX: slice_data_bit_offset does not account for EPB */ unsigned int diff --git a/src/i965_decoder_utils.h b/src/i965_decoder_utils.h index 14a45fb..a4c9415 100644 --- a/src/i965_decoder_utils.h +++ b/src/i965_decoder_utils.h @@ -54,6 +54,9 @@ avc_ensure_surface_bo( void avc_gen_default_iq_matrix(VAIQMatrixBufferH264 *iq_matrix); +VAPictureH264 * +avc_find_picture(VASurfaceID id, VAPictureH264 *pic_list, int pic_list_count); + unsigned int avc_get_first_mb_bit_offset( dri_bo *slice_data_bo, diff --git a/src/i965_media_h264.c b/src/i965_media_h264.c index 9de4e09..8ec7e4f 100644 --- a/src/i965_media_h264.c +++ b/src/i965_media_h264.c @@ -11,6 +11,7 @@ #include "i965_drv_video.h" #include "i965_media.h" #include "i965_media_h264.h" +#include "i965_decoder_utils.h" enum { INTRA_16X16 = 0, @@ -343,7 +344,7 @@ i965_media_h264_surfaces_setup(VADriverContextP ctx, struct object_surface *obj_surface; VAPictureParameterBufferH264 *pic_param; VAPictureH264 *va_pic; - int i, j, w, h; + int i, w, h; int field_picture; assert(media_context->private_context); @@ -375,24 +376,15 @@ i965_media_h264_surfaces_setup(VADriverContextP ctx, /* Reference Pictures */ for (i = 0; i < ARRAY_ELEMS(i965_h264_context->fsid_list); i++) { - if (i965_h264_context->fsid_list[i].surface_id != VA_INVALID_ID && - i965_h264_context->fsid_list[i].obj_surface != NULL) { - int found = 0; - for (j = 0; j < ARRAY_ELEMS(pic_param->ReferenceFrames); j++) { - va_pic = &pic_param->ReferenceFrames[j]; - - if (va_pic->flags & VA_PICTURE_H264_INVALID) - continue; - - if (va_pic->picture_id == i965_h264_context->fsid_list[i].surface_id) { - found = 1; - break; - } - } - - assert(found == 1); - - obj_surface = i965_h264_context->fsid_list[i].obj_surface; + struct object_surface * const obj_surface = + i965_h264_context->fsid_list[i].obj_surface; + + if (obj_surface) { + const VAPictureH264 * const va_pic = avc_find_picture( + obj_surface->base.id, pic_param->ReferenceFrames, + ARRAY_ELEMS(pic_param->ReferenceFrames)); + + assert(va_pic != NULL); w = obj_surface->width; h = obj_surface->height; field_picture = !!(va_pic->flags & (VA_PICTURE_H264_TOP_FIELD | VA_PICTURE_H264_BOTTOM_FIELD)); -- 1.7.9.5 _______________________________________________ Libva mailing list Libva@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/libva