OSDN Git Service

Use arrays to store BRC related parameters per temporal layer
[android-x86/hardware-intel-common-vaapi.git] / src / gen8_mfc.c
index 3e04754..ef553fb 100644 (file)
@@ -129,6 +129,23 @@ static struct i965_kernel gen9_mfc_kernels[] = {
     },
 };
 
+static const uint32_t qm_flat[16] = {
+    0x10101010, 0x10101010, 0x10101010, 0x10101010,
+    0x10101010, 0x10101010, 0x10101010, 0x10101010,
+    0x10101010, 0x10101010, 0x10101010, 0x10101010,
+    0x10101010, 0x10101010, 0x10101010, 0x10101010
+};
+
+static const uint32_t fqm_flat[32] = {
+    0x10001000, 0x10001000, 0x10001000, 0x10001000,
+    0x10001000, 0x10001000, 0x10001000, 0x10001000,
+    0x10001000, 0x10001000, 0x10001000, 0x10001000,
+    0x10001000, 0x10001000, 0x10001000, 0x10001000,
+    0x10001000, 0x10001000, 0x10001000, 0x10001000,
+    0x10001000, 0x10001000, 0x10001000, 0x10001000,
+    0x10001000, 0x10001000, 0x10001000, 0x10001000,
+    0x10001000, 0x10001000, 0x10001000, 0x10001000
+};
 
 #define                INTER_MODE_MASK         0x03
 #define                INTER_8X8               0x03
