diff options
author | Xiang, Haihao <haihao.xiang@intel.com> | 2010-07-01 13:01:31 +0800 |
---|---|---|
committer | Xiang, Haihao <haihao.xiang@intel.com> | 2010-07-07 14:53:36 +0800 |
commit | 2e719ae5ca1ce3f271f46fb711d42a796efa2d29 (patch) | |
tree | da7463499c56dde14f4ec6e0eb0500f9c6274f38 | |
parent | 74b303f584c8c2612d6f6c6dc1f054295f7e3beb (diff) | |
download | libva-2e719ae5ca1ce3f271f46fb711d42a796efa2d29.tar.gz |
i965_drv_video: [H.264] fix different slice type in a same picture issue.
-rw-r--r-- | i965_drv_video/i965_avc_bsd.c | 7 | ||||
-rw-r--r-- | i965_drv_video/i965_media_h264.c | 13 | ||||
-rw-r--r-- | i965_drv_video/i965_media_h264.h | 1 |
3 files changed, 10 insertions, 11 deletions
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; |