From patchwork Sat Jun 17 22:00:11 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: James Almer X-Patchwork-Id: 42178 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a20:c526:b0:117:ac03:c9de with SMTP id gm38csp2448416pzb; Sat, 17 Jun 2023 15:01:16 -0700 (PDT) X-Google-Smtp-Source: ACHHUZ4PCq7k8sppKM5QMkbhRHXwcfoKjBURg9XmVtsiLbNkBABHMKp/y2E2/qjupPFTtOQ3moWX X-Received: by 2002:a17:907:9309:b0:966:17b2:5b0b with SMTP id bu9-20020a170907930900b0096617b25b0bmr4925364ejc.49.1687039276583; Sat, 17 Jun 2023 15:01:16 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1687039276; cv=none; d=google.com; s=arc-20160816; b=BqBe66Cdsx3+g4KeDSbSH7jtDIhv9RjotoLHj7huxiy9Z2vvE12rqL/dg+QngPSYdA 4syt/C5MoVMcoE8XGP/J8KHsuQF+O5DD+afWDUGuuEyqm+3Q2BWEJOOZ3AViX5Uhlpko Z1vJLJPVbxKQRRc3I5uX7xtyl3cNjcKrNnl1ylb/SfWJcd2ityD1iCDSjPBmG6Q3VSId UV8YXjUz8/pBaoI4Y/tr+2Vsp2yUHNbtbKc61qT2q9ZziiNBNzmVc/OS5uCtO4N2OgiX 4jcW2oNFEMkwGZkToMUpa2oCX47rw0WPdJz4dZsAP1v4GR8eiOX1y9OTWBc0tOmSnTav 324g== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:reply-to:list-subscribe :list-help:list-post:list-archive:list-unsubscribe:list-id :precedence:subject:mime-version:references:in-reply-to:message-id :date:to:from:dkim-signature:delivered-to; bh=BiJwiXuVDxENdZf4wKYBFOk5X2OJZwF4nLqPSCPjuE8=; b=znif81qR97sQVFACNdizGJ5XFyJEsTLixoMTDHdZoiJZFOuXXacCf5WBUaEpEmUd2R PiynK8RyBS3nsnVayrXZ42RX4c1uCwdDnM34whll9iRojbJNkHiPo9H+7DZy4boFPboN hTyI2PV3zGNcE27sFiRBYwHfmvArBlxnV32SEcT54cuZKS3Uhyasmme1bnMZ6B8N8how 27BBLrGaDX29xrBVt1PqW873+rtL6Um1Qa+5ZG4aI8nxDQt3r6GqRCkYFn4z6ZmwLrk/ YjorVrhgCZxX4e1+1N7qyyIamtM6PwLlUuqyUWNbjRllgyDFG/u+ghR2oxGdENjK9tFa SUKQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20221208 header.b="bR44u/Bc"; 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; dmarc=fail (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id n9-20020a170906840900b00966147253f4si12002115ejx.662.2023.06.17.15.01.16; Sat, 17 Jun 2023 15:01:16 -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=@gmail.com header.s=20221208 header.b="bR44u/Bc"; 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; dmarc=fail (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id B59EF68BF4A; Sun, 18 Jun 2023 01:00:52 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-oa1-f41.google.com (mail-oa1-f41.google.com [209.85.160.41]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 4BB6568BF36 for ; Sun, 18 Jun 2023 01:00:46 +0300 (EEST) Received: by mail-oa1-f41.google.com with SMTP id 586e51a60fabf-1a9ae7cc01dso1400794fac.3 for ; Sat, 17 Jun 2023 15:00:46 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20221208; t=1687039244; x=1689631244; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:from:to:cc:subject:date:message-id :reply-to; bh=2A1WgaJtMbgKul7yaZFQrwTVnxA46bdcyNre3PNuN9I=; b=bR44u/BcVramSQx3ltS0kitfjOQMTFEXblYQv9qQPdfpHlhtDQjmJ78coUroZy1hn9 joZq5QH/tOIigBQcJXwatSdpVPdStgZayJ3e0wxNXA81yL0SQN36n9CtJO5CBAV2JgCm qVUm7NQ/oM9FOMMyJ8qxRHUWrRJlmkdLWdSLPMp20QFRxCyOwORySW7Ld9gUIq82qv3j labMA0vufLpaPavHefwtSHHAPLi6pl155QhYrVnnboR15K73ueNT7LdY/8YdLQhuG5Je CGru2Bvw41NeLFsYp3rp+jnXpI6EPlodfmEk9jc4bGJQ4MTnnb4V2h6/7KuhNJdvCVEA b5Jw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1687039244; x=1689631244; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=2A1WgaJtMbgKul7yaZFQrwTVnxA46bdcyNre3PNuN9I=; b=URVPxLMJloDD3EhWT95mZIRy/dxfYJFjKHCcpL/455ILnBktKclBoz7AVbebyVx6EP Q2/0XNmGToQX4V8QK6895O1OGMhuSU9W1J63WQoqy88S9f87873rq7gKlRUwRQq/DbQV JtNWA8/+mXceHmoRK+VG7aCtUgJ28zk9dS2Isze0ox20PmC6J9FtUf7EepnVPElgu8WC 1fMGmMOHcICz7yTuiwZOaq7Xho7mIOyj7985pSHhU37tNcW0jJOxlmOHpI6aP5/bWTGS D38C4i+UPe/mu3PwsQvSYyC0BoatKKTgoLYH8xj+fCBmNJwyg3hcF/romWcpsfZTJ7Ck mB6Q== X-Gm-Message-State: AC+VfDzf4t9oUh1WPEhnNr/fpD9CrTs4K+huQ8r4orQuSbiFHeXWq74H 25+kYFaGGGNd9YF/qhXuA/Y1j+EdqsU= X-Received: by 2002:a05:6870:51c3:b0:1a9:facf:158 with SMTP id b3-20020a05687051c300b001a9facf0158mr1137470oaj.35.1687039244368; Sat, 17 Jun 2023 15:00:44 -0700 (PDT) Received: from localhost.localdomain (host197.190-225-105.telecom.net.ar. [190.225.105.197]) by smtp.gmail.com with ESMTPSA id o42-20020a05687096aa00b0019280078be5sm6246497oaq.6.2023.06.17.15.00.43 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 17 Jun 2023 15:00:43 -0700 (PDT) From: James Almer To: ffmpeg-devel@ffmpeg.org Date: Sat, 17 Jun 2023 19:00:11 -0300 Message-ID: <20230617220015.12669-3-jamrial@gmail.com> X-Mailer: git-send-email 2.41.0 In-Reply-To: <20230617151848.1378-1-jamrial@gmail.com> References: <20230617151848.1378-1-jamrial@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 06/10] avcodec/evc_parse: split off deriving PoC 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 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: 3yN8BhW3r4/I Signed-off-by: James Almer --- libavcodec/evc_parse.c | 142 +++++++++++++++++++++-------------------- libavcodec/evc_parse.h | 5 ++ 2 files changed, 79 insertions(+), 68 deletions(-) diff --git a/libavcodec/evc_parse.c b/libavcodec/evc_parse.c index 1fe58c8050..262ef5aa39 100644 --- a/libavcodec/evc_parse.c +++ b/libavcodec/evc_parse.c @@ -187,6 +187,77 @@ static int evc_parse_slice_header(EVCParserContext *ctx, EVCParserSliceHeader *s return 0; } +int ff_evc_derive_poc(const EVCParamSets *ps, const EVCParserSliceHeader *sh, + EVCParserPoc *poc, enum EVCNALUnitType nalu_type, int tid) +{ + const EVCParserPPS *pps = ps->pps[sh->slice_pic_parameter_set_id]; + const EVCParserSPS *sps; + + if (!pps) + return AVERROR_INVALIDDATA; + + sps = ps->sps[pps->pps_seq_parameter_set_id]; + if (!sps) + return AVERROR_INVALIDDATA; + + if (sps->sps_pocs_flag) { + int PicOrderCntMsb = 0; + poc->prevPicOrderCntVal = poc->PicOrderCntVal; + + if (nalu_type == EVC_IDR_NUT) + PicOrderCntMsb = 0; + else { + int MaxPicOrderCntLsb = 1 << (sps->log2_max_pic_order_cnt_lsb_minus4 + 4); + int prevPicOrderCntLsb = poc->PicOrderCntVal & (MaxPicOrderCntLsb - 1); + int prevPicOrderCntMsb = poc->PicOrderCntVal - prevPicOrderCntLsb; + + if ((sh->slice_pic_order_cnt_lsb < prevPicOrderCntLsb) && + ((prevPicOrderCntLsb - sh->slice_pic_order_cnt_lsb) >= (MaxPicOrderCntLsb / 2))) + PicOrderCntMsb = prevPicOrderCntMsb + MaxPicOrderCntLsb; + else if ((sh->slice_pic_order_cnt_lsb > prevPicOrderCntLsb) && + ((sh->slice_pic_order_cnt_lsb - prevPicOrderCntLsb) > (MaxPicOrderCntLsb / 2))) + PicOrderCntMsb = prevPicOrderCntMsb - MaxPicOrderCntLsb; + else + PicOrderCntMsb = prevPicOrderCntMsb; + } + poc->PicOrderCntVal = PicOrderCntMsb + sh->slice_pic_order_cnt_lsb; + } else { + if (nalu_type == EVC_IDR_NUT) { + poc->PicOrderCntVal = 0; + poc->DocOffset = -1; + } else { + int SubGopLength = (int)pow(2.0, sps->log2_sub_gop_length); + if (tid == 0) { + poc->PicOrderCntVal = poc->prevPicOrderCntVal + SubGopLength; + poc->DocOffset = 0; + poc->prevPicOrderCntVal = poc->PicOrderCntVal; + } else { + int ExpectedTemporalId; + int PocOffset; + int prevDocOffset = poc->DocOffset; + + poc->DocOffset = (prevDocOffset + 1) % SubGopLength; + if (poc->DocOffset == 0) { + poc->prevPicOrderCntVal += SubGopLength; + ExpectedTemporalId = 0; + } else + ExpectedTemporalId = 1 + (int)log2(poc->DocOffset); + while (tid != ExpectedTemporalId) { + poc->DocOffset = (poc->DocOffset + 1) % SubGopLength; + if (poc->DocOffset == 0) + ExpectedTemporalId = 0; + else + ExpectedTemporalId = 1 + (int)log2(poc->DocOffset); + } + PocOffset = (int)(SubGopLength * ((2.0 * poc->DocOffset + 1) / (int)pow(2.0, tid) - 2)); + poc->PicOrderCntVal = poc->prevPicOrderCntVal + PocOffset; + } + } + } + + return 0; +} + int ff_evc_parse_nal_unit(EVCParserContext *ctx, const uint8_t *buf, int buf_size, void *logctx) { int nalu_type, nalu_size; @@ -299,8 +370,6 @@ int ff_evc_parse_nal_unit(EVCParserContext *ctx, const uint8_t *buf, int buf_siz case EVC_IDR_NUT: // Coded slice of a IDR or non-IDR picture case EVC_NOIDR_NUT: { EVCParserSliceHeader sh; - const EVCParserSPS *sps; - const EVCParserPPS *pps; int ret; ret = evc_parse_slice_header(ctx, &sh, data, nalu_size); @@ -331,72 +400,9 @@ int ff_evc_parse_nal_unit(EVCParserContext *ctx, const uint8_t *buf, int buf_siz // POC (picture order count of the current picture) derivation // @see ISO/IEC 23094-1:2020(E) 8.3.1 Decoding process for picture order count - pps = ctx->ps.pps[sh.slice_pic_parameter_set_id]; - sps = ctx->ps.sps[pps->pps_seq_parameter_set_id]; - av_assert0(sps && pps); - - if (sps->sps_pocs_flag) { - - int PicOrderCntMsb = 0; - ctx->poc.prevPicOrderCntVal = ctx->poc.PicOrderCntVal; - - if (nalu_type == EVC_IDR_NUT) - PicOrderCntMsb = 0; - else { - int MaxPicOrderCntLsb = 1 << (sps->log2_max_pic_order_cnt_lsb_minus4 + 4); - - int prevPicOrderCntLsb = ctx->poc.PicOrderCntVal & (MaxPicOrderCntLsb - 1); - int prevPicOrderCntMsb = ctx->poc.PicOrderCntVal - prevPicOrderCntLsb; - - - if ((sh.slice_pic_order_cnt_lsb < prevPicOrderCntLsb) && - ((prevPicOrderCntLsb - sh.slice_pic_order_cnt_lsb) >= (MaxPicOrderCntLsb / 2))) - - PicOrderCntMsb = prevPicOrderCntMsb + MaxPicOrderCntLsb; - - else if ((sh.slice_pic_order_cnt_lsb > prevPicOrderCntLsb) && - ((sh.slice_pic_order_cnt_lsb - prevPicOrderCntLsb) > (MaxPicOrderCntLsb / 2))) - - PicOrderCntMsb = prevPicOrderCntMsb - MaxPicOrderCntLsb; - - else - PicOrderCntMsb = prevPicOrderCntMsb; - } - ctx->poc.PicOrderCntVal = PicOrderCntMsb + sh.slice_pic_order_cnt_lsb; - - } else { - if (nalu_type == EVC_IDR_NUT) { - ctx->poc.PicOrderCntVal = 0; - ctx->poc.DocOffset = -1; - } else { - int SubGopLength = (int)pow(2.0, sps->log2_sub_gop_length); - if (tid == 0) { - ctx->poc.PicOrderCntVal = ctx->poc.prevPicOrderCntVal + SubGopLength; - ctx->poc.DocOffset = 0; - ctx->poc.prevPicOrderCntVal = ctx->poc.PicOrderCntVal; - } else { - int ExpectedTemporalId; - int PocOffset; - int prevDocOffset = ctx->poc.DocOffset; - - ctx->poc.DocOffset = (prevDocOffset + 1) % SubGopLength; - if (ctx->poc.DocOffset == 0) { - ctx->poc.prevPicOrderCntVal += SubGopLength; - ExpectedTemporalId = 0; - } else - ExpectedTemporalId = 1 + (int)log2(ctx->poc.DocOffset); - while (tid != ExpectedTemporalId) { - ctx->poc.DocOffset = (ctx->poc.DocOffset + 1) % SubGopLength; - if (ctx->poc.DocOffset == 0) - ExpectedTemporalId = 0; - else - ExpectedTemporalId = 1 + (int)log2(ctx->poc.DocOffset); - } - PocOffset = (int)(SubGopLength * ((2.0 * ctx->poc.DocOffset + 1) / (int)pow(2.0, tid) - 2)); - ctx->poc.PicOrderCntVal = ctx->poc.prevPicOrderCntVal + PocOffset; - } - } - } + ret = ff_evc_derive_poc(&ctx->ps, &sh, &ctx->poc, nalu_type, tid); + if (ret < 0) + return ret; ctx->output_picture_number = ctx->poc.PicOrderCntVal; ctx->key_frame = (nalu_type == EVC_IDR_NUT) ? 1 : 0; diff --git a/libavcodec/evc_parse.h b/libavcodec/evc_parse.h index 2748f8dfbf..97825efcd5 100644 --- a/libavcodec/evc_parse.h +++ b/libavcodec/evc_parse.h @@ -159,4 +159,9 @@ int ff_evc_get_temporal_id(const uint8_t *bits, int bits_size, void *logctx); int ff_evc_parse_nal_unit(EVCParserContext *ctx, const uint8_t *buf, int buf_size, void *logctx); +// POC (picture order count of the current picture) derivation +// @see ISO/IEC 23094-1:2020(E) 8.3.1 Decoding process for picture order count +int ff_evc_derive_poc(const EVCParamSets *ps, const EVCParserSliceHeader *sh, + EVCParserPoc *poc, enum EVCNALUnitType nalu_type, int tid); + #endif /* AVCODEC_EVC_PARSE_H */