[Libva] [Libva-intel-driver][PATCH 2/5] svct: Save the current frame size per layer

Xiang, Haihao haihao.xiang at intel.com
Mon Oct 24 04:49:39 UTC 2016


Use the the right previous frame size to estimate a QP for next frame in the
same layer

Signed-off-by: Xiang, Haihao <haihao.xiang at intel.com>
---
 src/gen6_mfc.h        | 1 +
 src/gen6_mfc_common.c | 7 +++++++
 2 files changed, 8 insertions(+)

diff --git a/src/gen6_mfc.h b/src/gen6_mfc.h
index e0972bb..e68c5c5 100644
--- a/src/gen6_mfc.h
+++ b/src/gen6_mfc.h
@@ -233,6 +233,7 @@ struct gen6_mfc_context
         int qp_prime_y[MAX_TEMPORAL_LAYERS][3];
         double bits_per_frame[MAX_TEMPORAL_LAYERS];
         double qpf_rounding_accumulator[MAX_TEMPORAL_LAYERS];
+        int bits_prev_frame[MAX_TEMPORAL_LAYERS];
 
         double saved_bps;
         double saved_fps;
diff --git a/src/gen6_mfc_common.c b/src/gen6_mfc_common.c
index fbce493..a38c6d0 100644
--- a/src/gen6_mfc_common.c
+++ b/src/gen6_mfc_common.c
@@ -225,11 +225,18 @@ int intel_mfc_brc_postpack(struct encode_state *encode_state,
         next_frame_layer_id = curr_frame_layer_id;
     }
 
+    mfc_context->brc.bits_prev_frame[curr_frame_layer_id] = frame_bits;
+    frame_bits = mfc_context->brc.bits_prev_frame[next_frame_layer_id];
+
     if (encoder_context->layer.num_layers < 2 || encoder_context->layer.size_frame_layer_ids == 0)
         factor = 1.0;
     else
         factor = (double)encoder_context->brc.framerate_per_100s[next_frame_layer_id] / encoder_context->brc.framerate_per_100s[encoder_context->layer.num_layers - 1];
 
+    /* 0 means the next frame is the first frame of next layer */
+    if (frame_bits == 0)
+        return sts;
+
     qpi = mfc_context->brc.qp_prime_y[next_frame_layer_id][SLICE_TYPE_I];
     qpp = mfc_context->brc.qp_prime_y[next_frame_layer_id][SLICE_TYPE_P];
     qpb = mfc_context->brc.qp_prime_y[next_frame_layer_id][SLICE_TYPE_B];
-- 
1.9.1



More information about the Libva mailing list