[Libva] [PATCH] VP8 HWEnc: Fix CBR qp setting for vme cost
Zhong Li
zhong.li at intel.com
Thu May 21 23:06:04 PDT 2015
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 <zhong.li at intel.com>
---
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
More information about the Libva
mailing list