[Mesa-dev] [PATCH 4/5] radeon/vce: sort cpb by ref list for VAAPI encode
Boyuan Zhang
boyuan.zhang at amd.com
Tue Jun 14 20:14:31 UTC 2016
Signed-off-by: Boyuan Zhang <boyuan.zhang at amd.com>
---
src/gallium/drivers/radeon/radeon_vce.c | 52 +++++++++++++++++++++++++++++++--
1 file changed, 49 insertions(+), 3 deletions(-)
diff --git a/src/gallium/drivers/radeon/radeon_vce.c b/src/gallium/drivers/radeon/radeon_vce.c
index 549d999..0ff07eb 100644
--- a/src/gallium/drivers/radeon/radeon_vce.c
+++ b/src/gallium/drivers/radeon/radeon_vce.c
@@ -139,6 +139,48 @@ static void sort_cpb(struct rvce_encoder *enc)
}
}
+/**
+ * sort l0 and l1 based on reference picture list
+ */
+static void sort_cpb_by_ref_list(struct rvce_encoder *enc)
+{
+ struct rvce_cpb_slot *i, *l0 = NULL, *l1 = NULL;
+ struct list_head *current = &enc->cpb_slots;
+
+ for (int j = 0 ; j < 32 ; j++) {
+ if ((enc->pic.ref_pic_list_0[j] == 0xFFFFFFFF) &&
+ (enc->pic.ref_pic_list_1[j] == 0xFFFFFFFF))
+ break;
+ LIST_FOR_EACH_ENTRY(i, &enc->cpb_slots, list) {
+ if (i->frame_num == enc->pic.ref_pic_list_0[j])
+ l0 = i;
+
+ if (i->frame_num == enc->pic.ref_pic_list_1[j])
+ l1 = i;
+
+ if (enc->pic.picture_type == PIPE_H264_ENC_PICTURE_TYPE_P &&
+ l0)
+ break;
+
+ if (enc->pic.picture_type == PIPE_H264_ENC_PICTURE_TYPE_B &&
+ l0 && l1)
+ break;
+ }
+
+ if (l0) {
+ LIST_DEL(&l0->list);
+ LIST_ADD(&l0->list, current);
+ current = current->next;
+ }
+
+ if (l1) {
+ LIST_DEL(&l1->list);
+ LIST_ADD(&l1->list, current);
+ current = current->next;
+ }
+ }
+}
+
static void get_rate_control_param(struct rvce_encoder *enc, struct pipe_h264_enc_picture_desc *pic)
{
enc->pic.rc.rc_method = pic->rate_ctrl.rate_ctrl_method;
@@ -444,9 +486,13 @@ static void rvce_begin_frame(struct pipe_video_codec *encoder,
if (pic->picture_type == PIPE_H264_ENC_PICTURE_TYPE_IDR)
reset_cpb(enc);
else if (pic->picture_type == PIPE_H264_ENC_PICTURE_TYPE_P ||
- pic->picture_type == PIPE_H264_ENC_PICTURE_TYPE_B)
- sort_cpb(enc);
-
+ pic->picture_type == PIPE_H264_ENC_PICTURE_TYPE_B) {
+ if (pic->has_ref_pic_list)
+ sort_cpb_by_ref_list(enc);
+ else
+ sort_cpb(enc);
+ }
+
if (!enc->stream_handle) {
struct rvid_buffer fb;
enc->stream_handle = rvid_alloc_stream_handle();
--
1.9.1
More information about the mesa-dev
mailing list