}
static void gen6_mfc_avc_slice_state(VADriverContextP ctx,
- int slice_type,
+ VAEncSliceParameterBufferH264 *slice_param,
struct encode_state *encode_state,
struct intel_encoder_context *encoder_context,
int rate_control_enable,
- int qp,
- int slice_index)
+ int qp)
{
struct intel_batchbuffer *batch = encoder_context->base.batch;
struct gen6_mfc_context *mfc_context = encoder_context->mfc_context;
- VAEncSliceParameterBufferH264 *pSliceParameter = (VAEncSliceParameterBufferH264 *)encode_state->slice_params_ext[0]->buffer; /* TODO: multi slices support */
int width_in_mbs = (mfc_context->surface_state.width + 15) / 16;
int height_in_mbs = (mfc_context->surface_state.height + 15) / 16;
- int beginmb = pSliceParameter->macroblock_address;
- int endmb = beginmb + pSliceParameter->num_macroblocks;
+ int beginmb = slice_param->macroblock_address;
+ int endmb = beginmb + slice_param->num_macroblocks;
int beginx = beginmb % width_in_mbs;
int beginy = beginmb / width_in_mbs;
int nextx = endmb % width_in_mbs;
int nexty = endmb / width_in_mbs;
- int last_slice = (pSliceParameter->macroblock_address + pSliceParameter->num_macroblocks) == (width_in_mbs * height_in_mbs);
+ int last_slice = (endmb == (width_in_mbs * height_in_mbs));
int bit_rate_control_target;
- if ( slice_type == SLICE_TYPE_I )
+ int slice_type = slice_param->slice_type;
+
+ if (slice_type == SLICE_TYPE_I)
bit_rate_control_target = 0;
else
bit_rate_control_target = 1;
}
OUT_BCS_BATCH(batch,
- (pSliceParameter->direct_spatial_mv_pred_flag<<29) | /*Direct Prediction Type*/
+ (slice_param->direct_spatial_mv_pred_flag<<29) | /*Direct Prediction Type*/
(0<<24) | /*Enable deblocking operation*/
(qp<<16) | /*Slice Quantization Parameter*/
0x0202 );
OUT_BCS_BATCH(batch, (beginy << 24) | /*First MB X&Y , the begin postion of current slice*/
(beginx << 16) |
- pSliceParameter->macroblock_address );
+ slice_param->macroblock_address );
OUT_BCS_BATCH(batch, (nexty << 16) | nextx); /*Next slice first MB X&Y*/
OUT_BCS_BATCH(batch,
(rate_control_enable<<31) | /*in CBR mode RateControlCounterEnable = enable*/
int slice_header_length_in_bits = 0;
unsigned int tail_data[] = { 0x0, 0x0 };
- gen6_mfc_avc_slice_state(ctx, pSliceParameter->slice_type,
+ gen6_mfc_avc_slice_state(ctx, pSliceParameter,
encode_state, encoder_context,
- (rate_control_mode == VA_RC_CBR), qp, slice_index);
+ (rate_control_mode == VA_RC_CBR), qp);
if ( slice_index == 0)
gen6_mfc_avc_pipeline_header_programing(ctx, encode_state, encoder_context);