From 45c4bf3df03ef53ae61fa1473424d4ae024f22e4 Mon Sep 17 00:00:00 2001 From: Anton Khirnov Date: Sat, 22 Jul 2017 14:52:27 +0200 Subject: [PATCH] h264dec: track the last seen value of x264_build Do not use the one in the SEI directly as that is reset at certain points. Inspired by patches from Michael Niedermayer and Anton Mitrofanov . CC: libav-stable@libav.org --- libavcodec/h264_direct.c | 4 ++-- libavcodec/h264_slice.c | 6 +++++- libavcodec/h264dec.c | 1 + libavcodec/h264dec.h | 1 + 4 files changed, 9 insertions(+), 3 deletions(-) diff --git a/libavcodec/h264_direct.c b/libavcodec/h264_direct.c index 7ec49b67f3..abac259cce 100644 --- a/libavcodec/h264_direct.c +++ b/libavcodec/h264_direct.c @@ -391,7 +391,7 @@ single_col: (l1ref0[0] < 0 && !l1ref1[0] && FFABS(l1mv1[0][0]) <= 1 && FFABS(l1mv1[0][1]) <= 1 && - h->sei.unregistered.x264_build > 33U))) { + h->x264_build > 33U))) { a = b = 0; if (ref[0] > 0) a = mv[0]; @@ -426,7 +426,7 @@ single_col: (l1ref0[i8] == 0 || (l1ref0[i8] < 0 && l1ref1[i8] == 0 && - h->sei.unregistered.x264_build > 33U))) { + h->x264_build > 33U))) { const int16_t (*l1mv)[2] = l1ref0[i8] == 0 ? l1mv0 : l1mv1; if (IS_SUB_8X8(sub_mb_type)) { const int16_t *mv_col = l1mv[x8 * 3 + y8 * 3 * b4_stride]; diff --git a/libavcodec/h264_slice.c b/libavcodec/h264_slice.c index c9f1dbb86f..e7408b24b5 100644 --- a/libavcodec/h264_slice.c +++ b/libavcodec/h264_slice.c @@ -403,6 +403,7 @@ int ff_h264_update_thread_context(AVCodecContext *dst, h->enable_er = h1->enable_er; h->workaround_bugs = h1->workaround_bugs; + h->x264_build = h1->x264_build; h->droppable = h1->droppable; // extradata/NAL handling @@ -509,6 +510,9 @@ static int h264_frame_start(H264Context *h) h->mb_aff_frame = h->ps.sps->mb_aff && (h->picture_structure == PICT_FRAME); + if (h->sei.unregistered.x264_build >= 0) + h->x264_build = h->sei.unregistered.x264_build; + assert(h->cur_pic_ptr->long_ref == 0); return 0; @@ -847,7 +851,7 @@ static int h264_slice_header_init(H264Context *h) if (sps->timing_info_present_flag) { int64_t den = sps->time_scale; - if (h->sei.unregistered.x264_build < 44U) + if (h->x264_build < 44U) den *= 2; av_reduce(&h->avctx->framerate.den, &h->avctx->framerate.num, sps->num_units_in_tick, den, 1 << 30); diff --git a/libavcodec/h264dec.c b/libavcodec/h264dec.c index 2a532a7ef7..7a8293efa5 100644 --- a/libavcodec/h264dec.c +++ b/libavcodec/h264dec.c @@ -293,6 +293,7 @@ static int h264_init_context(AVCodecContext *avctx, H264Context *h) h->flags = avctx->flags; h->poc.prev_poc_msb = 1 << 16; h->recovery_frame = -1; + h->x264_build = -1; h->frame_recovered = 0; h->next_outputed_poc = INT_MIN; diff --git a/libavcodec/h264dec.h b/libavcodec/h264dec.h index fc7beeb994..ddfe224e93 100644 --- a/libavcodec/h264dec.h +++ b/libavcodec/h264dec.h @@ -361,6 +361,7 @@ typedef struct H264Context { int context_initialized; int flags; int workaround_bugs; + int x264_build; /* Set when slice threading is used and at least one slice uses deblocking * mode 1 (i.e. across slice boundaries). Then we disable the loop filter * during normal MB decoding and execute it serially at the end.