From 147865fac43fe674302de9f820ca689583cebc60 Mon Sep 17 00:00:00 2001
From: Hendrik Leppkes <h.leppkes@gmail.com>
Date: Sat, 13 Dec 2014 21:21:00 +0100
Subject: [PATCH] hevc: try to handle the NoRaslOutputFlag logic
---
libavcodec/hevc.c | 8 ++++++++
libavcodec/hevc.h | 1 +
libavcodec/hevc_refs.c | 2 +-
3 files changed, 10 insertions(+), 1 deletion(-)
diff --git a/libavcodec/hevc.c b/libavcodec/hevc.c
index 802bff6..2ab2a53 100644
|
a
|
b
|
static int hevc_frame_start(HEVCContext *s)
|
| 2580 | 2580 | if (ret < 0) |
| 2581 | 2581 | goto fail; |
| 2582 | 2582 | |
| | 2583 | if (IS_IRAP(s)) |
| | 2584 | s->NoRaslOutputFlag = 0; |
| | 2585 | |
| 2583 | 2586 | ff_thread_finish_setup(s->avctx); |
| 2584 | 2587 | |
| 2585 | 2588 | return 0; |
| … |
… |
static int decode_nal_units(HEVCContext *s, const uint8_t *buf, int length)
|
| 2857 | 2860 | |
| 2858 | 2861 | s->ref = NULL; |
| 2859 | 2862 | s->last_eos = s->eos; |
| | 2863 | if (s->last_eos) |
| | 2864 | s->NoRaslOutputFlag = 1; |
| 2860 | 2865 | s->eos = 0; |
| 2861 | 2866 | |
| 2862 | 2867 | /* split the input packet into NAL units, so we know the upper bound on the |
| … |
… |
static int hevc_update_thread_context(AVCodecContext *dst,
|
| 3306 | 3311 | s->pocTid0 = s0->pocTid0; |
| 3307 | 3312 | s->max_ra = s0->max_ra; |
| 3308 | 3313 | s->eos = s0->eos; |
| | 3314 | s->NoRaslOutputFlag = s0->NoRaslOutputFlag; |
| 3309 | 3315 | |
| 3310 | 3316 | s->is_nalff = s0->is_nalff; |
| 3311 | 3317 | s->nal_length_size = s0->nal_length_size; |
| … |
… |
static av_cold int hevc_decode_init(AVCodecContext *avctx)
|
| 3400 | 3406 | |
| 3401 | 3407 | s->enable_parallel_tiles = 0; |
| 3402 | 3408 | s->picture_struct = 0; |
| | 3409 | s->NoRaslOutputFlag = 1; |
| 3403 | 3410 | |
| 3404 | 3411 | if(avctx->active_thread_type & FF_THREAD_SLICE) |
| 3405 | 3412 | s->threads_number = avctx->thread_count; |
| … |
… |
static void hevc_decode_flush(AVCodecContext *avctx)
|
| 3457 | 3464 | HEVCContext *s = avctx->priv_data; |
| 3458 | 3465 | ff_hevc_flush_dpb(s); |
| 3459 | 3466 | s->max_ra = INT_MAX; |
| | 3467 | s->NoRaslOutputFlag = 1; |
| 3460 | 3468 | } |
| 3461 | 3469 | |
| 3462 | 3470 | #define OFFSET(x) offsetof(HEVCContext, x) |
diff --git a/libavcodec/hevc.h b/libavcodec/hevc.h
index 1727b60..441d361 100644
|
a
|
b
|
typedef struct HEVCContext {
|
| 843 | 843 | int bs_height; |
| 844 | 844 | |
| 845 | 845 | int is_decoded; |
| | 846 | int NoRaslOutputFlag; |
| 846 | 847 | |
| 847 | 848 | HEVCPredContext hpc; |
| 848 | 849 | HEVCDSPContext hevcdsp; |
diff --git a/libavcodec/hevc_refs.c b/libavcodec/hevc_refs.c
index 5d8b214..f6e1bf2 100644
|
a
|
b
|
int ff_hevc_output_frame(HEVCContext *s, AVFrame *out, int flush)
|
| 173 | 173 | int min_poc = INT_MAX; |
| 174 | 174 | int i, min_idx, ret; |
| 175 | 175 | |
| 176 | | if (s->sh.no_output_of_prior_pics_flag == 1) { |
| | 176 | if (s->sh.no_output_of_prior_pics_flag == 1 && s->NoRaslOutputFlag) { |
| 177 | 177 | for (i = 0; i < FF_ARRAY_ELEMS(s->DPB); i++) { |
| 178 | 178 | HEVCFrame *frame = &s->DPB[i]; |
| 179 | 179 | if (!(frame->flags & HEVC_FRAME_FLAG_BUMPING) && frame->poc != s->poc && |