[FFmpeg-devel] [PATCH] vaapi_encode_h265: Ensure that ref pics are always in the RPS
Eoff, Ullysses A
ullysses.a.eoff at intel.com
Fri Jan 25 22:40:54 EET 2019
> -----Original Message-----
> From: ffmpeg-devel [mailto:ffmpeg-devel-bounces at ffmpeg.org] On Behalf Of Mark Thompson
> Sent: Friday, January 25, 2019 12:05 PM
> To: FFmpeg development discussions and patches <ffmpeg-devel at ffmpeg.org>
> Subject: [FFmpeg-devel] [PATCH] vaapi_encode_h265: Ensure that ref pics are always in the RPS
>
> When making a new P-frame when B-frames are present the previous P-frame
> is normally in the DPB because it will be referred to by subsequent
> B-frames. However, this is not true if there are no B-frames, or in edge
> cases where a GOP ends with two P-frames. Fix this by adding the direct
> ref pics to the RPS explicitly.
>
> Fixes #7699.
This patch fixes #7699 for me. Thanks! :)
> ---
> libavcodec/vaapi_encode_h265.c | 17 +++++++++++++----
> 1 file changed, 13 insertions(+), 4 deletions(-)
>
> diff --git a/libavcodec/vaapi_encode_h265.c b/libavcodec/vaapi_encode_h265.c
> index 1d40e06667..19e7104e9e 100644
> --- a/libavcodec/vaapi_encode_h265.c
> +++ b/libavcodec/vaapi_encode_h265.c
> @@ -902,6 +902,7 @@ static int vaapi_encode_h265_init_slice_params(AVCodecContext *avctx,
>
> if (pic->type != PICTURE_TYPE_IDR) {
> H265RawSTRefPicSet *rps;
> + const VAAPIEncodeH265Picture *strp;
> int rps_poc[MAX_DPB_SIZE];
> int rps_used[MAX_DPB_SIZE];
> int i, j, poc, rps_pics;
> @@ -912,16 +913,24 @@ static int vaapi_encode_h265_init_slice_params(AVCodecContext *avctx,
> memset(rps, 0, sizeof(*rps));
>
> rps_pics = 0;
> + for (i = 0; i < pic->nb_refs; i++) {
> + strp = pic->refs[i]->priv_data;
> + rps_poc[rps_pics] = strp->pic_order_cnt;
> + rps_used[rps_pics] = 1;
> + ++rps_pics;
> + }
> for (i = 0; i < pic->nb_dpb_pics; i++) {
> - VAAPIEncodeH265Picture *strp;
> if (pic->dpb[i] == pic)
> continue;
> + for (j = 0; j < pic->nb_refs; j++) {
> + if (pic->dpb[i] == pic->refs[j])
> + break;
> + }
> + if (j < pic->nb_refs)
> + continue;
> strp = pic->dpb[i]->priv_data;
> rps_poc[rps_pics] = strp->pic_order_cnt;
> rps_used[rps_pics] = 0;
> - for (j = 0; j < pic->nb_refs; j++)
> - if (pic->dpb[i] == pic->refs[j])
> - rps_used[rps_pics] = 1;
> ++rps_pics;
> }
>
> --
> 2.19.2
> _______________________________________________
> ffmpeg-devel mailing list
> ffmpeg-devel at ffmpeg.org
> http://ffmpeg.org/mailman/listinfo/ffmpeg-devel
More information about the ffmpeg-devel
mailing list