From patchwork Fri Nov 15 18:38:05 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: James Almer X-Patchwork-Id: 16289 Return-Path: X-Original-To: patchwork@ffaux-bg.ffmpeg.org Delivered-To: patchwork@ffaux-bg.ffmpeg.org Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org [79.124.17.100]) by ffaux.localdomain (Postfix) with ESMTP id 3877A44A9BE for ; Fri, 15 Nov 2019 20:45:06 +0200 (EET) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 19E42689FF9; Fri, 15 Nov 2019 20:45:06 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-qt1-f193.google.com (mail-qt1-f193.google.com [209.85.160.193]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 83760689F6F for ; Fri, 15 Nov 2019 20:44:59 +0200 (EET) Received: by mail-qt1-f193.google.com with SMTP id o49so11829106qta.7 for ; Fri, 15 Nov 2019 10:44:59 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:subject:date:message-id:in-reply-to:references:mime-version :content-transfer-encoding; bh=jgQgcY/Jw2uij7B1LLbbTq4O2ZpOrVQSo6dx2jtJNCQ=; b=ciu6qjbtrVOVLR1Z6+giU1xnOIoVRwx7a6maqPI8J9ANBmEPEiNI39M2/wvVjF0pAK MQGW56x0F9EbVpYgf5qq3I8jkFwnsibf4EXORq7Ok74SD9c/lzK8sOV8thRcz9x24F4m 5OmTUEX0A6nX6TcJvTUjbO70wsILOuC57yOZuTn1ahXFRfO2EhBE8V931MidsjZN46kb dMH6WvgzB9eKAGMN7CLPsj7En1zFd5Jbl3WiEHiOBe528GSt4Oxjhfrc19yocIxVsu24 N155YbW+7fh8Zmk1oGZtlVuINLmtvYTm1RnHRWoVB9jXblz5D45czdhghZokJQi1Nu3i wEXw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=jgQgcY/Jw2uij7B1LLbbTq4O2ZpOrVQSo6dx2jtJNCQ=; b=mYmiv1ulI/tTQoz0vIs5Eosr7aHZgAv99JIGEJ/HVSYgYq8OIKKz5jkdZ6JUpYvyO2 yzCs2ImFv77xvGuWGy9iLdvoxIPQTKdC5tS3XsdBr8Zhp57FlN/in4zudbABz0jvlHsl I2OzseNnfK7+NOuFymtkJ1iHl2bMlyK6ItWmJFpmWjyBlwsg1/OPw3WpuFv9o97dlovC oIEiQHtNqUx4fLFTWaZGNj2AviX8b0keeeU8CPujkByhcP5SnCkQe9pgADH0bLneJCoG ZQuuLx6LvkwD2yfvpW3bfHAa2/LBi7NhqNt1ZXrXf5HzL2Mnm0LM511YzoRr5/XXhd4I qjoA== X-Gm-Message-State: APjAAAXL57s8VTDwYDrQ4OI/cVLxMeZ/OZg2upvx9FoOFYhyUh3OXHA6 TGAbWpElf+8xpEYXx5+kZESSN1B4 X-Google-Smtp-Source: APXvYqzD5DamAJ2tm3ltbuKzOiSKcheTIlBsN3DdpblvMvRvQqMgzhLyVAl1TnbD2UUaOFcPi6Sd4w== X-Received: by 2002:ac8:5054:: with SMTP id h20mr15227963qtm.209.1573843113028; Fri, 15 Nov 2019 10:38:33 -0800 (PST) Received: from localhost.localdomain ([181.23.71.177]) by smtp.gmail.com with ESMTPSA id a70sm4690482qkg.1.2019.11.15.10.38.32 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 15 Nov 2019 10:38:32 -0800 (PST) From: James Almer To: ffmpeg-devel@ffmpeg.org Date: Fri, 15 Nov 2019 15:38:05 -0300 Message-Id: <20191115183805.1736-2-jamrial@gmail.com> X-Mailer: git-send-email 2.23.0 In-Reply-To: <20191115183805.1736-1-jamrial@gmail.com> References: <20191115183805.1736-1-jamrial@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 2/2] avcodec/cbs_av1: keep separate reference frame state for reading and writing X-BeenThere: ffmpeg-devel@ffmpeg.org X-Mailman-Version: 2.1.20 Precedence: list List-Id: FFmpeg development discussions and patches List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Reply-To: FFmpeg development discussions and patches Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" In scearios where a Temporal Unit is written right after reading it using the same CBS context (av1_metadata, av1_frame_merge, etc), the reference frame state used by the writer must not be the state that's the result of the reader having already parsed the current frame in question. This fixes writing frames of type Switch. Signed-off-by: James Almer --- This may be needed for other modules as well. I see at least VP9 and h264/hevc keeping some sort of state. Alternatively, we could just require a given CBS context to be used to either read or write, but not both. libavcodec/cbs_av1.c | 14 ++++++++++++++ libavcodec/cbs_av1.h | 4 +++- 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/libavcodec/cbs_av1.c b/libavcodec/cbs_av1.c index cca112ecf8..ddd8ea955d 100644 --- a/libavcodec/cbs_av1.c +++ b/libavcodec/cbs_av1.c @@ -640,6 +640,8 @@ static size_t cbs_av1_get_payload_bytes_left(GetBitContext *gbc) #define byte_alignment(rw) (get_bits_count(rw) % 8) +#define ref read_ref + #include "cbs_av1_syntax_template.c" #undef READ @@ -655,6 +657,7 @@ static size_t cbs_av1_get_payload_bytes_left(GetBitContext *gbc) #undef leb128 #undef infer #undef byte_alignment +#undef ref #define WRITE @@ -717,6 +720,8 @@ static size_t cbs_av1_get_payload_bytes_left(GetBitContext *gbc) #define byte_alignment(rw) (put_bits_count(rw) % 8) +#define ref write_ref + #include "cbs_av1_syntax_template.c" #undef WRITE @@ -732,6 +737,7 @@ static size_t cbs_av1_get_payload_bytes_left(GetBitContext *gbc) #undef leb128 #undef infer #undef byte_alignment +#undef ref static int cbs_av1_split_fragment(CodedBitstreamContext *ctx, @@ -973,6 +979,8 @@ static int cbs_av1_read_unit(CodedBitstreamContext *ctx, unit->data_ref); if (err < 0) return err; + + priv->ref = (AV1ReferenceFrameState *)&priv->read_ref; } break; case AV1_OBU_TILE_GROUP: @@ -995,6 +1003,8 @@ static int cbs_av1_read_unit(CodedBitstreamContext *ctx, if (err < 0) return err; + priv->ref = (AV1ReferenceFrameState *)&priv->read_ref; + err = cbs_av1_ref_tile_data(ctx, unit, &gbc, &obu->obu.frame.tile_group.tile_data); if (err < 0) @@ -1115,6 +1125,8 @@ static int cbs_av1_write_obu(CodedBitstreamContext *ctx, NULL); if (err < 0) return err; + + priv->ref = (AV1ReferenceFrameState *)&priv->write_ref; } break; case AV1_OBU_TILE_GROUP: @@ -1134,6 +1146,8 @@ static int cbs_av1_write_obu(CodedBitstreamContext *ctx, return err; td = &obu->obu.frame.tile_group.tile_data; + + priv->ref = (AV1ReferenceFrameState *)&priv->write_ref; } break; case AV1_OBU_TILE_LIST: diff --git a/libavcodec/cbs_av1.h b/libavcodec/cbs_av1.h index 1fb668ada4..675ed28f60 100644 --- a/libavcodec/cbs_av1.h +++ b/libavcodec/cbs_av1.h @@ -441,7 +441,9 @@ typedef struct CodedBitstreamAV1Context { int tile_cols; int tile_rows; - AV1ReferenceFrameState ref[AV1_NUM_REF_FRAMES]; + AV1ReferenceFrameState *ref; + AV1ReferenceFrameState read_ref[AV1_NUM_REF_FRAMES]; + AV1ReferenceFrameState write_ref[AV1_NUM_REF_FRAMES]; // Write buffer. uint8_t *write_buffer;