summaryrefslogtreecommitdiff
path: root/libavcodec/vaapi_encode_h265.c
diff options
context:
space:
mode:
authorMark Thompson <sw@jkqxz.net>2019-01-25 19:54:27 +0000
committerMark Thompson <sw@jkqxz.net>2019-01-27 17:38:38 +0000
commit44bcccb7f0c43cb40f1e61f6e1e19cf2ab266c57 (patch)
tree9d91a52ee8f334a53fbe6a10f2c415600a2b6955 /libavcodec/vaapi_encode_h265.c
parentd3a69438049b481dd9db1af82fd22494d7560ee4 (diff)
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>
Diffstat (limited to 'libavcodec/vaapi_encode_h265.c')
-rw-r--r--libavcodec/vaapi_encode_h265.c17
1 files 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;
}