[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