[Mesa-dev] [PATCH 4/5] radeon/vce: sort cpb by ref list for VAAPI encode
Christian König
deathsimple at vodafone.de
Wed Jun 15 13:02:14 UTC 2016
Am 14.06.2016 um 22:14 schrieb Boyuan Zhang:
> Signed-off-by: Boyuan Zhang <boyuan.zhang at amd.com>
We need to find an interface that works both for OpenMAX as well as
VA-API and not implement a separate interface for each state tracker.
So I would suggest to implement the logic to provide the reference
picture list in OpenMAX and switch over to using something general here.
Regards,
Christian.
> ---
> 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();
More information about the mesa-dev
mailing list