mirror of https://git.ffmpeg.org/ffmpeg.git
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:
parent
d3a6943804
commit
44bcccb7f0
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue