aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMark Thompson <sw@jkqxz.net>2016-05-16 14:01:31 +0100
committerMark Thompson <sw@jkqxz.net>2016-05-27 10:56:55 +0100
commitb51c7c6b8a5b35cfd06cb9655f9ec4c9f0ddd81b (patch)
tree13086487e883bb75c0c5a6476924c5be26fc26a8
parent2bfa067d0b636e7b2004fb0ad5a53d0d48c6de32 (diff)
downloadffmpeg-b51c7c6b8a5b35cfd06cb9655f9ec4c9f0ddd81b.tar.gz
vaapi_h264: Fix frame_num after non-reference frames
Non-reference frames (nal_ref_idc == 0) should be discardable, so frame_num does not advance after them. Before this change, a stream containing unreferenced B-frames would be rejected by the reference decoder.
-rw-r--r--libavcodec/vaapi_encode_h264.c18
1 files changed, 11 insertions, 7 deletions
diff --git a/libavcodec/vaapi_encode_h264.c b/libavcodec/vaapi_encode_h264.c
index 8690a8565b..7819788cf7 100644
--- a/libavcodec/vaapi_encode_h264.c
+++ b/libavcodec/vaapi_encode_h264.c
@@ -101,8 +101,8 @@ typedef struct VAAPIEncodeH264Context {
int fixed_qp_p;
int fixed_qp_b;
+ int next_frame_num;
int64_t idr_pic_count;
- int64_t last_idr_frame;
// Rate control configuration.
struct {
@@ -592,12 +592,17 @@ static int vaapi_encode_h264_init_picture_params(AVCodecContext *avctx,
if (pic->type == PICTURE_TYPE_IDR) {
av_assert0(pic->display_order == pic->encode_order);
- priv->last_idr_frame = pic->display_order;
+ vpic->frame_num = 0;
+ priv->next_frame_num = 1;
} else {
- av_assert0(pic->display_order > priv->last_idr_frame);
+ vpic->frame_num = priv->next_frame_num;
+ if (pic->type != PICTURE_TYPE_B) {
+ // nal_ref_idc != 0
+ ++priv->next_frame_num;
+ }
}
- vpic->frame_num = (pic->encode_order - priv->last_idr_frame) &
+ vpic->frame_num = vpic->frame_num &
((1 << (4 + vseq->seq_fields.bits.log2_max_frame_num_minus4)) - 1);
vpic->CurrPic.picture_id = pic->recon_surface;
@@ -608,10 +613,9 @@ static int vaapi_encode_h264_init_picture_params(AVCodecContext *avctx,
for (i = 0; i < pic->nb_refs; i++) {
VAAPIEncodePicture *ref = pic->refs[i];
- av_assert0(ref && ref->encode_order >= priv->last_idr_frame);
+ av_assert0(ref && ref->encode_order < pic->encode_order);
vpic->ReferenceFrames[i].picture_id = ref->recon_surface;
- vpic->ReferenceFrames[i].frame_idx =
- ref->encode_order - priv->last_idr_frame;
+ vpic->ReferenceFrames[i].frame_idx = ref->encode_order;
vpic->ReferenceFrames[i].flags = VA_PICTURE_H264_SHORT_TERM_REFERENCE;
vpic->ReferenceFrames[i].TopFieldOrderCnt = ref->display_order;
vpic->ReferenceFrames[i].BottomFieldOrderCnt = ref->display_order;