1. The q_index range of vp8 is different from h264, it's need to be mapped to avc qp range. 2. For CBR case, qp should be set to CBR calculated value.
Signed-off-by: Zhong Li <[email protected]> --- src/gen6_mfc_common.c | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/gen6_mfc_common.c b/src/gen6_mfc_common.c index 9c1d294..275fa13 100644 --- a/src/gen6_mfc_common.c +++ b/src/gen6_mfc_common.c @@ -793,6 +793,7 @@ int intel_format_lutvalue(int value, int max) #define QP_MAX 52 +#define VP8_QP_MAX 128 static float intel_lambda_qp(int qp) @@ -932,11 +933,17 @@ void intel_vme_vp8_update_mbmv_cost(VADriverContextP ctx, float lambda, m_costf; int is_key_frame = !pic_param->pic_flags.bits.frame_type; + int slice_type = (is_key_frame ? SLICE_TYPE_I : SLICE_TYPE_P); if (vme_state_message == NULL) return; - lambda = intel_lambda_qp(q_matrix->quantization_index[0] >> 1); + if (encoder_context->rate_control_mode == VA_RC_CQP) + qp = q_matrix->quantization_index[0]; + else + qp = mfc_context->bit_rate_control_context[slice_type].QpPrimeY; + + lambda = intel_lambda_qp(qp * QP_MAX / VP8_QP_MAX); if (is_key_frame) { vme_state_message[MODE_INTRA_16X16] = 0; m_cost = lambda * 16; @@ -957,7 +964,7 @@ void intel_vme_vp8_update_mbmv_cost(VADriverContextP ctx, mv_count++; } - if (q_matrix->quantization_index[0] < 32 ) { + if (qp < 32 ) { vme_state_message[MODE_INTRA_16X16] = 0x4a; vme_state_message[MODE_INTRA_4X4] = 0x4a; vme_state_message[MODE_INTRA_NONPRED] = 0x4a; -- 1.9.1 _______________________________________________ Libva mailing list [email protected] http://lists.freedesktop.org/mailman/listinfo/libva
