]> git.sesse.net Git - ffmpeg/commitdiff
avcodec/av1dec: update reference frame state on show_existing_frame
authorJames Almer <jamrial@gmail.com>
Wed, 9 Sep 2020 22:14:01 +0000 (19:14 -0300)
committerJames Almer <jamrial@gmail.com>
Sat, 12 Sep 2020 16:10:16 +0000 (13:10 -0300)
As defined in Section 7.4

Signed-off-by: James Almer <jamrial@gmail.com>
libavcodec/av1dec.c

index b39a509f3154c87c99ac1d13b100a5ea785d8adb..4a419d69d6e645328d57db54ecdc4fb72553b7dd 100644 (file)
@@ -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");