@@ -361,7 +378,7 @@ gen8_mfc_avc_img_state(VADriverContextP ctx, struct encode_state *encode_state,
 static void
 gen8_mfc_qm_state(VADriverContextP ctx,
                   int qm_type,
-                  unsigned int *qm,
+                  const uint32_t *qm,
                   int qm_length,
                   struct intel_encoder_context *encoder_context)
 {
@@ -380,25 +397,42 @@ gen8_mfc_qm_state(VADriverContextP ctx,
 }
 
 static void
-gen8_mfc_avc_qm_state(VADriverContextP ctx, struct intel_encoder_context *encoder_context)
+gen8_mfc_avc_qm_state(VADriverContextP ctx,
+                      struct encode_state *encode_state,
+                      struct intel_encoder_context *encoder_context)
 {
-    unsigned int qm[16] = {
-        0x10101010, 0x10101010, 0x10101010, 0x10101010,
-        0x10101010, 0x10101010, 0x10101010, 0x10101010,
-        0x10101010, 0x10101010, 0x10101010, 0x10101010,
-        0x10101010, 0x10101010, 0x10101010, 0x10101010
-    };
+    const unsigned int *qm_4x4_intra;
+    const unsigned int *qm_4x4_inter;
+    const unsigned int *qm_8x8_intra;
+    const unsigned int *qm_8x8_inter;
+    VAEncSequenceParameterBufferH264 *pSeqParameter =
+        (VAEncSequenceParameterBufferH264 *)encode_state->seq_param_ext->buffer;
+    VAEncPictureParameterBufferH264 *pPicParameter =
+        (VAEncPictureParameterBufferH264 *)encode_state->pic_param_ext->buffer;
+
+    if (!pSeqParameter->seq_fields.bits.seq_scaling_matrix_present_flag
+        && !pPicParameter->pic_fields.bits.pic_scaling_matrix_present_flag) {
+        qm_4x4_intra = qm_4x4_inter = qm_8x8_intra = qm_8x8_inter = qm_flat;
+    } else {
+        VAIQMatrixBufferH264 *qm;
+        assert(encode_state->q_matrix && encode_state->q_matrix->buffer);
+        qm = (VAIQMatrixBufferH264 *)encode_state->q_matrix->buffer;
+        qm_4x4_intra = (unsigned int *)qm->ScalingList4x4[0];
+        qm_4x4_inter = (unsigned int *)qm->ScalingList4x4[3];
+        qm_8x8_intra = (unsigned int *)qm->ScalingList8x8[0];
+        qm_8x8_inter = (unsigned int *)qm->ScalingList8x8[1];
+    }
 
-    gen8_mfc_qm_state(ctx, MFX_QM_AVC_4X4_INTRA_MATRIX, qm, 12, encoder_context);
-    gen8_mfc_qm_state(ctx, MFX_QM_AVC_4X4_INTER_MATRIX, qm, 12, encoder_context);
-    gen8_mfc_qm_state(ctx, MFX_QM_AVC_8x8_INTRA_MATRIX, qm, 16, encoder_context);
-    gen8_mfc_qm_state(ctx, MFX_QM_AVC_8x8_INTER_MATRIX, qm, 16, encoder_context);
+    gen8_mfc_qm_state(ctx, MFX_QM_AVC_4X4_INTRA_MATRIX, qm_4x4_intra, 12, encoder_context);
+    gen8_mfc_qm_state(ctx, MFX_QM_AVC_4X4_INTER_MATRIX, qm_4x4_inter, 12, encoder_context);
+    gen8_mfc_qm_state(ctx, MFX_QM_AVC_8x8_INTRA_MATRIX, qm_8x8_intra, 16, encoder_context);
+    gen8_mfc_qm_state(ctx, MFX_QM_AVC_8x8_INTER_MATRIX, qm_8x8_inter, 16, encoder_context);
 }
 
 static void
 gen8_mfc_fqm_state(VADriverContextP ctx,
                    int fqm_type,
-                   unsigned int *fqm,
+                   const uint32_t *fqm,
                    int fqm_length,
                    struct intel_encoder_context *encoder_context)
 {
@@ -417,23 +451,51 @@ gen8_mfc_fqm_state(VADriverContextP ctx,
 }
 
 static void
-gen8_mfc_avc_fqm_state(VADriverContextP ctx, struct intel_encoder_context *encoder_context)
+gen8_mfc_avc_fill_fqm(uint8_t *qm, uint16_t *fqm, int len)
 {
-    unsigned int qm[32] = {
-        0x10001000, 0x10001000, 0x10001000, 0x10001000,
-        0x10001000, 0x10001000, 0x10001000, 0x10001000,
-        0x10001000, 0x10001000, 0x10001000, 0x10001000,
-        0x10001000, 0x10001000, 0x10001000, 0x10001000,
-        0x10001000, 0x10001000, 0x10001000, 0x10001000,
-        0x10001000, 0x10001000, 0x10001000, 0x10001000,
-        0x10001000, 0x10001000, 0x10001000, 0x10001000,
-        0x10001000, 0x10001000, 0x10001000, 0x10001000
-    };
+    int i, j;
+    for (i = 0; i < len; i++)
+       for (j = 0; j < len; j++)
+           fqm[i * len + j] = (1 << 16) / qm[j * len + i];
+}
+
+static void
+gen8_mfc_avc_fqm_state(VADriverContextP ctx,
+                       struct encode_state *encode_state,
+                       struct intel_encoder_context *encoder_context)
+{
+    VAEncSequenceParameterBufferH264 *pSeqParameter =
+        (VAEncSequenceParameterBufferH264 *)encode_state->seq_param_ext->buffer;
+    VAEncPictureParameterBufferH264 *pPicParameter =
+        (VAEncPictureParameterBufferH264 *)encode_state->pic_param_ext->buffer;
+
+    if (!pSeqParameter->seq_fields.bits.seq_scaling_matrix_present_flag
+        && !pPicParameter->pic_fields.bits.pic_scaling_matrix_present_flag) {
+        gen8_mfc_fqm_state(ctx, MFX_QM_AVC_4X4_INTRA_MATRIX, fqm_flat, 24, encoder_context);
+        gen8_mfc_fqm_state(ctx, MFX_QM_AVC_4X4_INTER_MATRIX, fqm_flat, 24, encoder_context);
+        gen8_mfc_fqm_state(ctx, MFX_QM_AVC_8x8_INTRA_MATRIX, fqm_flat, 32, encoder_context);
+        gen8_mfc_fqm_state(ctx, MFX_QM_AVC_8x8_INTER_MATRIX, fqm_flat, 32, encoder_context);
+    } else {
+        int i;
+        uint32_t fqm[32];
+        VAIQMatrixBufferH264 *qm;
+        assert(encode_state->q_matrix && encode_state->q_matrix->buffer);
+        qm = (VAIQMatrixBufferH264 *)encode_state->q_matrix->buffer;
+
+        for (i = 0; i < 3; i++)
+            gen8_mfc_avc_fill_fqm(qm->ScalingList4x4[i], (uint16_t *)fqm + 16 * i, 4);
+        gen8_mfc_fqm_state(ctx, MFX_QM_AVC_4X4_INTRA_MATRIX, fqm, 24, encoder_context);
+
+        for (i = 3; i < 6; i++)
+            gen8_mfc_avc_fill_fqm(qm->ScalingList4x4[i], (uint16_t *)fqm + 16 * (i - 3), 4);
+        gen8_mfc_fqm_state(ctx, MFX_QM_AVC_4X4_INTER_MATRIX, fqm, 24, encoder_context);
 
-    gen8_mfc_fqm_state(ctx, MFX_QM_AVC_4X4_INTRA_MATRIX, qm, 24, encoder_context);
-    gen8_mfc_fqm_state(ctx, MFX_QM_AVC_4X4_INTER_MATRIX, qm, 24, encoder_context);
-    gen8_mfc_fqm_state(ctx, MFX_QM_AVC_8x8_INTRA_MATRIX, qm, 32, encoder_context);
-    gen8_mfc_fqm_state(ctx, MFX_QM_AVC_8x8_INTER_MATRIX, qm, 32, encoder_context);
+        gen8_mfc_avc_fill_fqm(qm->ScalingList8x8[0], (uint16_t *)fqm, 8);
+        gen8_mfc_fqm_state(ctx, MFX_QM_AVC_8x8_INTRA_MATRIX, fqm, 32, encoder_context);
+
+        gen8_mfc_avc_fill_fqm(qm->ScalingList8x8[1], (uint16_t *)fqm, 8);
+        gen8_mfc_fqm_state(ctx, MFX_QM_AVC_8x8_INTER_MATRIX, fqm, 32, encoder_context);
+    }
 }
 
 static void
@@ -768,8 +830,8 @@ static void gen8_mfc_avc_pipeline_picture_programing( VADriverContextP ctx,
     gen8_mfc_pipe_buf_addr_state(ctx, encoder_context);
     gen8_mfc_bsp_buf_base_addr_state(ctx, encoder_context);
     mfc_context->avc_img_state(ctx, encode_state, encoder_context);
-    mfc_context->avc_qm_state(ctx, encoder_context);
-    mfc_context->avc_fqm_state(ctx, encoder_context);
+    mfc_context->avc_qm_state(ctx, encode_state, encoder_context);
+    mfc_context->avc_fqm_state(ctx, encode_state, encoder_context);
     gen8_mfc_avc_directmode_state(ctx, encoder_context); 
     intel_mfc_avc_ref_idx_state(ctx, encode_state, encoder_context);
 }
@@ -1116,7 +1178,7 @@ gen8_mfc_avc_pipeline_slice_programing(VADriverContextP ctx,
 
     qp_slice = qp;
     if (rate_control_mode == VA_RC_CBR) {
-        qp = mfc_context->bit_rate_control_context[slice_type].QpPrimeY;
+        qp = mfc_context->brc.qp_prime_y[0][slice_type];
         if (encode_state->slice_header_index[slice_index] == 0) {
             pSliceParameter->slice_qp_delta = qp - pPicParameter->pic_init_qp;
             qp_slice = qp;
@@ -1473,7 +1535,7 @@ gen8_mfc_avc_batchbuffer_slice(VADriverContextP ctx,
 
     qp_slice = qp;
     if (rate_control_mode == VA_RC_CBR) {
-        qp = mfc_context->bit_rate_control_context[slice_type].QpPrimeY;
+        qp = mfc_context->brc.qp_prime_y[0][slice_type];
         if (encode_state->slice_header_index[slice_index] == 0) {
             pSliceParameter->slice_qp_delta = qp - pPicParameter->pic_init_qp;
             qp_slice = qp;
@@ -1669,7 +1731,7 @@ gen8_mfc_avc_encode_picture(VADriverContextP ctx,
         gen8_mfc_run(ctx, encode_state, encoder_context);
         if (rate_control_mode == VA_RC_CBR /*|| rate_control_mode == VA_RC_VBR*/) {
             gen8_mfc_stop(ctx, encode_state, encoder_context, &current_frame_bits_size);
-            sts = intel_mfc_brc_postpack(encode_state, mfc_context, current_frame_bits_size);
+            sts = intel_mfc_brc_postpack(encode_state, encoder_context, current_frame_bits_size);
             if (sts == BRC_NO_HRD_VIOLATION) {
                 intel_mfc_hrd_context_update(encode_state, mfc_context);
                 break;
@@ -3159,7 +3221,7 @@ gen8_mfc_jpeg_pipeline_picture_programing(VADriverContextP ctx,
 
     //I dont think I need this for loop. Just to be consistent with other encoding logic...
     for(i = 0; i < encode_state->num_slice_params_ext; i++) {
-        assert(encode_state->slice_params && encode_state->slice_params_ext[i]->buffer);
+        assert(encode_state->slice_params_ext && encode_state->slice_params_ext[i]->buffer);
         slice_param = (VAEncSliceParameterBufferJPEG *)encode_state->slice_params_ext[i]->buffer;
         
         for(j = 0; j < encode_state->slice_params_ext[i]->num_elements; j++) {
@@ -3257,39 +3319,14 @@ static int gen8_mfc_vp8_qindex_estimate(struct encode_state *encode_state,
     return target_qindex;
 }
 
-static void
-gen8_mfc_vp8_bit_rate_control_context_init(struct encode_state *encode_state,
-                                        struct gen6_mfc_context *mfc_context)
-{
-    VAEncSequenceParameterBufferVP8 *seq_param = (VAEncSequenceParameterBufferVP8 *)encode_state->seq_param_ext->buffer;
-    VAEncMiscParameterBuffer *misc_param_frame_rate_buffer = (VAEncMiscParameterBuffer*)encode_state->misc_param[VAEncMiscParameterTypeFrameRate]->buffer;
-    VAEncMiscParameterFrameRate* param_frame_rate = (VAEncMiscParameterFrameRate*)misc_param_frame_rate_buffer->data;
-    int width_in_mbs = ALIGN(seq_param->frame_width, 16) / 16;
-    int height_in_mbs = ALIGN(seq_param->frame_height, 16) / 16;
-    float fps = param_frame_rate->framerate;
-    int inter_mb_size = seq_param->bits_per_second * 1.0 / (fps+4.0) / width_in_mbs / height_in_mbs;
-    int intra_mb_size = inter_mb_size * 5.0;
-
-    mfc_context->bit_rate_control_context[SLICE_TYPE_I].target_mb_size = intra_mb_size;
-    mfc_context->bit_rate_control_context[SLICE_TYPE_I].target_frame_size = intra_mb_size * width_in_mbs * height_in_mbs;
-    mfc_context->bit_rate_control_context[SLICE_TYPE_P].target_mb_size = inter_mb_size;
-    mfc_context->bit_rate_control_context[SLICE_TYPE_P].target_frame_size = inter_mb_size * width_in_mbs * height_in_mbs;
-
-    mfc_context->bit_rate_control_context[SLICE_TYPE_I].TargetSizeInWord = (intra_mb_size + 16)/ 16;
-    mfc_context->bit_rate_control_context[SLICE_TYPE_P].TargetSizeInWord = (inter_mb_size + 16)/ 16;
-
-    mfc_context->bit_rate_control_context[SLICE_TYPE_I].MaxSizeInWord = mfc_context->bit_rate_control_context[SLICE_TYPE_I].TargetSizeInWord * 1.5;
-    mfc_context->bit_rate_control_context[SLICE_TYPE_P].MaxSizeInWord = mfc_context->bit_rate_control_context[SLICE_TYPE_P].TargetSizeInWord * 1.5;
-}
-
 static void gen8_mfc_vp8_brc_init(struct encode_state *encode_state,
                                struct intel_encoder_context* encoder_context)
 {
     struct gen6_mfc_context *mfc_context = encoder_context->mfc_context;
     VAEncSequenceParameterBufferVP8 *seq_param = (VAEncSequenceParameterBufferVP8 *)encode_state->seq_param_ext->buffer;
-    VAEncMiscParameterBuffer* misc_param_hrd = (VAEncMiscParameterBuffer*)encode_state->misc_param[VAEncMiscParameterTypeHRD]->buffer;
+    VAEncMiscParameterBuffer* misc_param_hrd = (VAEncMiscParameterBuffer*)encode_state->misc_param[VAEncMiscParameterTypeHRD][0]->buffer;
     VAEncMiscParameterHRD* param_hrd = (VAEncMiscParameterHRD*)misc_param_hrd->data;
-    VAEncMiscParameterBuffer* misc_param_frame_rate_buffer = (VAEncMiscParameterBuffer*)encode_state->misc_param[VAEncMiscParameterTypeFrameRate]->buffer;
+    VAEncMiscParameterBuffer* misc_param_frame_rate_buffer = (VAEncMiscParameterBuffer*)encode_state->misc_param[VAEncMiscParameterTypeFrameRate][0]->buffer;
     VAEncMiscParameterFrameRate* param_frame_rate = (VAEncMiscParameterFrameRate*)misc_param_frame_rate_buffer->data;
     double bitrate = seq_param->bits_per_second;
     unsigned int frame_rate = param_frame_rate->framerate;
@@ -3303,23 +3340,23 @@ static void gen8_mfc_vp8_brc_init(struct encode_state *encode_state,
 
     mfc_context->brc.mode = encoder_context->rate_control_mode;
 
-    mfc_context->brc.target_frame_size[SLICE_TYPE_I] = (int)((double)((bitrate * intra_period)/frame_rate) /
+    mfc_context->brc.target_frame_size[0][SLICE_TYPE_I] = (int)((double)((bitrate * intra_period)/frame_rate) /
                                                              (double)(inum + BRC_PWEIGHT * pnum ));
-    mfc_context->brc.target_frame_size[SLICE_TYPE_P] = BRC_PWEIGHT * mfc_context->brc.target_frame_size[SLICE_TYPE_I];
+    mfc_context->brc.target_frame_size[0][SLICE_TYPE_P] = BRC_PWEIGHT * mfc_context->brc.target_frame_size[0][SLICE_TYPE_I];
 
     mfc_context->brc.gop_nums[SLICE_TYPE_I] = inum;
     mfc_context->brc.gop_nums[SLICE_TYPE_P] = pnum;
 
-    mfc_context->brc.bits_per_frame = bitrate/frame_rate;
+    mfc_context->brc.bits_per_frame[0] = bitrate/frame_rate;
 
-    mfc_context->bit_rate_control_context[SLICE_TYPE_I].QpPrimeY = gen8_mfc_vp8_qindex_estimate(encode_state,
-                                                                   mfc_context,
-                                                                   mfc_context->brc.target_frame_size[SLICE_TYPE_I],
-                                                                   1);
-    mfc_context->bit_rate_control_context[SLICE_TYPE_P].QpPrimeY = gen8_mfc_vp8_qindex_estimate(encode_state,
-                                                                   mfc_context,
-                                                                   mfc_context->brc.target_frame_size[SLICE_TYPE_P],
-                                                                   0);
+    mfc_context->brc.qp_prime_y[0][SLICE_TYPE_I] = gen8_mfc_vp8_qindex_estimate(encode_state,
+                                                                                mfc_context,
+                                                                                mfc_context->brc.target_frame_size[0][SLICE_TYPE_I],
+                                                                                1);
+    mfc_context->brc.qp_prime_y[0][SLICE_TYPE_P] = gen8_mfc_vp8_qindex_estimate(encode_state,
+                                                                                mfc_context,
+                                                                                mfc_context->brc.target_frame_size[0][SLICE_TYPE_P],
+                                                                                0);
 
     mfc_context->hrd.buffer_size = (double)param_hrd->buffer_size;
     mfc_context->hrd.current_buffer_fullness =
@@ -3331,15 +3368,16 @@ static void gen8_mfc_vp8_brc_init(struct encode_state *encode_state,
 }
 
 static int gen8_mfc_vp8_brc_postpack(struct encode_state *encode_state,
-                           struct gen6_mfc_context *mfc_context,
+                           struct intel_encoder_context *encoder_context,
                            int frame_bits)
 {
+    struct gen6_mfc_context *mfc_context = encoder_context->mfc_context;
     gen6_brc_status sts = BRC_NO_HRD_VIOLATION;
     VAEncPictureParameterBufferVP8 *pic_param = (VAEncPictureParameterBufferVP8 *)encode_state->pic_param_ext->buffer;
     int is_key_frame = !pic_param->pic_flags.bits.frame_type;
     int slicetype = (is_key_frame ? SLICE_TYPE_I : SLICE_TYPE_P);
-    int qpi = mfc_context->bit_rate_control_context[SLICE_TYPE_I].QpPrimeY;
-    int qpp = mfc_context->bit_rate_control_context[SLICE_TYPE_P].QpPrimeY;
+    int qpi = mfc_context->brc.qp_prime_y[0][SLICE_TYPE_I];
+    int qpp = mfc_context->brc.qp_prime_y[0][SLICE_TYPE_P];
     int qp; // quantizer of previously encoded slice of current type
     int qpn; // predicted quantizer for next frame of current type in integer format
     double qpf; // predicted quantizer for next frame of current type in float format
@@ -3354,9 +3392,9 @@ static int gen8_mfc_vp8_brc_postpack(struct encode_state *encode_state,
     unsigned int max_qindex = pic_param->clamp_qindex_high;
     unsigned int min_qindex = pic_param->clamp_qindex_low;
 
-    qp = mfc_context->bit_rate_control_context[slicetype].QpPrimeY;
+    qp = mfc_context->brc.qp_prime_y[0][slicetype];
 
-    target_frame_size = mfc_context->brc.target_frame_size[slicetype];
+    target_frame_size = mfc_context->brc.target_frame_size[0][slicetype];
     if (mfc_context->hrd.buffer_capacity < 5)
         frame_size_alpha = 0;
     else
@@ -3391,7 +3429,7 @@ static int gen8_mfc_vp8_brc_postpack(struct encode_state *encode_state,
     BRC_CLIP(qpn, min_qindex, max_qindex);
 
     /* checking wthether HRD compliance is still met */
-    sts = intel_mfc_update_hrd(encode_state, mfc_context, frame_bits);
+    sts = intel_mfc_update_hrd(encode_state, encoder_context, frame_bits);
 
     /* calculating QP delta as some function*/
     x = mfc_context->hrd.target_buffer_fullness - mfc_context->hrd.current_buffer_fullness;
@@ -3417,13 +3455,13 @@ static int gen8_mfc_vp8_brc_postpack(struct encode_state *encode_state,
         /* correcting QPs of slices of other types */
         if (!is_key_frame) {
             if (abs(qpn - BRC_I_P_QP_DIFF - qpi) > 4)
-                mfc_context->bit_rate_control_context[SLICE_TYPE_I].QpPrimeY += (qpn - BRC_I_P_QP_DIFF - qpi) >> 2;
+                mfc_context->brc.qp_prime_y[0][SLICE_TYPE_I] += (qpn - BRC_I_P_QP_DIFF - qpi) >> 2;
         } else {
             if (abs(qpn + BRC_I_P_QP_DIFF - qpp) > 4)
-                mfc_context->bit_rate_control_context[SLICE_TYPE_P].QpPrimeY += (qpn + BRC_I_P_QP_DIFF - qpp) >> 2;
+                mfc_context->brc.qp_prime_y[0][SLICE_TYPE_P] += (qpn + BRC_I_P_QP_DIFF - qpp) >> 2;
         }
-        BRC_CLIP(mfc_context->bit_rate_control_context[SLICE_TYPE_I].QpPrimeY, min_qindex, max_qindex);
-        BRC_CLIP(mfc_context->bit_rate_control_context[SLICE_TYPE_P].QpPrimeY, min_qindex, max_qindex);
+        BRC_CLIP(mfc_context->brc.qp_prime_y[0][SLICE_TYPE_I], min_qindex, max_qindex);
+        BRC_CLIP(mfc_context->brc.qp_prime_y[0][SLICE_TYPE_P], min_qindex, max_qindex);
     } else if (sts == BRC_UNDERFLOW) { // underflow
         if (qpn <= qp) qpn = qp + 2;
         if (qpn > max_qindex) {
@@ -3438,7 +3476,7 @@ static int gen8_mfc_vp8_brc_postpack(struct encode_state *encode_state,
         }
     }
 
-    mfc_context->bit_rate_control_context[slicetype].QpPrimeY = qpn;
+    mfc_context->brc.qp_prime_y[0][slicetype] = qpn;
 
     return sts;
 }
@@ -3454,8 +3492,7 @@ static void gen8_mfc_vp8_hrd_context_init(struct encode_state *encode_state,
     // current we only support CBR mode.
     if (rate_control_mode == VA_RC_CBR) {
         mfc_context->vui_hrd.i_bit_rate_value = target_bit_rate >> 10;
-        mfc_context->vui_hrd.i_cpb_size_value = (target_bit_rate * 8) >> 10;
-        mfc_context->vui_hrd.i_initial_cpb_removal_delay = mfc_context->vui_hrd.i_cpb_size_value * 0.5 * 1024 / target_bit_rate * 90000;
+        mfc_context->vui_hrd.i_initial_cpb_removal_delay = ((target_bit_rate * 8) >> 10) * 0.5 * 1024 / target_bit_rate * 90000;
         mfc_context->vui_hrd.i_cpb_removal_delay = 2;
         mfc_context->vui_hrd.i_frame_number = 0;
 
@@ -3487,7 +3524,7 @@ static bool gen8_mfc_vp8_brc_updated_check(struct encode_state *encode_state,
     struct gen6_mfc_context *mfc_context = encoder_context->mfc_context;
     double cur_fps, cur_bitrate;
     VAEncSequenceParameterBufferVP8 *seq_param = (VAEncSequenceParameterBufferVP8 *)encode_state->seq_param_ext->buffer;
-    VAEncMiscParameterBuffer *misc_param_frame_rate_buf = (VAEncMiscParameterBuffer*)encode_state->misc_param[VAEncMiscParameterTypeFrameRate]->buffer;
+    VAEncMiscParameterBuffer *misc_param_frame_rate_buf = (VAEncMiscParameterBuffer*)encode_state->misc_param[VAEncMiscParameterTypeFrameRate][0]->buffer;
     VAEncMiscParameterFrameRate *param_frame_rate = (VAEncMiscParameterFrameRate*)misc_param_frame_rate_buf->data;
     unsigned int frame_rate = param_frame_rate->framerate;
 
@@ -3515,7 +3552,6 @@ static void gen8_mfc_vp8_brc_prepare(struct encode_state *encode_state,
                            struct intel_encoder_context *encoder_context)
 {
     unsigned int rate_control_mode = encoder_context->rate_control_mode;
-    struct gen6_mfc_context *mfc_context = encoder_context->mfc_context;
 
     if (rate_control_mode == VA_RC_CBR) {
         bool brc_updated;
@@ -3524,14 +3560,12 @@ static void gen8_mfc_vp8_brc_prepare(struct encode_state *encode_state,
         brc_updated = gen8_mfc_vp8_brc_updated_check(encode_state, encoder_context);
 
         /*Programing bit rate control */
-        if ((mfc_context->bit_rate_control_context[SLICE_TYPE_I].MaxSizeInWord == 0) ||
-             brc_updated) {
-            gen8_mfc_vp8_bit_rate_control_context_init(encode_state, mfc_context);
+        if (brc_updated) {
             gen8_mfc_vp8_brc_init(encode_state, encoder_context);
         }
 
         /*Programing HRD control */
-        if ((mfc_context->vui_hrd.i_cpb_size_value == 0) || brc_updated )
+        if (brc_updated)
             gen8_mfc_vp8_hrd_context_init(encode_state, encoder_context);
     }
 }
@@ -3638,7 +3672,7 @@ static void gen8_mfc_vp8_init(VADriverContextP ctx,
     rate_control_mode = encoder_context->rate_control_mode;
 
     if (rate_control_mode == VA_RC_CBR) {
-        q_matrix->quantization_index[0] = mfc_context->bit_rate_control_context[slice_type].QpPrimeY;
+        q_matrix->quantization_index[0] = mfc_context->brc.qp_prime_y[0][slice_type];
         for (i = 1; i < 4; i++)
             q_matrix->quantization_index[i] = q_matrix->quantization_index[0];
         for (i = 0; i < 5; i++)
@@ -4433,7 +4467,7 @@ gen8_mfc_vp8_encode_picture(VADriverContextP ctx,
     current_frame_bits_size = 8 * gen8_mfc_calc_vp8_coded_buffer_size(ctx, encode_state, encoder_context);
 
     if (rate_control_mode == VA_RC_CBR /*|| rate_control_mode == VA_RC_VBR*/) {
-        sts = gen8_mfc_vp8_brc_postpack(encode_state, mfc_context, current_frame_bits_size);
+        sts = gen8_mfc_vp8_brc_postpack(encode_state, encoder_context, current_frame_bits_size);
         if (sts == BRC_NO_HRD_VIOLATION) {
             gen8_mfc_vp8_hrd_context_update(encode_state, mfc_context);
         }