diff options
author | Xiang, Haihao <haihao.xiang@intel.com> | 2013-03-12 15:12:07 +0800 |
---|---|---|
committer | Xiang, Haihao <haihao.xiang@intel.com> | 2013-03-15 15:45:28 +0800 |
commit | 4f21aad1165f3d0a2e5978e0524db735d19944b3 (patch) | |
tree | 11dd569ec215db14ead396c4b551ba0d507e178f /src/gen6_mfd.c | |
parent | 54384c9585394db538b73eaf4227a59c7a452157 (diff) | |
download | libva-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-x | src/gen6_mfd.c | 38 |
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 |