From patchwork Mon Sep 26 07:23:15 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Xiang, Haihao" X-Patchwork-Id: 38323 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a20:3b1c:b0:96:9ee8:5cfd with SMTP id c28csp2077866pzh; Mon, 26 Sep 2022 00:26:13 -0700 (PDT) X-Google-Smtp-Source: AMsMyM4ji3rt6R/ddpRNeqgVOql/OG3ONHsuRNXnBj4hVCoN9ID0QOn9u55Szkgt+84CXx0RB4bj X-Received: by 2002:a50:cdc2:0:b0:456:ecb7:30ad with SMTP id h2-20020a50cdc2000000b00456ecb730admr11965168edj.37.1664177172753; Mon, 26 Sep 2022 00:26:12 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1664177172; cv=none; d=google.com; s=arc-20160816; b=NmS1V++Q8WCF4URBuxyx4juUG/yxZsbh6z050T5syfnIwdWKG53Py43Cw3R00XN2EN aEH6WDQmmu96nmQZSBbmuyF1tQQCozBJP+Kwd5nCmxWwqgGrwVNnBwLlczBZVjDsnKhs yZgwD8FpT4zNlSIW7G0e6WGgOKt6qHO1LdwgkbKee2WOZzSgp9tA3GVYxe5VLBkYLcOe o2nsHevuqxnuKqT9Bfqlc6jvgAnh1CZ0b5mvif9vOO9Rvtvi4+8kf46Uv7oNURFs+XwS 7lfkv9C+tyyvTiXkewsutD7ph3khT/szTeKjOkFdQZ6gKLGgNJfe/eoxC1n8rXS9lJ1H PhFQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:mime-version:cc:reply-to :list-subscribe:list-help:list-post:list-archive:list-unsubscribe :list-id:precedence:subject:message-id:date:to:from:dkim-signature :delivered-to; bh=0WQABI+mraJWDo5emQ4i6IQLh/O0uOOIskT1m3jEsFs=; b=rI5LN2eRcFGZUWzZ5M+kSGbhh9SLgXd4M0zbNJq6UOg8Dl9lX1otFxdy0fD42kBPZ9 C8vBEd12b3znEs1BSz5Xvkj4gjuO45gBjRz17dA8dHxa9oHctn8jXTgofrX5ZZ1FydsW aojN1GdwnHFV+RxEHmJ/9DGsWgzul/oAX1+4KKa5Iy2nENqFZiZGKoscJzncDZswP3BR nGDL8rGSUwiD8OfXbH74ceXdfzSdhGPi8lPSpenFYjfYVLRSKDAt/fS5V/FHQVLxpi2g ejp1fbAuH3xadoCojmX4FvstDrGVG8NRm7jp4BhtSk+NtyxP7aVrOxkPrwnksymPJez2 y4Cw== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@intel.com header.s=Intel header.b=k4h61MuW; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id r7-20020a50aac7000000b0044611122003si15051343edc.599.2022.09.26.00.26.12; Mon, 26 Sep 2022 00:26:12 -0700 (PDT) Received-SPF: pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) client-ip=79.124.17.100; Authentication-Results: mx.google.com; dkim=neutral (body hash did not verify) header.i=@intel.com header.s=Intel header.b=k4h61MuW; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id E669E68B408; Mon, 26 Sep 2022 10:26:08 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mga01.intel.com (mga01.intel.com [192.55.52.88]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 601E468B021 for ; Mon, 26 Sep 2022 10:26:01 +0300 (EEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1664177166; x=1695713166; h=from:to:cc:subject:date:message-id; bh=+0J4wm+TxFaFxpzF9uCUeFZR8KhgB3nWRhGM5xSg+/I=; b=k4h61MuWWf2HBNQSfHJj7pspk7rKru2g0P68ygkIjV6GhG67rdolTwFE T3tZwUzMomBPCT8s9stLKuESCBCjQF/HC4Xs2lL5WX2+NSygqMW08qqmW Rs2OWusTHQN8UkTcIu98tvowzvdOfDfmy7wt1KCSTQvOcDgcRCSUkBU35 uHHCZJI47k+ZEW1G8qK9XxYJe+AiTrUsjYEhlSKt2B8hzrtKg3xMcLvSs F47Fo+q1MBID4YEi9A9lrSYOyA/n9siaiakje9Op4gA3MQo+Kmm+7Rbnr 7Krt4lOvnCCMXuT8l/JaHFKQpzXKnseI/zWMYP+qPCXgjYAfryRGuyso1 Q==; X-IronPort-AV: E=McAfee;i="6500,9779,10481"; a="327304849" X-IronPort-AV: E=Sophos;i="5.93,345,1654585200"; d="scan'208";a="327304849" Received: from orsmga003.jf.intel.com ([10.7.209.27]) by fmsmga101.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 26 Sep 2022 00:25:57 -0700 X-IronPort-AV: E=McAfee;i="6500,9779,10481"; a="572109611" X-IronPort-AV: E=Sophos;i="5.93,345,1654585200"; d="scan'208";a="572109611" Received: from xhh-dg164.sh.intel.com ([10.238.5.169]) by orsmga003-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 26 Sep 2022 00:25:55 -0700 From: "Xiang, Haihao" To: ffmpeg-devel@ffmpeg.org Date: Mon, 26 Sep 2022 15:23:15 +0800 Message-Id: <20220926072315.26559-1-haihao.xiang@intel.com> X-Mailer: git-send-email 2.17.1 Subject: [FFmpeg-devel] [PATCH] lavc/cbs_av1: restore CodedBitstreamAV1Context when AVERROR(ENOSPC) X-BeenThere: ffmpeg-devel@ffmpeg.org X-Mailman-Version: 2.1.29 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 Cc: Haihao Xiang MIME-Version: 1.0 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: HmtcMu4cIpPx From: Haihao Xiang The current pbc might be small for an obu frame, so a new pbc is required then parse this obu frame again. Because CodedBitstreamAV1Context has already been updated for this obu frame, we need to restore CodedBitstreamAV1Context, otherwise CodedBitstreamAV1Context doesn't match this obu frame when parsing obu frame again, e.g. CodedBitstreamAV1Context.order_hint. $ ffmpeg -i input.ivf -c:v copy -f null - [...] [av1_frame_merge @ 0x558bc3d6f880] ref_order_hint[i] does not match inferred value: 20, but should be 22. [av1_frame_merge @ 0x558bc3d6f880] Failed to write unit 1 (type 6). [av1_frame_merge @ 0x558bc3d6f880] Failed to write packet. [obu @ 0x558bc3d6e040] av1_frame_merge filter failed to send output packet --- libavcodec/cbs_av1.c | 85 ++++++++++++++++++++++++++++++++++---------- 1 file changed, 67 insertions(+), 18 deletions(-) diff --git a/libavcodec/cbs_av1.c b/libavcodec/cbs_av1.c index 154d9156cf..585bc72cdb 100644 --- a/libavcodec/cbs_av1.c +++ b/libavcodec/cbs_av1.c @@ -1058,15 +1058,33 @@ static int cbs_av1_write_obu(CodedBitstreamContext *ctx, AV1RawTileData *td; size_t header_size; int err, start_pos, end_pos, data_pos; + CodedBitstreamAV1Context av1ctx; // OBUs in the normal bitstream format must contain a size field // in every OBU (in annex B it is optional, but we don't support // writing that). obu->header.obu_has_size_field = 1; + av1ctx = *priv; + + if (priv->sequence_header_ref) { + av1ctx.sequence_header_ref = av_buffer_ref(priv->sequence_header_ref); + if (!av1ctx.sequence_header_ref) { + err = AVERROR(ENOMEM); + goto error; + } + } + + if (priv->frame_header_ref) { + av1ctx.frame_header_ref = av_buffer_ref(priv->frame_header_ref); + if (!av1ctx.frame_header_ref) { + err = AVERROR(ENOMEM); + goto error; + } + } err = cbs_av1_write_obu_header(ctx, pbc, &obu->header); if (err < 0) - return err; + goto error; if (obu->header.obu_has_size_field) { pbc_tmp = *pbc; @@ -1084,18 +1102,21 @@ static int cbs_av1_write_obu(CodedBitstreamContext *ctx, err = cbs_av1_write_sequence_header_obu(ctx, pbc, &obu->obu.sequence_header); if (err < 0) - return err; + goto error; av_buffer_unref(&priv->sequence_header_ref); priv->sequence_header = NULL; err = ff_cbs_make_unit_refcounted(ctx, unit); if (err < 0) - return err; + goto error; priv->sequence_header_ref = av_buffer_ref(unit->content_ref); - if (!priv->sequence_header_ref) - return AVERROR(ENOMEM); + if (!priv->sequence_header_ref) { + err = AVERROR(ENOMEM); + goto error; + } + priv->sequence_header = &obu->obu.sequence_header; } break; @@ -1103,7 +1124,7 @@ static int cbs_av1_write_obu(CodedBitstreamContext *ctx, { err = cbs_av1_write_temporal_delimiter_obu(ctx, pbc); if (err < 0) - return err; + goto error; } break; case AV1_OBU_FRAME_HEADER: @@ -1115,7 +1136,7 @@ static int cbs_av1_write_obu(CodedBitstreamContext *ctx, AV1_OBU_REDUNDANT_FRAME_HEADER, NULL); if (err < 0) - return err; + goto error; } break; case AV1_OBU_TILE_GROUP: @@ -1123,7 +1144,7 @@ static int cbs_av1_write_obu(CodedBitstreamContext *ctx, err = cbs_av1_write_tile_group_obu(ctx, pbc, &obu->obu.tile_group); if (err < 0) - return err; + goto error; td = &obu->obu.tile_group.tile_data; } @@ -1132,7 +1153,7 @@ static int cbs_av1_write_obu(CodedBitstreamContext *ctx, { err = cbs_av1_write_frame_obu(ctx, pbc, &obu->obu.frame, NULL); if (err < 0) - return err; + goto error; td = &obu->obu.frame.tile_group.tile_data; } @@ -1141,7 +1162,7 @@ static int cbs_av1_write_obu(CodedBitstreamContext *ctx, { err = cbs_av1_write_tile_list_obu(ctx, pbc, &obu->obu.tile_list); if (err < 0) - return err; + goto error; td = &obu->obu.tile_list.tile_data; } @@ -1150,18 +1171,19 @@ static int cbs_av1_write_obu(CodedBitstreamContext *ctx, { err = cbs_av1_write_metadata_obu(ctx, pbc, &obu->obu.metadata); if (err < 0) - return err; + goto error; } break; case AV1_OBU_PADDING: { err = cbs_av1_write_padding_obu(ctx, pbc, &obu->obu.padding); if (err < 0) - return err; + goto error; } break; default: - return AVERROR(ENOSYS); + err = AVERROR(ENOSYS); + goto error; } end_pos = put_bits_count(pbc); @@ -1172,7 +1194,7 @@ static int cbs_av1_write_obu(CodedBitstreamContext *ctx, // Add trailing bits and recalculate. err = cbs_av1_write_trailing_bits(ctx, pbc, 8 - end_pos % 8); if (err < 0) - return err; + goto error; end_pos = put_bits_count(pbc); obu->obu_size = header_size = (end_pos - start_pos + 7) / 8; } else { @@ -1190,14 +1212,36 @@ static int cbs_av1_write_obu(CodedBitstreamContext *ctx, *pbc = pbc_tmp; err = cbs_av1_write_leb128(ctx, pbc, "obu_size", obu->obu_size); if (err < 0) - return err; + goto error; data_pos = put_bits_count(pbc) / 8; flush_put_bits(pbc); av_assert0(data_pos <= start_pos); - if (8 * obu->obu_size > put_bits_left(pbc)) - return AVERROR(ENOSPC); + if (8 * obu->obu_size > put_bits_left(pbc)) { + av_buffer_unref(&priv->sequence_header_ref); + av_buffer_unref(&priv->frame_header_ref); + *priv = av1ctx; + + if (av1ctx.sequence_header_ref) { + priv->sequence_header_ref = av_buffer_ref(av1ctx.sequence_header_ref); + if (!priv->sequence_header_ref) { + err = AVERROR(ENOMEM); + goto error; + } + } + + if (av1ctx.frame_header_ref) { + priv->frame_header_ref = av_buffer_ref(av1ctx.frame_header_ref); + if (!priv->frame_header_ref) { + err = AVERROR(ENOMEM); + goto error; + } + } + + err = AVERROR(ENOSPC); + goto error; + } if (obu->obu_size > 0) { memmove(pbc->buf + data_pos, @@ -1213,8 +1257,13 @@ static int cbs_av1_write_obu(CodedBitstreamContext *ctx, // OBU data must be byte-aligned. av_assert0(put_bits_count(pbc) % 8 == 0); + err = 0; - return 0; +error: + av_buffer_unref(&av1ctx.sequence_header_ref); + av_buffer_unref(&av1ctx.frame_header_ref); + + return err; } static int cbs_av1_assemble_fragment(CodedBitstreamContext *ctx,