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.

Tested-by: Ullysses A Eoff <ullysses.a.eoff@intel.com>
This commit is contained in:
Mark Thompson 2019-01-25 19:54:27 +00:00
parent d3a6943804
commit 44bcccb7f0
1 changed files with 13 additions and 4 deletions

View File

@ -902,6 +902,7 @@ static int vaapi_encode_h265_init_slice_params(AVCodecContext *avctx,
if (pic->type != PICTURE_TYPE_IDR) { if (pic->type != PICTURE_TYPE_IDR) {
H265RawSTRefPicSet *rps; H265RawSTRefPicSet *rps;
const VAAPIEncodeH265Picture *strp;
int rps_poc[MAX_DPB_SIZE]; int rps_poc[MAX_DPB_SIZE];
int rps_used[MAX_DPB_SIZE]; int rps_used[MAX_DPB_SIZE];
int i, j, poc, rps_pics; 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)); memset(rps, 0, sizeof(*rps));
rps_pics = 0; 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++) { for (i = 0; i < pic->nb_dpb_pics; i++) {
VAAPIEncodeH265Picture *strp;
if (pic->dpb[i] == pic) if (pic->dpb[i] == pic)
continue; 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; strp = pic->dpb[i]->priv_data;
rps_poc[rps_pics] = strp->pic_order_cnt; rps_poc[rps_pics] = strp->pic_order_cnt;
rps_used[rps_pics] = 0; 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; ++rps_pics;
} }