diff options
author | Hendrik Leppkes <[email protected]> | 2015-09-12 21:50:24 +0200 |
---|---|---|
committer | Carl Eugen Hoyos <[email protected]> | 2015-10-09 22:09:54 +0200 |
commit | 4edb236c49722bed5bdc72346c81c7224881106d (patch) | |
tree | 7bda6f28d3610e44161c6659c8eb88f186dbcfd0 | |
parent | f085ce32656381f8924e2f2f485669a46ed3209d (diff) |
hevc: properly handle no_rasl_output_flag when removing pictures from the DPB
Fixes ticket #4185.
Reviewed-By: Mickael Raulet <[email protected]>
Signed-off-by: Hendrik Leppkes <[email protected]>
(cherry picked from commit 0118158efa8e45761f9f65a3bb74f33907bd2aec)
-rw-r--r-- | libavcodec/hevc.c | 5 | ||||
-rw-r--r-- | libavcodec/hevc.h | 1 | ||||
-rw-r--r-- | libavcodec/hevc_refs.c | 2 |
3 files changed, 7 insertions, 1 deletions
diff --git a/libavcodec/hevc.c b/libavcodec/hevc.c index e5b4bb1048..fbfcb95e30 100644 --- a/libavcodec/hevc.c +++ b/libavcodec/hevc.c @@ -769,6 +769,8 @@ static int hls_slice_header(HEVCContext *s) s->HEVClc->tu.cu_qp_offset_cb = 0; s->HEVClc->tu.cu_qp_offset_cr = 0; + s->no_rasl_output_flag = IS_IDR(s) || IS_BLA(s) || (s->nal_unit_type == NAL_CRA_NUT && s->last_eos); + return 0; } @@ -3310,6 +3312,7 @@ static int hevc_update_thread_context(AVCodecContext *dst, s->pocTid0 = s0->pocTid0; s->max_ra = s0->max_ra; s->eos = s0->eos; + s->no_rasl_output_flag = s0->no_rasl_output_flag; s->is_nalff = s0->is_nalff; s->nal_length_size = s0->nal_length_size; @@ -3404,6 +3407,7 @@ static av_cold int hevc_decode_init(AVCodecContext *avctx) s->enable_parallel_tiles = 0; s->picture_struct = 0; + s->eos = 1; if(avctx->active_thread_type & FF_THREAD_SLICE) s->threads_number = avctx->thread_count; @@ -3445,6 +3449,7 @@ static void hevc_decode_flush(AVCodecContext *avctx) HEVCContext *s = avctx->priv_data; ff_hevc_flush_dpb(s); s->max_ra = INT_MAX; + s->eos = 1; } #define OFFSET(x) offsetof(HEVCContext, x) diff --git a/libavcodec/hevc.h b/libavcodec/hevc.h index 92b0423751..7efafe11e2 100644 --- a/libavcodec/hevc.h +++ b/libavcodec/hevc.h @@ -844,6 +844,7 @@ typedef struct HEVCContext { int bs_height; int is_decoded; + int no_rasl_output_flag; HEVCPredContext hpc; HEVCDSPContext hevcdsp; diff --git a/libavcodec/hevc_refs.c b/libavcodec/hevc_refs.c index b3a97871d5..dc35d3591a 100644 --- a/libavcodec/hevc_refs.c +++ b/libavcodec/hevc_refs.c @@ -158,7 +158,7 @@ int ff_hevc_output_frame(HEVCContext *s, AVFrame *out, int flush) int min_poc = INT_MAX; int i, min_idx, ret; - if (s->sh.no_output_of_prior_pics_flag == 1) { + if (s->sh.no_output_of_prior_pics_flag == 1 && s->no_rasl_output_flag == 1) { for (i = 0; i < FF_ARRAY_ELEMS(s->DPB); i++) { HEVCFrame *frame = &s->DPB[i]; if (!(frame->flags & HEVC_FRAME_FLAG_BUMPING) && frame->poc != s->poc && |