From: Xiang, Haihao Date: Thu, 1 Jul 2010 05:01:31 +0000 (+0800) Subject: i965_drv_video: [H.264] fix different slice type in a same picture issue. X-Git-Tag: libva-1.0.4~28 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=2e719ae5ca1ce3f271f46fb711d42a796efa2d29;p=platform%2Fupstream%2Flibva.git i965_drv_video: [H.264] fix different slice type in a same picture issue. --- diff --git a/i965_drv_video/i965_avc_bsd.c b/i965_drv_video/i965_avc_bsd.c index 6f75130..4bad64f 100644 --- a/i965_drv_video/i965_avc_bsd.c +++ b/i965_drv_video/i965_avc_bsd.c @@ -993,6 +993,8 @@ i965_avc_bsd_pipeline(VADriverContextP ctx, struct decode_state *decode_state) i965_avc_bsd_frame_store_index(ctx, pic_param); i965_h264_context->enable_avc_ildb = 0; + i965_h264_context->picture.i_flag = 1; + for (j = 0; j < decode_state->num_slice_params && i965_h264_context->enable_avc_ildb == 0; j++) { assert(decode_state->slice_params && decode_state->slice_params[j]->buffer); slice_param = (VASliceParameterBufferH264 *)decode_state->slice_params[j]->buffer; @@ -1035,6 +1037,11 @@ i965_avc_bsd_pipeline(VADriverContextP ctx, struct decode_state *decode_state) (slice_param->slice_type == SLICE_TYPE_SP) || (slice_param->slice_type == SLICE_TYPE_B)); + if (i965_h264_context->picture.i_flag && + (slice_param->slice_type != SLICE_TYPE_I || + slice_param->slice_type != SLICE_TYPE_SI)) + i965_h264_context->picture.i_flag = 0; + i965_avc_bsd_slice_state(ctx, pic_param, slice_param); i965_avc_bsd_buf_base_state(ctx, pic_param, slice_param); i965_avc_bsd_object(ctx, decode_state, pic_param, slice_param); diff --git a/i965_drv_video/i965_media_h264.c b/i965_drv_video/i965_media_h264.c index 95efa3f..add774f 100644 --- a/i965_drv_video/i965_media_h264.c +++ b/i965_drv_video/i965_media_h264.c @@ -523,7 +523,6 @@ i965_media_h264_vfe_state_extension(VADriverContextP ctx, struct i965_h264_context *i965_h264_context; struct i965_vfe_state_ex *vfe_state_ex; VAPictureParameterBufferH264 *pic_param; - VASliceParameterBufferH264 *slice_param; int mbaff_frame_flag; assert(media_state->private_context); @@ -531,10 +530,6 @@ i965_media_h264_vfe_state_extension(VADriverContextP ctx, assert(decode_state->pic_param && decode_state->pic_param->buffer); pic_param = (VAPictureParameterBufferH264 *)decode_state->pic_param->buffer; - - assert(decode_state->slice_params[0] && decode_state->slice_params[0]->buffer); - slice_param = (VASliceParameterBufferH264 *)decode_state->slice_params[0]->buffer; - mbaff_frame_flag = (pic_param->seq_fields.bits.mb_adaptive_frame_field_flag && !pic_param->pic_fields.bits.field_pic_flag); @@ -556,16 +551,12 @@ i965_media_h264_vfe_state_extension(VADriverContextP ctx, vfe_state_ex->vfex1.avc.residual_data_fix_offset_flag = !!RESIDUAL_DATA_OFFSET; vfe_state_ex->vfex1.avc.residual_data_offset = RESIDUAL_DATA_OFFSET; - if (slice_param->slice_type == SLICE_TYPE_I || - slice_param->slice_type == SLICE_TYPE_SI) + if (i965_h264_context->picture.i_flag) { vfe_state_ex->vfex1.avc.sub_field_present_flag = PRESENT_NOMV; /* NoMV */ - else - vfe_state_ex->vfex1.avc.sub_field_present_flag = PRESENT_MV_WO; /* Both MV and W/O */ - - if (vfe_state_ex->vfex1.avc.sub_field_present_flag == 0) { vfe_state_ex->vfex1.avc.weight_grf_offset = 0; vfe_state_ex->vfex1.avc.residual_grf_offset = 0; } else { + vfe_state_ex->vfex1.avc.sub_field_present_flag = PRESENT_MV_WO; /* Both MV and W/O */ vfe_state_ex->vfex1.avc.weight_grf_offset = 4; vfe_state_ex->vfex1.avc.residual_grf_offset = 6; } diff --git a/i965_drv_video/i965_media_h264.h b/i965_drv_video/i965_media_h264.h index 5a10e73..d1b6214 100644 --- a/i965_drv_video/i965_media_h264.h +++ b/i965_drv_video/i965_media_h264.h @@ -37,6 +37,7 @@ struct i965_h264_context unsigned int width_in_mbs; unsigned int height_in_mbs; int mbaff_frame_flag; + int i_flag; } picture; int enable_avc_ildb;