summaryrefslogtreecommitdiff
path: root/libavcodec/av1dec.c
diff options
context:
space:
mode:
authorJames Almer <jamrial@gmail.com>2020-09-09 19:14:01 -0300
committerJames Almer <jamrial@gmail.com>2020-09-12 13:10:16 -0300
commit9c6026bc72905d40b6628fdbecba35bb1aceb8ce (patch)
tree82cb66de3924e8dc8e5ddf074cc71db54640c608 /libavcodec/av1dec.c
parentb80c66bb6b23334666dbbb7b132fa5d49523d461 (diff)
downloadffmpeg-9c6026bc72905d40b6628fdbecba35bb1aceb8ce.tar.gz
avcodec/av1dec: update reference frame state on show_existing_frame
As defined in Section 7.4 Signed-off-by: James Almer <jamrial@gmail.com>
Diffstat (limited to 'libavcodec/av1dec.c')
-rw-r--r--libavcodec/av1dec.c24
1 files changed, 17 insertions, 7 deletions
diff --git a/libavcodec/av1dec.c b/libavcodec/av1dec.c
index b39a509f31..4a419d69d6 100644
--- a/libavcodec/av1dec.c
+++ b/libavcodec/av1dec.c
@@ -580,15 +580,9 @@ static int set_output_frame(AVCodecContext *avctx, AVFrame *frame,
const AVPacket *pkt, int *got_frame)
{
AV1DecContext *s = avctx->priv_data;
- const AV1RawFrameHeader *header = s->raw_frame_header;
- const AVFrame *srcframe;
+ const AVFrame *srcframe = s->cur_frame.tf.f;
int ret;
- if (header->show_existing_frame)
- srcframe = s->ref[header->frame_to_show_map_idx].tf.f;
- else
- srcframe = s->cur_frame.tf.f;
-
ret = av_frame_ref(frame, srcframe);
if (ret < 0)
return ret;
@@ -733,6 +727,22 @@ static int av1_decode_frame(AVCodecContext *avctx, void *frame,
s->raw_frame_header = &obu->obu.frame_header;
if (s->raw_frame_header->show_existing_frame) {
+ if (s->cur_frame.tf.f->buf[0])
+ av1_frame_unref(avctx, &s->cur_frame);
+
+ ret = av1_frame_ref(avctx, &s->cur_frame,
+ &s->ref[s->raw_frame_header->frame_to_show_map_idx]);
+ if (ret < 0) {
+ av_log(avctx, AV_LOG_ERROR, "Failed to get reference frame.\n");
+ goto end;
+ }
+
+ ret = update_reference_list(avctx);
+ if (ret < 0) {
+ av_log(avctx, AV_LOG_ERROR, "Failed to update reference list.\n");
+ goto end;
+ }
+
ret = set_output_frame(avctx, frame, pkt, got_frame);
if (ret < 0)
av_log(avctx, AV_LOG_ERROR, "Set output frame error.\n");