summaryrefslogtreecommitdiff
path: root/src/gen6_mfd.c
diff options
context:
space:
mode:
authorXiang, Haihao <haihao.xiang@intel.com>2013-03-12 15:12:07 +0800
committerXiang, Haihao <haihao.xiang@intel.com>2013-03-15 15:45:28 +0800
commit4f21aad1165f3d0a2e5978e0524db735d19944b3 (patch)
tree11dd569ec215db14ead396c4b551ba0d507e178f /src/gen6_mfd.c
parent54384c9585394db538b73eaf4227a59c7a452157 (diff)
downloadlibva-intel-driver-4f21aad1165f3d0a2e5978e0524db735d19944b3.tar.gz
Decoder: check whether the surface for decoding output is valid
In addition, uses the corresponding surface object directly. Signed-off-by: Xiang, Haihao <haihao.xiang@intel.com>
Diffstat (limited to 'src/gen6_mfd.c')
-rwxr-xr-xsrc/gen6_mfd.c38
1 files changed, 19 insertions, 19 deletions
diff --git a/src/gen6_mfd.c b/src/gen6_mfd.c
index 7513dda8..76a44f52 100755
--- a/src/gen6_mfd.c
+++ b/src/gen6_mfd.c
@@ -250,9 +250,7 @@ gen6_mfd_surface_state(VADriverContextP ctx,
struct gen6_mfd_context *gen6_mfd_context)
{
struct intel_batchbuffer *batch = gen6_mfd_context->base.batch;
- struct i965_driver_data *i965 = i965_driver_data(ctx);
- struct object_surface *obj_surface = SURFACE(decode_state->current_render_target);
- assert(obj_surface);
+ struct object_surface *obj_surface = decode_state->render_object;
BEGIN_BCS_BATCH(batch, 6);
OUT_BCS_BATCH(batch, MFX_SURFACE_STATE | (6 - 2));
@@ -433,7 +431,6 @@ gen6_mfd_avc_img_state(VADriverContextP ctx,
assert(decode_state->pic_param && decode_state->pic_param->buffer);
pic_param = (VAPictureParameterBufferH264 *)decode_state->pic_param->buffer;
- assert(!(pic_param->CurrPic.flags & VA_PICTURE_H264_INVALID));
if (decode_state->iq_matrix && decode_state->iq_matrix->buffer)
qm_present_flag = 1;
@@ -554,6 +551,7 @@ gen6_mfd_avc_qm_state(VADriverContextP ctx,
static void
gen6_mfd_avc_directmode_state(VADriverContextP ctx,
+ struct decode_state *decode_state,
VAPictureParameterBufferH264 *pic_param,
VASliceParameterBufferH264 *slice_param,
struct gen6_mfd_context *gen6_mfd_context)
@@ -600,9 +598,8 @@ gen6_mfd_avc_directmode_state(VADriverContextP ctx,
/* the current decoding frame/field */
va_pic = &pic_param->CurrPic;
- assert(!(va_pic->flags & VA_PICTURE_H264_INVALID));
- obj_surface = SURFACE(va_pic->picture_id);
- assert(obj_surface && obj_surface->bo && obj_surface->private_data);
+ obj_surface = decode_state->render_object;
+ assert(obj_surface->bo && obj_surface->private_data);
gen6_avc_surface = obj_surface->private_data;
OUT_BCS_RELOC(batch, gen6_avc_surface->dmv_top,
@@ -901,7 +898,6 @@ gen6_mfd_avc_decode_init(VADriverContextP ctx,
{
VAPictureParameterBufferH264 *pic_param;
VASliceParameterBufferH264 *slice_param;
- VAPictureH264 *va_pic;
struct i965_driver_data *i965 = i965_driver_data(ctx);
struct object_surface *obj_surface;
dri_bo *bo;
@@ -935,10 +931,7 @@ gen6_mfd_avc_decode_init(VADriverContextP ctx,
width_in_mbs = ((pic_param->picture_width_in_mbs_minus1 + 1) & 0xff);
/* Current decoded picture */
- va_pic = &pic_param->CurrPic;
- assert(!(va_pic->flags & VA_PICTURE_H264_INVALID));
- obj_surface = SURFACE(va_pic->picture_id);
- assert(obj_surface);
+ obj_surface = decode_state->render_object;
obj_surface->flags &= ~SURFACE_REF_DIS_MASK;
obj_surface->flags |= (pic_param->pic_fields.bits.reference_pic_flag ? SURFACE_REFERENCED : 0);
i965_check_alloc_surface_bo(ctx, obj_surface, 1, VA_FOURCC('N','V','1','2'), SUBSAMPLE_YUV420);
@@ -1052,7 +1045,7 @@ gen6_mfd_avc_decode_picture(VADriverContextP ctx,
else
next_slice_param = next_slice_group_param;
- gen6_mfd_avc_directmode_state(ctx, pic_param, slice_param, gen6_mfd_context);
+ gen6_mfd_avc_directmode_state(ctx, decode_state, pic_param, slice_param, gen6_mfd_context);
gen6_mfd_avc_slice_state(ctx, pic_param, slice_param, next_slice_param, gen6_mfd_context);
gen6_mfd_avc_ref_idx_state(ctx, pic_param, slice_param, gen6_mfd_context);
gen6_mfd_avc_weightoffset_state(ctx, pic_param, slice_param, gen6_mfd_context);
@@ -1089,8 +1082,7 @@ gen6_mfd_mpeg2_decode_init(VADriverContextP ctx,
);
/* Current decoded picture */
- obj_surface = SURFACE(decode_state->current_render_target);
- assert(obj_surface);
+ obj_surface = decode_state->render_object;
i965_check_alloc_surface_bo(ctx, obj_surface, 1, VA_FOURCC('N','V','1','2'), SUBSAMPLE_YUV420);
dri_bo_unreference(gen6_mfd_context->pre_deblocking_output.bo);
@@ -1428,8 +1420,7 @@ gen6_mfd_vc1_decode_init(VADriverContextP ctx,
gen6_mfd_context->reference_surface[i].surface_id = gen6_mfd_context->reference_surface[i % 2].surface_id;
/* Current decoded picture */
- obj_surface = SURFACE(decode_state->current_render_target);
- assert(obj_surface);
+ obj_surface = decode_state->render_object;
i965_check_alloc_surface_bo(ctx, obj_surface, 1, VA_FOURCC('N','V','1','2'), SUBSAMPLE_YUV420);
gen6_mfd_init_vc1_surface(ctx, pic_param, obj_surface);
@@ -1833,7 +1824,7 @@ gen6_mfd_vc1_directmode_state(VADriverContextP ctx,
assert(decode_state->pic_param && decode_state->pic_param->buffer);
pic_param = (VAPictureParameterBufferVC1 *)decode_state->pic_param->buffer;
- obj_surface = SURFACE(decode_state->current_render_target);
+ obj_surface = decode_state->render_object;
if (obj_surface && obj_surface->private_data) {
dmv_write_buffer = ((struct gen6_vc1_surface *)(obj_surface->private_data))->dmv;
@@ -1987,9 +1978,15 @@ gen6_mfd_decode_picture(VADriverContextP ctx,
{
struct gen6_mfd_context *gen6_mfd_context = (struct gen6_mfd_context *)hw_context;
struct decode_state *decode_state = &codec_state->decode;
+ VAStatus vaStatus;
assert(gen6_mfd_context);
+ vaStatus = intel_decoder_sanity_check_input(ctx, profile, decode_state);
+
+ if (vaStatus != VA_STATUS_SUCCESS)
+ goto out;
+
switch (profile) {
case VAProfileMPEG2Simple:
case VAProfileMPEG2Main:
@@ -2013,7 +2010,10 @@ gen6_mfd_decode_picture(VADriverContextP ctx,
break;
}
- return VA_STATUS_SUCCESS;
+ vaStatus = VA_STATUS_SUCCESS;
+
+out:
+ return vaStatus;
}
static void