diff options
author | Zhong Li <zhong.li@intel.com> | 2014-08-27 01:04:48 -0600 |
---|---|---|
committer | Zhao, Yakui <yakui.zhao@intel.com> | 2014-09-05 10:43:55 +0800 |
commit | 242fb4fcb8aa7300ee47400a6c2784610e5d4a6a (patch) | |
tree | 4a3de71719012986a4fa89e8572f99cc94864c13 | |
parent | 865f288d6821dfea5a9dc2a0525eba69ef786b23 (diff) | |
download | libva-intel-driver-242fb4fcb8aa7300ee47400a6c2784610e5d4a6a.tar.gz libva-intel-driver-242fb4fcb8aa7300ee47400a6c2784610e5d4a6a.tar.bz2 libva-intel-driver-242fb4fcb8aa7300ee47400a6c2784610e5d4a6a.zip |
Move gen6 phantom slice function as common
Following haihao's suggestion, make gen6 phantom slice funcion can be
re-used by SNB+.
v1->v2: Remove an unnessary comment.
Signed-off-by: Zhong Li <zhong.li@intel.com>
Reviewed-by: Xiang Haihao <haihao.xiang@intel.com>
Gwenole Beauchesne <gwenole.beauchesne@intel.com>
(cherry picked from commit 5e30cc3093407ca2b4dbefa1da8a1262ff8ae7e9)
-rwxr-xr-x | src/gen6_mfd.c | 81 | ||||
-rw-r--r-- | src/i965_decoder_utils.c | 75 | ||||
-rw-r--r-- | src/i965_decoder_utils.h | 7 |
3 files changed, 84 insertions, 79 deletions
diff --git a/src/gen6_mfd.c b/src/gen6_mfd.c index 8128a80..b6d19e8 100755 --- a/src/gen6_mfd.c +++ b/src/gen6_mfd.c @@ -596,56 +596,6 @@ gen6_mfd_avc_slice_state(VADriverContextP ctx, ADVANCE_BCS_BATCH(batch); } -static void -gen6_mfd_avc_phantom_slice_state(VADriverContextP ctx, - VAPictureParameterBufferH264 *pic_param, - VASliceParameterBufferH264 *next_slice_param, - struct gen6_mfd_context *gen6_mfd_context) -{ - struct intel_batchbuffer *batch = gen6_mfd_context->base.batch; - int width_in_mbs = pic_param->picture_width_in_mbs_minus1 + 1; - int height_in_mbs = pic_param->picture_height_in_mbs_minus1 + 1; /* frame height */ - int slice_hor_pos, slice_ver_pos, slice_start_mb_num, next_slice_hor_pos, next_slice_ver_pos; - int mbaff_picture = (!pic_param->pic_fields.bits.field_pic_flag && - pic_param->seq_fields.bits.mb_adaptive_frame_field_flag); - - if (next_slice_param) { - int first_mb_in_next_slice; - - slice_hor_pos = 0; - slice_ver_pos = 0; - slice_start_mb_num = 0; - first_mb_in_next_slice = next_slice_param->first_mb_in_slice << mbaff_picture; - next_slice_hor_pos = first_mb_in_next_slice % width_in_mbs; - next_slice_ver_pos = first_mb_in_next_slice / width_in_mbs; - } else { - slice_hor_pos = 0; - slice_ver_pos = height_in_mbs; - slice_start_mb_num = width_in_mbs * height_in_mbs / (1 + !!pic_param->pic_fields.bits.field_pic_flag); - next_slice_hor_pos = 0; - next_slice_ver_pos = 0; - } - - BEGIN_BCS_BATCH(batch, 11); /* FIXME: is it 10??? */ - OUT_BCS_BATCH(batch, MFX_AVC_SLICE_STATE | (11 - 2)); - OUT_BCS_BATCH(batch, 0); - OUT_BCS_BATCH(batch, 0); - OUT_BCS_BATCH(batch, 0); - OUT_BCS_BATCH(batch, - slice_ver_pos << 24 | - slice_hor_pos << 16 | - slice_start_mb_num << 0); - OUT_BCS_BATCH(batch, - next_slice_ver_pos << 16 | - next_slice_hor_pos << 0); - OUT_BCS_BATCH(batch, 0); - OUT_BCS_BATCH(batch, 0); - OUT_BCS_BATCH(batch, 0); - OUT_BCS_BATCH(batch, 0); - OUT_BCS_BATCH(batch, 0); - ADVANCE_BCS_BATCH(batch); -} - static inline void gen6_mfd_avc_ref_idx_state(VADriverContextP ctx, VAPictureParameterBufferH264 *pic_param, @@ -747,39 +697,12 @@ gen6_mfd_avc_bsd_object(VADriverContextP ctx, } static void -gen6_mfd_avc_phantom_slice_bsd_object(VADriverContextP ctx, - VAPictureParameterBufferH264 *pic_param, - struct gen6_mfd_context *gen6_mfd_context) -{ - struct intel_batchbuffer *batch = gen6_mfd_context->base.batch; - - BEGIN_BCS_BATCH(batch, 6); - OUT_BCS_BATCH(batch, MFD_AVC_BSD_OBJECT | (6 - 2)); - OUT_BCS_BATCH(batch, 0); - OUT_BCS_BATCH(batch, 0); - OUT_BCS_BATCH(batch, 0); - OUT_BCS_BATCH(batch, 0); - OUT_BCS_BATCH(batch, 0); - ADVANCE_BCS_BATCH(batch); -} - -static void -gen6_mfd_avc_phantom_slice(VADriverContextP ctx, - VAPictureParameterBufferH264 *pic_param, - VASliceParameterBufferH264 *next_slice_param, - struct gen6_mfd_context *gen6_mfd_context) -{ - gen6_mfd_avc_phantom_slice_state(ctx, pic_param, next_slice_param, gen6_mfd_context); - gen6_mfd_avc_phantom_slice_bsd_object(ctx, pic_param, gen6_mfd_context); -} - -static void gen6_mfd_avc_phantom_slice_first(VADriverContextP ctx, VAPictureParameterBufferH264 *pic_param, VASliceParameterBufferH264 *next_slice_param, struct gen6_mfd_context *gen6_mfd_context) { - gen6_mfd_avc_phantom_slice(ctx, pic_param, next_slice_param, gen6_mfd_context); + gen6_mfd_avc_phantom_slice(ctx, pic_param, next_slice_param, gen6_mfd_context->base.batch); } static void @@ -787,7 +710,7 @@ gen6_mfd_avc_phantom_slice_last(VADriverContextP ctx, VAPictureParameterBufferH264 *pic_param, struct gen6_mfd_context *gen6_mfd_context) { - gen6_mfd_avc_phantom_slice(ctx, pic_param, NULL, gen6_mfd_context); + gen6_mfd_avc_phantom_slice(ctx, pic_param, NULL, gen6_mfd_context->base.batch); } static void diff --git a/src/i965_decoder_utils.c b/src/i965_decoder_utils.c index 7ea39dd..8b546db 100644 --- a/src/i965_decoder_utils.c +++ b/src/i965_decoder_utils.c @@ -487,6 +487,81 @@ gen6_send_avc_ref_idx_state( ); } +static void +gen6_mfd_avc_phantom_slice_state(VADriverContextP ctx, + VAPictureParameterBufferH264 *pic_param, + VASliceParameterBufferH264 *next_slice_param, + struct intel_batchbuffer *batch) +{ + int width_in_mbs = pic_param->picture_width_in_mbs_minus1 + 1; + int height_in_mbs = pic_param->picture_height_in_mbs_minus1 + 1; /* frame height */ + int slice_hor_pos, slice_ver_pos, slice_start_mb_num, next_slice_hor_pos, next_slice_ver_pos; + int mbaff_picture = (!pic_param->pic_fields.bits.field_pic_flag && + pic_param->seq_fields.bits.mb_adaptive_frame_field_flag); + + if (next_slice_param) { + int first_mb_in_next_slice; + + slice_hor_pos = 0; + slice_ver_pos = 0; + slice_start_mb_num = 0; + first_mb_in_next_slice = next_slice_param->first_mb_in_slice << mbaff_picture; + next_slice_hor_pos = first_mb_in_next_slice % width_in_mbs; + next_slice_ver_pos = first_mb_in_next_slice / width_in_mbs; + } else { + slice_hor_pos = 0; + slice_ver_pos = height_in_mbs; + slice_start_mb_num = width_in_mbs * height_in_mbs / (1 + !!pic_param->pic_fields.bits.field_pic_flag); + next_slice_hor_pos = 0; + next_slice_ver_pos = 0; + } + + BEGIN_BCS_BATCH(batch, 11); + OUT_BCS_BATCH(batch, MFX_AVC_SLICE_STATE | (11 - 2)); + OUT_BCS_BATCH(batch, 0); + OUT_BCS_BATCH(batch, 0); + OUT_BCS_BATCH(batch, 0); + OUT_BCS_BATCH(batch, + slice_ver_pos << 24 | + slice_hor_pos << 16 | + slice_start_mb_num << 0); + OUT_BCS_BATCH(batch, + next_slice_ver_pos << 16 | + next_slice_hor_pos << 0); + OUT_BCS_BATCH(batch, 0); + OUT_BCS_BATCH(batch, 0); + OUT_BCS_BATCH(batch, 0); + OUT_BCS_BATCH(batch, 0); + OUT_BCS_BATCH(batch, 0); + ADVANCE_BCS_BATCH(batch); +} + +static void +gen6_mfd_avc_phantom_slice_bsd_object(VADriverContextP ctx, + VAPictureParameterBufferH264 *pic_param, + struct intel_batchbuffer *batch) +{ + + BEGIN_BCS_BATCH(batch, 6); + OUT_BCS_BATCH(batch, MFD_AVC_BSD_OBJECT | (6 - 2)); + OUT_BCS_BATCH(batch, 0); + OUT_BCS_BATCH(batch, 0); + OUT_BCS_BATCH(batch, 0); + OUT_BCS_BATCH(batch, 0); + OUT_BCS_BATCH(batch, 0); + ADVANCE_BCS_BATCH(batch); +} + +void +gen6_mfd_avc_phantom_slice(VADriverContextP ctx, + VAPictureParameterBufferH264 *pic_param, + VASliceParameterBufferH264 *next_slice_param, + struct intel_batchbuffer *batch) +{ + gen6_mfd_avc_phantom_slice_state(ctx, pic_param, next_slice_param, batch); + gen6_mfd_avc_phantom_slice_bsd_object(ctx, pic_param, batch); +} + /* Comparison function for sorting out the array of free frame store entries */ static int compare_avc_ref_store_func(const void *p1, const void *p2) diff --git a/src/i965_decoder_utils.h b/src/i965_decoder_utils.h index 3d39b21..3e6acdd 100644 --- a/src/i965_decoder_utils.h +++ b/src/i965_decoder_utils.h @@ -89,6 +89,13 @@ gen6_send_avc_ref_idx_state( const GenFrameStore frame_store[MAX_GEN_REFERENCE_FRAMES] ); +void +gen6_mfd_avc_phantom_slice(VADriverContextP ctx, + VAPictureParameterBufferH264 *pic_param, + VASliceParameterBufferH264 *next_slice_param, + struct intel_batchbuffer *batch +); + VAStatus intel_decoder_sanity_check_input(VADriverContextP ctx, VAProfile profile, |