From patchwork Tue Apr 18 10:29:42 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Dawid Kozinski X-Patchwork-Id: 41232 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a20:4645:b0:e3:3194:9d20 with SMTP id eb5csp3037633pzb; Tue, 18 Apr 2023 03:30:12 -0700 (PDT) X-Google-Smtp-Source: AKy350ZNqplHKIXZ/RE98i7+FmicRl5rVzP/xIxgXlUp/zliT0Xh3n98ulGRIt41moeBKtKLIj40 X-Received: by 2002:a17:906:364b:b0:94e:4586:f135 with SMTP id r11-20020a170906364b00b0094e4586f135mr10711314ejb.6.1681813812438; Tue, 18 Apr 2023 03:30:12 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1681813812; cv=none; d=google.com; s=arc-20160816; b=jRRpFbyxeQf8ETJA6nxEV3NOn4k+WQhg0xJA1n8kllP3I/yd7ahJj7ZEi71nHE3yrR OVRcjRLme5SfDvInEEhGzCE0OYbJHJyiXZxYn2G/fvhco087/JwCE5PcFEFQ0YAv3HbR YK9GxJ/z2vFr99xyWh0fLFjzud5pbCXHoch86m5hQJmMEwKu+LmbwjBCF0y5CtH6+edP 4vCnDdnXgXIdaZhegavI1C4M3G/VdYLlYaHmDGpHT0E5k1dLeXrl8t7LzP5eiH+seVOl /Gx+Le9IQOXXG+FAgOjuvTOgCs9Rk50d+ehmgH7TZoutOyj863ntpD0BqsDzwkEwzSyy iVXg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:cc:reply-to :list-subscribe:list-help:list-post:list-archive:list-unsubscribe :list-id:precedence:subject:references:cms-type:mime-version :message-id:date:to:from:dkim-signature:dkim-filter:delivered-to; bh=ws/8JOQwyr9qFe0UKkPj21mobxvwZ1bJbK+7xbQUOZs=; b=euYnTkjBtbhcaLU75HTmZ4wQFL6OaHF/QgFHSc0UIRJIqbauKpGmoHefnCFBj9GMRz CtUZ0s+74n7DtsMN4x3jxV3Sr1b6IUfXgqkmx9rIXtGK9pL7Rmwk24VOVTF/wo226zPF pxO44efnKXulZdXsreeBhAjMXJg5o5ZwjlFpK6ve8tiDg3BU4+KtwCWkn8MzgzTljC3M xBYwAD9FZFx+gk239wnZvpJMGJth1hqoKM9ZmUuxj1xQ7m/o3D0QbKDQh3/u007ndqmA gwQUFdm4n/h2LEgpmeXjTBp4ef5D90h8qDqbBXNXAHaIx63QJsLP7TrdgPi0s3E/pstk uYdw== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@samsung.com header.s=mail20170921 header.b="bF4E/WCJ"; 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=NONE dis=NONE) header.from=samsung.com Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id gc31-20020a1709072b1f00b0094ee0495c04si8535512ejc.286.2023.04.18.03.30.11; Tue, 18 Apr 2023 03:30: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=@samsung.com header.s=mail20170921 header.b="bF4E/WCJ"; 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=NONE dis=NONE) header.from=samsung.com Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 5EE3768BE25; Tue, 18 Apr 2023 13:30:07 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mailout1.w1.samsung.com (mailout1.w1.samsung.com [210.118.77.11]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 1F8D668BD1E for ; Tue, 18 Apr 2023 13:29:59 +0300 (EEST) Received: from eucas1p1.samsung.com (unknown [182.198.249.206]) by mailout1.w1.samsung.com (KnoxPortal) with ESMTP id 20230418102957euoutp018f07dfe581eaad1d84c2d21c35354b1d~XALzf3hxs1131111311euoutp01q for ; Tue, 18 Apr 2023 10:29:57 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 mailout1.w1.samsung.com 20230418102957euoutp018f07dfe581eaad1d84c2d21c35354b1d~XALzf3hxs1131111311euoutp01q DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=samsung.com; s=mail20170921; t=1681813797; bh=gG0AXIOQTmcA+MeXwa4gwJZPHRBfcrLVsKFzmJTNQGs=; h=From:To:Cc:Subject:Date:References:From; b=bF4E/WCJivxiPsaEsA+4wHx+b5eiHYZhZ72S28mpSnyEqfrknA4NHbu1IabOVlbux 53uP+pPiwr8+npHiPxvTRKiem7Cozab+MZ6I7z4gW+CppW3DC9Ud2J24/597zowUIv jjhiupKYnKG+GYUHs44fztD/jW5Xzvxd/bBaz/5U= Received: from eusmges3new.samsung.com (unknown [203.254.199.245]) by eucas1p1.samsung.com (KnoxPortal) with ESMTP id 20230418102956eucas1p1ec4d1d3c5e55239eea7d405b67dfc9bb~XALzVzeSv2952229522eucas1p18; Tue, 18 Apr 2023 10:29:56 +0000 (GMT) Received: from eucas1p2.samsung.com ( [182.198.249.207]) by eusmges3new.samsung.com (EUCPMTA) with SMTP id 0F.5B.10014.4217E346; Tue, 18 Apr 2023 11:29:56 +0100 (BST) Received: from eusmtrp2.samsung.com (unknown [182.198.249.139]) by eucas1p1.samsung.com (KnoxPortal) with ESMTPA id 20230418102956eucas1p16e14d45966619ad29b8a154436ea4d40~XALzBsFat2101021010eucas1p1c; Tue, 18 Apr 2023 10:29:56 +0000 (GMT) Received: from eusmgms1.samsung.com (unknown [182.198.249.179]) by eusmtrp2.samsung.com (KnoxPortal) with ESMTP id 20230418102956eusmtrp2bda0010adcdbd7bdacdc018625e603b0~XALzBDKMV1681416814eusmtrp2w; Tue, 18 Apr 2023 10:29:56 +0000 (GMT) X-AuditID: cbfec7f5-b8bff7000000271e-30-643e71247f44 Received: from eusmtip1.samsung.com ( [203.254.199.221]) by eusmgms1.samsung.com (EUCPMTA) with SMTP id 9F.D5.22108.4217E346; Tue, 18 Apr 2023 11:29:56 +0100 (BST) Received: from AMDN5164.EU.corp.samsungelectronics.net (unknown [106.210.132.171]) by eusmtip1.samsung.com (KnoxPortal) with ESMTPA id 20230418102956eusmtip1139e04f4dc234005b543f6f4b174a649~XALyscQhN2245322453eusmtip1O; Tue, 18 Apr 2023 10:29:56 +0000 (GMT) From: Dawid Kozinski To: d.frankiewic@samsung.com, ffmpeg-devel@ffmpeg.org Date: Tue, 18 Apr 2023 12:29:42 +0200 Message-Id: <20230418102942.594-1-d.kozinski@samsung.com> X-Mailer: git-send-email 2.37.3.windows.1 MIME-Version: 1.0 X-Unsent: 1 X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFnrNIsWRmVeSWpSXmKPExsWy7djP87oqhXYpBk+e61t8ufaF2WLlt98s Ft8+nWF2YPb4s2gzi0ffllWMAUxRXDYpqTmZZalF+nYJXBk/P59iKpgnU3Fz8yX2BsYvol2M nBwSAiYSm2ecZ+pi5OIQEljBKLHn8C4WCOcLo8SxyfuhMp8ZJc5/38wI0/JyQgs7iC0ksJxR 4s5cdoiidiaJYxvesoEk2AR0JV5+eMQEYosImEqcbN4LFmcW0JZYd/c7mC0s4Crxa8ZpFhCb RUBVYub7aWALeAUsJY7Pf8EMsUxTYsKWOUwQcUGJkzOfsEDEuSXWzbrECjFTXqJ562xmkCMk BL6yS5x/eQiqyEXiwPK5TBC2sMSr41vYIWwZif875wPFOYDsYolD/Q4QZo3EoR/pEBXWEm8b jzOChJmBTli/Sx8i7CjRfm0+K0Q1n8SNt4IQB/BJTNo2nRkizCvR0SYEYapI9HWKQTRKSTxd NgfqJQ+J0z+nMU1gVJyF5KtZSD6ZhbB2ASPzKkbx1NLi3PTUYuO81HK94sTc4tK8dL3k/NxN jMD0cPrf8a87GFe8+qh3iJGJg/EQowQHs5II7xlXqxQh3pTEyqrUovz4otKc1OJDjNIcLEri vNq2J5OFBNITS1KzU1MLUotgskwcnFINTFV167fs7YvZtSApNTfF3e5/R/zpd6EPvX50zeLJ uS95PS8/XXr9NrXMvqMVx2cs37nB//OtqQ/3Li8xbJIQ3+AoqfCvWTZebqKVCNc01nLpdfHT P7unvA889uDqrWT+8/c2FnDL31Fp/BS9TsHcNZnhdk6vR8eJNXcF9ZaFil52c5peFW/lpvbo 1JdddiI5GyQKDtx3uLPErFbhy5RjWiq10YvfvlRjdV/2PnTxqvXyCb+OzasLWntF8pjv+6rV nQtZ80z1cnSmMcYmRM95btUSGHSSgfemmQTT+XRruXVKpupRUosPM195r9E3n/HVp43bVQ9s 9Hst5nuj+IK+r1q124HpJkuOLLzx20pxuhJLcUaioRZzUXEiAFa6OX5+AwAA X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFrrELMWRmVeSWpSXmKPExsVy+t/xu7oqhXYpBps+SFt8ufaF2WLlt98s Ft8+nWF2YPb4s2gzi0ffllWMAUxRejZF+aUlqQoZ+cUltkrRhhZGeoaWFnpGJpZ6hsbmsVZG pkr6djYpqTmZZalF+nYJehk/P59iKpgnU3Fz8yX2BsYvol2MnBwSAiYSLye0sHcxcnEICSxl lDj9ZgMzREJKYunSRYwQtrDEn2tdbBBFrUwSbauWMIEk2AR0JV5+eARmiwiYS1xcdwusgVlA W2Ld3e9sILawgKvErxmnWUBsFgFViZnvp4HV8ApYShyf/wJqmabEhC1zmCDighInZz5hgYhz S6ybdYkVYqa8RPPW2cwTGPlnISmbhSS1gJFpFaNIamlxbnpusaFecWJucWleul5yfu4mRmDg bjv2c/MOxnmvPuodYmTiYDzEKMHBrCTCe8bVKkWINyWxsiq1KD++qDQntfgQoynQrROZpUST 84Gxk1cSb2hmYGpoYmZpYGppZqwkzutZ0JEoJJCeWJKanZpakFoE08fEwSnVwGT5zOfrcoar 7HGuIoasX3pV7X4zJy0yY5he7PLtaMBHoXfhnEsvGfee3lbjrudTfDNEzO/Bq99dVyN9V0ss Nj2tc/QUU6/BrWiXnswLE9Y22v2Sv7xHS2x7e9x66UfPvrkyP9BYdnvzZIcem1u1IjP/b+r1 VmlZK8CQfiDlupjMXVZJL3Z7zsAHOaseLQpn//OrubapRu5EVdtsy+514s4fdvPwMGbOlcnO 4ZVYJfuiceE740PiMj/aJWJF9x3UVFYJvd7NGx0S5FOz1OvEGXk5TnWmb6eKKp98eb1jX+3n +mu6RrrrG5pmC6Z0TN7vVnDxptzmPdW+jhv/qi6f96CF9Yfr1u+qlj6Gku+VlViKMxINtZiL ihMB4jSn4OUCAAA= X-CMS-MailID: 20230418102956eucas1p16e14d45966619ad29b8a154436ea4d40 X-Msg-Generator: CA X-RootMTR: 20230418102956eucas1p16e14d45966619ad29b8a154436ea4d40 X-EPHeader: CA CMS-TYPE: 201P X-CMS-RootMailID: 20230418102956eucas1p16e14d45966619ad29b8a154436ea4d40 References: Subject: [FFmpeg-devel] [PATCH v20 01/10] avcodec/evc: MPEG-5 EVC codec registration 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: Dawid Kozinski Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: CTWHhupOviBy Added prerequisites that must be met before providing support for the MPEG-5 EVC codec - Added new entry to codec IDs list - Added new entry to the codec descriptor list - Bumped libavcodec minor version - Added profiles for EVC codec Signed-off-by: Dawid Kozinski --- libavcodec/avcodec.h | 3 +++ libavcodec/codec_desc.c | 8 ++++++++ libavcodec/codec_id.h | 1 + libavcodec/profiles.c | 6 ++++++ libavcodec/profiles.h | 1 + libavcodec/version.h | 2 +- 6 files changed, 20 insertions(+), 1 deletion(-) diff --git a/libavcodec/avcodec.h b/libavcodec/avcodec.h index 1e91b9cb53..ffc07af862 100644 --- a/libavcodec/avcodec.h +++ b/libavcodec/avcodec.h @@ -1707,6 +1707,9 @@ typedef struct AVCodecContext { #define FF_PROFILE_KLVA_SYNC 0 #define FF_PROFILE_KLVA_ASYNC 1 +#define FF_PROFILE_EVC_BASELINE 0 +#define FF_PROFILE_EVC_MAIN 1 + /** * level * - encoding: Set by user. diff --git a/libavcodec/codec_desc.c b/libavcodec/codec_desc.c index efdcb59bc9..06454849c7 100644 --- a/libavcodec/codec_desc.c +++ b/libavcodec/codec_desc.c @@ -1923,6 +1923,14 @@ static const AVCodecDescriptor codec_descriptors[] = { .long_name = NULL_IF_CONFIG_SMALL("ViewQuest VQC"), .props = AV_CODEC_PROP_LOSSY, }, + { + .id = AV_CODEC_ID_EVC, + .type = AVMEDIA_TYPE_VIDEO, + .name = "evc", + .long_name = NULL_IF_CONFIG_SMALL("MPEG-5 EVC (Essential Video Coding)"), + .props = AV_CODEC_PROP_LOSSY | AV_CODEC_PROP_REORDER, + .profiles = NULL_IF_CONFIG_SMALL(ff_evc_profiles), + }, /* various PCM "codecs" */ { diff --git a/libavcodec/codec_id.h b/libavcodec/codec_id.h index 64df9699f4..c6c07bd18c 100644 --- a/libavcodec/codec_id.h +++ b/libavcodec/codec_id.h @@ -320,6 +320,7 @@ enum AVCodecID { AV_CODEC_ID_WBMP, AV_CODEC_ID_MEDIA100, AV_CODEC_ID_VQC, + AV_CODEC_ID_EVC, /* various PCM "codecs" */ AV_CODEC_ID_FIRST_AUDIO = 0x10000, ///< A dummy id pointing at the start of audio codecs diff --git a/libavcodec/profiles.c b/libavcodec/profiles.c index 545626337c..c646a3f54d 100644 --- a/libavcodec/profiles.c +++ b/libavcodec/profiles.c @@ -194,4 +194,10 @@ const AVProfile ff_arib_caption_profiles[] = { { FF_PROFILE_UNKNOWN } }; +const AVProfile ff_evc_profiles[] = { + { FF_PROFILE_EVC_BASELINE, "Baseline" }, + { FF_PROFILE_EVC_MAIN, "Main" }, + { FF_PROFILE_UNKNOWN }, +}; + #endif /* !CONFIG_SMALL */ diff --git a/libavcodec/profiles.h b/libavcodec/profiles.h index 1d523992fc..c0eacae5c1 100644 --- a/libavcodec/profiles.h +++ b/libavcodec/profiles.h @@ -74,5 +74,6 @@ extern const AVProfile ff_sbc_profiles[]; extern const AVProfile ff_prores_profiles[]; extern const AVProfile ff_mjpeg_profiles[]; extern const AVProfile ff_arib_caption_profiles[]; +extern const AVProfile ff_evc_profiles[]; #endif /* AVCODEC_PROFILES_H */ diff --git a/libavcodec/version.h b/libavcodec/version.h index 230d5fa13e..35947dad28 100644 --- a/libavcodec/version.h +++ b/libavcodec/version.h @@ -30,7 +30,7 @@ #include "version_major.h" #define LIBAVCODEC_VERSION_MINOR 9 -#define LIBAVCODEC_VERSION_MICRO 100 +#define LIBAVCODEC_VERSION_MICRO 101 #define LIBAVCODEC_VERSION_INT AV_VERSION_INT(LIBAVCODEC_VERSION_MAJOR, \ LIBAVCODEC_VERSION_MINOR, \ From patchwork Tue Apr 18 10:30:12 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Dawid Kozinski X-Patchwork-Id: 41233 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a20:4645:b0:e3:3194:9d20 with SMTP id eb5csp3037857pzb; Tue, 18 Apr 2023 03:30:37 -0700 (PDT) X-Google-Smtp-Source: AKy350aOFRN63S5GBT+7aHHsn6+GzC7f9Kr+aSNGEk89p7tAemEs1pr5lzxzy+TZZQFxSVHqCbmD X-Received: by 2002:aa7:dbc9:0:b0:504:a360:e611 with SMTP id v9-20020aa7dbc9000000b00504a360e611mr1622846edt.13.1681813836823; Tue, 18 Apr 2023 03:30:36 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1681813836; cv=none; d=google.com; s=arc-20160816; b=ErL9roUxKqyBWAZ48TOtRn5QlKjMBIAnnAQVpRSCMvHxx7BVsKdeb0AHLirpUxWo0m 65KyvfV3Khx1P7fOYSMbDBqumpRx1eEzAixF3Un19iOInWK2NPYz8mcEw0z78XtdHXaK PS64fV5SY2hM+1LdxsAtLDUl1VU2EPG5mV04NsUnD/wkNH/usWJLa4YJLtrg/Q+92yZH NAJ7LyXHc4dEUnad1S/RClEv7JmHURYESU1dsLUhRYapE0a7A9yKQLfxEnlTBkVk1paX fjXzrH6Zs3XY2p7l2BpLZ+HKIqPzw/21HVhkRnonwjR/KjgKyoGtC54rzPP6jLTPs/3K QhIw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:cc:reply-to :list-subscribe:list-help:list-post:list-archive:list-unsubscribe :list-id:precedence:subject:references:cms-type:mime-version :message-id:date:to:from:dkim-signature:dkim-filter:delivered-to; bh=wJu6jqsCcqT0X83mWlc6PLuzUn1a3qOL6VjQ0rIRk9g=; b=tplaLLwe0eohfsWW8B5YQO+3eHVAkK9WVqpWDyXbvrgUnTHbzzEwM8MCrCRByi7c/p syDiwGbmlkauoPVPFNLCYE8yq4K8JHrdNgmd3Zm9sdKNWoI59jKqAFWB8QvXLixCmzVc j7XhH6C+R7ZtEfhaaPaM2iJ8JdVoK3t8DDNp8IoflLfHVnzdlPJqM/lLZjn5hIe0Oazs 8gEnMqifTVzRXhckIuv2zOOi06t+5Gu9RYoK1ZaYlbBd9QUZLHhxvwXRbbc4/LbaPdLh 0dIcVPtRW6S8E2/sA6WzwmV3z+8+5bjZ5hRKfENPgiWzo+ekbC7qi+6leun4LwRScnNz nwng== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@samsung.com header.s=mail20170921 header.b=QA+2hJUB; 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=NONE dis=NONE) header.from=samsung.com Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id a1-20020aa7d741000000b004ad06322427si12648514eds.9.2023.04.18.03.30.36; Tue, 18 Apr 2023 03:30:36 -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=@samsung.com header.s=mail20170921 header.b=QA+2hJUB; 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=NONE dis=NONE) header.from=samsung.com Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 96FF368BE4B; Tue, 18 Apr 2023 13:30:33 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mailout2.w1.samsung.com (mailout2.w1.samsung.com [210.118.77.12]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 1975868BE0B for ; Tue, 18 Apr 2023 13:30:26 +0300 (EEST) Received: from eucas1p1.samsung.com (unknown [182.198.249.206]) by mailout2.w1.samsung.com (KnoxPortal) with ESMTP id 20230418103024euoutp027f6c6717e670e493ffc42a8ec90c473a~XAMNaF3Nx0940809408euoutp024 for ; Tue, 18 Apr 2023 10:30:24 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 mailout2.w1.samsung.com 20230418103024euoutp027f6c6717e670e493ffc42a8ec90c473a~XAMNaF3Nx0940809408euoutp024 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=samsung.com; s=mail20170921; t=1681813824; bh=DAxsT6K9MsOQLahD3rhgNwVgXBuX9UuYL1yJ51WYkGU=; h=From:To:Cc:Subject:Date:References:From; b=QA+2hJUBCjybGNc9aGEd9L1HF140K7R4vKXRgS3X9qrHZ+5J8y84j/ER2xmUPx27p qdvRtPIrtH2uxa/EH1XVPxYZ61Mykv6/FgRIY0qKK4sipsaYWR3QGQTvgrt+ia4Vmg YfM5rhow0EZru6byMmzVrrgARDh9ruoHFqQvsekw= Received: from eusmges2new.samsung.com (unknown [203.254.199.244]) by eucas1p2.samsung.com (KnoxPortal) with ESMTP id 20230418103024eucas1p2ad19766f82eaae81a7aec04e58aea875~XAMNI8GOO0136101361eucas1p2J; Tue, 18 Apr 2023 10:30:24 +0000 (GMT) Received: from eucas1p2.samsung.com ( [182.198.249.207]) by eusmges2new.samsung.com (EUCPMTA) with SMTP id 11.CE.09966.0417E346; Tue, 18 Apr 2023 11:30:24 +0100 (BST) Received: from eusmtrp2.samsung.com (unknown [182.198.249.139]) by eucas1p1.samsung.com (KnoxPortal) with ESMTPA id 20230418103024eucas1p1ad475a241d2d758a7d9429a25802273f~XAMMvz4s32306223062eucas1p14; Tue, 18 Apr 2023 10:30:24 +0000 (GMT) Received: from eusmgms1.samsung.com (unknown [182.198.249.179]) by eusmtrp2.samsung.com (KnoxPortal) with ESMTP id 20230418103024eusmtrp263497c304563ced1da0550935fbc4664~XAMMvKLv01851018510eusmtrp2E; Tue, 18 Apr 2023 10:30:24 +0000 (GMT) X-AuditID: cbfec7f4-d39ff700000026ee-82-643e71408e19 Received: from eusmtip2.samsung.com ( [203.254.199.222]) by eusmgms1.samsung.com (EUCPMTA) with SMTP id 32.F5.22108.0417E346; Tue, 18 Apr 2023 11:30:24 +0100 (BST) Received: from AMDN5164.EU.corp.samsungelectronics.net (unknown [106.210.132.171]) by eusmtip2.samsung.com (KnoxPortal) with ESMTPA id 20230418103023eusmtip2c65ae7a80f8ab3c86b2dad46ff5338f7~XAMMWvmen2674026740eusmtip2N; Tue, 18 Apr 2023 10:30:23 +0000 (GMT) From: Dawid Kozinski To: d.frankiewic@samsung.com, ffmpeg-devel@ffmpeg.org Date: Tue, 18 Apr 2023 12:30:12 +0200 Message-Id: <20230418103012.714-1-d.kozinski@samsung.com> X-Mailer: git-send-email 2.37.3.windows.1 MIME-Version: 1.0 X-Unsent: 1 X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFnrLIsWRmVeSWpSXmKPExsWy7djP87oOhXYpBu9vSFt8ufaF2WLlt98s Ft8+nWF2YPb4s2gzi0ffllWMAUxRXDYpqTmZZalF+nYJXBlPj7ayFez5wFyx7PIUlgbG9zeZ uhg5OSQETCTmrrvC2MXIxSEksIJR4tqzjSwQzhdGiSkbb0NlPjNKnHm1nxGmZfP2Lqiq5YwS 7/p+QFW1M0nMX/icFaSKTUBX4uWHR2BLRARMJU4272UDsZkFtCXW3f0OZgsLREu8/n+THcRm EVCV6Dz3C6yeV8BSYvPxHqgDNSUmbJkDFReUODnzCQtEnFti3axLrBAz5SWat85mBjlCQuAr u8ThnnOsEEUuEssfnmKHsIUlXh3fAmXLSPzfOR9oKAeQXSxxqN8BwqyROPQjHaLCWuJt43FG kDAz0Anrd+lDVDhKLHkcBmHySdx4Kwixn09i0rbpzBBhXomONiEIU0Wir1MMYpyUxNNlc5gh bA+Jm9OamSYwKs5C8tQsJI/MQti6gJF5FaN4amlxbnpqsVFearlecWJucWleul5yfu4mRmCK OP3v+JcdjMtffdQ7xMjEwXiIUYKDWUmE94yrVYoQb0piZVVqUX58UWlOavEhRmkOFiVxXm3b k8lCAumJJanZqakFqUUwWSYOTqkGpuaDUSxna7UW9q1dt2/uYWPHaMsdAm4WrXY75yxY1a52 MThy3q77v7jqlDinekqdzNhYZTflu1/MymjLBsa1f87KexcLPy+LNhFTzV235uNytXNuKqe9 uarl592YcPnjg/zj8nZJPyfkM9VdWZ6YU8wg/tc+RFdJuUtwhTlXRYPKWou6xPU3/3xmKqkr 9lkalxYc+2Bpw5d/0n+mpz74dPPHgynWZjE3lsvpR824vHnyydqKs4mloucTNeI7LoW9n/Lz 7sYpfp9P7TQIKezWm28cflKxvPoo60nmVavvC3DI/GJxDDh2IOXVmieP+F4k9n7P62rk/P7U 8XtxgFTWRPMH8knNDy51Wi2dEXGET4mlOCPRUIu5qDgRAEInAQuAAwAA X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFrrMLMWRmVeSWpSXmKPExsVy+t/xe7oOhXYpBr+Ws1h8ufaF2WLlt98s Ft8+nWF2YPb4s2gzi0ffllWMAUxRejZF+aUlqQoZ+cUltkrRhhZGeoaWFnpGJpZ6hsbmsVZG pkr6djYpqTmZZalF+nYJehlPj7ayFez5wFyx7PIUlgbG9zeZuhg5OSQETCQ2b+9i6WLk4hAS WMoocX7HCzaIhJTE0qWLGCFsYYk/17rA4kICrUwSzy7EgthsAroSLz88AhskImAucXHdLbB6 ZgFtiXV3v4PVCwtESkxds44FxGYRUJXoPPcLrJ5XwFJi8/EeqCM0JSZsmQMVF5Q4OfMJC0Sc W2LdrEusEDPlJZq3zmaewMg/C0nZLCSpBYxMqxhFUkuLc9Nziw31ihNzi0vz0vWS83M3MQJD d9uxn5t3MM579VHvECMTB+MhRgkOZiUR3jOuVilCvCmJlVWpRfnxRaU5qcWHGE2Bbp3ILCWa nA+MnrySeEMzA1NDEzNLA1NLM2MlcV7Pgo5EIYH0xJLU7NTUgtQimD4mDk6pBqZdze4dD1tL n3tOrbTp3Wnw3VvG7eXnWCf+zvLlygeM7Sxc7rdf/OmZcHsrz5edHmXNel3r6wrLr2tGz5IK nHvd7Y7Tm3fsMxKV8h/+cFN6UrXk9wX1qtsyeu4ys/L/y/p6pS9eYj63+6/txrXGPmJTnHb8 vnWZd5Xrso/PIst8vWQPBZmrv9zz4fHXk1KpQeKts05tawmXV/uQJd/TsFXHRI+lQPqF9tsX ejYZKgr3UnpX861f/WpplcxH3SvfSqIzQ9qfzVghltb2Tafy2NNXLcZ1s3tFxH1mXZi9gNXX +D3PF+H82M4JYpsW2Avu29Ug8DjZ73nfw/Ct/mWzvA1vijztlddJENhzW2C7gxJLcUaioRZz UXEiACOobcvmAgAA X-CMS-MailID: 20230418103024eucas1p1ad475a241d2d758a7d9429a25802273f X-Msg-Generator: CA X-RootMTR: 20230418103024eucas1p1ad475a241d2d758a7d9429a25802273f X-EPHeader: CA CMS-TYPE: 201P X-CMS-RootMailID: 20230418103024eucas1p1ad475a241d2d758a7d9429a25802273f References: Subject: [FFmpeg-devel] [PATCH v20 02/10] avcodec/evc_parser: Added parser implementation for EVC format 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: Dawid Kozinski Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: kFkK+vcoNkMQ - Added constants definitions for EVC parser - Provided NAL units parsing following ISO_IEC_23094-1 - EVC parser registration Signed-off-by: Dawid Kozinski --- libavcodec/Makefile | 1 + libavcodec/evc.h | 155 +++++ libavcodec/evc_parser.c | 1375 +++++++++++++++++++++++++++++++++++++++ libavcodec/parsers.c | 1 + 4 files changed, 1532 insertions(+) create mode 100644 libavcodec/evc.h create mode 100644 libavcodec/evc_parser.c diff --git a/libavcodec/Makefile b/libavcodec/Makefile index aa10fbfcf8..b07fabc3aa 100644 --- a/libavcodec/Makefile +++ b/libavcodec/Makefile @@ -1159,6 +1159,7 @@ OBJS-$(CONFIG_DVAUDIO_PARSER) += dvaudio_parser.o OBJS-$(CONFIG_DVBSUB_PARSER) += dvbsub_parser.o OBJS-$(CONFIG_DVD_NAV_PARSER) += dvd_nav_parser.o OBJS-$(CONFIG_DVDSUB_PARSER) += dvdsub_parser.o +OBJS-$(CONFIG_EVC_PARSER) += evc_parser.o OBJS-$(CONFIG_FLAC_PARSER) += flac_parser.o flacdata.o flac.o OBJS-$(CONFIG_FTR_PARSER) += ftr_parser.o OBJS-$(CONFIG_G723_1_PARSER) += g723_1_parser.o diff --git a/libavcodec/evc.h b/libavcodec/evc.h new file mode 100644 index 0000000000..d1fdb4fac6 --- /dev/null +++ b/libavcodec/evc.h @@ -0,0 +1,155 @@ +/* + * EVC definitions and enums + * Copyright (c) 2022 Dawid Kozinski + * + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * FFmpeg is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef AVCODEC_EVC_H +#define AVCODEC_EVC_H + +// The length field that indicates the length in bytes of the following NAL unit is configured to be of 4 bytes +#define EVC_NALU_LENGTH_PREFIX_SIZE (4) /* byte */ +#define EVC_NALU_HEADER_SIZE (2) /* byte */ + +/** + * @see ISO_IEC_23094-1_2020, 7.4.2.2 NAL unit header semantic + * Table 4 - NAL unit type codes and NAL unit type classes + */ +enum EVCNALUnitType { + EVC_NOIDR_NUT = 0, /* Coded slice of a non-IDR picture */ + EVC_IDR_NUT = 1, /* Coded slice of an IDR picture */ + EVC_RSV_VCL_NUT02 = 2, + EVC_RSV_VCL_NUT03 = 3, + EVC_RSV_VCL_NUT04 = 4, + EVC_RSV_VCL_NUT05 = 5, + EVC_RSV_VCL_NUT06 = 6, + EVC_RSV_VCL_NUT07 = 7, + EVC_RSV_VCL_NUT08 = 8, + EVC_RSV_VCL_NUT09 = 9, + EVC_RSV_VCL_NUT10 = 10, + EVC_RSV_VCL_NUT11 = 11, + EVC_RSV_VCL_NUT12 = 12, + EVC_RSV_VCL_NUT13 = 13, + EVC_RSV_VCL_NUT14 = 14, + EVC_RSV_VCL_NUT15 = 15, + EVC_RSV_VCL_NUT16 = 16, + EVC_RSV_VCL_NUT17 = 17, + EVC_RSV_VCL_NUT18 = 18, + EVC_RSV_VCL_NUT19 = 19, + EVC_RSV_VCL_NUT20 = 20, + EVC_RSV_VCL_NUT21 = 21, + EVC_RSV_VCL_NUT22 = 22, + EVC_RSV_VCL_NUT23 = 23, + EVC_SPS_NUT = 24, /* Sequence parameter set */ + EVC_PPS_NUT = 25, /* Picture paremeter set */ + EVC_APS_NUT = 26, /* Adaptation parameter set */ + EVC_FD_NUT = 27, /* Filler data */ + EVC_SEI_NUT = 28, /* Supplemental enhancement information */ + EVC_RSV_NONVCL29 = 29, + EVC_RSV_NONVCL30 = 30, + EVC_RSV_NONVCL31 = 31, + EVC_RSV_NONVCL32 = 32, + EVC_RSV_NONVCL33 = 33, + EVC_RSV_NONVCL34 = 34, + EVC_RSV_NONVCL35 = 35, + EVC_RSV_NONVCL36 = 36, + EVC_RSV_NONVCL37 = 37, + EVC_RSV_NONVCL38 = 38, + EVC_RSV_NONVCL39 = 39, + EVC_RSV_NONVCL40 = 40, + EVC_RSV_NONVCL41 = 41, + EVC_RSV_NONVCL42 = 42, + EVC_RSV_NONVCL43 = 43, + EVC_RSV_NONVCL44 = 44, + EVC_RSV_NONVCL45 = 45, + EVC_RSV_NONVCL46 = 46, + EVC_RSV_NONVCL47 = 47, + EVC_RSV_NONVCL48 = 48, + EVC_RSV_NONVCL49 = 49, + EVC_RSV_NONVCL50 = 50, + EVC_RSV_NONVCL51 = 51, + EVC_RSV_NONVCL52 = 52, + EVC_RSV_NONVCL53 = 53, + EVC_RSV_NONVCL54 = 54, + EVC_RSV_NONVCL55 = 55, + EVC_UNSPEC_NUT56 = 56, + EVC_UNSPEC_NUT57 = 57, + EVC_UNSPEC_NUT58 = 58, + EVC_UNSPEC_NUT59 = 59, + EVC_UNSPEC_NUT60 = 60, + EVC_UNSPEC_NUT61 = 61, + EVC_UNSPEC_NUT62 = 62 +}; + +// slice type +// @see ISO_IEC_23094-1_2020 7.4.5 Slice header semantics +// +enum EVCSliceType { + EVC_SLICE_TYPE_B = 0, + EVC_SLICE_TYPE_P = 1, + EVC_SLICE_TYPE_I = 2 +}; + +enum { + // 7.4.3.2: aps_video_parameter_set_id is u(4). + EVC_MAX_APS_COUNT = 32, + + // 7.4.3.1: sps_seq_parameter_set_id is in [0, 15]. + EVC_MAX_SPS_COUNT = 16, + + // 7.4.3.2: pps_pic_parameter_set_id is in [0, 63]. + EVC_MAX_PPS_COUNT = 64, + + // 7.4.5: slice header slice_pic_parameter_set_id in [0, 63] + EVC_MAX_SH_COUNT = 64, + + // E.3.2: cpb_cnt_minus1[i] is in [0, 31]. + EVC_MAX_CPB_CNT = 32, + + // A.4.1: in table A.1 the highest level allows a MaxLumaPs of 35 651 584. + EVC_MAX_LUMA_PS = 35651584, + + EVC_MAX_NUM_REF_PICS = 21, + + EVC_MAX_NUM_RPLS = 32, + + // A.4.1: pic_width_in_luma_samples and pic_height_in_luma_samples are + // constrained to be not greater than sqrt(MaxLumaPs * 8). Hence height/ + // width are bounded above by sqrt(8 * 35651584) = 16888.2 samples. + EVC_MAX_WIDTH = 16888, + EVC_MAX_HEIGHT = 16888, + + // A.4.1: table A.1 allows at most 22 tile rows for any level. + EVC_MAX_TILE_ROWS = 22, + // A.4.1: table A.1 allows at most 20 tile columns for any level. + EVC_MAX_TILE_COLUMNS = 20, + + // A.4.1: table A.1 allows at most 600 slice segments for any level. + EVC_MAX_SLICE_SEGMENTS = 600, + + // 7.4.7.1: in the worst case (tiles_enabled_flag and + // entropy_coding_sync_enabled_flag are both set), entry points can be + // placed at the beginning of every Ctb row in every tile, giving an + // upper bound of (num_tile_columns_minus1 + 1) * PicHeightInCtbsY - 1. + // Only a stream with very high resolution and perverse parameters could + // get near that, though, so set a lower limit here with the maximum + // possible value for 4K video (at most 135 16x16 Ctb rows). + HEVC_MAX_ENTRY_POINT_OFFSETS = EVC_MAX_TILE_COLUMNS * 135, +}; + +#endif // AVCODEC_EVC_H diff --git a/libavcodec/evc_parser.c b/libavcodec/evc_parser.c new file mode 100644 index 0000000000..bdcf61cecb --- /dev/null +++ b/libavcodec/evc_parser.c @@ -0,0 +1,1375 @@ +/* + * EVC format parser + * + * Copyright (C) 2021 Dawid Kozinski + * + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * FFmpeg is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include + +#include "libavutil/common.h" +#include "parser.h" +#include "golomb.h" +#include "evc.h" + +#define EVC_MAX_QP_TABLE_SIZE 58 + +#define EXTENDED_SAR 255 +#define NUM_CPB 32 + +#define NUM_CHROMA_FORMATS 4 // @see ISO_IEC_23094-1 section 6.2 table 2 + +static const enum AVPixelFormat pix_fmts_8bit[NUM_CHROMA_FORMATS] = { + AV_PIX_FMT_GRAY8, AV_PIX_FMT_YUV420P, AV_PIX_FMT_YUV422P, AV_PIX_FMT_YUV444P +}; + +static const enum AVPixelFormat pix_fmts_9bit[NUM_CHROMA_FORMATS] = { + AV_PIX_FMT_GRAY9, AV_PIX_FMT_YUV420P9, AV_PIX_FMT_YUV422P9, AV_PIX_FMT_YUV444P9 +}; + +static const enum AVPixelFormat pix_fmts_10bit[NUM_CHROMA_FORMATS] = { + AV_PIX_FMT_GRAY10, AV_PIX_FMT_YUV420P10, AV_PIX_FMT_YUV422P10, AV_PIX_FMT_YUV444P10 +}; + +static const enum AVPixelFormat pix_fmts_12bit[NUM_CHROMA_FORMATS] = { + AV_PIX_FMT_GRAY12, AV_PIX_FMT_YUV420P12, AV_PIX_FMT_YUV422P12, AV_PIX_FMT_YUV444P12 +}; + +static const enum AVPixelFormat pix_fmts_14bit[NUM_CHROMA_FORMATS] = { + AV_PIX_FMT_GRAY14, AV_PIX_FMT_YUV420P14, AV_PIX_FMT_YUV422P14, AV_PIX_FMT_YUV444P14 +}; + +static const enum AVPixelFormat pix_fmts_16bit[NUM_CHROMA_FORMATS] = { + AV_PIX_FMT_GRAY16, AV_PIX_FMT_YUV420P16, AV_PIX_FMT_YUV422P16, AV_PIX_FMT_YUV444P16 +}; + +// rpl structure +typedef struct RefPicListStruct { + int poc; + int tid; + int ref_pic_num; + int ref_pic_active_num; + int ref_pics[EVC_MAX_NUM_REF_PICS]; + char pic_type; + +} RefPicListStruct; + +// chromaQP table structure to be signalled in SPS +typedef struct ChromaQpTable { + int chroma_qp_table_present_flag; // u(1) + int same_qp_table_for_chroma; // u(1) + int global_offset_flag; // u(1) + int num_points_in_qp_table_minus1[2]; // ue(v) + int delta_qp_in_val_minus1[2][EVC_MAX_QP_TABLE_SIZE]; // u(6) + int delta_qp_out_val[2][EVC_MAX_QP_TABLE_SIZE]; // se(v) +} ChromaQpTable; + +// Hypothetical Reference Decoder (HRD) parameters, part of VUI +typedef struct HRDParameters { + int cpb_cnt_minus1; // ue(v) + int bit_rate_scale; // u(4) + int cpb_size_scale; // u(4) + int bit_rate_value_minus1[NUM_CPB]; // ue(v) + int cpb_size_value_minus1[NUM_CPB]; // ue(v) + int cbr_flag[NUM_CPB]; // u(1) + int initial_cpb_removal_delay_length_minus1; // u(5) + int cpb_removal_delay_length_minus1; // u(5) + int dpb_output_delay_length_minus1; // u(5) + int time_offset_length; // u(5) +} HRDParameters; + +// video usability information (VUI) part of SPS +typedef struct VUIParameters { + int aspect_ratio_info_present_flag; // u(1) + int aspect_ratio_idc; // u(8) + int sar_width; // u(16) + int sar_height; // u(16) + int overscan_info_present_flag; // u(1) + int overscan_appropriate_flag; // u(1) + int video_signal_type_present_flag; // u(1) + int video_format; // u(3) + int video_full_range_flag; // u(1) + int colour_description_present_flag; // u(1) + int colour_primaries; // u(8) + int transfer_characteristics; // u(8) + int matrix_coefficients; // u(8) + int chroma_loc_info_present_flag; // u(1) + int chroma_sample_loc_type_top_field; // ue(v) + int chroma_sample_loc_type_bottom_field; // ue(v) + int neutral_chroma_indication_flag; // u(1) + int field_seq_flag; // u(1) + int timing_info_present_flag; // u(1) + int num_units_in_tick; // u(32) + int time_scale; // u(32) + int fixed_pic_rate_flag; // u(1) + int nal_hrd_parameters_present_flag; // u(1) + int vcl_hrd_parameters_present_flag; // u(1) + int low_delay_hrd_flag; // u(1) + int pic_struct_present_flag; // u(1) + int bitstream_restriction_flag; // u(1) + int motion_vectors_over_pic_boundaries_flag; // u(1) + int max_bytes_per_pic_denom; // ue(v) + int max_bits_per_mb_denom; // ue(v) + int log2_max_mv_length_horizontal; // ue(v) + int log2_max_mv_length_vertical; // ue(v) + int num_reorder_pics; // ue(v) + int max_dec_pic_buffering; // ue(v) + + HRDParameters hrd_parameters; +} VUIParameters; + +// The sturcture reflects SPS RBSP(raw byte sequence payload) layout +// @see ISO_IEC_23094-1 section 7.3.2.1 +// +// The following descriptors specify the parsing process of each element +// u(n) - unsigned integer using n bits +// ue(v) - unsigned integer 0-th order Exp_Golomb-coded syntax element with the left bit first +typedef struct EVCParserSPS { + int sps_seq_parameter_set_id; // ue(v) + int profile_idc; // u(8) + int level_idc; // u(8) + int toolset_idc_h; // u(32) + int toolset_idc_l; // u(32) + int chroma_format_idc; // ue(v) + int pic_width_in_luma_samples; // ue(v) + int pic_height_in_luma_samples; // ue(v) + int bit_depth_luma_minus8; // ue(v) + int bit_depth_chroma_minus8; // ue(v) + + int sps_btt_flag; // u(1) + int log2_ctu_size_minus5; // ue(v) + int log2_min_cb_size_minus2; // ue(v) + int log2_diff_ctu_max_14_cb_size; // ue(v) + int log2_diff_ctu_max_tt_cb_size; // ue(v) + int log2_diff_min_cb_min_tt_cb_size_minus2; // ue(v) + + int sps_suco_flag; // u(1) + int log2_diff_ctu_size_max_suco_cb_size; // ue(v) + int log2_diff_max_suco_min_suco_cb_size; // ue(v) + + int sps_admvp_flag; // u(1) + int sps_affine_flag; // u(1) + int sps_amvr_flag; // u(1) + int sps_dmvr_flag; // u(1) + int sps_mmvd_flag; // u(1) + int sps_hmvp_flag; // u(1) + + int sps_eipd_flag; // u(1) + int sps_ibc_flag; // u(1) + int log2_max_ibc_cand_size_minus2; // ue(v) + + int sps_cm_init_flag; // u(1) + int sps_adcc_flag; // u(1) + + int sps_iqt_flag; // u(1) + int sps_ats_flag; // u(1) + + int sps_addb_flag; // u(1) + int sps_alf_flag; // u(1) + int sps_htdf_flag; // u(1) + int sps_rpl_flag; // u(1) + int sps_pocs_flag; // u(1) + int sps_dquant_flag; // u(1) + int sps_dra_flag; // u(1) + + int log2_max_pic_order_cnt_lsb_minus4; // ue(v) + int log2_sub_gop_length; // ue(v) + int log2_ref_pic_gap_length; // ue(v) + + int max_num_tid0_ref_pics; // ue(v) + + int sps_max_dec_pic_buffering_minus1; // ue(v) + int long_term_ref_pic_flag; // u(1) + int rpl1_same_as_rpl0_flag; // u(1) + int num_ref_pic_list_in_sps[2]; // ue(v) + struct RefPicListStruct rpls[2][EVC_MAX_NUM_RPLS]; + + int picture_cropping_flag; // u(1) + int picture_crop_left_offset; // ue(v) + int picture_crop_right_offset; // ue(v) + int picture_crop_top_offset; // ue(v) + int picture_crop_bottom_offset; // ue(v) + + struct ChromaQpTable chroma_qp_table_struct; + + int vui_parameters_present_flag; // u(1) + + struct VUIParameters vui_parameters; + +} EVCParserSPS; + +typedef struct EVCParserPPS { + int pps_pic_parameter_set_id; // ue(v) + int pps_seq_parameter_set_id; // ue(v) + int num_ref_idx_default_active_minus1[2]; // ue(v) + int additional_lt_poc_lsb_len; // ue(v) + int rpl1_idx_present_flag; // u(1) + int single_tile_in_pic_flag; // u(1) + int num_tile_columns_minus1; // ue(v) + int num_tile_rows_minus1; // ue(v) + int uniform_tile_spacing_flag; // u(1) + int tile_column_width_minus1[EVC_MAX_TILE_ROWS]; // ue(v) + int tile_row_height_minus1[EVC_MAX_TILE_COLUMNS]; // ue(v) + int loop_filter_across_tiles_enabled_flag; // u(1) + int tile_offset_len_minus1; // ue(v) + int tile_id_len_minus1; // ue(v) + int explicit_tile_id_flag; // u(1) + int tile_id_val[EVC_MAX_TILE_ROWS][EVC_MAX_TILE_COLUMNS]; // u(v) + int pic_dra_enabled_flag; // u(1) + int pic_dra_aps_id; // u(5) + int arbitrary_slice_present_flag; // u(1) + int constrained_intra_pred_flag; // u(1) + int cu_qp_delta_enabled_flag; // u(1) + int log2_cu_qp_delta_area_minus6; // ue(v) + +} EVCParserPPS; + +// The sturcture reflects Slice Header RBSP(raw byte sequence payload) layout +// @see ISO_IEC_23094-1 section 7.3.2.6 +// +// The following descriptors specify the parsing process of each element +// u(n) - unsigned integer using n bits +// ue(v) - unsigned integer 0-th order Exp_Golomb-coded syntax element with the left bit first +// u(n) - unsigned integer using n bits. +// When n is "v" in the syntax table, the number of bits varies in a manner dependent on the value of other syntax elements. +typedef struct EVCParserSliceHeader { + int slice_pic_parameter_set_id; // ue(v) + int single_tile_in_slice_flag; // u(1) + int first_tile_id; // u(v) + int arbitrary_slice_flag; // u(1) + int last_tile_id; // u(v) + int num_remaining_tiles_in_slice_minus1; // ue(v) + int delta_tile_id_minus1[EVC_MAX_TILE_ROWS * EVC_MAX_TILE_COLUMNS]; // ue(v) + + int slice_type; // ue(v) + int no_output_of_prior_pics_flag; // u(1) + int mmvd_group_enable_flag; // u(1) + int slice_alf_enabled_flag; // u(1) + + int slice_alf_luma_aps_id; // u(5) + int slice_alf_map_flag; // u(1) + int slice_alf_chroma_idc; // u(2) + int slice_alf_chroma_aps_id; // u(5) + int slice_alf_chroma_map_flag; // u(1) + int slice_alf_chroma2_aps_id; // u(5) + int slice_alf_chroma2_map_flag; // u(1) + int slice_pic_order_cnt_lsb; // u(v) + + // @note + // Currently the structure does not reflect the entire Slice Header RBSP layout. + // It contains only the fields that are necessary to read from the NAL unit all the values + // necessary for the correct initialization of the AVCodecContext structure. + + // @note + // If necessary, add the missing fields to the structure to reflect + // the contents of the entire NAL unit of the SPS type + +} EVCParserSliceHeader; + +// picture order count of the current picture +typedef struct EVCParserPoc { + int PicOrderCntVal; // current picture order count value + int prevPicOrderCntVal; // the picture order count of the previous Tid0 picture + int DocOffset; // the decoding order count of the previous picture +} EVCParserPoc; + +typedef struct EVCParserContext { + ParseContext pc; + EVCParserSPS sps[EVC_MAX_SPS_COUNT]; + EVCParserPPS pps[EVC_MAX_PPS_COUNT]; + EVCParserSliceHeader slice_header[EVC_MAX_PPS_COUNT]; + + int to_read; // number of bytes of NAL Unit that do not fit into the current input data chunk and must be read from the new chunk(s) + int bytes_read; // number of bytes of the current Access Unit that already has been read + + int incomplete_nalu_prefix_read; // the flag is set to 1 when the current input data chunk contains an incomplete NAL unit prefix + int incomplete_nalu_read; // the flag is set to 1 when the current input data chunk contains an incomplete NAL unit (more input data is needed to read complete NAL unit) + + int nuh_temporal_id; // the value of TemporalId (shall be the same for all VCL NAL units of an Access Unit) + + int nalu_prefix_assembled; // the flag is set to when NALU prefix has been assembled from last chunk and current chunk of incoming data + int nalu_type; // the current NALU type + int nalu_size; // the current NALU size + int time_base; + + EVCParserPoc poc; + + int parsed_extradata; + +} EVCParserContext; + +static int get_nalu_type(const uint8_t *bits, int bits_size, AVCodecContext *avctx) +{ + int unit_type_plus1 = 0; + + if (bits_size >= EVC_NALU_HEADER_SIZE) { + unsigned char *p = (unsigned char *)bits; + // forbidden_zero_bit + if ((p[0] & 0x80) != 0) + return -1; + + // nal_unit_type + unit_type_plus1 = (p[0] >> 1) & 0x3F; + } + + return unit_type_plus1 - 1; +} + +static uint32_t read_nal_unit_length(const uint8_t *bits, int bits_size, AVCodecContext *avctx) +{ + uint32_t nalu_len = 0; + + if (bits_size >= EVC_NALU_LENGTH_PREFIX_SIZE) { + + int t = 0; + unsigned char *p = (unsigned char *)bits; + + for (int i = 0; i < EVC_NALU_LENGTH_PREFIX_SIZE; i++) + t = (t << 8) | p[i]; + + nalu_len = t; + if (nalu_len == 0) + return 0; + } + + return nalu_len; +} + +// nuh_temporal_id specifies a temporal identifier for the NAL unit +static int get_temporal_id(const uint8_t *bits, int bits_size, AVCodecContext *avctx) +{ + int temporal_id = 0; + short t = 0; + + if (bits_size >= EVC_NALU_HEADER_SIZE) { + unsigned char *p = (unsigned char *)bits; + // forbidden_zero_bit + if ((p[0] & 0x80) != 0) + return -1; + + for (int i = 0; i < EVC_NALU_HEADER_SIZE; i++) + t = (t << 8) | p[i]; + + temporal_id = (t >> 6) & 0x0007; + } + + return temporal_id; +} + +// @see ISO_IEC_23094-1 (7.3.7 Reference picture list structure syntax) +static int ref_pic_list_struct(GetBitContext *gb, RefPicListStruct *rpl) +{ + uint32_t delta_poc_st, strp_entry_sign_flag = 0; + rpl->ref_pic_num = get_ue_golomb(gb); + if (rpl->ref_pic_num > 0) { + delta_poc_st = get_ue_golomb(gb); + + rpl->ref_pics[0] = delta_poc_st; + if (rpl->ref_pics[0] != 0) { + strp_entry_sign_flag = get_bits(gb, 1); + + rpl->ref_pics[0] *= 1 - (strp_entry_sign_flag << 1); + } + } + + for (int i = 1; i < rpl->ref_pic_num; ++i) { + delta_poc_st = get_ue_golomb(gb); + if (delta_poc_st != 0) + strp_entry_sign_flag = get_bits(gb, 1); + rpl->ref_pics[i] = rpl->ref_pics[i - 1] + delta_poc_st * (1 - (strp_entry_sign_flag << 1)); + } + + return 0; +} + +// @see ISO_IEC_23094-1 (E.2.2 HRD parameters syntax) +static int hrd_parameters(GetBitContext *gb, HRDParameters *hrd) +{ + hrd->cpb_cnt_minus1 = get_ue_golomb(gb); + hrd->bit_rate_scale = get_bits(gb, 4); + hrd->cpb_size_scale = get_bits(gb, 4); + for (int SchedSelIdx = 0; SchedSelIdx <= hrd->cpb_cnt_minus1; SchedSelIdx++) { + hrd->bit_rate_value_minus1[SchedSelIdx] = get_ue_golomb(gb); + hrd->cpb_size_value_minus1[SchedSelIdx] = get_ue_golomb(gb); + hrd->cbr_flag[SchedSelIdx] = get_bits(gb, 1); + } + hrd->initial_cpb_removal_delay_length_minus1 = get_bits(gb, 5); + hrd->cpb_removal_delay_length_minus1 = get_bits(gb, 5); + hrd->cpb_removal_delay_length_minus1 = get_bits(gb, 5); + hrd->time_offset_length = get_bits(gb, 5); + + return 0; +} + +// @see ISO_IEC_23094-1 (E.2.1 VUI parameters syntax) +static int vui_parameters(GetBitContext *gb, VUIParameters *vui) +{ + vui->aspect_ratio_info_present_flag = get_bits(gb, 1); + if (vui->aspect_ratio_info_present_flag) { + vui->aspect_ratio_idc = get_bits(gb, 8); + if (vui->aspect_ratio_idc == EXTENDED_SAR) { + vui->sar_width = get_bits(gb, 16); + vui->sar_height = get_bits(gb, 16); + } + } + vui->overscan_info_present_flag = get_bits(gb, 1); + if (vui->overscan_info_present_flag) + vui->overscan_appropriate_flag = get_bits(gb, 1); + vui->video_signal_type_present_flag = get_bits(gb, 1); + if (vui->video_signal_type_present_flag) { + vui->video_format = get_bits(gb, 3); + vui->video_full_range_flag = get_bits(gb, 1); + vui->colour_description_present_flag = get_bits(gb, 1); + if (vui->colour_description_present_flag) { + vui->colour_primaries = get_bits(gb, 8); + vui->transfer_characteristics = get_bits(gb, 8); + vui->matrix_coefficients = get_bits(gb, 8); + } + } + vui->chroma_loc_info_present_flag = get_bits(gb, 1); + if (vui->chroma_loc_info_present_flag) { + vui->chroma_sample_loc_type_top_field = get_ue_golomb(gb); + vui->chroma_sample_loc_type_bottom_field = get_ue_golomb(gb); + } + vui->neutral_chroma_indication_flag = get_bits(gb, 1); + + vui->field_seq_flag = get_bits(gb, 1); + + vui->timing_info_present_flag = get_bits(gb, 1); + if (vui->timing_info_present_flag) { + vui->num_units_in_tick = get_bits(gb, 32); + vui->time_scale = get_bits(gb, 32); + vui->fixed_pic_rate_flag = get_bits(gb, 1); + } + vui->nal_hrd_parameters_present_flag = get_bits(gb, 1); + if (vui->nal_hrd_parameters_present_flag) + hrd_parameters(gb, &vui->hrd_parameters); + vui->vcl_hrd_parameters_present_flag = get_bits(gb, 1); + if (vui->vcl_hrd_parameters_present_flag) + hrd_parameters(gb, &vui->hrd_parameters); + if (vui->nal_hrd_parameters_present_flag || vui->vcl_hrd_parameters_present_flag) + vui->low_delay_hrd_flag = get_bits(gb, 1); + vui->pic_struct_present_flag = get_bits(gb, 1); + vui->bitstream_restriction_flag = get_bits(gb, 1); + if (vui->bitstream_restriction_flag) { + vui->motion_vectors_over_pic_boundaries_flag = get_bits(gb, 1); + vui->max_bytes_per_pic_denom = get_ue_golomb(gb); + vui->max_bits_per_mb_denom = get_ue_golomb(gb); + vui->log2_max_mv_length_horizontal = get_ue_golomb(gb); + vui->log2_max_mv_length_vertical = get_ue_golomb(gb); + vui->num_reorder_pics = get_ue_golomb(gb); + vui->max_dec_pic_buffering = get_ue_golomb(gb); + } + + return 0; +} + +// @see ISO_IEC_23094-1 (7.3.2.1 SPS RBSP syntax) +static EVCParserSPS *parse_sps(const uint8_t *bs, int bs_size, EVCParserContext *ev) +{ + GetBitContext gb; + EVCParserSPS *sps; + int sps_seq_parameter_set_id; + + if (init_get_bits8(&gb, bs, bs_size) < 0) + return NULL; + + sps_seq_parameter_set_id = get_ue_golomb(&gb); + + if (sps_seq_parameter_set_id >= EVC_MAX_SPS_COUNT) + return NULL; + + sps = &ev->sps[sps_seq_parameter_set_id]; + sps->sps_seq_parameter_set_id = sps_seq_parameter_set_id; + + // the Baseline profile is indicated by profile_idc eqal to 0 + // the Main profile is indicated by profile_idc eqal to 1 + sps->profile_idc = get_bits(&gb, 8); + + sps->level_idc = get_bits(&gb, 8); + + skip_bits_long(&gb, 32); /* skip toolset_idc_h */ + skip_bits_long(&gb, 32); /* skip toolset_idc_l */ + + // 0 - monochrome + // 1 - 4:2:0 + // 2 - 4:2:2 + // 3 - 4:4:4 + sps->chroma_format_idc = get_ue_golomb(&gb); + + sps->pic_width_in_luma_samples = get_ue_golomb(&gb); + sps->pic_height_in_luma_samples = get_ue_golomb(&gb); + + sps->bit_depth_luma_minus8 = get_ue_golomb(&gb); + sps->bit_depth_chroma_minus8 = get_ue_golomb(&gb); + + sps->sps_btt_flag = get_bits(&gb, 1); + if (sps->sps_btt_flag) { + sps->log2_ctu_size_minus5 = get_ue_golomb(&gb); + sps->log2_min_cb_size_minus2 = get_ue_golomb(&gb); + sps->log2_diff_ctu_max_14_cb_size = get_ue_golomb(&gb); + sps->log2_diff_ctu_max_tt_cb_size = get_ue_golomb(&gb); + sps->log2_diff_min_cb_min_tt_cb_size_minus2 = get_ue_golomb(&gb); + } + + sps->sps_suco_flag = get_bits(&gb, 1); + if (sps->sps_suco_flag) { + sps->log2_diff_ctu_size_max_suco_cb_size = get_ue_golomb(&gb); + sps->log2_diff_max_suco_min_suco_cb_size = get_ue_golomb(&gb); + } + + sps->sps_admvp_flag = get_bits(&gb, 1); + if (sps->sps_admvp_flag) { + sps->sps_affine_flag = get_bits(&gb, 1); + sps->sps_amvr_flag = get_bits(&gb, 1); + sps->sps_dmvr_flag = get_bits(&gb, 1); + sps->sps_mmvd_flag = get_bits(&gb, 1); + sps->sps_hmvp_flag = get_bits(&gb, 1); + } + + sps->sps_eipd_flag = get_bits(&gb, 1); + if (sps->sps_eipd_flag) { + sps->sps_ibc_flag = get_bits(&gb, 1); + if (sps->sps_ibc_flag) + sps->log2_max_ibc_cand_size_minus2 = get_ue_golomb(&gb); + } + + sps->sps_cm_init_flag = get_bits(&gb, 1); + if (sps->sps_cm_init_flag) + sps->sps_adcc_flag = get_bits(&gb, 1); + + sps->sps_iqt_flag = get_bits(&gb, 1); + if (sps->sps_iqt_flag) + sps->sps_ats_flag = get_bits(&gb, 1); + + sps->sps_addb_flag = get_bits(&gb, 1); + sps->sps_alf_flag = get_bits(&gb, 1); + sps->sps_htdf_flag = get_bits(&gb, 1); + sps->sps_rpl_flag = get_bits(&gb, 1); + sps->sps_pocs_flag = get_bits(&gb, 1); + sps->sps_dquant_flag = get_bits(&gb, 1); + sps->sps_dra_flag = get_bits(&gb, 1); + + if (sps->sps_pocs_flag) + sps->log2_max_pic_order_cnt_lsb_minus4 = get_ue_golomb(&gb); + + if (!sps->sps_pocs_flag || !sps->sps_rpl_flag) { + sps->log2_sub_gop_length = get_ue_golomb(&gb); + if (sps->log2_sub_gop_length == 0) + sps->log2_ref_pic_gap_length = get_ue_golomb(&gb); + } + + if (!sps->sps_rpl_flag) + sps->max_num_tid0_ref_pics = get_ue_golomb(&gb); + else { + sps->sps_max_dec_pic_buffering_minus1 = get_ue_golomb(&gb); + sps->long_term_ref_pic_flag = get_bits(&gb, 1); + sps->rpl1_same_as_rpl0_flag = get_bits(&gb, 1); + sps->num_ref_pic_list_in_sps[0] = get_ue_golomb(&gb); + + for (int i = 0; i < sps->num_ref_pic_list_in_sps[0]; ++i) + ref_pic_list_struct(&gb, &sps->rpls[0][i]); + + if (!sps->rpl1_same_as_rpl0_flag) { + sps->num_ref_pic_list_in_sps[1] = get_ue_golomb(&gb); + for (int i = 0; i < sps->num_ref_pic_list_in_sps[1]; ++i) + ref_pic_list_struct(&gb, &sps->rpls[1][i]); + } + } + + sps->picture_cropping_flag = get_bits(&gb, 1); + + if (sps->picture_cropping_flag) { + sps->picture_crop_left_offset = get_ue_golomb(&gb); + sps->picture_crop_right_offset = get_ue_golomb(&gb); + sps->picture_crop_top_offset = get_ue_golomb(&gb); + sps->picture_crop_bottom_offset = get_ue_golomb(&gb); + } + + if (sps->chroma_format_idc != 0) { + sps->chroma_qp_table_struct.chroma_qp_table_present_flag = get_bits(&gb, 1); + + if (sps->chroma_qp_table_struct.chroma_qp_table_present_flag) { + sps->chroma_qp_table_struct.same_qp_table_for_chroma = get_bits(&gb, 1); + sps->chroma_qp_table_struct.global_offset_flag = get_bits(&gb, 1); + for (int i = 0; i < (sps->chroma_qp_table_struct.same_qp_table_for_chroma ? 1 : 2); i++) { + sps->chroma_qp_table_struct.num_points_in_qp_table_minus1[i] = get_ue_golomb(&gb);; + for (int j = 0; j <= sps->chroma_qp_table_struct.num_points_in_qp_table_minus1[i]; j++) { + sps->chroma_qp_table_struct.delta_qp_in_val_minus1[i][j] = get_bits(&gb, 6); + sps->chroma_qp_table_struct.delta_qp_out_val[i][j] = get_se_golomb(&gb); + } + } + } + } + + sps->vui_parameters_present_flag = get_bits(&gb, 1); + if (sps->vui_parameters_present_flag) + vui_parameters(&gb, &(sps->vui_parameters)); + + // @note + // If necessary, add the missing fields to the EVCParserSPS structure + // and then extend parser implementation + + return sps; +} + +// @see ISO_IEC_23094-1 (7.3.2.2 SPS RBSP syntax) +// +// @note +// The current implementation of parse_sps function doesn't handle VUI parameters parsing. +// If it will be needed, parse_sps function could be extended to handle VUI parameters parsing +// to initialize fields of the AVCodecContex i.e. color_primaries, color_trc,color_range +// +static EVCParserPPS *parse_pps(const uint8_t *bs, int bs_size, EVCParserContext *ev) +{ + GetBitContext gb; + EVCParserPPS *pps; + + int pps_pic_parameter_set_id; + + if (init_get_bits8(&gb, bs, bs_size) < 0) + return NULL; + + pps_pic_parameter_set_id = get_ue_golomb(&gb); + if (pps_pic_parameter_set_id > EVC_MAX_PPS_COUNT) + return NULL; + + pps = &ev->pps[pps_pic_parameter_set_id]; + + pps->pps_pic_parameter_set_id = pps_pic_parameter_set_id; + + pps->pps_seq_parameter_set_id = get_ue_golomb(&gb); + if (pps->pps_seq_parameter_set_id >= EVC_MAX_SPS_COUNT) + return NULL; + + pps->num_ref_idx_default_active_minus1[0] = get_ue_golomb(&gb); + pps->num_ref_idx_default_active_minus1[1] = get_ue_golomb(&gb); + pps->additional_lt_poc_lsb_len = get_ue_golomb(&gb); + pps->rpl1_idx_present_flag = get_bits(&gb, 1); + pps->single_tile_in_pic_flag = get_bits(&gb, 1); + + if (!pps->single_tile_in_pic_flag) { + pps->num_tile_columns_minus1 = get_ue_golomb(&gb); + pps->num_tile_rows_minus1 = get_ue_golomb(&gb); + pps->uniform_tile_spacing_flag = get_bits(&gb, 1); + + if (!pps->uniform_tile_spacing_flag) { + for (int i = 0; i < pps->num_tile_columns_minus1; i++) + pps->tile_column_width_minus1[i] = get_ue_golomb(&gb); + + for (int i = 0; i < pps->num_tile_rows_minus1; i++) + pps->tile_row_height_minus1[i] = get_ue_golomb(&gb); + } + pps->loop_filter_across_tiles_enabled_flag = get_bits(&gb, 1); + pps->tile_offset_len_minus1 = get_ue_golomb(&gb); + } + + pps->tile_id_len_minus1 = get_ue_golomb(&gb); + pps->explicit_tile_id_flag = get_bits(&gb, 1); + + if (pps->explicit_tile_id_flag) { + for (int i = 0; i <= pps->num_tile_rows_minus1; i++) { + for (int j = 0; j <= pps->num_tile_columns_minus1; j++) + pps->tile_id_val[i][j] = get_bits(&gb, pps->tile_id_len_minus1 + 1); + } + } + + pps->pic_dra_enabled_flag = 0; + pps->pic_dra_enabled_flag = get_bits(&gb, 1); + + if (pps->pic_dra_enabled_flag) + pps->pic_dra_aps_id = get_bits(&gb, 5); + + pps->arbitrary_slice_present_flag = get_bits(&gb, 1); + pps->constrained_intra_pred_flag = get_bits(&gb, 1); + pps->cu_qp_delta_enabled_flag = get_bits(&gb, 1); + + if (pps->cu_qp_delta_enabled_flag) + pps->log2_cu_qp_delta_area_minus6 = get_ue_golomb(&gb); + + return pps; +} + +// @see ISO_IEC_23094-1 (7.3.2.6 Slice layer RBSP syntax) +static EVCParserSliceHeader *parse_slice_header(const uint8_t *bs, int bs_size, EVCParserContext *ev) +{ + GetBitContext gb; + EVCParserSliceHeader *sh; + EVCParserPPS *pps; + EVCParserSPS *sps; + + int num_tiles_in_slice = 0; + int slice_pic_parameter_set_id; + + if (init_get_bits8(&gb, bs, bs_size) < 0) + return NULL; + + slice_pic_parameter_set_id = get_ue_golomb(&gb); + + if (slice_pic_parameter_set_id < 0 || slice_pic_parameter_set_id >= EVC_MAX_PPS_COUNT) + return NULL; + + sh = &ev->slice_header[slice_pic_parameter_set_id]; + pps = &ev->pps[slice_pic_parameter_set_id]; + sps = &ev->sps[slice_pic_parameter_set_id]; + + sh->slice_pic_parameter_set_id = slice_pic_parameter_set_id; + + if (!pps->single_tile_in_pic_flag) { + sh->single_tile_in_slice_flag = get_bits(&gb, 1); + sh->first_tile_id = get_bits(&gb, pps->tile_id_len_minus1 + 1); + } else + sh->single_tile_in_slice_flag = 1; + + if (!sh->single_tile_in_slice_flag) { + if (pps->arbitrary_slice_present_flag) + sh->arbitrary_slice_flag = get_bits(&gb, 1); + + if (!sh->arbitrary_slice_flag) + sh->last_tile_id = get_bits(&gb, pps->tile_id_len_minus1 + 1); + else { + sh->num_remaining_tiles_in_slice_minus1 = get_ue_golomb(&gb); + num_tiles_in_slice = sh->num_remaining_tiles_in_slice_minus1 + 2; + for (int i = 0; i < num_tiles_in_slice - 1; ++i) + sh->delta_tile_id_minus1[i] = get_ue_golomb(&gb); + } + } + + sh->slice_type = get_ue_golomb(&gb); + + if (ev->nalu_type == EVC_IDR_NUT) + sh->no_output_of_prior_pics_flag = get_bits(&gb, 1); + + if (sps->sps_mmvd_flag && ((sh->slice_type == EVC_SLICE_TYPE_B) || (sh->slice_type == EVC_SLICE_TYPE_P))) + sh->mmvd_group_enable_flag = get_bits(&gb, 1); + else + sh->mmvd_group_enable_flag = 0; + + if (sps->sps_alf_flag) { + int ChromaArrayType = sps->chroma_format_idc; + + sh->slice_alf_enabled_flag = get_bits(&gb, 1); + + if (sh->slice_alf_enabled_flag) { + sh->slice_alf_luma_aps_id = get_bits(&gb, 5); + sh->slice_alf_map_flag = get_bits(&gb, 1); + sh->slice_alf_chroma_idc = get_bits(&gb, 2); + + if ((ChromaArrayType == 1 || ChromaArrayType == 2) && sh->slice_alf_chroma_idc > 0) + sh->slice_alf_chroma_aps_id = get_bits(&gb, 5); + } + if (ChromaArrayType == 3) { + int sliceChromaAlfEnabledFlag = 0; + int sliceChroma2AlfEnabledFlag = 0; + + if (sh->slice_alf_chroma_idc == 1) { // @see ISO_IEC_23094-1 (7.4.5) + sliceChromaAlfEnabledFlag = 1; + sliceChroma2AlfEnabledFlag = 0; + } else if (sh->slice_alf_chroma_idc == 2) { + sliceChromaAlfEnabledFlag = 0; + sliceChroma2AlfEnabledFlag = 1; + } else if (sh->slice_alf_chroma_idc == 3) { + sliceChromaAlfEnabledFlag = 1; + sliceChroma2AlfEnabledFlag = 1; + } else { + sliceChromaAlfEnabledFlag = 0; + sliceChroma2AlfEnabledFlag = 0; + } + + if (!sh->slice_alf_enabled_flag) + sh->slice_alf_chroma_idc = get_bits(&gb, 2); + + if (sliceChromaAlfEnabledFlag) { + sh->slice_alf_chroma_aps_id = get_bits(&gb, 5); + sh->slice_alf_chroma_map_flag = get_bits(&gb, 1); + } + + if (sliceChroma2AlfEnabledFlag) { + sh->slice_alf_chroma2_aps_id = get_bits(&gb, 5); + sh->slice_alf_chroma2_map_flag = get_bits(&gb, 1); + } + } + } + + if (ev->nalu_type != EVC_IDR_NUT) { + if (sps->sps_pocs_flag) + sh->slice_pic_order_cnt_lsb = get_bits(&gb, sps->log2_max_pic_order_cnt_lsb_minus4 + 4); + } + + // @note + // If necessary, add the missing fields to the EVCParserSliceHeader structure + // and then extend parser implementation + + return sh; +} + +static int parse_nal_unit_type(AVCodecParserContext *s, const uint8_t *buf, + int buf_size, AVCodecContext *avctx) +{ + EVCParserContext *ev = s->priv_data; + int nalu_type, nalu_size; + + const uint8_t *data = buf; + int data_size = buf_size; + + nalu_size = buf_size; + if (nalu_size <= 0) { + av_log(avctx, AV_LOG_ERROR, "Invalid NAL unit size: (%d)\n", nalu_size); + return AVERROR_INVALIDDATA; + } + + // @see ISO_IEC_23094-1_2020, 7.4.2.2 NAL unit header semantic (Table 4 - NAL unit type codes and NAL unit type classes) + // @see enum EVCNALUnitType in evc.h + nalu_type = get_nalu_type(data, data_size, avctx); + if (nalu_type < EVC_NOIDR_NUT || nalu_type > EVC_UNSPEC_NUT62) { + av_log(avctx, AV_LOG_ERROR, "Invalid NAL unit type: (%d)\n", nalu_type); + return AVERROR_INVALIDDATA; + } + ev->nalu_type = nalu_type; + + return 0; +} + +static int parse_nal_unit(AVCodecParserContext *s, const uint8_t *buf, + int buf_size, AVCodecContext *avctx) +{ + EVCParserContext *ev = s->priv_data; + int nalu_type, nalu_size; + int tid; + const uint8_t *data = buf; + int data_size = buf_size; + + s->picture_structure = AV_PICTURE_STRUCTURE_FRAME; + s->key_frame = -1; + + nalu_size = buf_size; + if (nalu_size <= 0) { + av_log(avctx, AV_LOG_ERROR, "Invalid NAL unit size: (%d)\n", nalu_size); + return AVERROR_INVALIDDATA; + } + + // @see ISO_IEC_23094-1_2020, 7.4.2.2 NAL unit header semantic (Table 4 - NAL unit type codes and NAL unit type classes) + // @see enum EVCNALUnitType in evc.h + nalu_type = get_nalu_type(data, data_size, avctx); + if (nalu_type < EVC_NOIDR_NUT || nalu_type > EVC_UNSPEC_NUT62) { + av_log(avctx, AV_LOG_ERROR, "Invalid NAL unit type: (%d)\n", nalu_type); + return AVERROR_INVALIDDATA; + } + ev->nalu_type = nalu_type; + + tid = get_temporal_id(data, data_size, avctx); + if (tid < 0) { + av_log(avctx, AV_LOG_ERROR, "Invalid temporial id: (%d)\n", tid); + return AVERROR_INVALIDDATA; + } + ev->nuh_temporal_id = tid; + + if (data_size < nalu_size) { + av_log(avctx, AV_LOG_ERROR, "NAL unit does not fit in the data buffer\n"); + return AVERROR_INVALIDDATA; + } + + data += EVC_NALU_HEADER_SIZE; + data_size -= EVC_NALU_HEADER_SIZE; + + switch(nalu_type) { + case EVC_SPS_NUT: { + EVCParserSPS *sps; + int SubGopLength; + int bit_depth; + + sps = parse_sps(data, nalu_size, ev); + if (!sps) { + av_log(avctx, AV_LOG_ERROR, "SPS parsing error\n"); + return AVERROR_INVALIDDATA; + } + + s->coded_width = sps->pic_width_in_luma_samples; + s->coded_height = sps->pic_height_in_luma_samples; + s->width = sps->pic_width_in_luma_samples - sps->picture_crop_left_offset - sps->picture_crop_right_offset; + s->height = sps->pic_height_in_luma_samples - sps->picture_crop_top_offset - sps->picture_crop_bottom_offset; + + SubGopLength = (int)pow(2.0, sps->log2_sub_gop_length); + avctx->gop_size = SubGopLength; + + avctx->delay = (sps->sps_max_dec_pic_buffering_minus1) ? sps->sps_max_dec_pic_buffering_minus1 - 1 : SubGopLength + sps->max_num_tid0_ref_pics - 1; + + if (sps->profile_idc == 1) avctx->profile = FF_PROFILE_EVC_MAIN; + else avctx->profile = FF_PROFILE_EVC_BASELINE; + + if (sps->vui_parameters_present_flag) { + if (sps->vui_parameters.timing_info_present_flag) { + int64_t num = sps->vui_parameters.num_units_in_tick; + int64_t den = sps->vui_parameters.time_scale; + if (num != 0 && den != 0) + av_reduce(&avctx->framerate.den, &avctx->framerate.num, num, den, 1 << 30); + } + } + + bit_depth = sps->bit_depth_chroma_minus8 + 8; + s->format = AV_PIX_FMT_NONE; + + switch (bit_depth) { + case 8: + s->format = pix_fmts_8bit[sps->chroma_format_idc]; + break; + case 9: + s->format = pix_fmts_9bit[sps->chroma_format_idc]; + break; + case 10: + s->format = pix_fmts_10bit[sps->chroma_format_idc]; + break; + case 12: + s->format = pix_fmts_12bit[sps->chroma_format_idc]; + break; + case 14: + s->format = pix_fmts_14bit[sps->chroma_format_idc]; + break; + case 16: + s->format = pix_fmts_16bit[sps->chroma_format_idc]; + break; + } + av_assert0(s->format != AV_PIX_FMT_NONE); + + break; + } + case EVC_PPS_NUT: { + EVCParserPPS *pps; + + pps = parse_pps(data, nalu_size, ev); + if (!pps) { + av_log(avctx, AV_LOG_ERROR, "PPS parsing error\n"); + return AVERROR_INVALIDDATA; + } + break; + } + case EVC_SEI_NUT: // Supplemental Enhancement Information + case EVC_APS_NUT: // Adaptation parameter set + case EVC_FD_NUT: // Filler data + break; + case EVC_IDR_NUT: // Coded slice of a IDR or non-IDR picture + case EVC_NOIDR_NUT: { + EVCParserSliceHeader *sh; + EVCParserSPS *sps; + int slice_pic_parameter_set_id; + + sh = parse_slice_header(data, nalu_size, ev); + if (!sh) { + av_log(avctx, AV_LOG_ERROR, "Slice header parsing error\n"); + return AVERROR_INVALIDDATA; + } + + switch (sh->slice_type) { + case EVC_SLICE_TYPE_B: { + s->pict_type = AV_PICTURE_TYPE_B; + break; + } + case EVC_SLICE_TYPE_P: { + s->pict_type = AV_PICTURE_TYPE_P; + break; + } + case EVC_SLICE_TYPE_I: { + s->pict_type = AV_PICTURE_TYPE_I; + break; + } + default: { + s->pict_type = AV_PICTURE_TYPE_NONE; + } + } + + s->key_frame = (nalu_type == EVC_IDR_NUT) ? 1 : 0; + + // 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 + slice_pic_parameter_set_id = sh->slice_pic_parameter_set_id; + sps = &ev->sps[slice_pic_parameter_set_id]; + + if (sps->sps_pocs_flag) { + + int PicOrderCntMsb = 0; + ev->poc.prevPicOrderCntVal = ev->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 = ev->poc.PicOrderCntVal & (MaxPicOrderCntLsb - 1); + int prevPicOrderCntMsb = ev->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; + } + ev->poc.PicOrderCntVal = PicOrderCntMsb + sh->slice_pic_order_cnt_lsb; + + } else { + if (nalu_type == EVC_IDR_NUT) { + ev->poc.PicOrderCntVal = 0; + ev->poc.DocOffset = -1; + } else { + int SubGopLength = (int)pow(2.0, sps->log2_sub_gop_length); + if (tid == 0) { + ev->poc.PicOrderCntVal = ev->poc.prevPicOrderCntVal + SubGopLength; + ev->poc.DocOffset = 0; + ev->poc.prevPicOrderCntVal = ev->poc.PicOrderCntVal; + } else { + int ExpectedTemporalId; + int PocOffset; + int prevDocOffset = ev->poc.DocOffset; + + ev->poc.DocOffset = (prevDocOffset + 1) % SubGopLength; + if (ev->poc.DocOffset == 0) { + ev->poc.prevPicOrderCntVal += SubGopLength; + ExpectedTemporalId = 0; + } else + ExpectedTemporalId = 1 + (int)log2(ev->poc.DocOffset); + while (tid != ExpectedTemporalId) { + ev->poc.DocOffset = (ev->poc.DocOffset + 1) % SubGopLength; + if (ev->poc.DocOffset == 0) + ExpectedTemporalId = 0; + else + ExpectedTemporalId = 1 + (int)log2(ev->poc.DocOffset); + } + PocOffset = (int)(SubGopLength * ((2.0 * ev->poc.DocOffset + 1) / (int)pow(2.0, tid) - 2)); + ev->poc.PicOrderCntVal = ev->poc.prevPicOrderCntVal + PocOffset; + } + } + } + + s->output_picture_number = ev->poc.PicOrderCntVal; + s->key_frame = (nalu_type == EVC_IDR_NUT) ? 1 : 0; + + break; + } + } + + return 0; +} + +static int parse_nal_units(AVCodecParserContext *s, const uint8_t *buf, + int buf_size, AVCodecContext *avctx) +{ + const uint8_t *data = buf; + int data_size = buf_size; + int bytes_read = 0; + int nalu_size = 0; + + while (data_size > 0) { + + // Buffer size is not enough for buffer to store NAL unit 4-bytes prefix (length) + if (data_size < EVC_NALU_LENGTH_PREFIX_SIZE) + return END_NOT_FOUND; + + nalu_size = read_nal_unit_length(data, data_size, avctx); + bytes_read += EVC_NALU_LENGTH_PREFIX_SIZE; + + data += EVC_NALU_LENGTH_PREFIX_SIZE; + data_size -= EVC_NALU_LENGTH_PREFIX_SIZE; + + if (data_size < nalu_size) + return END_NOT_FOUND; + + if (parse_nal_unit(s, data, nalu_size, avctx) != 0) { + av_log(avctx, AV_LOG_ERROR, "Parsing of NAL unit failed\n"); + return AVERROR_INVALIDDATA; + } + + data += nalu_size; + data_size -= nalu_size; + } + return 0; +} + +// Reconstruct NAL Unit from incomplete data +// +// Assemble the NALU prefix storing NALU length if it has been split between 2 subsequent buffers (input chunks) incoming to the parser. +// This is the case when the buffer size is not enough for the buffer to store the whole NAL unit prefix. +// In this case, we have to get part of the prefix from the previous buffer and assemble it with the rest from the current buffer. +// Then we'll be able to read NAL unit size. +static int evc_assemble_nalu_prefix(AVCodecParserContext *s, const uint8_t *data, int data_size, + uint8_t *nalu_prefix, AVCodecContext *avctx) +{ + EVCParserContext *ctx = s->priv_data; + ParseContext *pc = &ctx->pc; + + // 1. pc->buffer contains previously read bytes of NALU prefix + // 2. buf contains the rest of NAL unit prefix bytes + + for (int i = 0; i < EVC_NALU_LENGTH_PREFIX_SIZE; i++) { + if (i < pc->index) + nalu_prefix[i] = pc->buffer[i]; + else + nalu_prefix[i] = data[i - pc->index]; + } + + return 0; +} + +// Reconstruct NALU from incomplete data +// Assemble NALU if it is split between multiple buffers +// +// This is the case when the buffer size is not enough to store the entire NAL unit. +// In this scenario, we must retrieve parts of the NALU from the previous buffers stored in pc->buffer and assemble them with the remainder from the current buffer. +static int evc_assemble_nalu(AVCodecParserContext *s, const uint8_t *data, int data_size, + uint8_t *nalu, int nalu_size, + AVCodecContext *avctx) +{ + EVCParserContext *ctx = s->priv_data; + ParseContext *pc = &ctx->pc; + + // 1. pc->buffer contains previously read bytes of the current NALU and previous NALUs that belong to the current Access Unit. + // + // - previously read bytes are data that came with the previous incoming data chunks. + // + // - pc->buffer contains bytes of the current NALU that have already been read while processing previous chunks of incoming data, + // as well as already read bytes of previous NALUs belonging to the same Access Unit. + // + // - ctx->bytes_read is the index of the the first element of the current NALU int the pc->buffer. + // - The pc->index is the index of the element located right next to the last element of the current NALU in the pc->buffer. + // - The elements of pc->buffer located before ctx->bytes_read index contain previously read NALUs of the current Access Unit. + // + // 2. buf contains the rest of the NAL unit bytestime_base + // + // - ctx->to_read number of bytes to read from buf (the index of the element right next to the last element to read) + + uint8_t *prev_data = pc->buffer + ctx->bytes_read; + int prev_data_size = pc->index - ctx->bytes_read; + + memcpy(nalu, prev_data, prev_data_size); + memcpy(nalu + prev_data_size, data, data_size); + + return 0; +} + +static int end_of_access_unit_found(AVCodecParserContext *s, AVCodecContext *avctx) +{ + EVCParserContext *ctx = s->priv_data; + + if (avctx->profile == 0) { // BASELINE profile + if (ctx->nalu_type == EVC_NOIDR_NUT || ctx->nalu_type == EVC_IDR_NUT) + return 1; + } else { // MAIN profile + EVCParserContext *ev = s->priv_data; + if (ctx->nalu_type == EVC_NOIDR_NUT) { + if (ev->poc.PicOrderCntVal != ev->poc.prevPicOrderCntVal) + return 1; + } else if (ctx->nalu_type == EVC_IDR_NUT) + return 1; + } + return 0; +} + +// Find the end of the current frame in the bitstream. +// The end of frame is the end of Access Unit. +// Function returns the position of the first byte of the next frame, or END_NOT_FOUND +static int evc_find_frame_end(AVCodecParserContext *s, const uint8_t *buf, + int buf_size, AVCodecContext *avctx) +{ + EVCParserContext *ctx = s->priv_data; + + const uint8_t *data = buf; + int data_size = buf_size; + + while (data_size > 0) { + + if (ctx->to_read == 0) { + // Nothing must be read and appended to the data from previous chunks. + // The previous chunk of data provided the complete NALU prefix or provided the complete NALU. + + if (ctx->nalu_prefix_assembled) // NALU prefix has been assembled from previous and current chunks of incoming data + ctx->nalu_prefix_assembled = 0; + else { + // Buffer size is not enough for buffer to store NAL unit 4-bytes prefix (length) + if (data_size < EVC_NALU_LENGTH_PREFIX_SIZE) { + ctx->to_read = EVC_NALU_LENGTH_PREFIX_SIZE - data_size; + ctx->incomplete_nalu_prefix_read = 1; + return END_NOT_FOUND; + } + + ctx->nalu_size = read_nal_unit_length(data, data_size, avctx); + ctx->bytes_read += EVC_NALU_LENGTH_PREFIX_SIZE; + + data += EVC_NALU_LENGTH_PREFIX_SIZE; + data_size -= EVC_NALU_LENGTH_PREFIX_SIZE; + } + + if (data_size < ctx->nalu_size) { + + ctx->to_read = ctx->nalu_size - data_size; + ctx->incomplete_nalu_read = 1; + return END_NOT_FOUND; + } + + // the entire NALU can be read + if (parse_nal_unit_type(s, data, ctx->nalu_size, avctx) != 0) { + av_log(avctx, AV_LOG_ERROR, "Parsing of NAL unit type failed\n"); + return AVERROR_INVALIDDATA; + } + + data += ctx->nalu_size; + data_size -= ctx->nalu_size; + + ctx->bytes_read += ctx->nalu_size; + + if (end_of_access_unit_found(s, avctx)) { + + // parser should return buffer that contains complete AU + int read_bytes = ctx->bytes_read; + ctx->bytes_read = 0; + return read_bytes; + } + + // go to the next iteration + continue; + + } else { + // The previous chunk of input data did not contain the complete valid NALU prefix or did not contain the complete NALU. + // + // Missing data must be read from the current data chunk and merged with the data from the previous data chunk + // to assemble a complete NALU or complete NALU prefix. + // + // The data from the previous data chunk are stored in pc->buf + + if (ctx->to_read < data_size) { + + if (ctx->incomplete_nalu_prefix_read == 1) { + + uint8_t nalu_prefix[EVC_NALU_LENGTH_PREFIX_SIZE]; + evc_assemble_nalu_prefix(s, data, data_size, nalu_prefix, avctx); + + ctx->nalu_size = read_nal_unit_length(nalu_prefix, EVC_NALU_LENGTH_PREFIX_SIZE, avctx); + + // update variable storing amout of read bytes for teh current AU + ctx->bytes_read += ctx->to_read; + + // update data pointer and data size + data += ctx->to_read; + data_size -= ctx->to_read; + + // reset variable storing amount of bytes to read from the new data chunk + ctx->to_read = 0; + + ctx->incomplete_nalu_prefix_read = 0; + ctx->nalu_prefix_assembled = 1; + + continue; + } + if (ctx->incomplete_nalu_read == 1) { + + uint8_t *nalu = (uint8_t *)av_malloc(ctx->nalu_size); + + // assemble NAL unit using data from previous data chunks (pc->buffer) and the current one (data) + evc_assemble_nalu(s, data, ctx->to_read, nalu, ctx->nalu_size, avctx); + + if (parse_nal_unit_type(s, nalu, ctx->nalu_size, avctx) != 0) { + av_log(avctx, AV_LOG_ERROR, "Parsing of NAL unit type failed\n"); + return AVERROR_INVALIDDATA; + } + + av_free(nalu); + + // update variable storing amout of read bytes for teh current AU + ctx->bytes_read += ctx->nalu_size; + + // update data pointer and data size + data += ctx->to_read; + data_size -= ctx->to_read; + + ctx->incomplete_nalu_read = 0; + + if (end_of_access_unit_found(s, avctx)) { + + // parser should return buffer that contains complete AU + int read_bytes = ctx->to_read; + + ctx->to_read = 0; + ctx->bytes_read = 0; + + return read_bytes; + } + + // reset variable storing amount of bytes to read from the new data chunk + ctx->to_read = 0; + + continue; + } + } else { + // needed more input data to assemble complete valid NAL Unit + ctx->to_read = ctx->to_read - data_size; + return END_NOT_FOUND; + } + } + } + + return END_NOT_FOUND; +} + +static int evc_parse(AVCodecParserContext *s, AVCodecContext *avctx, + const uint8_t **poutbuf, int *poutbuf_size, + const uint8_t *buf, int buf_size) +{ + int next; + EVCParserContext *ev = s->priv_data; + ParseContext *pc = &ev->pc; + + if (s->flags & PARSER_FLAG_COMPLETE_FRAMES) + next = buf_size; + else { + next = evc_find_frame_end(s, buf, buf_size, avctx); + if (ff_combine_frame(pc, next, &buf, &buf_size) < 0) { + *poutbuf = NULL; + *poutbuf_size = 0; + return buf_size; + } + } + + parse_nal_units(s, buf, buf_size, avctx); + + // poutbuf contains just one Access Unit + *poutbuf = buf; + *poutbuf_size = buf_size; + + return next; +} + +static int evc_parser_init(AVCodecParserContext *s) +{ + EVCParserContext *ev = s->priv_data; + ev->incomplete_nalu_prefix_read = 0; + + return 0; +} + +const AVCodecParser ff_evc_parser = { + .codec_ids = { AV_CODEC_ID_EVC }, + .priv_data_size = sizeof(EVCParserContext), + .parser_init = evc_parser_init, + .parser_parse = evc_parse, + .parser_close = ff_parse_close, +}; diff --git a/libavcodec/parsers.c b/libavcodec/parsers.c index d355808018..2c077ec3ae 100644 --- a/libavcodec/parsers.c +++ b/libavcodec/parsers.c @@ -41,6 +41,7 @@ extern const AVCodecParser ff_dvaudio_parser; extern const AVCodecParser ff_dvbsub_parser; extern const AVCodecParser ff_dvdsub_parser; extern const AVCodecParser ff_dvd_nav_parser; +extern const AVCodecParser ff_evc_parser; extern const AVCodecParser ff_flac_parser; extern const AVCodecParser ff_ftr_parser; extern const AVCodecParser ff_g723_1_parser; From patchwork Tue Apr 18 10:30:37 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Dawid Kozinski X-Patchwork-Id: 41234 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a20:4645:b0:e3:3194:9d20 with SMTP id eb5csp3038047pzb; Tue, 18 Apr 2023 03:30:56 -0700 (PDT) X-Google-Smtp-Source: AKy350YdiPnUfYR6Bfiep1kBRjOo+K9En9oBqDXSm/D21OxYPTsFSQpPb+h/R7B0ZpMk9Ol63luv X-Received: by 2002:aa7:d153:0:b0:506:a44c:47e3 with SMTP id r19-20020aa7d153000000b00506a44c47e3mr1816853edo.16.1681813856289; Tue, 18 Apr 2023 03:30:56 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1681813856; cv=none; d=google.com; s=arc-20160816; b=bGu02KFdT8nD8EbJrkdsmk6YI//C+jMn5N6SLCfEo38W0+Jr/6uX328zVdKsLHdfi5 SHFPKUvAVls0Smdoz7Q4pMeldCm0d6KNotcyzy0f6noNubAS0GRoKM90XpC7kOm+RSKN +LDInAU+EnQWAq8KAM9o9Dfl3ryDfP1OxrPx9w2a0ZUrV5nV7Jz7s5B9LC+Hdvnb6VUi 5aLv5Xpe566IR1Chyt8QEtozJcow/ofK/Qd8eU1I88T+XMrdbvMdD2jDAo8DwWDcXDA6 WuDpvPwXTLNznu/vejnzDIAAT6b4l7KOFXk25slZ7t52JQLxGkBvsknLxrKigxZEXjM4 hpdg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:cc:reply-to :list-subscribe:list-help:list-post:list-archive:list-unsubscribe :list-id:precedence:subject:references:cms-type:mime-version :message-id:date:to:from:dkim-signature:dkim-filter:delivered-to; bh=YyPEuk/3XpY5xJiBbFhP9aku12gOscwhZ0d2o+9YRag=; b=aqe2rFfCbkAdwrwaYLpIlzLQ5gxfJpErhzQXGofG0B7vxSS5AcRPjXwbQ4oGxpvZDk WlGRrpTR5wN9uz9oEh6ywLT30MDHdYPZcZ48rhcLsAfftufOzamzRQLk7olMpPlB54mj lPAeB9uYMbIG3KwoEEFyeF6IBjqfLdBBZcOWKOw1Q6vCygj4E+Vo/5pLHIaRlyDWZSE1 pub3ZUEsUx84qpAhD1t+uGtA8VZNp4nHUATBr0JzxlKixd3SomxbLMf87ZKoCAnefI87 8khBwv+EaFqnn/3veijKf4WpbbmwZEsR2hbUtpPIzLaKH6vgRV6brEw/H1YPoL39e/1L a53g== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@samsung.com header.s=mail20170921 header.b="Xl/oPiwu"; 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=NONE dis=NONE) header.from=samsung.com Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id s20-20020aa7d794000000b0050494bece11si12694557edq.273.2023.04.18.03.30.55; Tue, 18 Apr 2023 03:30:56 -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=@samsung.com header.s=mail20170921 header.b="Xl/oPiwu"; 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=NONE dis=NONE) header.from=samsung.com Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id CB19368BE6B; Tue, 18 Apr 2023 13:30:52 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mailout1.w1.samsung.com (mailout1.w1.samsung.com [210.118.77.11]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 527C768BE5C for ; Tue, 18 Apr 2023 13:30:51 +0300 (EEST) Received: from eucas1p2.samsung.com (unknown [182.198.249.207]) by mailout1.w1.samsung.com (KnoxPortal) with ESMTP id 20230418103050euoutp01c14f15ea029a61b47dd7f0a71487de0e~XAMljtLSp1316913169euoutp01h for ; Tue, 18 Apr 2023 10:30:50 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 mailout1.w1.samsung.com 20230418103050euoutp01c14f15ea029a61b47dd7f0a71487de0e~XAMljtLSp1316913169euoutp01h DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=samsung.com; s=mail20170921; t=1681813850; bh=sfP9fXeVQZCnBihkd6bclU660PBiv56rnF5/LGTWUl0=; h=From:To:Cc:Subject:Date:References:From; b=Xl/oPiwuGTcIc/Ix4shWbSnBMPZmMdOre/UXb7W0npbwYCoNLFLfNZnangB1d8dQe fRDC6VAMZRAgHOKhK93PYtY7X/kWYUtBnsOwaQk66TPIfFQGXZDObZiCUkfObsLboJ 8bIuHRV17fBYLSFU79V2Qb/VT/WgQEVt/POj+EIw= Received: from eusmges3new.samsung.com (unknown [203.254.199.245]) by eucas1p1.samsung.com (KnoxPortal) with ESMTP id 20230418103050eucas1p165fb5e879f73d3b6ed9f5124915af2b9~XAMlYUnKq2306223062eucas1p1G; Tue, 18 Apr 2023 10:30:50 +0000 (GMT) Received: from eucas1p2.samsung.com ( [182.198.249.207]) by eusmges3new.samsung.com (EUCPMTA) with SMTP id DB.8B.10014.A517E346; Tue, 18 Apr 2023 11:30:50 +0100 (BST) Received: from eusmtrp2.samsung.com (unknown [182.198.249.139]) by eucas1p2.samsung.com (KnoxPortal) with ESMTPA id 20230418103050eucas1p268aaa5c59ba1abae49692cba6efa4033~XAMk17aNs2692026920eucas1p2R; Tue, 18 Apr 2023 10:30:50 +0000 (GMT) Received: from eusmgms2.samsung.com (unknown [182.198.249.180]) by eusmtrp2.samsung.com (KnoxPortal) with ESMTP id 20230418103050eusmtrp2421bb79faaa2047bd225bb4adc5a77db~XAMk1YIqq1851018510eusmtrp2S; Tue, 18 Apr 2023 10:30:50 +0000 (GMT) X-AuditID: cbfec7f5-ba1ff7000000271e-f2-643e715aa652 Received: from eusmtip2.samsung.com ( [203.254.199.222]) by eusmgms2.samsung.com (EUCPMTA) with SMTP id 7A.D5.34412.9517E346; Tue, 18 Apr 2023 11:30:49 +0100 (BST) Received: from AMDN5164.EU.corp.samsungelectronics.net (unknown [106.210.132.171]) by eusmtip2.samsung.com (KnoxPortal) with ESMTPA id 20230418103049eusmtip288d284b8173fbe7d72e68e69d5f4deac~XAMkjTyBO1409914099eusmtip2i; Tue, 18 Apr 2023 10:30:49 +0000 (GMT) From: Dawid Kozinski To: d.frankiewic@samsung.com, ffmpeg-devel@ffmpeg.org Date: Tue, 18 Apr 2023 12:30:37 +0200 Message-Id: <20230418103037.1870-1-d.kozinski@samsung.com> X-Mailer: git-send-email 2.37.3.windows.1 MIME-Version: 1.0 X-Unsent: 1 X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFnrDIsWRmVeSWpSXmKPExsWy7djP87pRhXYpBpO+y1l8ufaF2WLlt98s Ft8+nWF2YPb4s2gzi0ffllWMAUxRXDYpqTmZZalF+nYJXBlt7X/YCz6IVuxsaGRsYGwT7GLk 5JAQMJHo27+buYuRi0NIYAWjxIINz1khnC+MEk/2T2SHcD4zSkz8M58FpqVzw25GiMRyRonZ j+YyQTjtTBLzp89mA6liE9CVePnhEROILSJgKnGyeS9YnFlAW2Ld3e9gtrBAncTRb8cZQWwW AVWJKUe+MoPYvAJWEms+7GOG2KYpMWHLHCaIuKDEyZlPoK7gllg36xIrxEx5ieats8GekBD4 yi7RtOMgI0SRi8SbOVvZIWxhiVfHt0DZMhL/d84HGsoBZBdLHOp3gDBrJA79SIeosJZ42why GgfQeE2J9bv0IcKOEsunfWaGqOaTuPFWEOIAPolJ26ZDhXklOtqEIEwVib5OMYhGKYmny+ZA veQh8fThV6YJjIqzkHw1C8knsxDWLmBkXsUonlpanJueWmycl1quV5yYW1yal66XnJ+7iRGY IE7/O/51B+OKVx/1DjEycTAeYpTgYFYS4T3japUixJuSWFmVWpQfX1Sak1p8iFGag0VJnFfb 9mSykEB6YklqdmpqQWoRTJaJg1OqgUns1WWOZX7n/RblPlsqELWcr+N3gIZvs07ne92IThM7 0QQZ4XvKlyM95KU49h85c8t5WZTab44lrWpllzL3fZnkP2vFlc2X2BaUnV3EmbmqdmHN5Anb lvnuV3of6am3gD2K60XdxT+Kx/a2f/B9/ZpHqmd21I/Kf/xl4cuehS4xtvvxTc83vEc1m2+D 8+NPQjNdf03jb2HZuXjq1scPIq47vm668p3pqt/WCsedZkJW6aXSDHu2bXiy5I3f+Y0dJ9/K xE8q2Fa4/vPElZx/96mbZLPfsfkh9LbO3+nHKZ/5ryweHFj56aLGnWahFIlprl3r9s3KePwl 5kf6XJUzUacnyxz8mWf6y3Wb66+3ypcXKLEUZyQaajEXFScCADM4Lqt/AwAA X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFrrELMWRmVeSWpSXmKPExsVy+t/xe7qRhXYpBnt32lh8ufaF2WLlt98s Ft8+nWF2YPb4s2gzi0ffllWMAUxRejZF+aUlqQoZ+cUltkrRhhZGeoaWFnpGJpZ6hsbmsVZG pkr6djYpqTmZZalF+nYJehlt7X/YCz6IVuxsaGRsYGwT7GLk5JAQMJHo3LCbsYuRi0NIYCmj xLG1G5ghElISS5cuYoSwhSX+XOtigyhqZZJYtf4xE0iCTUBX4uWHR2C2iIC5xMV1t8AamAW0 Jdbd/c4GYgsL1Eh87NoCFmcRUJWYcuQr2AJeASuJNR/2QS3TlJiwZQ4TRFxQ4uTMJywQcW6J dbMusULMlJdo3jqbeQIj/ywkZbOQpBYwMq1iFEktLc5Nzy020itOzC0uzUvXS87P3cQIDNxt x35u2cG48tVHvUOMTByMhxglOJiVRHjPuFqlCPGmJFZWpRblxxeV5qQWH2I0Bbp1IrOUaHI+ MHbySuINzQxMDU3MLA1MLc2MlcR5PQs6EoUE0hNLUrNTUwtSi2D6mDg4pRqY9PLm2317KJvp xWIf9/BH99ndO25tYzxitlFq2tquaSIOxZv41l1taH902fP+DJ3KTe5Buosk9s6xc1x6pdZo zWSR8Murg+xelKcW+b04HMTyzOmEqVWC5p8HLPz3XggXlb09bbF71bH7u8s3zAjOceXJ5lXZ rrR5v1f5wy3+i2qj1paltBt3apbu6VCZZfPfeObdD+zTtl9cmsIsEGvALJN50auk+o2iUELP z/tnpju8cOCTqMhRLxEujw98Oysmb0tD6ErR9N3cBxikDDfmLRZ8XVsQY60Vu//9jkU5/pz8 i5vn6l+5UGi5Zk6s0xIODoU3p5eYi0sE3I90envrDIPy0gspF1RuhqbPr96uxFKckWioxVxU nAgAGISfDOUCAAA= X-CMS-MailID: 20230418103050eucas1p268aaa5c59ba1abae49692cba6efa4033 X-Msg-Generator: CA X-RootMTR: 20230418103050eucas1p268aaa5c59ba1abae49692cba6efa4033 X-EPHeader: CA CMS-TYPE: 201P X-CMS-RootMailID: 20230418103050eucas1p268aaa5c59ba1abae49692cba6efa4033 References: Subject: [FFmpeg-devel] [PATCH v20 03/10] avformat/evc_muxer: Added muxer to handle writing EVC encoded data into file or output bytestream 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: Dawid Kozinski Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: 9bFIR7msFzSj - Provided AVOutputFormat structure describing EVC output format (ff_evc_muxer) - Added documentation for EVC muxer Signed-off-by: Dawid Kozinski --- doc/muxers.texi | 6 ++++++ libavformat/Makefile | 1 + libavformat/allformats.c | 1 + libavformat/rawenc.c | 13 +++++++++++++ 4 files changed, 21 insertions(+) diff --git a/doc/muxers.texi b/doc/muxers.texi index 79dd864182..eee3e7c526 100644 --- a/doc/muxers.texi +++ b/doc/muxers.texi @@ -2120,6 +2120,12 @@ DTS Coherent Acoustics (DCA) audio. Dolby Digital Plus, also known as Enhanced AC-3, audio. +@subsection evc + +MPEG-5 Essential Video Coding (EVC) / EVC / MPEG-5 Part 1 EVC video. + +Extensions: evc + @subsection g722 ITU-T G.722 audio. diff --git a/libavformat/Makefile b/libavformat/Makefile index 048649689b..fafed6d129 100644 --- a/libavformat/Makefile +++ b/libavformat/Makefile @@ -251,6 +251,7 @@ OBJS-$(CONFIG_HCOM_DEMUXER) += hcom.o pcm.o OBJS-$(CONFIG_HDS_MUXER) += hdsenc.o OBJS-$(CONFIG_HEVC_DEMUXER) += hevcdec.o rawdec.o OBJS-$(CONFIG_HEVC_MUXER) += rawenc.o +OBJS-$(CONFIG_EVC_MUXER) += rawenc.o OBJS-$(CONFIG_HLS_DEMUXER) += hls.o hls_sample_encryption.o OBJS-$(CONFIG_HLS_MUXER) += hlsenc.o hlsplaylist.o avc.o OBJS-$(CONFIG_HNM_DEMUXER) += hnm.o diff --git a/libavformat/allformats.c b/libavformat/allformats.c index cb5b69e9cd..203188cb27 100644 --- a/libavformat/allformats.c +++ b/libavformat/allformats.c @@ -154,6 +154,7 @@ extern const AVInputFormat ff_ea_cdata_demuxer; extern const AVInputFormat ff_eac3_demuxer; extern const FFOutputFormat ff_eac3_muxer; extern const AVInputFormat ff_epaf_demuxer; +extern const FFOutputFormat ff_evc_muxer; extern const FFOutputFormat ff_f4v_muxer; extern const AVInputFormat ff_ffmetadata_demuxer; extern const FFOutputFormat ff_ffmetadata_muxer; diff --git a/libavformat/rawenc.c b/libavformat/rawenc.c index 78fadda967..70d6322c53 100644 --- a/libavformat/rawenc.c +++ b/libavformat/rawenc.c @@ -401,6 +401,19 @@ const FFOutputFormat ff_hevc_muxer = { }; #endif +#if CONFIG_EVC_MUXER +const FFOutputFormat ff_evc_muxer = { + .p.name = "evc", + .p.long_name = NULL_IF_CONFIG_SMALL("raw EVC video"), + .p.extensions = "evc", + .p.audio_codec = AV_CODEC_ID_NONE, + .p.video_codec = AV_CODEC_ID_EVC, + .init = force_one_stream, + .write_packet = ff_raw_write_packet, + .p.flags = AVFMT_NOTIMESTAMPS, +}; +#endif + #if CONFIG_M4V_MUXER const FFOutputFormat ff_m4v_muxer = { .p.name = "m4v", From patchwork Tue Apr 18 10:31:03 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Dawid Kozinski X-Patchwork-Id: 41235 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a20:4645:b0:e3:3194:9d20 with SMTP id eb5csp3038364pzb; Tue, 18 Apr 2023 03:31:25 -0700 (PDT) X-Google-Smtp-Source: AKy350aZXXGTEA8Ly0Yigb1PrTHM+NOrmcv5FDOJdklWHtIKeSTV6tKzT/Yd8EHtUYLM6aESdM5O X-Received: by 2002:a17:906:ae56:b0:932:1af9:7386 with SMTP id lf22-20020a170906ae5600b009321af97386mr10177890ejb.27.1681813885775; Tue, 18 Apr 2023 03:31:25 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1681813885; cv=none; d=google.com; s=arc-20160816; b=v/LfCMC86WwSy4PCQbcT4Ie6Efz0pjJKuTM+ScR0Hsk986IVNFbOInvwGv248iN5hP Yi68FHSjfzwOQC4gju7HKphjJaOW9cjw6JOZ7ugd8m2azvi1Tah0+fL2oqyXM4NyYqGo NtE3PHPDGw0U4wbCiQanEP2bRAtGRejBjL/go4bmF1JIOHbVY99pxhmW7AOapDDD96db 9k6OZXp0Sbk22Uvm9LaSt4K+xAvv6u4HIN+Qe7WEkz01ClrsVXoXAEoVm51A3sWKyqXX Ux+X6E1/H3JcqPcN3CJXCwgK8O6NKHFmeMcTmziD0PG6ORr5x+atMBhAzBgv739X6ry2 O7Hg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:cc:reply-to :list-subscribe:list-help:list-post:list-archive:list-unsubscribe :list-id:precedence:subject:references:cms-type:mime-version :message-id:date:to:from:dkim-signature:dkim-filter:delivered-to; bh=xeKg/8alJXarla+UdJzXP1kphYNhBMsimxRK6BqxPKk=; b=rc6qs4RL7Vr41O+UbhLMggZkDlyK0lKRbhS60ZqGfA5FpTutMQ+iiyuoHijwrkpJ79 MlCcPmt+akFDKJWNP7AKjGS3/ZaTuBQ1+FJTeIvxT8iJO48qUHC0p5t4heQ1/VWftn0+ 38rXBrItMKl6s9qiXaGOsJ/RihTOdjOB1Bj0cdmqJDRXo+gzIYcMIoWgYvPgVkL5Wq1U C80mujjKVIjfCgJ/vH/ayk/rzCfgZnBNfrR0hI21TtOaW25gIatyc9xRL1rGw/2x9tyw 0WrU0S2NInP2E4jS1zYY3l3u8yoQFN0mqayKLr9jzn515gbMJLsCX1Vjo2/ZizS7AHSa eqSg== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@samsung.com header.s=mail20170921 header.b=QwJwJobd; 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=NONE dis=NONE) header.from=samsung.com Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id f12-20020a056402004c00b005049c85875esi11437400edu.659.2023.04.18.03.31.25; Tue, 18 Apr 2023 03:31:25 -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=@samsung.com header.s=mail20170921 header.b=QwJwJobd; 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=NONE dis=NONE) header.from=samsung.com Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id EE8BA68BE63; Tue, 18 Apr 2023 13:31:22 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mailout1.w1.samsung.com (mailout1.w1.samsung.com [210.118.77.11]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 026E868BD1E for ; Tue, 18 Apr 2023 13:31:16 +0300 (EEST) Received: from eucas1p2.samsung.com (unknown [182.198.249.207]) by mailout1.w1.samsung.com (KnoxPortal) with ESMTP id 20230418103116euoutp01f998d1c89ed8cd0e7d463b38fb80a6a8~XAM9hSZNh1316913169euoutp01s for ; Tue, 18 Apr 2023 10:31:16 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 mailout1.w1.samsung.com 20230418103116euoutp01f998d1c89ed8cd0e7d463b38fb80a6a8~XAM9hSZNh1316913169euoutp01s DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=samsung.com; s=mail20170921; t=1681813876; bh=GIoD4J0tXxCWhDvkGUSECYeMtB83b+2XBjqG22mbxJE=; h=From:To:Cc:Subject:Date:References:From; b=QwJwJobd2VXPCL3zvkIDkUYhrH7lFEjP1YEw7UeXkw2HySyKeeo5hhRzWM1hjYAh5 0ZaLQpoDHwshVyP9AnituDvOl+EEfd6ZinGGvcfrn30hQjIhNPsiNR1EQyN5i8ASPy YmuNFaPFMKPCYQd/cHVU5Kx1L49W971Md0oWHpTQ= Received: from eusmges2new.samsung.com (unknown [203.254.199.244]) by eucas1p1.samsung.com (KnoxPortal) with ESMTP id 20230418103116eucas1p1b89625cc0276b95485ea18b6ce606110~XAM9C2WZY1026910269eucas1p1w; Tue, 18 Apr 2023 10:31:16 +0000 (GMT) Received: from eucas1p1.samsung.com ( [182.198.249.206]) by eusmges2new.samsung.com (EUCPMTA) with SMTP id 8E.EE.09966.3717E346; Tue, 18 Apr 2023 11:31:15 +0100 (BST) Received: from eusmtrp2.samsung.com (unknown [182.198.249.139]) by eucas1p1.samsung.com (KnoxPortal) with ESMTPA id 20230418103115eucas1p1756177d874201fd66489b730e78b97a0~XAM8eQiAJ2306223062eucas1p1a; Tue, 18 Apr 2023 10:31:15 +0000 (GMT) Received: from eusmgms2.samsung.com (unknown [182.198.249.180]) by eusmtrp2.samsung.com (KnoxPortal) with ESMTP id 20230418103115eusmtrp2edf8e45a8e0ee0e583df21b963cebbcc~XAM8dhLI-1851018510eusmtrp29; Tue, 18 Apr 2023 10:31:15 +0000 (GMT) X-AuditID: cbfec7f4-d39ff700000026ee-45-643e7173844d Received: from eusmtip1.samsung.com ( [203.254.199.221]) by eusmgms2.samsung.com (EUCPMTA) with SMTP id E5.E5.34412.3717E346; Tue, 18 Apr 2023 11:31:15 +0100 (BST) Received: from AMDN5164.EU.corp.samsungelectronics.net (unknown [106.210.132.171]) by eusmtip1.samsung.com (KnoxPortal) with ESMTPA id 20230418103115eusmtip14e32539e29e22abafa4dccc0d6554694~XAM8KSjMn2124821248eusmtip11; Tue, 18 Apr 2023 10:31:15 +0000 (GMT) From: Dawid Kozinski To: d.frankiewic@samsung.com, ffmpeg-devel@ffmpeg.org Date: Tue, 18 Apr 2023 12:31:03 +0200 Message-Id: <20230418103103.1937-1-d.kozinski@samsung.com> X-Mailer: git-send-email 2.37.3.windows.1 MIME-Version: 1.0 X-Unsent: 1 X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFnrNIsWRmVeSWpSXmKPExsWy7djPc7rFhXYpBjffmVl8ufaF2WLlt98s Ft8+nWF2YPb4s2gzi0ffllWMAUxRXDYpqTmZZalF+nYJXBn7ZkxjL5igVbF6xU3GBsYf8l2M nBwSAiYS/1ZtZ+9i5OIQEljBKNHf8YgVwvnCKHGo9RYThPOZUWJx2zVGmJb9L04yQySWAyUO v4Jy2pkkjvQuAqtiE9CVePnhEROILSJgKnGyeS8biM0soC2x7u53MFtYIEni2eQLYDaLgKrE jb0nwOp5Bawk9t27yQSxTVNiwpY5UHFBiZMzn7BAxLkl1s26xAoxU16ieetssCMkBL6yS0xe 9gpoKAeQ4yLxelo2RL2wxKvjW9ghbBmJ/zvnM0GUFEsc6neAMGskDv1Ih6iwlnjbeJwRJMwM dMH6XfoQYUeJ5Yt+Q83mk7jxVhBiP5/EpG3TmSHCvBIdbUIQpopEX6cYRKOUxNNlc5ghbA+J m5MOM01gVJyF5KlZSB6ZhbB2ASPzKkbx1NLi3PTUYqO81HK94sTc4tK8dL3k/NxNjMD0cPrf 8S87GJe/+qh3iJGJg/EQowQHs5II7xlXqxQh3pTEyqrUovz4otKc1OJDjNIcLErivNq2J5OF BNITS1KzU1MLUotgskwcnFINTFUvrbuynZ0/3rqxlK95d8Hmgwm+U3V1qyumLrbQ2lniG7RX UfTTqnvmldOi5po5H/i30JSP13j5zb2+c9NmLlxlueNu5+/lV63mhj4+K73rS7WcwuLdnseV 7V1VVMSOLKq5ePDMA/OzYruidP/7bjx2YebGVZLdh8rfnyp4XjAhbjazpHdvae3xqQv5Lt5v U2ExkP79/5V5QGo942lmhjQrt3zB+GnvO4yizmwNe9TE5LtD+H5wZ1b06x+3zjlnL5UT2Wy5 eMqKgILSAq6iln/n3p79Unk+4WvRP6EkLvMZAv/9ApJ6lZ4E639SypUwcdEsnHO3W/iSS+67 gFeCfqGSbzccqlvd/uWa9x4tayWW4oxEQy3mouJEAHeKCTR+AwAA X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFrrELMWRmVeSWpSXmKPExsVy+t/xu7rFhXYpBvO+iFh8ufaF2WLlt98s Ft8+nWF2YPb4s2gzi0ffllWMAUxRejZF+aUlqQoZ+cUltkrRhhZGeoaWFnpGJpZ6hsbmsVZG pkr6djYpqTmZZalF+nYJehn7ZkxjL5igVbF6xU3GBsYf8l2MnBwSAiYS+1+cZO5i5OIQEljK KHH4+DsmiISUxNKlixghbGGJP9e62CCKWpkk/p8+wgaSYBPQlXj54RFYg4iAucTFdbfAGpgF tCXW3f0OViMskCDRsOo/WA2LgKrEjb0nwGxeASuJffduQi3TlJiwZQ5UXFDi5MwnLBBxbol1 sy6xQsyUl2jeOpt5AiP/LCRls5CkFjAyrWIUSS0tzk3PLTbSK07MLS7NS9dLzs/dxAgM3G3H fm7Zwbjy1Ue9Q4xMHIyHGCU4mJVEeM+4WqUI8aYkVlalFuXHF5XmpBYfYjQFunUis5Rocj4w dvJK4g3NDEwNTcwsDUwtzYyVxHk9CzoShQTSE0tSs1NTC1KLYPqYODilGpjiXRj1ny8ouvnp +yK1Pbt9QhdUyi9c0yvq8NPcjfuAUPPJqX/X3vwrmX9wVceMECUh79MzJ9XuyTL7ez1exY27 9GPJbPuQRGX3TxNlwyeea7zkP29ptOLlbyftcp0uxRg57mn8s+X5W+8Cs/DVlvN+FudGXrzd xehovv3fnbkXD86Yrf3vnjPPzfTJ0uvXF/Za5Z3Jrw+QWx5zY6nLxPsm/b/1fYKadRXuzD7J /EYyYUb1MmlHU7OOGdeUljrt0TL9YnH/zffVzhy9grWWUw7/Lp+1/5qryapLR6+4/Th5jf/2 bDd2wdstTb/8/j0w7ZzY3VW1WE1sBqf7qyWK61Zxnjlhna/AGV5tPFMzsyJFiaU4I9FQi7mo OBEA0j6wu+UCAAA= X-CMS-MailID: 20230418103115eucas1p1756177d874201fd66489b730e78b97a0 X-Msg-Generator: CA X-RootMTR: 20230418103115eucas1p1756177d874201fd66489b730e78b97a0 X-EPHeader: CA CMS-TYPE: 201P X-CMS-RootMailID: 20230418103115eucas1p1756177d874201fd66489b730e78b97a0 References: Subject: [FFmpeg-devel] [PATCH v20 04/10] avformat/evc_demuxer: Added demuxer to handle reading EVC video files 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: Dawid Kozinski Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: iFL+t9nHWrmm - Provided AVInputFormat struct describing EVC input format (ff_evc_demuxer) Signed-off-by: Dawid Kozinski --- libavformat/Makefile | 1 + libavformat/allformats.c | 1 + libavformat/evcdec.c | 121 +++++++++++++++++++++++++++++++++++++++ 3 files changed, 123 insertions(+) create mode 100644 libavformat/evcdec.c diff --git a/libavformat/Makefile b/libavformat/Makefile index fafed6d129..d80e5dc6b3 100644 --- a/libavformat/Makefile +++ b/libavformat/Makefile @@ -251,6 +251,7 @@ OBJS-$(CONFIG_HCOM_DEMUXER) += hcom.o pcm.o OBJS-$(CONFIG_HDS_MUXER) += hdsenc.o OBJS-$(CONFIG_HEVC_DEMUXER) += hevcdec.o rawdec.o OBJS-$(CONFIG_HEVC_MUXER) += rawenc.o +OBJS-$(CONFIG_EVC_DEMUXER) += evcdec.o rawdec.o OBJS-$(CONFIG_EVC_MUXER) += rawenc.o OBJS-$(CONFIG_HLS_DEMUXER) += hls.o hls_sample_encryption.o OBJS-$(CONFIG_HLS_MUXER) += hlsenc.o hlsplaylist.o avc.o diff --git a/libavformat/allformats.c b/libavformat/allformats.c index 203188cb27..9d7d6a37a1 100644 --- a/libavformat/allformats.c +++ b/libavformat/allformats.c @@ -154,6 +154,7 @@ extern const AVInputFormat ff_ea_cdata_demuxer; extern const AVInputFormat ff_eac3_demuxer; extern const FFOutputFormat ff_eac3_muxer; extern const AVInputFormat ff_epaf_demuxer; +extern const AVInputFormat ff_evc_demuxer; extern const FFOutputFormat ff_evc_muxer; extern const FFOutputFormat ff_f4v_muxer; extern const AVInputFormat ff_ffmetadata_demuxer; diff --git a/libavformat/evcdec.c b/libavformat/evcdec.c new file mode 100644 index 0000000000..f73eeb4417 --- /dev/null +++ b/libavformat/evcdec.c @@ -0,0 +1,121 @@ +/* + * RAW EVC video demuxer + * + * Copyright (c) 2021 Dawid Kozinski + * + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * FFmpeg is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include "libavcodec/get_bits.h" +#include "libavcodec/golomb.h" +#include "libavcodec/internal.h" +#include "libavcodec/evc.h" + +#include "rawdec.h" +#include "avformat.h" + +typedef struct EVCParserContext { + int got_sps; + int got_pps; + int got_idr; + int got_nonidr; +} EVCParserContext; + +static int get_nalu_type(const uint8_t *bits, int bits_size) +{ + int unit_type_plus1 = 0; + + if (bits_size >= EVC_NALU_HEADER_SIZE) { + unsigned char *p = (unsigned char *)bits; + // forbidden_zero_bit + if ((p[0] & 0x80) != 0) // Cannot get bitstream information. Malformed bitstream. + return -1; + + // nal_unit_type + unit_type_plus1 = (p[0] >> 1) & 0x3F; + } + + return unit_type_plus1 - 1; +} + +static uint32_t read_nal_unit_length(const uint8_t *bits, int bits_size) +{ + uint32_t nalu_len = 0; + + if (bits_size >= EVC_NALU_LENGTH_PREFIX_SIZE) { + + int t = 0; + unsigned char *p = (unsigned char *)bits; + + for (int i = 0; i < EVC_NALU_LENGTH_PREFIX_SIZE; i++) + t = (t << 8) | p[i]; + + nalu_len = t; + if (nalu_len == 0) // Invalid bitstream size + return 0; + } + + return nalu_len; +} + +static int parse_nal_units(const AVProbeData *p, EVCParserContext *ev) +{ + int nalu_type; + size_t nalu_size; + unsigned char *bits = (unsigned char *)p->buf; + int bytes_to_read = p->buf_size; + + while (bytes_to_read > EVC_NALU_LENGTH_PREFIX_SIZE) { + + nalu_size = read_nal_unit_length(bits, EVC_NALU_LENGTH_PREFIX_SIZE); + if (nalu_size == 0) break; + + bits += EVC_NALU_LENGTH_PREFIX_SIZE; + bytes_to_read -= EVC_NALU_LENGTH_PREFIX_SIZE; + + if(bytes_to_read < nalu_size) break; + + nalu_type = get_nalu_type(bits, bytes_to_read); + + bits += nalu_size; + bytes_to_read -= nalu_size; + + if (nalu_type == EVC_SPS_NUT) + ev->got_sps++; + else if (nalu_type == EVC_PPS_NUT) + ev->got_pps++; + else if (nalu_type == EVC_IDR_NUT ) + ev->got_idr++; + else if (nalu_type == EVC_NOIDR_NUT) + ev->got_nonidr++; + } + + return 0; +} + +static int evc_probe(const AVProbeData *p) +{ + EVCParserContext ev = {0}; + int ret = parse_nal_units(p, &ev); + + if (ret == 0 && ev.got_sps && ev.got_pps && (ev.got_idr || ev.got_nonidr > 3)) + return AVPROBE_SCORE_EXTENSION + 1; // 1 more than .mpg + + return 0; +} + +FF_DEF_RAWVIDEO_DEMUXER(evc, "raw EVC video", evc_probe, "evc", AV_CODEC_ID_EVC) From patchwork Tue Apr 18 10:31:36 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Dawid Kozinski X-Patchwork-Id: 41236 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a20:4645:b0:e3:3194:9d20 with SMTP id eb5csp3038678pzb; Tue, 18 Apr 2023 03:32:01 -0700 (PDT) X-Google-Smtp-Source: AKy350Z8FF0KksRcUXxk8dBv/EPBLVcQO5PHJEtfZo9UZ6tkQZBxw9cxcdaxylsrh5CLdaSs7CAY X-Received: by 2002:a05:6402:710:b0:4fd:2b0e:ce87 with SMTP id w16-20020a056402071000b004fd2b0ece87mr1859439edx.24.1681813921195; Tue, 18 Apr 2023 03:32:01 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1681813921; cv=none; d=google.com; s=arc-20160816; b=KHY2qwc6OtQJ3EZLHrWxrtPyjy1Kg/byjRGIsk2sdnTQYrynHss+dF1h0WlWua5DMF klhf+ne1xr/jUO75wW2NJ49guxATJHXq9guwwtBCGBe6QQgAqNKPRycQwUJ3ijc4HPdE YdqkOQeV6PQg1NGylhhY3ScPWYcuQ6J43sdlh+MmAKHyXoJFSYSsycnozL15N6l5EzEJ aqPZMtLWmd3kby8G3RTs4eyIJMdOu+Y/yg9XNfi58gZwqTsU4j96VaGD4bTkPUNmxE57 LV8UZJ1spl9NCHb1GwypykzKXF5BwiHsIHGx/PkQTf5HqXTf7I6WZpvs7FmvnlqdRrWN pR+Q== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:cc:reply-to :list-subscribe:list-help:list-post:list-archive:list-unsubscribe :list-id:precedence:subject:references:cms-type:mime-version :message-id:date:to:from:dkim-signature:dkim-filter:delivered-to; bh=OdgwnxYets3xZYx6sH9nk9dlWarXrqnRg92uvKTKAmk=; b=IsLBrr6JUqdZR0nTErrszbp5YC7eEN+UFz39DfmCbhE65uCvBkAzybOlMrvz0iJ2C2 LIqPL/Lc6lbnEu8TGDD+k1msroNljsKcy7TsOZh1NfFaukBeVgWKIbxkk+Wrf7tA4FF5 7LT0b6X/Zh3bWhxKBdCh1at8E/8Qcwc5QPpRNjuAbZv+SNFC62UGZMFUq0XPl9V6nkGc TahdUgpprzmVVE0J7GJqAVF22kUtRdxN2VvAOWokQoUqv5p0799zI6Uc2Iq9BE1Tfigh BRz3svDf9gjS2OOB4slNzne1I5MpZDiTIev5Dik3EEAs9ELnQEscGbeL/Xj06DuspAQX G7EQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@samsung.com header.s=mail20170921 header.b="o/QHJt7Q"; 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=NONE dis=NONE) header.from=samsung.com Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id z5-20020aa7cf85000000b00504b02fcb7esi11471099edx.648.2023.04.18.03.31.59; Tue, 18 Apr 2023 03:32:01 -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=@samsung.com header.s=mail20170921 header.b="o/QHJt7Q"; 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=NONE dis=NONE) header.from=samsung.com Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 2058F68BE5D; Tue, 18 Apr 2023 13:31:57 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mailout2.w1.samsung.com (mailout2.w1.samsung.com [210.118.77.12]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id AB62668AF28 for ; Tue, 18 Apr 2023 13:31:50 +0300 (EEST) Received: from eucas1p1.samsung.com (unknown [182.198.249.206]) by mailout2.w1.samsung.com (KnoxPortal) with ESMTP id 20230418103150euoutp02021fcb5e8fb42e3c1dda54101e51aada~XANc6_GDg0971209712euoutp02W for ; Tue, 18 Apr 2023 10:31:50 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 mailout2.w1.samsung.com 20230418103150euoutp02021fcb5e8fb42e3c1dda54101e51aada~XANc6_GDg0971209712euoutp02W DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=samsung.com; s=mail20170921; t=1681813910; bh=iO+E/cMKvurFgeZjBttJX/fQiRV7njbpGNocR6RbvhI=; h=From:To:Cc:Subject:Date:References:From; b=o/QHJt7QNkUqenUkZJl3tDy8WFA0m/CQrYJOmVvDe6JWc27hev/gcqlj7f4jwxcNJ ZdUak/vSfxUqRYA/l7IbS8u51FfxWvKtxGVbEbIsIIVMLJ/dm27VXtHgMc/Q9pfFuV s7tCLlaNrmAG2KeFlsmX/aJSWcmv4K3mvXJbl1kM= Received: from eusmges2new.samsung.com (unknown [203.254.199.244]) by eucas1p1.samsung.com (KnoxPortal) with ESMTP id 20230418103149eucas1p1d3ff0682e3c2cba48e5c58818face5e1~XANcnlLeN0574505745eucas1p1l; Tue, 18 Apr 2023 10:31:49 +0000 (GMT) Received: from eucas1p2.samsung.com ( [182.198.249.207]) by eusmges2new.samsung.com (EUCPMTA) with SMTP id 4E.0F.09966.5917E346; Tue, 18 Apr 2023 11:31:49 +0100 (BST) Received: from eusmtrp1.samsung.com (unknown [182.198.249.138]) by eucas1p1.samsung.com (KnoxPortal) with ESMTPA id 20230418103149eucas1p15adbcad5cadf8c30ea281029b396d4d0~XANcSpcvU0577105771eucas1p1I; Tue, 18 Apr 2023 10:31:49 +0000 (GMT) Received: from eusmgms2.samsung.com (unknown [182.198.249.180]) by eusmtrp1.samsung.com (KnoxPortal) with ESMTP id 20230418103149eusmtrp133ecb29cd749e11393ddfa403667612f~XANcSHNU31315413154eusmtrp1c; Tue, 18 Apr 2023 10:31:49 +0000 (GMT) X-AuditID: cbfec7f4-d4fff700000026ee-ce-643e719593a1 Received: from eusmtip1.samsung.com ( [203.254.199.221]) by eusmgms2.samsung.com (EUCPMTA) with SMTP id EE.F5.34412.5917E346; Tue, 18 Apr 2023 11:31:49 +0100 (BST) Received: from AMDN5164.EU.corp.samsungelectronics.net (unknown [106.210.132.171]) by eusmtip1.samsung.com (KnoxPortal) with ESMTPA id 20230418103149eusmtip1e3835706f4b58ade198077e532fbe158~XANb_Jd670116001160eusmtip1I; Tue, 18 Apr 2023 10:31:49 +0000 (GMT) From: Dawid Kozinski To: d.frankiewic@samsung.com, ffmpeg-devel@ffmpeg.org Date: Tue, 18 Apr 2023 12:31:36 +0200 Message-Id: <20230418103136.1951-1-d.kozinski@samsung.com> X-Mailer: git-send-email 2.37.3.windows.1 MIME-Version: 1.0 X-Unsent: 1 X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFnrNIsWRmVeSWpSXmKPExsWy7djP87pTC+1SDL51mFh8ufaF2WLlt98s Ft8+nWF2YPb4s2gzi0ffllWMAUxRXDYpqTmZZalF+nYJXBk/GlcwFVz7zVjxYN41pgbGd3sZ uxg5OSQETCT+LFrKBGILCaxglJi0zaSLkQvI/sIosWrJUhYI5zOjxIKfU9lgOiavPMwKkVjO KPFi0SdWiPZ2Jon7F2RBbDYBXYmXHx6BjRURMJU42bwXrJlZQFti3d3vYLawQJDEsSvPwWwW AVWJBdsOsIDYvAJWErcOrWGCWKYpMWHLHCaIuKDEyZlPWCDi3BLrZl1ihZgpL9G8dTYzyEES Aj/ZJd41TQRyOIAcF4mHd/Ih6oUlXh3fwg5hy0icntzDAlFSLHGo3wHCrJE49CMdosJa4m3j cUaQMDPQBet36UOEHSU2HHvCDlHNJ3HjrSDEfj5gqE2HWskr0dEmBGGqSPR1ikE0Skk8XTaH GcL2kJh5eiH7BEbFWUiemoXkkVkIaxcwMq9iFE8tLc5NTy02ykst1ytOzC0uzUvXS87P3cQI TA+n/x3/soNx+auPeocYmTgYDzFKcDArifCecbVKEeJNSaysSi3Kjy8qzUktPsQozcGiJM6r bXsyWUggPbEkNTs1tSC1CCbLxMEp1cC08krLdY7rc609l/nlqHky33/2MEee8fWXaLE7U3ye zpUTevY99XzLpZYXMYuPyW7YWCj/49qTbwmzXz7+sXDZn+4FHpoTOY0Ouh1+t32R14EdzHa/ PoosPbwwT+7TrECTZfeNmMqcLybnrWg6prksw6Mk84j1/jJW48xzXA+ENzvGTjE/oGb9eWrT VmOGn8n+M3UcHt7p6zFTWPzcYZ7lx9wTJhFX9Lco5M4P8Zqy9ZtfBIfgnaeP3jv6p1aWSYjl u7oXvf2gaLjngCFTT1fEjVydLrGCKUkSq01uzePq538pe15t7z6l99tESq6fvbZy1/+sxmn3 Nx9SXn/9gPMOccY53jprajbvnzRx9ttJ8kosxRmJhlrMRcWJAAhPOOd+AwAA X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFrrCLMWRmVeSWpSXmKPExsVy+t/xu7pTC+1SDJbelLP4cu0Ls8XKb79Z LL59OsPswOzxZ9FmFo++LasYA5ii9GyK8ktLUhUy8otLbJWiDS2M9AwtLfSMTCz1DI3NY62M TJX07WxSUnMyy1KL9O0S9DJ+NK5gKrj2m7HiwbxrTA2M7/YydjFyckgImEhMXnmYtYuRi0NI YCmjxPdlZ5ggElISS5cugioSlvhzrYsNoqiVSeLwo1PsIAk2AV2Jlx8egTWICJhLXFx3C6yB WUBbYt3d72wgtrBAgMTLC51g9SwCqhILth1gAbF5Bawkbh1aA7VMU2LCljlMEHFBiZMzn7BA xLkl1s26xAoxU16ieets5gmM/LOQlM1CklrAyLSKUSS1tDg3PbfYSK84Mbe4NC9dLzk/dxMj MHi3Hfu5ZQfjylcf9Q4xMnEwHmKU4GBWEuE942qVIsSbklhZlVqUH19UmpNafIjRFOjWicxS osn5wPjJK4k3NDMwNTQxszQwtTQzVhLn9SzoSBQSSE8sSc1OTS1ILYLpY+LglGpgCjz0t7hV 1lvSrVx06opNzn25P8XiUy3+bHRabyP/mOPY0VVZXrEsb6Xm5D9ckWxbl+Hz50N84rRrFyIK H+fnyF92kFn5aMkqKcaDIuLhF/yYvtQcm255bHK7IqPhipa5d1k/FvWpFzy3Ov6zWuXnrfOG vJmvO5QYFkkpzbuzgacsYGdf9HpLUclMpaLE1RKv6/b9j9hVaNofIb+sroL50cytC/wm39MK 2/jv98E5L+4/ddc9e6BbddnmlzP+fugpVvG9UxakWDcltrppW02cd4+w8OvZdudkAq7OkdLJ fPzjeac5668LC6OvbnRYbz3/r567+ILVCa84ex5OjUy51eDCIWowe2982My5t0wXKbEUZyQa ajEXFScCAH9Yof7nAgAA X-CMS-MailID: 20230418103149eucas1p15adbcad5cadf8c30ea281029b396d4d0 X-Msg-Generator: CA X-RootMTR: 20230418103149eucas1p15adbcad5cadf8c30ea281029b396d4d0 X-EPHeader: CA CMS-TYPE: 201P X-CMS-RootMailID: 20230418103149eucas1p15adbcad5cadf8c30ea281029b396d4d0 References: Subject: [FFmpeg-devel] [PATCH v20 05/10] avcodec/evc_encoder: Provided support for EVC encoder 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: Dawid Kozinski Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: 0dlDNyVgJklb - Added EVC encoder wrapper - Changes in project configuration file and libavcodec Makefile - Added documentation for xeve wrapper Signed-off-by: Dawid Kozinski --- configure | 4 + doc/encoders.texi | 69 +++++ doc/general_contents.texi | 11 + libavcodec/Makefile | 1 + libavcodec/allcodecs.c | 1 + libavcodec/libxeve.c | 616 ++++++++++++++++++++++++++++++++++++++ 6 files changed, 702 insertions(+) create mode 100644 libavcodec/libxeve.c diff --git a/configure b/configure index 033db7442d..df8635adc8 100755 --- a/configure +++ b/configure @@ -292,6 +292,7 @@ External library support: --enable-libwebp enable WebP encoding via libwebp [no] --enable-libx264 enable H.264 encoding via x264 [no] --enable-libx265 enable HEVC encoding via x265 [no] + --enable-libxeve enable EVC encoding via libxeve [no] --enable-libxavs enable AVS encoding via xavs [no] --enable-libxavs2 enable AVS2 encoding via xavs2 [no] --enable-libxcb enable X11 grabbing using XCB [autodetect] @@ -1864,6 +1865,7 @@ EXTERNAL_LIBRARY_LIST=" libvorbis libvpx libwebp + libxeve libxml2 libzimg libzmq @@ -3397,6 +3399,7 @@ libx265_encoder_deps="libx265" libx265_encoder_select="atsc_a53" libxavs_encoder_deps="libxavs" libxavs2_encoder_deps="libxavs2" +libxeve_encoder_deps="libxeve" libxvid_encoder_deps="libxvid" libzvbi_teletext_decoder_deps="libzvbi" vapoursynth_demuxer_deps="vapoursynth" @@ -6735,6 +6738,7 @@ enabled libx265 && require_pkg_config libx265 x265 x265.h x265_api_get require_cpp_condition libx265 x265.h "X265_BUILD >= 89" enabled libxavs && require libxavs "stdint.h xavs.h" xavs_encoder_encode "-lxavs $pthreads_extralibs $libm_extralibs" enabled libxavs2 && require_pkg_config libxavs2 "xavs2 >= 1.3.0" "stdint.h xavs2.h" xavs2_api_get +enabled libxeve && require_pkg_config libxeve "xeve >= 0.4.3" "xeve.h" xeve_encode enabled libxvid && require libxvid xvid.h xvid_global -lxvidcore enabled libzimg && require_pkg_config libzimg "zimg >= 2.7.0" zimg.h zimg_get_api_version enabled libzmq && require_pkg_config libzmq "libzmq >= 4.2.1" zmq.h zmq_ctx_new diff --git a/doc/encoders.texi b/doc/encoders.texi index 3cb6fc1ce7..39a3fceaba 100644 --- a/doc/encoders.texi +++ b/doc/encoders.texi @@ -2883,6 +2883,75 @@ ffmpeg -i input -c:v libxavs2 -xavs2-params RdoqLevel=0 output.avs2 @end example @end table +@section libxeve + +eXtra-fast Essential Video Encoder (XEVE) MPEG-5 EVC encoder wrapper. +The xeve-equivalent options or values are listed in parentheses for easy migration. + +This encoder requires the presence of the libxeve headers and library +during configuration. You need to explicitly configure the build with +@option{--enable-libxeve}. + +@float NOTE +Many libxeve encoder options are mapped to FFmpeg global codec options, +while unique encoder options are provided through private options. +Additionally the xeve-params private options allows one to pass a list +of key=value tuples as accepted by the libxeve @code{parse_xeve_params} function. +@end float + +The xeve project website is at @url{https://github.com/mpeg5/xeve}. + +@subsection Options + +The following options are supported by the libxeve wrapper. +The xeve-equivalent options or values are listed in parentheses for easy migration. + +@float NOTE +To reduce the duplication of documentation, only the private options +and some others requiring special attention are documented here. For +the documentation of the undocumented generic options, see +@ref{codec-options,,the Codec Options chapter}. +@end float + +@float NOTE +To get a more accurate and extensive documentation of the libxeve options, +invoke the command @code{xeve_app --help} or consult the libxeve documentation. +@end float + +@table @option +@item b (@emph{bitrate}) +Set target video bitrate in bits/s. +Note that FFmpeg's b option is expressed in bits/s, while xeve's bitrate is in kilobits/s. + +@item bf (@emph{bframes}) +Set the maximum number of B frames (1,3,7,15). + +@item g (@emph{keyint}) +Set the GOP size (I-picture period). + +@item preset (@emph{preset}) +Set the xeve preset. +Set the encoder preset value to determine encoding speed [fast, medium, slow, placebo] + +@item tune (@emph{tune}) +Set the encoder tune parameter [psnr, zerolatency] + +@item profile (@emph{profile}) +Set the encoder profile [0: baselie; 1: main] + +@item crf (@emph{crf}) +Set the quality for constant quality mode. +Constant rate factor <10..49> [default: 32] + +@item qp (@emph{qp}) +Set constant quantization rate control method parameter. +Quantization parameter qp <0..51> [default: 32] + +@item threads (@emph{threads}) +Force to use a specific number of threads + +@end table + @section libxvid Xvid MPEG-4 Part 2 encoder wrapper. diff --git a/doc/general_contents.texi b/doc/general_contents.texi index 2eeebd847d..31f1793b9e 100644 --- a/doc/general_contents.texi +++ b/doc/general_contents.texi @@ -343,6 +343,14 @@ libxavs2 is under the GNU Public License Version 2 or later details), you must upgrade FFmpeg's license to GPL in order to use it. @end float +@section eXtra-fast Essential Video Encoder (XEVE) + +FFmpeg can make use of the XEVE library for EVC video encoding. + +Go to @url{https://github.com/mpeg5/xeve} and follow the instructions for +installing the XEVE library. Then pass @code{--enable-libxeve} to configure to +enable it. + @section ZVBI ZVBI is a VBI decoding library which can be used by FFmpeg to decode DVB @@ -598,6 +606,7 @@ library: @item raw DTS @tab X @tab X @item raw DTS-HD @tab @tab X @item raw E-AC-3 @tab X @tab X +@item raw EVC @tab X @tab X @item raw FLAC @tab X @tab X @item raw GSM @tab @tab X @item raw H.261 @tab X @tab X @@ -943,6 +952,8 @@ following image formats are supported: @item Electronic Arts TQI video @tab @tab X @item Escape 124 @tab @tab X @item Escape 130 @tab @tab X +@item EVC / MPEG-5 Part 1 @tab X @tab X + @tab encoding and decoding supported through external librariy libxeve @item FFmpeg video codec #1 @tab X @tab X @tab lossless codec (fourcc: FFV1) @item Flash Screen Video v1 @tab X @tab X diff --git a/libavcodec/Makefile b/libavcodec/Makefile index b07fabc3aa..7a9f42590f 100644 --- a/libavcodec/Makefile +++ b/libavcodec/Makefile @@ -1132,6 +1132,7 @@ OBJS-$(CONFIG_LIBX264_ENCODER) += libx264.o OBJS-$(CONFIG_LIBX265_ENCODER) += libx265.o OBJS-$(CONFIG_LIBXAVS_ENCODER) += libxavs.o OBJS-$(CONFIG_LIBXAVS2_ENCODER) += libxavs2.o +OBJS-$(CONFIG_LIBXEVE_ENCODER) += libxeve.o OBJS-$(CONFIG_LIBXVID_ENCODER) += libxvid.o OBJS-$(CONFIG_LIBZVBI_TELETEXT_DECODER) += libzvbi-teletextdec.o ass.o diff --git a/libavcodec/allcodecs.c b/libavcodec/allcodecs.c index 797fe39486..001d136d36 100644 --- a/libavcodec/allcodecs.c +++ b/libavcodec/allcodecs.c @@ -815,6 +815,7 @@ extern LIBX264_CONST FFCodec ff_libx264_encoder; #endif extern const FFCodec ff_libx264rgb_encoder; extern FFCodec ff_libx265_encoder; +extern const FFCodec ff_libxeve_encoder; extern const FFCodec ff_libxavs_encoder; extern const FFCodec ff_libxavs2_encoder; extern const FFCodec ff_libxvid_encoder; diff --git a/libavcodec/libxeve.c b/libavcodec/libxeve.c new file mode 100644 index 0000000000..c10b7de023 --- /dev/null +++ b/libavcodec/libxeve.c @@ -0,0 +1,616 @@ +/* + * libxeve encoder + * EVC (MPEG-5 Essential Video Coding) encoding using XEVE MPEG-5 EVC encoder library + * + * Copyright (C) 2021 Dawid Kozinski + * + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * FFmpeg is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include +#include + +#include + +#include "libavutil/internal.h" +#include "libavutil/common.h" +#include "libavutil/opt.h" +#include "libavutil/pixdesc.h" +#include "libavutil/pixfmt.h" +#include "libavutil/time.h" +#include "libavutil/cpu.h" +#include "libavutil/avstring.h" + +#include "avcodec.h" +#include "internal.h" +#include "packet_internal.h" +#include "codec_internal.h" +#include "profiles.h" +#include "encode.h" + +#define MAX_BS_BUF (16*1024*1024) + +/** + * Error codes + */ +#define XEVE_PARAM_BAD_NAME -100 +#define XEVE_PARAM_BAD_VALUE -200 + +/** + * Encoder states + * + * STATE_ENCODING - the encoder receives and processes input frames + * STATE_BUMPING - there are no more input frames, however the encoder still processes previously received data + */ +typedef enum State { + STATE_ENCODING, + STATE_BUMPING, +} State; + +/** + * The structure stores all the states associated with the instance of Xeve MPEG-5 EVC encoder + */ +typedef struct XeveContext { + const AVClass *class; + + XEVE id; // XEVE instance identifier + XEVE_CDSC cdsc; // coding parameters i.e profile, width & height of input frame, num of therads, frame rate ... + XEVE_BITB bitb; // bitstream buffer (output) + XEVE_STAT stat; // encoding status (output) + XEVE_IMGB imgb; // image buffer (input) + + State state; // encoder state (skipping, encoding, bumping) + + int profile_id; // encoder profile (main, baseline) + int preset_id; // preset of xeve ( fast, medium, slow, placebo) + int tune_id; // tune of xeve (psnr, zerolatency) + + // variables for rate control modes + int rc_mode; // Rate control mode [ 0(CQP) / 1(ABR) / 2(CRF) ] + int qp; // quantization parameter (QP) [0,51] + int crf; // constant rate factor (CRF) [10,49] + + int hash; // embed picture signature (HASH) for conformance checking in decoding + int sei_info; // embed Supplemental enhancement information while encoding + + int color_format; // input data color format: currently only XEVE_CF_YCBCR420 is supported + + AVDictionary *xeve_params; +} XeveContext; + +/** + * Convert FFmpeg pixel format (AVPixelFormat) to XEVE pre-defined color format + * + * @param[in] av_pix_fmt pixel format (@see https://ffmpeg.org/doxygen/trunk/pixfmt_8h.html#a9a8e335cf3be472042bc9f0cf80cd4c5) + * @param[out] xeve_col_fmt XEVE pre-defined color format (@see xeve.h) + * + * @return 0 on success, negative value on failure + */ +static int libxeve_color_fmt(enum AVPixelFormat av_pix_fmt, int *xeve_col_fmt) +{ + switch (av_pix_fmt) { + case AV_PIX_FMT_YUV420P: + *xeve_col_fmt = XEVE_CF_YCBCR420; + break; + case AV_PIX_FMT_YUV420P10: + *xeve_col_fmt = XEVE_CF_YCBCR420; + break; + default: + *xeve_col_fmt = XEVE_CF_UNKNOWN; + return AVERROR_INVALIDDATA; + } + + return 0; +} + +/** + * Convert FFmpeg pixel format (AVPixelFormat) into XEVE pre-defined color space + * + * @param[in] px_fmt pixel format (@see https://ffmpeg.org/doxygen/trunk/pixfmt_8h.html#a9a8e335cf3be472042bc9f0cf80cd4c5) + * + * @return XEVE pre-defined color space (@see xeve.h) on success, XEVE_CF_UNKNOWN on failure + */ +static int libxeve_color_space(enum AVPixelFormat av_pix_fmt) +{ + /* color space of input image */ + int cs = XEVE_CF_UNKNOWN; + + switch (av_pix_fmt) { + case AV_PIX_FMT_YUV420P: + cs = XEVE_CS_YCBCR420; + break; + case AV_PIX_FMT_YUV420P10: +#if AV_HAVE_BIGENDIAN + cs = XEVE_CS_SET(XEVE_CF_YCBCR420, 10, 1); +#else + cs = XEVE_CS_YCBCR420_10LE; +#endif + + break; + default: + cs = XEVE_CF_UNKNOWN; + break; + } + + return cs; +} + +/** + * The function returns a pointer to the object of the XEVE_CDSC type. + * XEVE_CDSC contains all encoder parameters that should be initialized before the encoder is used. + * + * The field values of the XEVE_CDSC structure are populated based on: + * - the corresponding field values of the AvCodecConetxt structure, + * - the xeve encoder specific option values, + * (the full list of options available for xeve encoder is displayed after executing the command ./ffmpeg --help encoder = libxeve) + * + * The order of processing input data and populating the XEVE_CDSC structure + * 1) first, the fields of the AVCodecContext structure corresponding to the provided input options are processed, + * (i.e -pix_fmt yuv420p -s:v 1920x1080 -r 30 -profile:v 0) + * 2) then xeve-specific options added as AVOption to the xeve AVCodec implementation + * (i.e -preset 0) + * + * Keep in mind that, there are options that can be set in different ways. + * In this case, please follow the above-mentioned order of processing. + * The most recent assignments overwrite the previous values. + * + * @param[in] avctx codec context (AVCodecContext) + * @param[out] cdsc contains all Xeve MPEG-5 EVC encoder encoder parameters that should be initialized before the encoder is use + * + * @return 0 on success, negative error code on failure + */ +static int get_conf(AVCodecContext *avctx, XEVE_CDSC *cdsc) +{ + XeveContext *xectx = NULL; + int ret; + + xectx = avctx->priv_data; + + /* initialize xeve_param struct with default values */ + ret = xeve_param_default(&cdsc->param); + if (XEVE_FAILED(ret)) { + av_log(avctx, AV_LOG_ERROR, "Cannot set_default parameter\n"); + return AVERROR_EXTERNAL; + } + + /* read options from AVCodecContext */ + if (avctx->width > 0) + cdsc->param.w = avctx->width; + + if (avctx->height > 0) + cdsc->param.h = avctx->height; + + if (avctx->framerate.num > 0) { + // fps can be float number, but xeve API doesn't support it + cdsc->param.fps = lrintf(av_q2d(avctx->framerate)); + } + + // GOP size (key-frame interval, I-picture period) + cdsc->param.keyint = avctx->gop_size; // 0: only one I-frame at the first time; 1: every frame is coded in I-frame + + if (avctx->max_b_frames == 0 || avctx->max_b_frames == 1 || avctx->max_b_frames == 3 || + avctx->max_b_frames == 7 || avctx->max_b_frames == 15) // number of b-frames + cdsc->param.bframes = avctx->max_b_frames; + else { + av_log(avctx, AV_LOG_ERROR, "Incorrect value for maximum number of B frames: (%d) \n" + "Acceptable values for bf option (maximum number of B frames) are 0,1,3,7 or 15\n", avctx->max_b_frames); + return AVERROR_INVALIDDATA; + } + + cdsc->param.level_idc = avctx->level; + + if (avctx->rc_buffer_size) // VBV buf size + cdsc->param.vbv_bufsize = (int)(avctx->rc_buffer_size / 1000); + + cdsc->param.rc_type = xectx->rc_mode; + + if (xectx->rc_mode == XEVE_RC_CQP) + cdsc->param.qp = xectx->qp; + else if (xectx->rc_mode == XEVE_RC_ABR) { + if (avctx->bit_rate / 1000 > INT_MAX || avctx->rc_max_rate / 1000 > INT_MAX) { + av_log(avctx, AV_LOG_ERROR, "Not supported bitrate bit_rate and rc_max_rate > %d000\n", INT_MAX); + return AVERROR_INVALIDDATA; + } + cdsc->param.bitrate = (int)(avctx->bit_rate / 1000); + } else if (xectx->rc_mode == XEVE_RC_CRF) + cdsc->param.crf = xectx->crf; + else { + av_log(avctx, AV_LOG_ERROR, "Not supported rate control type: %d\n", xectx->rc_mode); + return AVERROR_INVALIDDATA; + } + + if (avctx->thread_count <= 0) { + int cpu_count = av_cpu_count(); + cdsc->param.threads = (cpu_count < XEVE_MAX_THREADS) ? cpu_count : XEVE_MAX_THREADS; + } else if (avctx->thread_count > XEVE_MAX_THREADS) + cdsc->param.threads = XEVE_MAX_THREADS; + else + cdsc->param.threads = avctx->thread_count; + + + libxeve_color_fmt(avctx->pix_fmt, &xectx->color_format); + + cdsc->param.cs = XEVE_CS_SET(xectx->color_format, cdsc->param.codec_bit_depth, AV_HAVE_BIGENDIAN); + + cdsc->max_bs_buf_size = MAX_BS_BUF; + + ret = xeve_param_ppt(&cdsc->param, xectx->profile_id, xectx->preset_id, xectx->tune_id); + if (XEVE_FAILED(ret)) { + av_log(avctx, AV_LOG_ERROR, "Cannot set profile(%d), preset(%d), tune(%d)\n", xectx->profile_id, xectx->preset_id, xectx->tune_id); + return AVERROR_EXTERNAL; + } + + return 0; +} + +/** + * Set XEVE_CFG_SET_USE_PIC_SIGNATURE for encoder + * + * @param[in] logger context + * @param[in] id XEVE encodec instance identifier + * @param[in] ctx the structure stores all the states associated with the instance of Xeve MPEG-5 EVC encoder + * + * @return 0 on success, negative error code on failure + */ +static int set_extra_config(AVCodecContext *avctx, XEVE id, XeveContext *ctx) +{ + int ret, size; + size = 4; + + // embed SEI messages identifying encoder parameters and command line arguments + // - 0: off\n" + // - 1: emit sei info" + // + // SEI - Supplemental enhancement information contains information + // that is not necessary to decode the samples of coded pictures from VCL NAL units. + // Some SEI message information is required to check bitstream conformance + // and for output timing decoder conformance. + // @see ISO_IEC_23094-1_2020 7.4.3.5 + // @see ISO_IEC_23094-1_2020 Annex D + ret = xeve_config(id, XEVE_CFG_SET_SEI_CMD, &ctx->sei_info, &size); // sei_cmd_info + if (XEVE_FAILED(ret)) { + av_log(avctx, AV_LOG_ERROR, "Failed to set config for sei command info messages\n"); + return AVERROR_EXTERNAL; + } + + ret = xeve_config(id, XEVE_CFG_SET_USE_PIC_SIGNATURE, &ctx->hash, &size); + if (XEVE_FAILED(ret)) { + av_log(avctx, AV_LOG_ERROR, "Failed to set config for picture signature\n"); + return AVERROR_EXTERNAL; + } + + return 0; +} + +/** + * @brief Switch encoder to bumping mode + * + * @param id XEVE encodec instance identifier + * @return 0 on success, negative error code on failure + */ +static int setup_bumping(XEVE id) +{ + int val = 1; + int size = sizeof(int); + if (XEVE_FAILED(xeve_config(id, XEVE_CFG_SET_FORCE_OUT, (void *)(&val), &size))) + return AVERROR_EXTERNAL; + + return 0; +} + +/** + * @brief Initialize eXtra-fast Essential Video Encoder codec + * Create an encoder instance and allocate all the needed resources + * + * @param avctx codec context + * @return 0 on success, negative error code on failure + */ +static av_cold int libxeve_init(AVCodecContext *avctx) +{ + XeveContext *xectx = avctx->priv_data; + unsigned char *bs_buf = NULL; + int i; + int shift_h = 0; + int shift_v = 0; + int width_chroma = 0; + int height_chroma = 0; + XEVE_IMGB *imgb = NULL; + int ret = 0; + + XEVE_CDSC *cdsc = &(xectx->cdsc); + + /* allocate bitstream buffer */ + bs_buf = av_malloc(MAX_BS_BUF); + if (bs_buf == NULL) { + av_log(avctx, AV_LOG_ERROR, "Cannot allocate bitstream buffer\n"); + return AVERROR(ENOMEM); + } + xectx->bitb.addr = bs_buf; + xectx->bitb.bsize = MAX_BS_BUF; + + /* read configurations and set values for created descriptor (XEVE_CDSC) */ + if ((ret = get_conf(avctx, cdsc)) != 0) { + av_log(avctx, AV_LOG_ERROR, "Cannot get configuration\n"); + return AVERROR(EINVAL); + } + + if ((ret = xeve_param_check(&cdsc->param)) != 0) { + av_log(avctx, AV_LOG_ERROR, "Invalid configuration\n"); + return AVERROR(EINVAL); + } + + { + AVDictionaryEntry *en = NULL; + while (en = av_dict_get(xectx->xeve_params, "", en, AV_DICT_IGNORE_SUFFIX)) { + if ((ret = xeve_param_parse(&cdsc->param, en->key, en->value)) < 0) { + av_log(avctx, AV_LOG_WARNING, + "Error parsing option '%s = %s'.\n", + en->key, en->value); + } + } + } + + /* create encoder */ + xectx->id = xeve_create(cdsc, NULL); + if (xectx->id == NULL) { + av_log(avctx, AV_LOG_ERROR, "Cannot create XEVE encoder\n"); + return AVERROR_EXTERNAL; + } + + if ((ret = set_extra_config(avctx, xectx->id, xectx)) != 0) { + av_log(avctx, AV_LOG_ERROR, "Cannot set extra configuration\n"); + return AVERROR(EINVAL); + } + + if ((ret = av_pix_fmt_get_chroma_sub_sample(avctx->pix_fmt, &shift_h, &shift_v)) != 0) { + av_log(avctx, AV_LOG_ERROR, "Failed to get chroma shift\n"); + return AVERROR(EINVAL); + } + + // Chroma subsampling + // + // YUV format explanation + // shift_h == 1 && shift_v == 1 : YUV420 + // shift_h == 1 && shift_v == 0 : YUV422 + // shift_h == 0 && shift_v == 0 : YUV444 + // + width_chroma = AV_CEIL_RSHIFT(avctx->width, shift_h); + height_chroma = AV_CEIL_RSHIFT(avctx->height, shift_v); + + /* set default values for input image buffer */ + imgb = &xectx->imgb; + imgb->cs = libxeve_color_space(avctx->pix_fmt); + imgb->np = 3; /* only for yuv420p, yuv420ple */ + + for (i = 0; i < imgb->np; i++) + imgb->x[i] = imgb->y[i] = 0; + + imgb->w[0] = imgb->aw[0] = avctx->width; // width luma + imgb->w[1] = imgb->w[2] = imgb->aw[1] = imgb->aw[2] = width_chroma; + imgb->h[0] = imgb->ah[0] = avctx->height; // height luma + imgb->h[1] = imgb->h[2] = imgb->ah[1] = imgb->ah[2] = height_chroma; + + xectx->state = STATE_ENCODING; + + return 0; +} + +/** + * Encode raw data frame into EVC packet + * + * @param[in] avctx codec context + * @param[out] avpkt output AVPacket containing encoded data + * @param[in] frame AVFrame containing the raw data to be encoded + * @param[out] got_packet encoder sets to 0 or 1 to indicate that a + * non-empty packet was returned in pkt + * + * @return 0 on success, negative error code on failure + */ +static int libxeve_encode(AVCodecContext *avctx, AVPacket *avpkt, + const AVFrame *frame, int *got_packet) +{ + XeveContext *xectx = avctx->priv_data; + int ret = -1; + + // No more input frames are available but encoder still can have some data in its internal buffer to process + // and some frames to dump. + if (xectx->state == STATE_ENCODING && frame == NULL) { + if (setup_bumping(xectx->id) == 0) + xectx->state = STATE_BUMPING; // Entering bumping process + else { + av_log(avctx, AV_LOG_ERROR, "Failed to setup bumping\n"); + return 0; + } + } + + if (xectx->state == STATE_ENCODING) { + int i; + XEVE_IMGB *imgb = NULL; + + imgb = &xectx->imgb; + + for (i = 0; i < imgb->np; i++) { + imgb->a[i] = frame->data[i]; + imgb->s[i] = frame->linesize[i]; + } + + imgb->ts[XEVE_TS_PTS] = frame->pts; + + /* push image to encoder */ + ret = xeve_push(xectx->id, imgb); + if (XEVE_FAILED(ret)) { + av_log(avctx, AV_LOG_ERROR, "xeve_push() failed\n"); + return AVERROR_EXTERNAL; + } + } + if (xectx->state == STATE_ENCODING || xectx->state == STATE_BUMPING) { + /* encoding */ + ret = xeve_encode(xectx->id, &(xectx->bitb), &(xectx->stat)); + if (XEVE_FAILED(ret)) { + av_log(avctx, AV_LOG_ERROR, "xeve_encode() failed\n"); + return AVERROR_EXTERNAL; + } + + /* store bitstream */ + if (ret == XEVE_OK_OUT_NOT_AVAILABLE) { // Return OK but picture is not available yet + *got_packet = 0; + return 0; + } else if (ret == XEVE_OK) { + int av_pic_type; + + if (xectx->stat.write > 0) { + + ret = ff_get_encode_buffer(avctx, avpkt, xectx->stat.write, 0); + if (ret < 0) + return ret; + + memcpy(avpkt->data, xectx->bitb.addr, xectx->stat.write); + + avpkt->time_base.num = 1; + avpkt->time_base.den = xectx->cdsc.param.fps; + + avpkt->pts = xectx->bitb.ts[XEVE_TS_PTS]; + avpkt->dts = xectx->bitb.ts[XEVE_TS_DTS]; + + switch(xectx->stat.stype) { + case XEVE_ST_I: + av_pic_type = AV_PICTURE_TYPE_I; + avpkt->flags |= AV_PKT_FLAG_KEY; + break; + case XEVE_ST_P: + av_pic_type = AV_PICTURE_TYPE_P; + break; + case XEVE_ST_B: + av_pic_type = AV_PICTURE_TYPE_B; + break; + case XEVE_ST_UNKNOWN: + av_log(avctx, AV_LOG_ERROR, "Unknown slice type\n"); + return AVERROR_INVALIDDATA; + } + + ff_side_data_set_encoder_stats(avpkt, xectx->stat.qp * FF_QP2LAMBDA, NULL, 0, av_pic_type); + + *got_packet = 1; + } + } else if (ret == XEVE_OK_NO_MORE_FRM) { + // Return OK but no more frames + return 0; + } else { + av_log(avctx, AV_LOG_ERROR, "Invalid return value: %d\n", ret); + return AVERROR_EXTERNAL; + } + } else { + av_log(avctx, AV_LOG_ERROR, "Udefined encoder state\n"); + return AVERROR_INVALIDDATA; + } + + return 0; +} + +/** + * Destroy the encoder and release all the allocated resources + * + * @param avctx codec context + * @return 0 on success, negative error code on failure + */ +static av_cold int libxeve_close(AVCodecContext *avctx) +{ + XeveContext *xectx = avctx->priv_data; + + if (xectx->id) { + xeve_delete(xectx->id); + xectx->id = NULL; + } + + av_free(xectx->bitb.addr); /* release bitstream buffer */ + + return 0; +} + +#define OFFSET(x) offsetof(XeveContext, x) +#define VE AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_ENCODING_PARAM + +static const enum AVPixelFormat supported_pixel_formats[] = { + AV_PIX_FMT_YUV420P, + AV_PIX_FMT_YUV420P10, + AV_PIX_FMT_NONE +}; + +// Consider using following options (./ffmpeg --help encoder=libxeve) +// +static const AVOption libxeve_options[] = { + { "preset", "Encoding preset for setting encoding speed", OFFSET(preset_id), AV_OPT_TYPE_INT, { .i64 = XEVE_PRESET_MEDIUM }, XEVE_PRESET_DEFAULT, XEVE_PRESET_PLACEBO, VE, "preset" }, + { "default", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = XEVE_PRESET_DEFAULT }, INT_MIN, INT_MAX, VE, "preset" }, + { "fast", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = XEVE_PRESET_FAST }, INT_MIN, INT_MAX, VE, "preset" }, + { "medium", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = XEVE_PRESET_MEDIUM }, INT_MIN, INT_MAX, VE, "preset" }, + { "slow", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = XEVE_PRESET_SLOW }, INT_MIN, INT_MAX, VE, "preset" }, + { "placebo", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = XEVE_PRESET_PLACEBO }, INT_MIN, INT_MAX, VE, "preset" }, + { "tune", "Tuning parameter for special purpose operation", OFFSET(tune_id), AV_OPT_TYPE_INT, { .i64 = XEVE_TUNE_NONE }, XEVE_TUNE_NONE, XEVE_TUNE_PSNR, VE, "tune"}, + { "none", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = XEVE_TUNE_NONE }, INT_MIN, INT_MAX, VE, "tune" }, + { "zerolatency", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = XEVE_TUNE_ZEROLATENCY }, INT_MIN, INT_MAX, VE, "tune" }, + { "psnr", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = XEVE_TUNE_PSNR }, INT_MIN, INT_MAX, VE, "tune" }, + { "profile", "Encoding profile", OFFSET(profile_id), AV_OPT_TYPE_INT, { .i64 = XEVE_PROFILE_BASELINE }, XEVE_PROFILE_BASELINE, XEVE_PROFILE_MAIN, VE, "profile" }, + { "baseline", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = XEVE_PROFILE_BASELINE }, INT_MIN, INT_MAX, VE, "profile" }, + { "main", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = XEVE_PROFILE_MAIN }, INT_MIN, INT_MAX, VE, "profile" }, + { "rc_mode", "Rate control mode", OFFSET(rc_mode), AV_OPT_TYPE_INT, { .i64 = XEVE_RC_CQP }, XEVE_RC_CQP, XEVE_RC_CRF, VE, "rc_mode" }, + { "CQP", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = XEVE_RC_CQP }, INT_MIN, INT_MAX, VE, "rc_mode" }, + { "ABR", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = XEVE_RC_ABR }, INT_MIN, INT_MAX, VE, "rc_mode" }, + { "CRF", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = XEVE_RC_CRF }, INT_MIN, INT_MAX, VE, "rc_mode" }, + { "qp", "Quantization parameter value for CQP rate control mode", OFFSET(qp), AV_OPT_TYPE_INT, { .i64 = 32 }, 0, 51, VE }, + { "crf", "Constant rate factor value for CRF rate control mode", OFFSET(crf), AV_OPT_TYPE_INT, { .i64 = 32 }, 10, 49, VE }, + { "hash", "Embed picture signature (HASH) for conformance checking in decoding", OFFSET(hash), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, 1, VE }, + { "sei_info", "Embed SEI messages identifying encoder parameters and command line arguments", OFFSET(sei_info), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, 1, VE }, + { "xeve-params", "Override the xeve configuration using a :-separated list of key=value parameters", OFFSET(xeve_params), AV_OPT_TYPE_DICT, { 0 }, 0, 0, VE }, + { NULL } +}; + +static const AVClass libxeve_class = { + .class_name = "libxeve", + .item_name = av_default_item_name, + .option = libxeve_options, + .version = LIBAVUTIL_VERSION_INT, +}; + +/** + * libavcodec generic global options, which can be set on all the encoders and decoders + * @see https://www.ffmpeg.org/ffmpeg-codecs.html#Codec-Options + */ +static const FFCodecDefault libxeve_defaults[] = { + { "b", "0" }, // bitrate in terms of kilo-bits per second + { "g", "0" }, // gop_size (key-frame interval 0: only one I-frame at the first time; 1: every frame is coded in I-frame) + { "bf", "15"}, // maximum number of B frames (0: no B-frames, 1,3,7,15) + { "threads", "0"}, // number of threads to be used (0: automatically select the number of threads to set) + { NULL }, +}; + +const FFCodec ff_libxeve_encoder = { + .p.name = "libxeve", + .p.long_name = NULL_IF_CONFIG_SMALL("libxeve MPEG-5 EVC"), + .p.type = AVMEDIA_TYPE_VIDEO, + .p.id = AV_CODEC_ID_EVC, + .init = libxeve_init, + FF_CODEC_ENCODE_CB(libxeve_encode), + .close = libxeve_close, + .priv_data_size = sizeof(XeveContext), + .p.priv_class = &libxeve_class, + .defaults = libxeve_defaults, + .p.capabilities = AV_CODEC_CAP_DELAY | AV_CODEC_CAP_OTHER_THREADS | AV_CODEC_CAP_DR1, + .p.profiles = NULL_IF_CONFIG_SMALL(ff_evc_profiles), + .p.wrapper_name = "libxeve", + .p.pix_fmts = supported_pixel_formats, + .caps_internal = FF_CODEC_CAP_INIT_CLEANUP | FF_CODEC_CAP_NOT_INIT_THREADSAFE, +}; From patchwork Tue Apr 18 10:32:02 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Dawid Kozinski X-Patchwork-Id: 41237 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a20:4645:b0:e3:3194:9d20 with SMTP id eb5csp3038894pzb; Tue, 18 Apr 2023 03:32:24 -0700 (PDT) X-Google-Smtp-Source: AKy350ZwVMKgPcFF4avhZnfJd6InBELZfE1jy8w8q5+ciLNR/g/VhuMLXBmC/0JtgG7nlIzaTrDa X-Received: by 2002:a17:906:8143:b0:94d:8b66:46cb with SMTP id z3-20020a170906814300b0094d8b6646cbmr9268811ejw.3.1681813944466; Tue, 18 Apr 2023 03:32:24 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1681813944; cv=none; d=google.com; s=arc-20160816; b=LO5NDq3WHybJH//ncNACga0wB5DwcPcU1ajQhyoWDZebFQB4Au+TR3cCSWJV1GHWOd t/6Sp0eT0d9Lo+lr/8hW5QXQM4zqnMb7UeB3UHPYaJSKGU9sUlsFtloNM+ofVg2KdmGd TQJl7+cyesI/J1kjNtwI8ISOz1Mvm/sEHNUWD9ApgjfHC/OQaRitL50ef5YNJM7lsVpR uWCAsVa/9nVzBm9EPMZFf/x5Ed8qHnJn0BvQ3+eK3+JCAEnMKp+XwPTZTThBLZJ61M/J u4u6if2uyXknSes/mfX5Z5adhRnk+FhvW/dMI/IOAxXUtOyTjYVStbzxTqvnJbcwug7H 9Blw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:cc:reply-to :list-subscribe:list-help:list-post:list-archive:list-unsubscribe :list-id:precedence:subject:references:cms-type:mime-version :message-id:date:to:from:dkim-signature:dkim-filter:delivered-to; bh=w4CBrmfsM3ueBE1Z87DriizdanMABfXZsIcvZddH/7g=; b=Is111NaTtgZgQpiEcqNYPJ5ED3gFlljwaCbFVovXarWKFDFpeV78nwU+5K7sjZ0YHc /XiE4vos+nfbNgKk1bJMyhWkAdEADCPL8L6FgyQhwv2CNNXFg6L/Ox5FpEKtTNoiOCGQ wwDe1njEcY5BoZnJoGnXUOw945CbaQgszoKsjnzg3ExVOYwLT1xObCkDWRk7WOf1hxBs 4sL8ukcT9uRivP1yVT1i8AgXDT3BSpP3+HWa3O6W792gNF+2w5Aza4OokcUouXeJN52F 7lXy9OLlHQHorUMfUnU7LZkpiTfI/WyuFjLOsn665rDAehY+eFB/rwCIAfDHV8wTigMh dQVw== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@samsung.com header.s=mail20170921 header.b="ZWGh/N+a"; 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=NONE dis=NONE) header.from=samsung.com Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id t8-20020a170906a10800b0094e9865c092si11780873ejy.714.2023.04.18.03.32.23; Tue, 18 Apr 2023 03:32:24 -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=@samsung.com header.s=mail20170921 header.b="ZWGh/N+a"; 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=NONE dis=NONE) header.from=samsung.com Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 2ED5968BE86; Tue, 18 Apr 2023 13:32:21 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mailout1.w1.samsung.com (mailout1.w1.samsung.com [210.118.77.11]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 02D3868BE0B for ; Tue, 18 Apr 2023 13:32:15 +0300 (EEST) Received: from eucas1p1.samsung.com (unknown [182.198.249.206]) by mailout1.w1.samsung.com (KnoxPortal) with ESMTP id 20230418103214euoutp01bf97ab8108598835f3fdbde894dd4733~XANzhM8SA1325813258euoutp01Q for ; Tue, 18 Apr 2023 10:32:14 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 mailout1.w1.samsung.com 20230418103214euoutp01bf97ab8108598835f3fdbde894dd4733~XANzhM8SA1325813258euoutp01Q DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=samsung.com; s=mail20170921; t=1681813934; bh=c+IkXSxFxmiN4P4jqeVg0uVRD+90IsvuO5g/QIAWAzI=; h=From:To:Cc:Subject:Date:References:From; b=ZWGh/N+aJzfkVRonjNZSOHyGWlEnFCVJmJ6P3AQaxGbZuXlpr/h01+5NDS+1EIb7d cr+ShE5OaYe8MBp3R11gGe1yMjS1Xhnv/4iYhmWHF/K0LkOxhuBGAs1wTh3k8jlltw WcccjmL50aidA3RlPJqfr6r1eRtahTZsRsSrw/P0= Received: from eusmges1new.samsung.com (unknown [203.254.199.242]) by eucas1p1.samsung.com (KnoxPortal) with ESMTP id 20230418103214eucas1p14692f1a6293af18998697e7b9f6a45b0~XANzRlkfv0771707717eucas1p1V; Tue, 18 Apr 2023 10:32:14 +0000 (GMT) Received: from eucas1p1.samsung.com ( [182.198.249.206]) by eusmges1new.samsung.com (EUCPMTA) with SMTP id BA.82.09503.EA17E346; Tue, 18 Apr 2023 11:32:14 +0100 (BST) Received: from eusmtrp1.samsung.com (unknown [182.198.249.138]) by eucas1p1.samsung.com (KnoxPortal) with ESMTPA id 20230418103213eucas1p1f2590dfa1813df9690c1767cb341e91e~XANy6II7J0515805158eucas1p1k; Tue, 18 Apr 2023 10:32:13 +0000 (GMT) Received: from eusmgms1.samsung.com (unknown [182.198.249.179]) by eusmtrp1.samsung.com (KnoxPortal) with ESMTP id 20230418103213eusmtrp127a4c63b483c011da95e9bc8d0c6a512~XANy5kq741374613746eusmtrp1M; Tue, 18 Apr 2023 10:32:13 +0000 (GMT) X-AuditID: cbfec7f2-ea5ff7000000251f-b4-643e71ae9018 Received: from eusmtip2.samsung.com ( [203.254.199.222]) by eusmgms1.samsung.com (EUCPMTA) with SMTP id 07.36.22108.DA17E346; Tue, 18 Apr 2023 11:32:13 +0100 (BST) Received: from AMDN5164.EU.corp.samsungelectronics.net (unknown [106.210.132.171]) by eusmtip2.samsung.com (KnoxPortal) with ESMTPA id 20230418103213eusmtip24e3f4acd1f9424cc9d94e88606b8b1e8~XANyi8UxG1883018830eusmtip2J; Tue, 18 Apr 2023 10:32:13 +0000 (GMT) From: Dawid Kozinski To: d.frankiewic@samsung.com, ffmpeg-devel@ffmpeg.org Date: Tue, 18 Apr 2023 12:32:02 +0200 Message-Id: <20230418103202.1030-1-d.kozinski@samsung.com> X-Mailer: git-send-email 2.37.3.windows.1 MIME-Version: 1.0 X-Unsent: 1 X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFnrJIsWRmVeSWpSXmKPExsWy7djPc7rrCu1SDGZ0cFl8ufaF2WLlt98s Ft8+nWF2YPb4s2gzi0ffllWMAUxRXDYpqTmZZalF+nYJXBmX3qxiKji0hrFi39u3rA2MG2q6 GDk4JARMJL4+kepi5OIQEljBKPH9xDH2LkZOIOcLo8TdWSwQic+MEm2b5rKAJEAafi68wgaR WM4osbG9mR3CaWeSmPaqC6ydTUBX4uWHR0wgtoiAqcTJ5r1sIDazgLbEurvfwWxhgSCJL+u2 MoLYLAKqEuffr2UFsXkFrCTOXj3ABrFNU2LCljlMEHFBiZMzn0BdwS2xbtYlVoiZ8hLNW2cz gxwhIfCTXeLs1MvMEL+5SHz4FApRLyzx6vgWdghbRuL05B4WiJJiiUP9DhBmjcShH+kQFdYS bxuPM4KEmYEuWL9LHyLsKLH05h1GiGo+iRtvBSH280lM2jYdaiWvREebEISpItHXKQbRKCXx dNkcqAoPiUudKRMYFWch+WkWkj9mIWxdwMi8ilE8tbQ4Nz212DAvtVyvODG3uDQvXS85P3cT IzA1nP53/NMOxrmvPuodYmTiYDzEKMHBrCTCe8bVKkWINyWxsiq1KD++qDQntfgQozQHi5I4 r7btyWQhgfTEktTs1NSC1CKYLBMHp1QDU8q1/fN6r5sy2z6SWPnQ6cf8af/0YpwU/GY0N7Ww VL0LaVypfq8g10lfcNP3e61RuZJN7OnfPl7s74++P7njTVPo/4yq3SdTV+7eG33ufd0T86r1 J09MD7QR/H9kDdvhnppv99cd7lHbPP0mq/qFLJ2+LZdjBO3WFayZtPTJm6Nvbs+b6ZK3L+jD TeW0U02LdrJ9iJB5XXjs/Y8zezwv/z6cKSv5Yd5cyXpP2z5j29K3wa5m05YwRTDbG5/70N3h IS1/6fbx//fOCvjMaPwlwZ619cxkrb0v7kVm+mXXC6llZr+9mKPRIXzt1iauqU0Rv51UHtzX Kt4xsfn1I91Ve64/qJ29TO9mvpThzvkrNLYpsRRnJBpqMRcVJwIAg/RgC3wDAAA= X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFrrMLMWRmVeSWpSXmKPExsVy+t/xe7prC+1SDLqu61p8ufaF2WLlt98s Ft8+nWF2YPb4s2gzi0ffllWMAUxRejZF+aUlqQoZ+cUltkrRhhZGeoaWFnpGJpZ6hsbmsVZG pkr6djYpqTmZZalF+nYJehmX3qxiKji0hrFi39u3rA2MG2q6GDk5JARMJH4uvMLWxcjFISSw lFGiZ+s+NoiElMTSpYsYIWxhiT/XuqCKWpkkDjw5yQKSYBPQlXj54RETiC0iYC5xcd0tsAZm AW2JdXe/gw0SFgiQ2HhgMyuIzSKgKnH+/Vowm1fASuLs1QNQyzQlJmyZwwQRF5Q4OfMJC0Sc W2LdrEusEDPlJZq3zmaewMg/C0nZLCSpBYxMqxhFUkuLc9Nziw31ihNzi0vz0vWS83M3MQJD d9uxn5t3MM579VHvECMTB+MhRgkOZiUR3jOuVilCvCmJlVWpRfnxRaU5qcWHGE2Bbp3ILCWa nA+MnrySeEMzA1NDEzNLA1NLM2MlcV7Pgo5EIYH0xJLU7NTUgtQimD4mDk6pBia9vtXaMhtX /oniffyxK8V01mb32WrbtDwXrlV6M0PzO2d3ptFbbVH9Axv3NLbcfJGzerrg5Gvx1bsseHmF wr8l3395syx0xluet/f6sqRMucvjnK8f2lwgJbPjCc8N/RYOORlRjW07/V//1N/8+Ekuz9Pb XItD9zOuz3n2TzvN7PIfSSOpWfGrvXg+VDS3JrkUNCxXDHyruDB6f9Fr9SPy11e2LFm21Ux7 d7ZDxJWOCR/VfK7a3j5/jOG0wsf0QzNKrvH9/FHAk1NrtOioBXe/ztW/U86vkpjse+fekfBH FvbhD2xMBN4q6om6pB0q/+Uh1cTPNu3tS55D0r1rLKd/lJ0stEDyp3F09IHSrmNKLMUZiYZa zEXFiQDTRxK45gIAAA== X-CMS-MailID: 20230418103213eucas1p1f2590dfa1813df9690c1767cb341e91e X-Msg-Generator: CA X-RootMTR: 20230418103213eucas1p1f2590dfa1813df9690c1767cb341e91e X-EPHeader: CA CMS-TYPE: 201P X-CMS-RootMailID: 20230418103213eucas1p1f2590dfa1813df9690c1767cb341e91e References: Subject: [FFmpeg-devel] [PATCH v20 06/10] avcodec/evc_decoder: Provided support for EVC decoder 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: Dawid Kozinski Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: uuaBrqJXp83Q - Added EVC decoder wrapper - Changes in project configuration file and libavcodec Makefile - Added documentation for xevd wrapper Signed-off-by: Dawid Kozinski --- configure | 4 + doc/decoders.texi | 24 ++ doc/general_contents.texi | 10 +- libavcodec/Makefile | 1 + libavcodec/allcodecs.c | 1 + libavcodec/libxevd.c | 479 ++++++++++++++++++++++++++++++++++++++ 6 files changed, 518 insertions(+), 1 deletion(-) create mode 100644 libavcodec/libxevd.c diff --git a/configure b/configure index df8635adc8..eede13301f 100755 --- a/configure +++ b/configure @@ -293,6 +293,7 @@ External library support: --enable-libx264 enable H.264 encoding via x264 [no] --enable-libx265 enable HEVC encoding via x265 [no] --enable-libxeve enable EVC encoding via libxeve [no] + --enable-libxevd enable EVC decoding via libxevd [no] --enable-libxavs enable AVS encoding via xavs [no] --enable-libxavs2 enable AVS2 encoding via xavs2 [no] --enable-libxcb enable X11 grabbing using XCB [autodetect] @@ -1865,6 +1866,7 @@ EXTERNAL_LIBRARY_LIST=" libvorbis libvpx libwebp + libxevd libxeve libxml2 libzimg @@ -3399,6 +3401,7 @@ libx265_encoder_deps="libx265" libx265_encoder_select="atsc_a53" libxavs_encoder_deps="libxavs" libxavs2_encoder_deps="libxavs2" +libxevd_decoder_deps="libxevd" libxeve_encoder_deps="libxeve" libxvid_encoder_deps="libxvid" libzvbi_teletext_decoder_deps="libzvbi" @@ -6738,6 +6741,7 @@ enabled libx265 && require_pkg_config libx265 x265 x265.h x265_api_get require_cpp_condition libx265 x265.h "X265_BUILD >= 89" enabled libxavs && require libxavs "stdint.h xavs.h" xavs_encoder_encode "-lxavs $pthreads_extralibs $libm_extralibs" enabled libxavs2 && require_pkg_config libxavs2 "xavs2 >= 1.3.0" "stdint.h xavs2.h" xavs2_api_get +enabled libxevd && require_pkg_config libxevd "xevd >= 0.4.1" "xevd.h" xevd_decode enabled libxeve && require_pkg_config libxeve "xeve >= 0.4.3" "xeve.h" xeve_encode enabled libxvid && require libxvid xvid.h xvid_global -lxvidcore enabled libzimg && require_pkg_config libzimg "zimg >= 2.7.0" zimg.h zimg_get_api_version diff --git a/doc/decoders.texi b/doc/decoders.texi index 09b8314dd2..6311af229f 100644 --- a/doc/decoders.texi +++ b/doc/decoders.texi @@ -130,6 +130,30 @@ Set amount of frame threads to use during decoding. The default value is 0 (auto @end table +@section libxevd + +eXtra-fast Essential Video Decoder (XEVD) MPEG-5 EVC decoder wrapper. + +This decoder requires the presence of the libxevd headers and library +during configuration. You need to explicitly configure the build with +@option{--enable-libxevd}. + +The xevd project website is at @url{https://github.com/mpeg5/xevd}. + +@subsection Options + +The following options are supported by the libxevd wrapper. +The xevd-equivalent options or values are listed in parentheses for easy migration. + +To get a more accurate and extensive documentation of the libxevd options, +invoke the command @code{xevd_app --help} or consult the libxevd documentation. + +@table @option +@item threads (@emph{threads}) +Force to use a specific number of threads + +@end table + @section QSV Decoders The family of Intel QuickSync Video decoders (VC1, MPEG-2, H.264, HEVC, diff --git a/doc/general_contents.texi b/doc/general_contents.texi index 31f1793b9e..8e08f5ebc3 100644 --- a/doc/general_contents.texi +++ b/doc/general_contents.texi @@ -351,6 +351,14 @@ Go to @url{https://github.com/mpeg5/xeve} and follow the instructions for installing the XEVE library. Then pass @code{--enable-libxeve} to configure to enable it. +@section eXtra-fast Essential Video Decoder (XEVD) + +FFmpeg can make use of the XEVD library for EVC video decoding. + +Go to @url{https://github.com/mpeg5/xevd} and follow the instructions for +installing the XEVD library. Then pass @code{--enable-libxevd} to configure to +enable it. + @section ZVBI ZVBI is a VBI decoding library which can be used by FFmpeg to decode DVB @@ -953,7 +961,7 @@ following image formats are supported: @item Escape 124 @tab @tab X @item Escape 130 @tab @tab X @item EVC / MPEG-5 Part 1 @tab X @tab X - @tab encoding and decoding supported through external librariy libxeve + @tab encoding and decoding supported through external libraries libxeve and libxevd @item FFmpeg video codec #1 @tab X @tab X @tab lossless codec (fourcc: FFV1) @item Flash Screen Video v1 @tab X @tab X diff --git a/libavcodec/Makefile b/libavcodec/Makefile index 7a9f42590f..9ed28b485b 100644 --- a/libavcodec/Makefile +++ b/libavcodec/Makefile @@ -1132,6 +1132,7 @@ OBJS-$(CONFIG_LIBX264_ENCODER) += libx264.o OBJS-$(CONFIG_LIBX265_ENCODER) += libx265.o OBJS-$(CONFIG_LIBXAVS_ENCODER) += libxavs.o OBJS-$(CONFIG_LIBXAVS2_ENCODER) += libxavs2.o +OBJS-$(CONFIG_LIBXEVD_DECODER) += libxevd.o OBJS-$(CONFIG_LIBXEVE_ENCODER) += libxeve.o OBJS-$(CONFIG_LIBXVID_ENCODER) += libxvid.o OBJS-$(CONFIG_LIBZVBI_TELETEXT_DECODER) += libzvbi-teletextdec.o ass.o diff --git a/libavcodec/allcodecs.c b/libavcodec/allcodecs.c index 001d136d36..f666b5c0cd 100644 --- a/libavcodec/allcodecs.c +++ b/libavcodec/allcodecs.c @@ -816,6 +816,7 @@ extern LIBX264_CONST FFCodec ff_libx264_encoder; extern const FFCodec ff_libx264rgb_encoder; extern FFCodec ff_libx265_encoder; extern const FFCodec ff_libxeve_encoder; +extern const FFCodec ff_libxevd_decoder; extern const FFCodec ff_libxavs_encoder; extern const FFCodec ff_libxavs2_encoder; extern const FFCodec ff_libxvid_encoder; diff --git a/libavcodec/libxevd.c b/libavcodec/libxevd.c new file mode 100644 index 0000000000..7c4922d46e --- /dev/null +++ b/libavcodec/libxevd.c @@ -0,0 +1,479 @@ +/* + * libxevd decoder + * EVC (MPEG-5 Essential Video Coding) decoding using XEVD MPEG-5 EVC decoder library + * + * Copyright (C) 2021 Dawid Kozinski + * + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * FFmpeg is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include +#include + +#include + +#include "libavutil/internal.h" +#include "libavutil/common.h" +#include "libavutil/opt.h" +#include "libavutil/pixdesc.h" +#include "libavutil/pixfmt.h" +#include "libavutil/imgutils.h" +#include "libavutil/cpu.h" + +#include "avcodec.h" +#include "internal.h" +#include "packet_internal.h" +#include "codec_internal.h" +#include "profiles.h" +#include "decode.h" + +#define XEVD_PARAM_BAD_NAME -1 +#define XEVD_PARAM_BAD_VALUE -2 + +#define EVC_NAL_HEADER_SIZE 2 /* byte */ + +/** + * The structure stores all the states associated with the instance of Xeve MPEG-5 EVC decoder + */ +typedef struct XevdContext { + const AVClass *class; + + XEVD id; // XEVD instance identifier @see xevd.h + XEVD_CDSC cdsc; // decoding parameters @see xevd.h + + // If end of stream occurs it is required "flushing" (aka draining) the codec, + // as the codec might buffer multiple frames or packets internally. + int draining_mode; // The flag is set if codec enters draining mode. + + AVPacket *pkt; +} XevdContext; + +/** + * The function populates the XEVD_CDSC structure. + * XEVD_CDSC contains all decoder parameters that should be initialized before its use. + * + * @param[in] avctx codec context + * @param[out] cdsc contains all decoder parameters that should be initialized before its use + * + */ +static void get_conf(AVCodecContext *avctx, XEVD_CDSC *cdsc) +{ + int cpu_count = av_cpu_count(); + + /* clear XEVS_CDSC structure */ + memset(cdsc, 0, sizeof(XEVD_CDSC)); + + /* init XEVD_CDSC */ + if (avctx->thread_count <= 0) + cdsc->threads = (cpu_count < XEVD_MAX_TASK_CNT) ? cpu_count : XEVD_MAX_TASK_CNT; + else if (avctx->thread_count > XEVD_MAX_TASK_CNT) + cdsc->threads = XEVD_MAX_TASK_CNT; + else + cdsc->threads = avctx->thread_count; +} + +/** + * Read NAL unit length + * @param bs input data (bitstream) + * @return the length of NAL unit on success, 0 value on failure + */ +static uint32_t read_nal_unit_length(const uint8_t *bs, int bs_size, AVCodecContext *avctx) +{ + uint32_t len = 0; + XEVD_INFO info; + int ret; + + if (bs_size == XEVD_NAL_UNIT_LENGTH_BYTE) { + ret = xevd_info((void *)bs, XEVD_NAL_UNIT_LENGTH_BYTE, 1, &info); + if (XEVD_FAILED(ret)) { + av_log(avctx, AV_LOG_ERROR, "Cannot get bitstream information\n"); + return 0; + } + len = info.nalu_len; + if (len == 0) { + av_log(avctx, AV_LOG_ERROR, "Invalid bitstream size! [%d]\n", bs_size); + return 0; + } + } + + return len; +} + +/** + * @param[in] xectx the structure that stores all the state associated with the instance of Xeve MPEG-5 EVC decoder + * @param[out] avctx codec context + * @return 0 on success, negative value on failure + */ +static int export_stream_params(const XevdContext *xectx, AVCodecContext *avctx) +{ + int ret; + int size; + int color_space; + + avctx->pix_fmt = AV_PIX_FMT_YUV420P10; + + size = 4; + ret = xevd_config(xectx->id, XEVD_CFG_GET_CODED_WIDTH, &avctx->coded_width, &size); + if (XEVD_FAILED(ret)) { + av_log(avctx, AV_LOG_ERROR, "Failed to get coded_width\n"); + return AVERROR_EXTERNAL; + } + + ret = xevd_config(xectx->id, XEVD_CFG_GET_CODED_HEIGHT, &avctx->coded_height, &size); + if (XEVD_FAILED(ret)) { + av_log(avctx, AV_LOG_ERROR, "Failed to get coded_height\n"); + return AVERROR_EXTERNAL; + } + + ret = xevd_config(xectx->id, XEVD_CFG_GET_WIDTH, &avctx->width, &size); + if (XEVD_FAILED(ret)) { + av_log(avctx, AV_LOG_ERROR, "Failed to get width\n"); + return AVERROR_EXTERNAL; + } + + ret = xevd_config(xectx->id, XEVD_CFG_GET_HEIGHT, &avctx->height, &size); + if (XEVD_FAILED(ret)) { + av_log(avctx, AV_LOG_ERROR, "Failed to get height\n"); + return AVERROR_EXTERNAL; + } + + ret = xevd_config(xectx->id, XEVD_CFG_GET_COLOR_SPACE, &color_space, &size); + if (XEVD_FAILED(ret)) { + av_log(avctx, AV_LOG_ERROR, "Failed to get color_space\n"); + return AVERROR_EXTERNAL; + } + switch(color_space) { + case XEVD_CS_YCBCR400_10LE: + avctx->pix_fmt = AV_PIX_FMT_GRAY10LE; + break; + case XEVD_CS_YCBCR420_10LE: + avctx->pix_fmt = AV_PIX_FMT_YUV420P10LE; + break; + case XEVD_CS_YCBCR422_10LE: + avctx->pix_fmt = AV_PIX_FMT_YUV422P10LE; + break; + case XEVD_CS_YCBCR444_10LE: + avctx->pix_fmt = AV_PIX_FMT_YUV444P10LE; + break; + default: + av_log(avctx, AV_LOG_ERROR, "Unknown color space\n"); + avctx->pix_fmt = AV_PIX_FMT_NONE; + return AVERROR_INVALIDDATA; + } + + // the function returns sps->num_reorder_pics + ret = xevd_config(xectx->id, XEVD_CFG_GET_MAX_CODING_DELAY, &avctx->max_b_frames, &size); + if (XEVD_FAILED(ret)) { + av_log(avctx, AV_LOG_ERROR, "Failed to get max_coding_delay\n"); + return AVERROR_EXTERNAL; + } + + avctx->has_b_frames = (avctx->max_b_frames) ? 1 : 0; + + return 0; +} + +/** + * @brief Copy image in imgb to frame. + * + * @param avctx codec context + * @param[in] imgb + * @param[out] frame + * @return 0 on success, negative value on failure + */ +static int libxevd_image_copy(struct AVCodecContext *avctx, XEVD_IMGB *imgb, struct AVFrame *frame) +{ + int ret; + if (imgb->cs != XEVD_CS_YCBCR420_10LE) { + av_log(avctx, AV_LOG_ERROR, "Not supported pixel format: %s\n", av_get_pix_fmt_name(avctx->pix_fmt)); + return AVERROR_INVALIDDATA; + } + + if (imgb->w[0] != avctx->width || imgb->h[0] != avctx->height) { // stream resolution changed + if (ff_set_dimensions(avctx, imgb->w[0], imgb->h[0]) < 0) { + av_log(avctx, AV_LOG_ERROR, "Cannot set new dimension\n"); + return AVERROR_INVALIDDATA; + } + } + + if (ret = ff_get_buffer(avctx, frame, 0) < 0) + return ret; + + av_image_copy(frame->data, frame->linesize, (const uint8_t **)imgb->a, + imgb->s, avctx->pix_fmt, + imgb->w[0], imgb->h[0]); + + return 0; +} + +/** + * Initialize decoder + * Create a decoder instance and allocate all the needed resources + * + * @param avctx codec context + * @return 0 on success, negative error code on failure + */ +static av_cold int libxevd_init(AVCodecContext *avctx) +{ + XevdContext *xectx = avctx->priv_data; + XEVD_CDSC *cdsc = &(xectx->cdsc); + + /* read configurations and set values for created descriptor (XEVD_CDSC) */ + get_conf(avctx, cdsc); + + /* create decoder */ + xectx->id = xevd_create(&(xectx->cdsc), NULL); + if (xectx->id == NULL) { + av_log(avctx, AV_LOG_ERROR, "Cannot create XEVD encoder\n"); + return AVERROR_EXTERNAL; + } + + xectx->draining_mode = 0; + xectx->pkt = av_packet_alloc(); + + return 0; +} + +/** + * Decode frame with decoupled packet/frame dataflow + * + * @param avctx codec context + * @param[out] frame decoded frame + * + * @return 0 on success, negative error code on failure + */ +static int libxevd_receive_frame(AVCodecContext *avctx, AVFrame *frame) +{ + XevdContext *xectx = avctx->priv_data; + AVPacket *pkt = xectx->pkt; + XEVD_IMGB *imgb = NULL; + + int xevd_ret = 0; + int ret = 0; + + if (!pkt) + return AVERROR(ENOMEM); + + // obtain input data + ret = ff_decode_get_packet(avctx, pkt); + if (ret < 0 && ret != AVERROR_EOF) { + av_packet_unref(pkt); + + return ret; + } else if(ret == AVERROR_EOF && xectx->draining_mode == 0) { // End of stream situations. Enter draining mode + + xectx->draining_mode = 1; + av_packet_unref(pkt); + + return 0; + } + + if (pkt->size > 0) { + int bs_read_pos = 0; + XEVD_STAT stat; + XEVD_BITB bitb; + int nalu_size; + + imgb = NULL; + + while(pkt->size > (bs_read_pos + XEVD_NAL_UNIT_LENGTH_BYTE)) { + memset(&stat, 0, sizeof(XEVD_STAT)); + + nalu_size = read_nal_unit_length(pkt->data + bs_read_pos, XEVD_NAL_UNIT_LENGTH_BYTE, avctx); + if (nalu_size == 0) { + av_log(avctx, AV_LOG_ERROR, "Invalid bitstream\n"); + av_packet_unref(pkt); + ret = AVERROR_INVALIDDATA; + + return ret; + } + bs_read_pos += XEVD_NAL_UNIT_LENGTH_BYTE; + + bitb.addr = pkt->data + bs_read_pos; + bitb.ssize = nalu_size; + + /* main decoding block */ + xevd_ret = xevd_decode(xectx->id, &bitb, &stat); + if (XEVD_FAILED(xevd_ret)) { + av_log(avctx, AV_LOG_ERROR, "Failed to decode bitstream\n"); + av_packet_unref(pkt); + ret = AVERROR_EXTERNAL; + + return ret; + } + + bs_read_pos += nalu_size; + + if (stat.nalu_type == XEVD_NUT_SPS) { // EVC stream parameters changed + if ((ret = export_stream_params(xectx, avctx)) != 0) { + av_log(avctx, AV_LOG_ERROR, "Failed to export stream params\n"); + av_packet_unref(pkt); + + return ret; + } + } + if (stat.read != nalu_size) + av_log(avctx, AV_LOG_INFO, "Different reading of bitstream (in:%d, read:%d)\n,", nalu_size, stat.read); + if (stat.fnum >= 0) { + + xevd_ret = xevd_pull(xectx->id, &imgb); // The function returns a valid image only if the return code is XEVD_OK + + if (XEVD_FAILED(xevd_ret)) { + av_log(avctx, AV_LOG_ERROR, "Failed to pull the decoded image (xevd error code: %d, frame#=%d)\n", xevd_ret, stat.fnum); + ret = AVERROR_EXTERNAL; + av_packet_unref(pkt); + + return ret; + } else if (xevd_ret == XEVD_OK_FRM_DELAYED) { + av_packet_unref(pkt); + + return AVERROR(EAGAIN); + } else { // XEVD_OK + if (!imgb) { + av_packet_unref(pkt); + + return AVERROR(EAGAIN); + } + + // got frame + ret = libxevd_image_copy(avctx, imgb, frame); + if(ret < 0) { + av_log(avctx, AV_LOG_ERROR, "Image copying error\n"); + + imgb->release(imgb); + imgb = NULL; + + av_packet_unref(pkt); + + return ret; + } + + // use ff_decode_frame_props() to fill frame properties + ret = ff_decode_frame_props(avctx, frame); + if (ret < 0) { + imgb->release(imgb); + imgb = NULL; + + av_packet_unref(pkt); + av_frame_unref(frame); + + return ret; + } + + frame->pkt_dts = pkt->dts; + + // xevd_pull uses pool of objects of type XEVD_IMGB. + // The pool size is equal MAX_PB_SIZE (26), so release object when it is no more needed + imgb->release(imgb); + imgb = NULL; + + av_packet_unref(pkt); + return 0; + } + } + } + } else { // decoder draining mode handling + + xevd_ret = xevd_pull(xectx->id, &imgb); + + if (xevd_ret == XEVD_ERR_UNEXPECTED) { // draining process completed + av_log(avctx, AV_LOG_DEBUG, "Draining process completed\n"); + av_packet_unref(pkt); + + return AVERROR_EOF; + } else if (XEVD_FAILED(xevd_ret)) { // handle all other errors + av_log(avctx, AV_LOG_ERROR, "Failed to pull the decoded image (xevd error code: %d)\n", xevd_ret); + av_packet_unref(pkt); + + return AVERROR_EXTERNAL; + } else { // XEVD_OK + if (!imgb) { + av_packet_unref(pkt); + + return AVERROR_EXTERNAL; + } + // got frame + ret = libxevd_image_copy(avctx, imgb, frame); + if(ret < 0) { + imgb->release(imgb); + imgb = NULL; + + av_packet_unref(pkt); + + return ret; + } + + frame->pkt_dts = pkt->dts; + + av_packet_unref(pkt); + + // xevd_pull uses pool of objects of type XEVD_IMGB. + // The pool size is equal MAX_PB_SIZE (26), so release object when it is no more needed + imgb->release(imgb); + imgb = NULL; + + return 0; + } + } + + return ret; +} + +/** + * Destroy decoder + * + * @param avctx codec context + * @return 0 on success + */ +static av_cold int libxevd_close(AVCodecContext *avctx) +{ + XevdContext *xectx = avctx->priv_data; + if (xectx->id) { + xevd_delete(xectx->id); + xectx->id = NULL; + } + + xectx->draining_mode = 0; + av_packet_free(&xectx->pkt); + + return 0; +} + +#define OFFSET(x) offsetof(XevdContext, x) +#define VD AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_DECODING_PARAM + +static const AVClass libxevd_class = { + .class_name = "libxevd", + .item_name = av_default_item_name, + .version = LIBAVUTIL_VERSION_INT, +}; + +const FFCodec ff_libxevd_decoder = { + .p.name = "evc", + .p.long_name = NULL_IF_CONFIG_SMALL("EVC / MPEG-5 Essential Video Coding (EVC)"), + .p.type = AVMEDIA_TYPE_VIDEO, + .p.id = AV_CODEC_ID_EVC, + .init = libxevd_init, + FF_CODEC_RECEIVE_FRAME_CB(libxevd_receive_frame), + .close = libxevd_close, + .priv_data_size = sizeof(XevdContext), + .p.priv_class = &libxevd_class, + .p.capabilities = AV_CODEC_CAP_DELAY | AV_CODEC_CAP_OTHER_THREADS | AV_CODEC_CAP_AVOID_PROBING, + .p.profiles = NULL_IF_CONFIG_SMALL(ff_evc_profiles), + .p.wrapper_name = "libxevd", + .caps_internal = FF_CODEC_CAP_INIT_CLEANUP | FF_CODEC_CAP_NOT_INIT_THREADSAFE | FF_CODEC_CAP_SETS_PKT_DTS | FF_CODEC_CAP_SETS_FRAME_PROPS +}; From patchwork Tue Apr 18 10:32:27 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Dawid Kozinski X-Patchwork-Id: 41238 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a20:4645:b0:e3:3194:9d20 with SMTP id eb5csp3039099pzb; Tue, 18 Apr 2023 03:32:46 -0700 (PDT) X-Google-Smtp-Source: AKy350Yj+csRTcnSfQO6GSDUH6txgfHozAzb6m6XaQ64Zrl9CiSy52D6gETgLygOz+jebx+w7iOP X-Received: by 2002:a17:906:4e4f:b0:94e:eb3f:d01b with SMTP id g15-20020a1709064e4f00b0094eeb3fd01bmr9699732ejw.9.1681813966390; Tue, 18 Apr 2023 03:32:46 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1681813966; cv=none; d=google.com; s=arc-20160816; b=ONoGsleWTSvA8WcaeZC1Lsy5ylRfHgmwehv2V2QstzeB9UAPVZs9T5B4BH25WTUVEs Zr6egjTAv50emIOoGW+JRokHLUY076cGisRr/KTOI86d8UokRkOZW3437DwQV5UQcdF9 p29iqRs42FvNB7L0yKVoXb28EqeKin6L7qyWxBenzFU5PDTTsdRNs1wqIsMZpd7ig96r kDOT/CewgAufUIDxdDBscGJdF9u6Oy7sB/lwe4eXY5QASVlWMoVGI2jKuGkHJCSmP20D OaVBCSwcQvD/Tis/YaxckZi0w0b2fM4avD+YHKZeNJR5dS5CkaR6yVBQ1aGLjagmobzW Z1Mg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:cc:reply-to :list-subscribe:list-help:list-post:list-archive:list-unsubscribe :list-id:precedence:subject:references:cms-type:mime-version :message-id:date:to:from:dkim-signature:dkim-filter:delivered-to; bh=m7fPlXjjUrtPFkEzTCqpiXzCEcvHY3Mx/Ef6uSe6zgk=; b=sNuol5VAJZ78vlX0C4GsJZBHxONuJ+bzjeM6wLKszPEG+Kl/xUaqq5svV5ts0fTGxS zJPUG4BiHaAwRbL11eHoqcZjbw4oA2UJZ9hsLfxUcCvud7eqtVEAUPXapHTJbDXGjIaF Gd5kZ7jLrBEpMoTeM6jpmvOdPST+c37nSz436L9qEQR5HxXau1hLfFGTNjihuJiJRFEc njDVBebJE6BXxReypMsTiVC8c/3VCeksg4nwTdvnSpmucRg8r1se1VHYMoBbL83HBXND s5kqwabGrfg5Ubtc6v7pRtmVKkjj3OpHRgysP8tHlCQLV5Wuh5g5GGAXJ0w222rnc7RD s5Vw== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@samsung.com header.s=mail20170921 header.b=VGVM9ZI2; 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=NONE dis=NONE) header.from=samsung.com Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id eu22-20020a170907299600b0094f48329ed1si5703571ejc.647.2023.04.18.03.32.46; Tue, 18 Apr 2023 03:32:46 -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=@samsung.com header.s=mail20170921 header.b=VGVM9ZI2; 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=NONE dis=NONE) header.from=samsung.com Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 39B6A68BE96; Tue, 18 Apr 2023 13:32:43 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mailout2.w1.samsung.com (mailout2.w1.samsung.com [210.118.77.12]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 822DC68B87F for ; Tue, 18 Apr 2023 13:32:40 +0300 (EEST) Received: from eucas1p1.samsung.com (unknown [182.198.249.206]) by mailout2.w1.samsung.com (KnoxPortal) with ESMTP id 20230418103239euoutp029677bc0c8cf5709fcc8ae6b1baa0463f~XAOLOr_NG1488614886euoutp02M for ; Tue, 18 Apr 2023 10:32:39 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 mailout2.w1.samsung.com 20230418103239euoutp029677bc0c8cf5709fcc8ae6b1baa0463f~XAOLOr_NG1488614886euoutp02M DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=samsung.com; s=mail20170921; t=1681813960; bh=9tyyuyeMh0/JzLE4VJxNP8FmHNTyCFkA5oV0cva+3eE=; h=From:To:Cc:Subject:Date:References:From; b=VGVM9ZI2+uKaPLy62oR4wHan0L7y5RowdBDSWMZJrt/SGhqR6UjgnWxnMRtecTC/9 xyxE1a0kqRA2R2mbC4io+j8Ux2qtP/L/NhTKo+CUVluLjWohU6gqXL0Nqf48gXyZKW +2f+8ztiFV/RVAZa0kNInJpCZAtD1oUibyMZs1do= Received: from eusmges2new.samsung.com (unknown [203.254.199.244]) by eucas1p2.samsung.com (KnoxPortal) with ESMTP id 20230418103239eucas1p2be8111595469166cce912484eb83eb6c~XAOKxCPDL3119631196eucas1p2g; Tue, 18 Apr 2023 10:32:39 +0000 (GMT) Received: from eucas1p2.samsung.com ( [182.198.249.207]) by eusmges2new.samsung.com (EUCPMTA) with SMTP id C2.3F.09966.7C17E346; Tue, 18 Apr 2023 11:32:39 +0100 (BST) Received: from eusmtrp1.samsung.com (unknown [182.198.249.138]) by eucas1p2.samsung.com (KnoxPortal) with ESMTPA id 20230418103239eucas1p29385926bca9ee67ff93a98bcf06fc51c~XAOKZJ3Xi0270302703eucas1p2W; Tue, 18 Apr 2023 10:32:39 +0000 (GMT) Received: from eusmgms2.samsung.com (unknown [182.198.249.180]) by eusmtrp1.samsung.com (KnoxPortal) with ESMTP id 20230418103239eusmtrp1970edd95f2b2e53d287a0cd69231eeca~XAOKYPN6C1427014270eusmtrp1d; Tue, 18 Apr 2023 10:32:39 +0000 (GMT) X-AuditID: cbfec7f4-d4fff700000026ee-79-643e71c7e10a Received: from eusmtip1.samsung.com ( [203.254.199.221]) by eusmgms2.samsung.com (EUCPMTA) with SMTP id 27.26.34412.6C17E346; Tue, 18 Apr 2023 11:32:38 +0100 (BST) Received: from AMDN5164.EU.corp.samsungelectronics.net (unknown [106.210.132.171]) by eusmtip1.samsung.com (KnoxPortal) with ESMTPA id 20230418103238eusmtip125783c27d547f8eda2ca50803ebfb727~XAOJ_rLWJ2501625016eusmtip13; Tue, 18 Apr 2023 10:32:38 +0000 (GMT) From: Dawid Kozinski To: d.frankiewic@samsung.com, ffmpeg-devel@ffmpeg.org Date: Tue, 18 Apr 2023 12:32:27 +0200 Message-Id: <20230418103227.1336-1-d.kozinski@samsung.com> X-Mailer: git-send-email 2.37.3.windows.1 MIME-Version: 1.0 X-Unsent: 1 X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFnrDIsWRmVeSWpSXmKPExsWy7djP87rHC+1SDI7NkrD4cu0Ls8XKb79Z LL59OsPswOzxZ9FmFo++LasYA5iiuGxSUnMyy1KL9O0SuDJ+7rvLWtC4m7Hi7MMbTA2MRzoY uxg5OSQETCQOd/9j6WLk4hASWMEo0XJ3NiuE84VRYnvnZyjnM6PE0qmLWGFaFlzZDmYLCSxn lJiwKxaiqJ1JYsrn82Bz2QR0JV5+eMQEYosImEqcbN7LBmIzC2hLrLv7HcwWFoiXuP32BdBu Dg4WAVWJ3mWuIGFeASuJGVs2MEPs0pSYsGUOE0RcUOLkzCcsEHFuiXWzLrFCjJSXaN46mxnk BgmBn+wSjVfnQTW7SGw4exaqQVji1fEt7BC2jMTpyT1geyUEiiUO9TtAmDUSh36kQ1RYS7xt PM4IEmYGOmH9Ln2IsKPEnufTmSGq+SRuvBWEOIBPYtI2mDCvREebEISpItHXKQbRKCXxdNkc qKs8JFY232KZwKg4C8lXs5B8Mgth7QJG5lWM4qmlxbnpqcVGeanlesWJucWleel6yfm5mxiB CeL0v+NfdjAuf/VR7xAjEwfjIUYJDmYlEd4zrlYpQrwpiZVVqUX58UWlOanFhxilOViUxHm1 bU8mCwmkJ5akZqemFqQWwWSZODilGpiYov0/az59plbVelgn8GbzuZYcG8MLx45mucX8FZ0h o7n7/WPd8zoJj6R3xFs8ytQwdPZo+t3Xb/U+759KMoOozqtddyJmvtgZ1CtfN2uxpUuixn/l 0+Knvs2+v6Ly6O7VmXl3jyys2ZHff2zvPubpDjs/VXVuP/nt5IbwLcvcfvxcayV08eSl+e1f Htdk3RZVfr5jo83BoOPzlt59wjB1vk8Bw51F9j5NvNk32MPZOK9+qlW/+ted79V/99MPlU6X 610+t25Ba1Vn/L4N27wmZLx7sJ5nX6AZk2Z3XeUGNSH7fd8jSs3uRlt8dfd6bn++KdNbzO2/ yeG+bUKGn5edsr/2ICwmcv+XIw/uaRXcUGIpzkg01GIuKk4EAO+ooxJ/AwAA X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFrrELMWRmVeSWpSXmKPExsVy+t/xu7rHCu1SDBa1WVh8ufaF2WLlt98s Ft8+nWF2YPb4s2gzi0ffllWMAUxRejZF+aUlqQoZ+cUltkrRhhZGeoaWFnpGJpZ6hsbmsVZG pkr6djYpqTmZZalF+nYJehk/991lLWjczVhx9uENpgbGIx2MXYycHBICJhILrmxn7WLk4hAS WMoosf7/XKiElMTSpYugbGGJP9e62CCKWpkkDtxfzw6SYBPQlXj54RETiC0iYC5xcd0tsAZm AW2JdXe/AzVwcAgLxEpMW88LYrIIqEr0LnMFqeAVsJKYsWUDM8R4TYkJW+YwQcQFJU7OfMIC EeeWWDfrEivERHmJ5q2zmScw8s9CUjYLSWoBI9MqRpHU0uLc9NxiI73ixNzi0rx0veT83E2M wMDdduznlh2MK1991DvEyMTBeIhRgoNZSYT3jKtVihBvSmJlVWpRfnxRaU5q8SFGU6BTJzJL iSbnA2MnryTe0MzA1NDEzNLA1NLMWEmc17OgI1FIID2xJDU7NbUgtQimj4mDU6qByVJFzM3n y/2Ni+1X7z5TlRekqBJoY8QuvLhqR0JdzOGw9U/nHJkeev9artHTG/cDMxYGXXr2f7ZYfn5C c9ZbeZdyp5VmE9ZbnP7KnfAotDyep9ZC4JLwpys9Muu1lk65KFdd9lZKYA+3RmeExG/eyw/f pCdE3fqdm22z3vb37Qe6fAm1uXwT93d+P1qs5Vhh42jXfWOKgMfDSe6f39Wc5S7u2Plp/hed lfXhc/u/vdc3jyvgCnvJ5jJDekamt9LnhsZpM5/mR+v98356rTDi4YR+TpN9V7mOTtqQwbhZ +spbvc4nM7JVA2bkbdzeGa8yZ9qj3pm/rxwMVtRdUroxbs+bJVMTlbMOmaW2nvgQpMRSnJFo qMVcVJwIALxSuELlAgAA X-CMS-MailID: 20230418103239eucas1p29385926bca9ee67ff93a98bcf06fc51c X-Msg-Generator: CA X-RootMTR: 20230418103239eucas1p29385926bca9ee67ff93a98bcf06fc51c X-EPHeader: CA CMS-TYPE: 201P X-CMS-RootMailID: 20230418103239eucas1p29385926bca9ee67ff93a98bcf06fc51c References: Subject: [FFmpeg-devel] [PATCH v20 07/10] avformat/mov_muxer: Extended MOV muxer to handle EVC video content 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: Dawid Kozinski Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: tfGwKpO9YlCZ - Changes in mov_write_video_tag function to handle EVC elementary stream - Provided structure EVCDecoderConfigurationRecord that specifies the decoder configuration information for ISO/IEC 23094-1 video content Signed-off-by: Dawid Kozinski --- libavformat/Makefile | 2 +- libavformat/evc.c | 455 ++++++++++++++++++++++++++++++++++++++++ libavformat/evc.h | 44 ++++ libavformat/isom_tags.c | 2 + libavformat/movenc.c | 33 +++ 5 files changed, 535 insertions(+), 1 deletion(-) create mode 100644 libavformat/evc.c create mode 100644 libavformat/evc.h diff --git a/libavformat/Makefile b/libavformat/Makefile index d80e5dc6b3..77e11aef84 100644 --- a/libavformat/Makefile +++ b/libavformat/Makefile @@ -363,7 +363,7 @@ OBJS-$(CONFIG_MOV_DEMUXER) += mov.o mov_chan.o mov_esds.o \ OBJS-$(CONFIG_MOV_MUXER) += movenc.o av1.o avc.o hevc.o vpcc.o \ movenchint.o mov_chan.o rtp.o \ movenccenc.o movenc_ttml.o rawutils.o \ - dovi_isom.o + dovi_isom.o evc.o OBJS-$(CONFIG_MP2_MUXER) += rawenc.o OBJS-$(CONFIG_MP3_DEMUXER) += mp3dec.o replaygain.o OBJS-$(CONFIG_MP3_MUXER) += mp3enc.o rawenc.o id3v2enc.o diff --git a/libavformat/evc.c b/libavformat/evc.c new file mode 100644 index 0000000000..9a3daba04a --- /dev/null +++ b/libavformat/evc.c @@ -0,0 +1,455 @@ +/* + * EVC helper functions for muxers + * Copyright (c) 2022 Dawid Kozinski + * + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * FFmpeg is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include "libavutil/intreadwrite.h" +#include "libavcodec/get_bits.h" +#include "libavcodec/golomb.h" +#include "libavcodec/evc.h" +#include "avformat.h" +#include "avio.h" +#include "evc.h" +#include "avio_internal.h" + +// The length field that indicates the length in bytes of the following NAL unit is configured to be of 4 bytes +#define EVC_NALU_LENGTH_PREFIX_SIZE (4) /* byte */ +#define EVC_NALU_HEADER_SIZE (2) /* byte */ + +// @see ISO/IEC 14496-15:2021 Coding of audio-visual objects - Part 15: section 12.3.3.1 +enum { + SPS_INDEX, + PPS_INDEX, + APS_INDEX, + SEI_INDEX, + NB_ARRAYS +}; + +// rpl structure +typedef struct RefPicListStruct { + int poc; + int tid; + int ref_pic_num; + int ref_pic_active_num; + int ref_pics[EVC_MAX_NUM_REF_PICS]; + char pic_type; + +} RefPicListStruct; + +// The sturcture reflects SPS RBSP(raw byte sequence payload) layout +// @see ISO_IEC_23094-1 section 7.3.2.1 +// +// The following descriptors specify the parsing process of each element +// u(n) - unsigned integer using n bits +// ue(v) - unsigned integer 0-th order Exp_Golomb-coded syntax element with the left bit first +typedef struct EVCSPS { + int sps_seq_parameter_set_id; // ue(v) + int profile_idc; // u(8) + int level_idc; // u(8) + int toolset_idc_h; // u(32) + int toolset_idc_l; // u(32) + int chroma_format_idc; // ue(v) + int pic_width_in_luma_samples; // ue(v) + int pic_height_in_luma_samples; // ue(v) + int bit_depth_luma_minus8; // ue(v) + int bit_depth_chroma_minus8; // ue(v) + + // @note + // Currently the structure does not reflect the entire SPS RBSP layout. + // It contains only the fields that are necessary to read from the NAL unit all the values + // necessary for the correct initialization of EVCDecoderConfigurationRecord + + // @note + // If necessary, add the missing fields to the structure to reflect + // the contents of the entire NAL unit of the SPS type + +} EVCSPS; + +// @see ISO/IEC 14496-15:2021 Coding of audio-visual objects - Part 15: section 12.3.3.3 +typedef struct EVCNALUnitArray { + uint8_t array_completeness; // when equal to 1 indicates that all NAL units of the given type are in the following array + uint8_t NAL_unit_type; // indicates the type of the NAL units in the following array + uint16_t numNalus; // indicates the number of NAL units of the indicated type + uint16_t *nalUnitLength; // indicates the length in bytes of the NAL unit + uint8_t **nalUnit; // contains an SPS, PPS, APS or a SEI NAL unit, as specified in ISO/IEC 23094-1 +} EVCNALUnitArray; + +/** + * @brief Specifies the decoder configuration information for ISO/IEC 23094-1 video content. + * @see ISO/IEC 14496-15:2021 Coding of audio-visual objects - Part 15: section 12.3.3.2 + * Carriage of network abstraction layer (NAL) unit structured video in the ISO base media file format + */ +typedef struct EVCDecoderConfigurationRecord { + uint8_t configurationVersion; // 8 bits + uint8_t profile_idc; // 8 bits + uint8_t level_idc; // 8 bits + uint32_t toolset_idc_h; // 32 bits + uint32_t toolset_idc_l; // 32 bits + uint8_t chroma_format_idc; // 2 bits + uint8_t bit_depth_luma_minus8; // 3 bits + uint8_t bit_depth_chroma_minus8; // 3 bits + uint16_t pic_width_in_luma_samples; // 16 bits + uint16_t pic_height_in_luma_samples; // 16 bits + uint8_t reserved; // 6 bits '000000'b + uint8_t lengthSizeMinusOne; // 2 bits + uint8_t num_of_arrays; // 8 bits + EVCNALUnitArray arrays[NB_ARRAYS]; +} EVCDecoderConfigurationRecord; + +typedef struct NALU { + int offset; + uint32_t size; +} NALU; + +typedef struct NALUList { + NALU *nalus; + unsigned nalus_array_size; + unsigned nb_nalus; ///< valid entries in nalus +} NALUList; + +static int get_nalu_type(const uint8_t *bits, int bits_size) +{ + int unit_type_plus1 = 0; + + if (bits_size >= EVC_NALU_HEADER_SIZE) { + unsigned char *p = (unsigned char *)bits; + // forbidden_zero_bit + if ((p[0] & 0x80) != 0) + return -1; + + // nal_unit_type + unit_type_plus1 = (p[0] >> 1) & 0x3F; + } + + return unit_type_plus1 - 1; +} + +static uint32_t read_nal_unit_length(const uint8_t *bits, int bits_size) +{ + uint32_t nalu_len = 0; + + if (bits_size >= EVC_NALU_LENGTH_PREFIX_SIZE) { + + int t = 0; + for (int i = 0; i < EVC_NALU_LENGTH_PREFIX_SIZE; i++) + t = (t << 8) | bits[i]; + + nalu_len = t; + if (nalu_len == 0) + return 0; + } + + return nalu_len; +} + +// @see ISO_IEC_23094-1 (7.3.2.1 SPS RBSP syntax) +static int evcc_parse_sps(const uint8_t *bs, int bs_size, EVCDecoderConfigurationRecord *evcc) +{ + GetBitContext gb; + int sps_seq_parameter_set_id; + EVCSPS sps; + + if (init_get_bits8(&gb, bs, bs_size) < 0) + return 0; + + sps.sps_seq_parameter_set_id = get_ue_golomb(&gb); + + if (sps_seq_parameter_set_id >= EVC_MAX_SPS_COUNT) + return 0; + + // the Baseline profile is indicated by profile_idc eqal to 0 + // the Main profile is indicated by profile_idc eqal to 1 + sps.profile_idc = get_bits(&gb, 8); + + sps.level_idc = get_bits(&gb, 8); + + sps.toolset_idc_h = get_bits(&gb, 32); + sps.toolset_idc_l = get_bits(&gb, 32); + + // 0 - monochrome + // 1 - 4:2:0 + // 2 - 4:2:2 + // 3 - 4:4:4 + sps.chroma_format_idc = get_ue_golomb(&gb); + + sps.pic_width_in_luma_samples = get_ue_golomb(&gb); + sps.pic_height_in_luma_samples = get_ue_golomb(&gb); + + sps.bit_depth_luma_minus8 = get_ue_golomb(&gb); + sps.bit_depth_chroma_minus8 = get_ue_golomb(&gb); + + evcc->profile_idc = sps.profile_idc; + evcc->level_idc = sps.level_idc; + evcc->toolset_idc_h = sps.toolset_idc_h; + evcc->toolset_idc_l = sps.toolset_idc_l; + evcc->chroma_format_idc = sps.chroma_format_idc; + evcc->bit_depth_luma_minus8 = sps.bit_depth_luma_minus8; + evcc->bit_depth_chroma_minus8 = sps.bit_depth_chroma_minus8; + evcc->pic_width_in_luma_samples = sps.pic_width_in_luma_samples; + evcc->pic_height_in_luma_samples = sps.pic_height_in_luma_samples; + + return 0; +} + +// @see ISO/IEC 14496-15:2021 Coding of audio-visual objects - Part 15: section 12.3.3.3 +static int evcc_array_add_nal_unit(const uint8_t *nal_buf, uint32_t nal_size, + uint8_t nal_type, int ps_array_completeness, + EVCNALUnitArray *array) +{ + int ret; + uint16_t numNalus = array->numNalus; + + ret = av_reallocp_array(&array->nalUnit, numNalus + 1, sizeof(uint8_t *)); + if (ret < 0) + return ret; + + ret = av_reallocp_array(&array->nalUnitLength, numNalus + 1, sizeof(uint16_t)); + if (ret < 0) + return ret; + + array->nalUnit [numNalus] = (uint8_t *)nal_buf; + array->nalUnitLength[numNalus] = nal_size; + array->NAL_unit_type = nal_type; + array->numNalus++; + + /* + * When the sample entry name is 'evc1', the default and mandatory value of + * array_completeness is 1 for arrays of all types of parameter sets, and 0 + * for all other arrays. + */ + if (nal_type == EVC_SPS_NUT || nal_type == EVC_PPS_NUT || nal_type == EVC_APS_NUT) + array->array_completeness = ps_array_completeness; + + return 0; +} + +static void evcc_init(EVCDecoderConfigurationRecord *evcc) +{ + memset(evcc, 0, sizeof(EVCDecoderConfigurationRecord)); + evcc->configurationVersion = 1; + evcc->lengthSizeMinusOne = 3; // 4 bytes +} + +static void evcc_close(EVCDecoderConfigurationRecord *evcc) +{ + for (unsigned i = 0; i < FF_ARRAY_ELEMS(evcc->arrays); i++) { + EVCNALUnitArray *const array = &evcc->arrays[i]; + array->numNalus = 0; + av_freep(&array->nalUnit); + av_freep(&array->nalUnitLength); + } +} + +static int evcc_write(AVIOContext *pb, EVCDecoderConfigurationRecord *evcc) +{ + uint16_t sps_count; + + av_log(NULL, AV_LOG_TRACE, "configurationVersion: %"PRIu8"\n", + evcc->configurationVersion); + av_log(NULL, AV_LOG_TRACE, "profile_idc: %"PRIu8"\n", + evcc->profile_idc); + av_log(NULL, AV_LOG_TRACE, "level_idc: %"PRIu8"\n", + evcc->level_idc); + av_log(NULL, AV_LOG_TRACE, "toolset_idc_h: %"PRIu32"\n", + evcc->toolset_idc_h); + av_log(NULL, AV_LOG_TRACE, "toolset_idc_l: %"PRIu32"\n", + evcc->toolset_idc_l); + av_log(NULL, AV_LOG_TRACE, "chroma_format_idc: %"PRIu8"\n", + evcc->chroma_format_idc); + av_log(NULL, AV_LOG_TRACE, "bit_depth_luma_minus8: %"PRIu8"\n", + evcc->bit_depth_luma_minus8); + av_log(NULL, AV_LOG_TRACE, "bit_depth_chroma_minus8: %"PRIu8"\n", + evcc->bit_depth_chroma_minus8); + av_log(NULL, AV_LOG_TRACE, "pic_width_in_luma_samples: %"PRIu16"\n", + evcc->pic_width_in_luma_samples); + av_log(NULL, AV_LOG_TRACE, "pic_height_in_luma_samples: %"PRIu16"\n", + evcc->pic_height_in_luma_samples); + av_log(NULL, AV_LOG_TRACE, "lengthSizeMinusOne: %"PRIu8"\n", + evcc->lengthSizeMinusOne); + av_log(NULL, AV_LOG_TRACE, "num_of_arrays: %"PRIu8"\n", + evcc->num_of_arrays); + for (unsigned i = 0; i < FF_ARRAY_ELEMS(evcc->arrays); i++) { + const EVCNALUnitArray *const array = &evcc->arrays[i]; + + if(array->numNalus == 0) + continue; + + av_log(NULL, AV_LOG_TRACE, "array_completeness[%"PRIu8"]: %"PRIu8"\n", + i, array->array_completeness); + av_log(NULL, AV_LOG_TRACE, "NAL_unit_type[%"PRIu8"]: %"PRIu8"\n", + i, array->NAL_unit_type); + av_log(NULL, AV_LOG_TRACE, "numNalus[%"PRIu8"]: %"PRIu16"\n", + i, array->numNalus); + for ( unsigned j = 0; j < array->numNalus; j++) + av_log(NULL, AV_LOG_TRACE, + "nalUnitLength[%"PRIu8"][%"PRIu16"]: %"PRIu16"\n", + i, j, array->nalUnitLength[j]); + } + + /* + * We need at least one SPS. + */ + sps_count = evcc->arrays[SPS_INDEX].numNalus; + if (!sps_count || sps_count > EVC_MAX_SPS_COUNT) + return AVERROR_INVALIDDATA; + + if (!sps_count || sps_count > EVC_MAX_SPS_COUNT) + return AVERROR_INVALIDDATA; + + /* unsigned int(8) configurationVersion = 1; */ + avio_w8(pb, evcc->configurationVersion); + + /* unsigned int(8) profile_idc */ + avio_w8(pb, evcc->profile_idc); + + /* unsigned int(8) profile_idc */ + avio_w8(pb, evcc->level_idc); + + /* unsigned int(32) toolset_idc_h */ + avio_wb32(pb, evcc->toolset_idc_h); + + /* unsigned int(32) toolset_idc_l */ + avio_wb32(pb, evcc->toolset_idc_l); + + /* + * unsigned int(2) chroma_format_idc; + * unsigned int(3) bit_depth_luma_minus8; + * unsigned int(3) bit_depth_chroma_minus8; + */ + avio_w8(pb, evcc->chroma_format_idc << 6 | + evcc->bit_depth_luma_minus8 << 3 | + evcc->bit_depth_chroma_minus8); + + /* unsigned int(16) pic_width_in_luma_samples; */ + avio_wb16(pb, evcc->pic_width_in_luma_samples); + + /* unsigned int(16) pic_width_in_luma_samples; */ + avio_wb16(pb, evcc->pic_height_in_luma_samples); + + /* + * bit(6) reserved = '111111'b; + * unsigned int(2) chromaFormat; + */ + avio_w8(pb, evcc->lengthSizeMinusOne | 0xfc); + + /* unsigned int(8) numOfArrays; */ + avio_w8(pb, evcc->num_of_arrays); + + for (unsigned i = 0; i < FF_ARRAY_ELEMS(evcc->arrays); i++) { + const EVCNALUnitArray *const array = &evcc->arrays[i]; + + if (!array->numNalus) + continue; + + /* + * bit(1) array_completeness; + * unsigned int(1) reserved = 0; + * unsigned int(6) NAL_unit_type; + */ + avio_w8(pb, array->array_completeness << 7 | + array->NAL_unit_type & 0x3f); + + /* unsigned int(16) numNalus; */ + avio_wb16(pb, array->numNalus); + + for (unsigned j = 0; j < array->numNalus; j++) { + /* unsigned int(16) nalUnitLength; */ + avio_wb16(pb, array->nalUnitLength[j]); + + /* bit(8*nalUnitLength) nalUnit; */ + avio_write(pb, array->nalUnit[j], + array->nalUnitLength[j]); + } + } + + return 0; +} + +int ff_isom_write_evcc(AVIOContext *pb, const uint8_t *data, + int size, int ps_array_completeness) +{ + EVCDecoderConfigurationRecord evcc; + int nalu_type; + size_t nalu_size; + int bytes_to_read = size; + unsigned array_index; + + int ret = 0; + + if (size < 8) { + /* We can't write a valid evcC from the provided data */ + return AVERROR_INVALIDDATA; + } else if (*data == 1) { + /* Data is already evcC-formatted */ + avio_write(pb, data, size); + return 0; + } + + evcc_init(&evcc); + + while (bytes_to_read > EVC_NALU_LENGTH_PREFIX_SIZE) { + nalu_size = read_nal_unit_length(data, EVC_NALU_LENGTH_PREFIX_SIZE); + if (nalu_size == 0) break; + + data += EVC_NALU_LENGTH_PREFIX_SIZE; + bytes_to_read -= EVC_NALU_LENGTH_PREFIX_SIZE; + + if (bytes_to_read < nalu_size) break; + + nalu_type = get_nalu_type(data, bytes_to_read); + + switch (nalu_type) { + case EVC_SPS_NUT: + array_index = SPS_INDEX; + break; + case EVC_PPS_NUT: + array_index = PPS_INDEX; + break; + case EVC_APS_NUT: + array_index = APS_INDEX; + break; + case EVC_SEI_NUT: + array_index = SEI_INDEX; + break; + default: + break; + } + + ret = evcc_array_add_nal_unit(data, nalu_size, nalu_type, ps_array_completeness, &(evcc.arrays[array_index])); + if (ret < 0) + goto end; + if (evcc.arrays[array_index].numNalus == 1) + evcc.num_of_arrays++; + + if(nalu_type == EVC_SPS_NUT) { + ret = evcc_parse_sps(data, nalu_size, &evcc); + if (ret < 0) + goto end; + } + + data += nalu_size; + bytes_to_read -= nalu_size; + } + + ret = evcc_write(pb, &evcc); + +end: + evcc_close(&evcc); + return ret; +} diff --git a/libavformat/evc.h b/libavformat/evc.h new file mode 100644 index 0000000000..db56275fd8 --- /dev/null +++ b/libavformat/evc.h @@ -0,0 +1,44 @@ +/* + * EVC helper functions for muxers + * Copyright (c) 2022 Dawid Kozinski + * + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * FFmpeg is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef AVFORMAT_EVC_H +#define AVFORMAT_EVC_H + +#include +#include "libavutil/rational.h" +#include "avio.h" + + + +/** + * Writes EVC sample metadata to the provided AVIOContext. + * + * @param pb pointer to the AVIOContext where the evc sample metadata shall be written + * @param buf input data buffer + * @param size size in bytes of the input data buffer + * @param ps_array_completeness @see ISO/IEC 14496-15:2021 Coding of audio-visual objects - Part 15: section 12.3.3.3 + * + * @return 0 in case of success, a negative error code in case of failure + */ +int ff_isom_write_evcc(AVIOContext *pb, const uint8_t *data, + int size, int ps_array_completeness); + +#endif // AVFORMAT_EVC_H diff --git a/libavformat/isom_tags.c b/libavformat/isom_tags.c index 86c7272525..2a29823b2e 100644 --- a/libavformat/isom_tags.c +++ b/libavformat/isom_tags.c @@ -147,6 +147,8 @@ const AVCodecTag ff_codec_movvideo_tags[] = { { AV_CODEC_ID_H264, MKTAG('d', 'v', 'a', '1') }, /* AVC-based Dolby Vision derived from avc1 */ { AV_CODEC_ID_H264, MKTAG('d', 'v', 'a', 'v') }, /* AVC-based Dolby Vision derived from avc3 */ + { AV_CODEC_ID_EVC, MKTAG('e', 'v', 'c', '1') }, /* EVC/MPEG-5 */ + { AV_CODEC_ID_VP8, MKTAG('v', 'p', '0', '8') }, /* VP8 */ { AV_CODEC_ID_VP9, MKTAG('v', 'p', '0', '9') }, /* VP9 */ { AV_CODEC_ID_AV1, MKTAG('a', 'v', '0', '1') }, /* AV1 */ diff --git a/libavformat/movenc.c b/libavformat/movenc.c index c370922c7d..87b0484ed5 100644 --- a/libavformat/movenc.c +++ b/libavformat/movenc.c @@ -35,6 +35,7 @@ #include "isom.h" #include "av1.h" #include "avc.h" +#include "evc.h" #include "libavcodec/ac3_parser_internal.h" #include "libavcodec/dnxhddata.h" #include "libavcodec/flac.h" @@ -1455,6 +1456,21 @@ static int mov_write_hvcc_tag(AVIOContext *pb, MOVTrack *track) return update_size(pb, pos); } +static int mov_write_evcc_tag(AVIOContext *pb, MOVTrack *track) +{ + int64_t pos = avio_tell(pb); + + avio_wb32(pb, 0); + ffio_wfourcc(pb, "evcC"); + + if (track->tag == MKTAG('e','v','c','1')) + ff_isom_write_evcc(pb, track->vos_data, track->vos_len, 1); + else + ff_isom_write_evcc(pb, track->vos_data, track->vos_len, 0); + + return update_size(pb, pos); +} + /* also used by all avid codecs (dv, imx, meridien) and their variants */ static int mov_write_avid_tag(AVIOContext *pb, MOVTrack *track) { @@ -1704,6 +1720,16 @@ static int mov_get_h264_codec_tag(AVFormatContext *s, MOVTrack *track) return tag; } +static int mov_get_evc_codec_tag(AVFormatContext *s, MOVTrack *track) +{ + int tag = track->par->codec_tag; + + if (!tag) + tag = MKTAG('e', 'v', 'c', 'i'); + + return tag; +} + static const struct { enum AVPixelFormat pix_fmt; uint32_t tag; @@ -1785,6 +1811,8 @@ static unsigned int mov_get_codec_tag(AVFormatContext *s, MOVTrack *track) tag = mov_get_mpeg2_xdcam_codec_tag(s, track); else if (track->par->codec_id == AV_CODEC_ID_H264) tag = mov_get_h264_codec_tag(s, track); + else if (track->par->codec_id == AV_CODEC_ID_EVC) + tag = mov_get_evc_codec_tag(s, track); else if (track->par->codec_id == AV_CODEC_ID_DNXHD) tag = mov_get_dnxhd_codec_tag(s, track); else if (track->par->codec_type == AVMEDIA_TYPE_VIDEO) { @@ -2352,6 +2380,9 @@ static int mov_write_video_tag(AVFormatContext *s, AVIOContext *pb, MOVMuxContex mov_write_avcc_tag(pb, track); if (track->mode == MODE_IPOD) mov_write_uuid_tag_ipod(pb); + } + else if (track->par->codec_id ==AV_CODEC_ID_EVC) { + mov_write_evcc_tag(pb, track); } else if (track->par->codec_id == AV_CODEC_ID_VP9) { mov_write_vpcc_tag(mov->fc, pb, track); } else if (track->par->codec_id == AV_CODEC_ID_AV1) { @@ -6123,6 +6154,7 @@ int ff_mov_write_packet(AVFormatContext *s, AVPacket *pkt) par->codec_id == AV_CODEC_ID_H264 || par->codec_id == AV_CODEC_ID_HEVC || par->codec_id == AV_CODEC_ID_VP9 || + par->codec_id == AV_CODEC_ID_EVC || par->codec_id == AV_CODEC_ID_TRUEHD) && !trk->vos_len && !TAG_IS_AVCI(trk->tag)) { /* copy frame to create needed atoms */ @@ -7782,6 +7814,7 @@ static const AVCodecTag codec_mp4_tags[] = { { AV_CODEC_ID_H264, MKTAG('a', 'v', 'c', '3') }, { AV_CODEC_ID_HEVC, MKTAG('h', 'e', 'v', '1') }, { AV_CODEC_ID_HEVC, MKTAG('h', 'v', 'c', '1') }, + { AV_CODEC_ID_EVC, MKTAG('e', 'v', 'c', '1') }, { AV_CODEC_ID_MPEG2VIDEO, MKTAG('m', 'p', '4', 'v') }, { AV_CODEC_ID_MPEG1VIDEO, MKTAG('m', 'p', '4', 'v') }, { AV_CODEC_ID_MJPEG, MKTAG('m', 'p', '4', 'v') }, From patchwork Tue Apr 18 10:32:57 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Dawid Kozinski X-Patchwork-Id: 41239 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a20:4645:b0:e3:3194:9d20 with SMTP id eb5csp3039504pzb; Tue, 18 Apr 2023 03:33:19 -0700 (PDT) X-Google-Smtp-Source: AKy350aM05rhWrRxkaq6/z9BFjXZ3L5SOYLClAGRSJUo9k3o/5d9aV9dBZZKBkddQHSSQNMc3bp6 X-Received: by 2002:a17:906:a194:b0:94e:75f8:668 with SMTP id s20-20020a170906a19400b0094e75f80668mr9743442ejy.56.1681813999635; Tue, 18 Apr 2023 03:33:19 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1681813999; cv=none; d=google.com; s=arc-20160816; b=KHaBGIg6bQZi+dFWFNf3APexiEXgdvGNZ1XQC8ctAP7zFGD4Prt4LbUFAS5+g4FWAM DpxSl6CCIbVkS96/A4Q3CR/641HBrICa/NZFBmCvtEFkVC8fqEODfPrAzZ4+DleWu+iA sqWh0UyMJ3luscZQa4+3hU4d/7ad1AMcb6xirJKnTEiGriQAp2qwFo+w5FZHGGJWwmkq uVPzvFCrobvK1O5vO7bbidnQhxxzqbRrY+gvE+NLETp3jQmmjljjJKpqB4D8+Y5opt5G LfTFdGnEBWa3UMopTSbfgSG+KKqBzlLsOftd3Mxw2lLhFOE6PKPLQoENZX3b7fvcH2Dr BQlw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:cc:reply-to :list-subscribe:list-help:list-post:list-archive:list-unsubscribe :list-id:precedence:subject:references:cms-type:mime-version :message-id:date:to:from:dkim-signature:dkim-filter:delivered-to; bh=hwZj8EqBIIg+dkQ9IywDYgeYn7wKsaaiwVlQfNPaA+0=; b=acyIWWnh5FV65hvyCIFiL28zJ6ZFKVZXoEggnGBQZjANzxh03OoOgSPgrfh2SC4ex5 diHy6NlphtNvXEorew7sSi9uGuFyQBRkaji3WOypOgdBSV2m0Mk7MhOA6rvh8exEZnv7 fx2LEaxywM9/ADDw8YJ9sPgdz447ShsQqx58cgaHKnM/g0PBX++OhmQ0cvSiXhfKpbrm ujyE5qg8jeTeprPAJX07vhM1iupo5t+s3jz+ohD0Tl0uYhamqD9HjGTr+zGtS3bNIKqX gOW5WKPsAMZw6HcY8KacPAId/dmV0I4ROMaKCnos9Iq41I8bIe++uBVMf7ukzoQFoKFV 9s9g== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@samsung.com header.s=mail20170921 header.b=ALD8JXzT; 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=NONE dis=NONE) header.from=samsung.com Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id jr23-20020a170906515700b0094f184a5822si6959421ejc.659.2023.04.18.03.33.19; Tue, 18 Apr 2023 03:33:19 -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=@samsung.com header.s=mail20170921 header.b=ALD8JXzT; 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=NONE dis=NONE) header.from=samsung.com Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 2CB5768BE9E; Tue, 18 Apr 2023 13:33:17 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mailout2.w1.samsung.com (mailout2.w1.samsung.com [210.118.77.12]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 19CCE68BE86 for ; Tue, 18 Apr 2023 13:33:10 +0300 (EEST) Received: from eucas1p2.samsung.com (unknown [182.198.249.207]) by mailout2.w1.samsung.com (KnoxPortal) with ESMTP id 20230418103309euoutp02e8415c7e7af09422b0a338cf2acddd9d~XAOmzYXXN1435614356euoutp02o for ; Tue, 18 Apr 2023 10:33:09 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 mailout2.w1.samsung.com 20230418103309euoutp02e8415c7e7af09422b0a338cf2acddd9d~XAOmzYXXN1435614356euoutp02o DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=samsung.com; s=mail20170921; t=1681813989; bh=T/Ob5g2TvBSsX21a+F3fPRFKxcx4M+etZ1hxK6O/0tY=; h=From:To:Cc:Subject:Date:References:From; b=ALD8JXzTAJ+MNjNX35+Y/jRow7N7hl2j+W8WKOAmX6rwEdk5D3Ei1n4maCKUaZSrO PScqSQkGO7gXgfVlwtodnWgtmZTe08SLK8lTsPqCjDZbxt3CxTwvAIQjR7FpbF6yNx 2G1uXveyMDD1fLJZLErgHi8Btp37Ykuo61i2Dpm8= Received: from eusmges1new.samsung.com (unknown [203.254.199.242]) by eucas1p2.samsung.com (KnoxPortal) with ESMTP id 20230418103309eucas1p2f74181642730c2009b3135308820ecaa~XAOmnQjLg3117731177eucas1p29; Tue, 18 Apr 2023 10:33:09 +0000 (GMT) Received: from eucas1p1.samsung.com ( [182.198.249.206]) by eusmges1new.samsung.com (EUCPMTA) with SMTP id 54.C2.09503.5E17E346; Tue, 18 Apr 2023 11:33:09 +0100 (BST) Received: from eusmtrp1.samsung.com (unknown [182.198.249.138]) by eucas1p1.samsung.com (KnoxPortal) with ESMTPA id 20230418103309eucas1p1d5a7030d175f0b7061a7c9df9e3c624c~XAOmSvUsO0769907699eucas1p1E; Tue, 18 Apr 2023 10:33:09 +0000 (GMT) Received: from eusmgms2.samsung.com (unknown [182.198.249.180]) by eusmtrp1.samsung.com (KnoxPortal) with ESMTP id 20230418103309eusmtrp1be1d7430696ec776860a3b7ae4ab5049~XAOmSNOw81427114271eusmtrp1b; Tue, 18 Apr 2023 10:33:09 +0000 (GMT) X-AuditID: cbfec7f2-ea5ff7000000251f-81-643e71e57ed7 Received: from eusmtip2.samsung.com ( [203.254.199.222]) by eusmgms2.samsung.com (EUCPMTA) with SMTP id 2D.36.34412.4E17E346; Tue, 18 Apr 2023 11:33:08 +0100 (BST) Received: from AMDN5164.EU.corp.samsungelectronics.net (unknown [106.210.132.171]) by eusmtip2.samsung.com (KnoxPortal) with ESMTPA id 20230418103308eusmtip28507bfb21ee8672d6f3822a1d726af94~XAOl-qVTB2323723237eusmtip29; Tue, 18 Apr 2023 10:33:08 +0000 (GMT) From: Dawid Kozinski To: d.frankiewic@samsung.com, ffmpeg-devel@ffmpeg.org Date: Tue, 18 Apr 2023 12:32:57 +0200 Message-Id: <20230418103257.374-1-d.kozinski@samsung.com> X-Mailer: git-send-email 2.37.3.windows.1 MIME-Version: 1.0 X-Unsent: 1 X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFnrFIsWRmVeSWpSXmKPExsWy7djPc7pPC+1SDL5MEbX4cu0Ls8XKb79Z LL59OsPswOzxZ9FmFo++LasYA5iiuGxSUnMyy1KL9O0SuDIWnj3MXDCNr2LF2x3MDYyvuLoY OTgkBEwkus47dDFycQgJrGCU6FkxmRHC+cIocernNWYI5zOjRMvfTpYuRk6wjh+7dkIllgNV fWthgnDamSR2r3rOBlLFJqAr8fLDIyYQW0TAVOJk816wOLOAtsS6u9/BbGGBZIl1B36ygtgs AqoSc39/ZAaxeQUsJZZfm8cGsU1TYsKWOUwQcUGJkzOfQF3BLbFu1iVWiJnyEs1bZ4NdJCHw lV2iaes6ZogiF4l9B35CDRKWeHV8CzuELSNxenIPCyQAiiUO9TtAmDUSh36kQ1RYS7xtPM4I EmYGOmH9Ln2ICkeJda1hECafxI23ghD7+SQmbZvODBHmlehoE4IwVST6OsUgxklJPF02B+oo D4kd1xczT2BUnIXkqVlIHpmFsHUBI/MqRvHU0uLc9NRiw7zUcr3ixNzi0rx0veT83E2MwORw +t/xTzsY5776qHeIkYmD8RCjBAezkgjvGVerFCHelMTKqtSi/Pii0pzU4kOM0hwsSuK82rYn k4UE0hNLUrNTUwtSi2CyTBycUg1Mtkc/SQW8ErhVqvB6CXPM4rgkqxfqSsv639Rd5jobNLPg zKfE797HZD7tm8WcmXjV49HyVNO3Cin6P7XSvrge51j6N8hk0q3Xx9/UxGT9e+975qHyxri1 7C5h/KGyV7WlDgV+nV36kfnGvhv+Ba3SDIvdXmW+/HnBwGUh87pLLxbbHan0+Ju9Yd7+SG9L gfufbgn/l9n/1uL3r45v++S4I7U1Lyz/rPJzV8xt+Syn72LixmsvNoqw3Jm5yZ57umb/Lqm2 lQI7nKosnl2X3fR+5poA0Xm/DDt8mDdPDZ2gfz5Ol/vb7N0nui5/rLK8sEDjmt3BpR9nPFvN WOSSvNzEZfUUqa15rQd2V16/XCt1bKcSS3FGoqEWc1FxIgC/BHgOfQMAAA== X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFrrELMWRmVeSWpSXmKPExsVy+t/xe7pPCu1SDN7tsbb4cu0Ls8XKb79Z LL59OsPswOzxZ9FmFo++LasYA5ii9GyK8ktLUhUy8otLbJWiDS2M9AwtLfSMTCz1DI3NY62M TJX07WxSUnMyy1KL9O0S9DIWnj3MXDCNr2LF2x3MDYyvuLoYOTkkBEwkfuzaydzFyMUhJLCU UWLLkhdsEAkpiaVLFzFC2MISf651sUEUtTJJLPo5hR0kwSagK/HywyMmEFtEwFzi4rpbYA3M AtoS6+5+BxskLJAocW3SZ7A4i4CqxNzfH5lBbF4BS4nl1+ZBLdOUmLBlDhNEXFDi5MwnLBBx bol1sy6xQsyUl2jeOpt5AiP/LCRls5CkFjAyrWIUSS0tzk3PLTbSK07MLS7NS9dLzs/dxAgM 3G3Hfm7Zwbjy1Ue9Q4xMHIyHGCU4mJVEeM+4WqUI8aYkVlalFuXHF5XmpBYfYjQFunUis5Ro cj4wdvJK4g3NDEwNTcwsDUwtzYyVxHk9CzoShQTSE0tSs1NTC1KLYPqYODilGpjKtz/pUfdd olFxfhLb00bZcIdN+7SDD50P+X7yvDJb0MNDj5XaXq7fw/LAe2eGdExB1krZ4v3LrApPuamJ hKZV37fXWvDp1Irpdn9F9624Gd5nqz33tkWojGDGoz8m30Q7Q/ZkHJ5Y8F5MSlLpeGDJvoM6 q5VilwlXTdoX/bC+O9uotZnz/bxtR2fFvzwjsbHUN54x23Ru0h+WkqNmb2yNfLbrLfYuNdto pbnW7krVC9veivcSMb4dxrG3UpaeEv252MBskuTig68y5ossZrY8IbrUom+jvGVO8nX1f/ut tkezBbcH751nuyWtSZlNhYfnpuXipzOtnS5/PJevnBL9l91HzcfjX05O29T6TiWW4oxEQy3m ouJEACKdGc3lAgAA X-CMS-MailID: 20230418103309eucas1p1d5a7030d175f0b7061a7c9df9e3c624c X-Msg-Generator: CA X-RootMTR: 20230418103309eucas1p1d5a7030d175f0b7061a7c9df9e3c624c X-EPHeader: CA CMS-TYPE: 201P X-CMS-RootMailID: 20230418103309eucas1p1d5a7030d175f0b7061a7c9df9e3c624c References: Subject: [FFmpeg-devel] [PATCH v20 08/10] avformat/mov_demuxer: Extended MOV demuxer to handle EVC video content 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: Dawid Kozinski Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: oaP8O32RKqgT - Added evc extension to the list of extensions for ff_mov_demuxer Signed-off-by: Dawid Kozinski --- libavformat/demux.c | 1 + libavformat/mov.c | 3 ++- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/libavformat/demux.c b/libavformat/demux.c index 06de71cd6e..912413c6a8 100644 --- a/libavformat/demux.c +++ b/libavformat/demux.c @@ -120,6 +120,7 @@ static int set_codec_from_probe_data(AVFormatContext *s, AVStream *st, { "mp3", AV_CODEC_ID_MP3, AVMEDIA_TYPE_AUDIO }, { "mpegvideo", AV_CODEC_ID_MPEG2VIDEO, AVMEDIA_TYPE_VIDEO }, { "truehd", AV_CODEC_ID_TRUEHD, AVMEDIA_TYPE_AUDIO }, + { "evc", AV_CODEC_ID_EVC, AVMEDIA_TYPE_VIDEO }, { 0 } }; int score; diff --git a/libavformat/mov.c b/libavformat/mov.c index 057fd872b1..3d5c432697 100644 --- a/libavformat/mov.c +++ b/libavformat/mov.c @@ -2647,6 +2647,7 @@ static int mov_finalize_stsd_codec(MOVContext *c, AVIOContext *pb, case AV_CODEC_ID_VP9: sti->need_parsing = AVSTREAM_PARSE_FULL; break; + case AV_CODEC_ID_EVC: case AV_CODEC_ID_AV1: /* field_order detection of H264 requires parsing */ case AV_CODEC_ID_H264: @@ -9305,7 +9306,7 @@ const AVInputFormat ff_mov_demuxer = { .long_name = NULL_IF_CONFIG_SMALL("QuickTime / MOV"), .priv_class = &mov_class, .priv_data_size = sizeof(MOVContext), - .extensions = "mov,mp4,m4a,3gp,3g2,mj2,psp,m4b,ism,ismv,isma,f4v,avif", + .extensions = "mov,mp4,m4a,3gp,3g2,mj2,psp,m4b,ism,ismv,isma,f4v,avif,evc", .flags_internal = FF_FMT_INIT_CLEANUP, .read_probe = mov_probe, .read_header = mov_read_header, From patchwork Tue Apr 18 10:33:21 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Dawid Kozinski X-Patchwork-Id: 41240 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a20:4645:b0:e3:3194:9d20 with SMTP id eb5csp3039676pzb; Tue, 18 Apr 2023 03:33:39 -0700 (PDT) X-Google-Smtp-Source: AKy350YdERm6ww91DRz3XfWHRzbseY25iscT6Z/uzmDusUCM4t8ptfuYBiDS5N20MXzQNAyAE5uZ X-Received: by 2002:a05:6402:197:b0:506:70c9:b870 with SMTP id r23-20020a056402019700b0050670c9b870mr1829602edv.3.1681814018893; Tue, 18 Apr 2023 03:33:38 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1681814018; cv=none; d=google.com; s=arc-20160816; b=TpzyiKgavvUnFxZhtm3UB1jBZBLxFgLragIC6VLb5Op7lolnBNVeSF8kpaPnEcSk+O UyVOSO9WhPgqxl4vOGF6pDUdbWwzWps54CFDuEMhbdORLMnamjcnTGK8PhN7LOV8WeYm dwA/OmFiX2oPNrEtuWABrihg13vSGEowWeyH9lakN6CcdObjg6NSz7Yx+WZ3d08E4WRy yjzEpwnP7DA//wMApCmSqwE2msBAfl1uqJtoHMJKhbml9JP+cgvzq5/JKhYaLd9GEzDo SkPA7qoP/tX9ckmB4hIx+LbhDkIVfTrrQJw4GcJO5Nr61p1l/FO0rESoccpNzH6uH94P S5lQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:cc:reply-to :list-subscribe:list-help:list-post:list-archive:list-unsubscribe :list-id:precedence:subject:references:cms-type:mime-version :message-id:date:to:from:dkim-signature:dkim-filter:delivered-to; bh=p5LKgKotsPHBOgdTyoW17PAUV6hk2d5Qt2raeURyR2c=; b=WIBYBY2sCeYBrj7RTeVYVaL8koTGLSK2JnzxgRT67DHgiOAFScC4F2CMXYCyaZTvfr +NkECcmQr6jj8wNj0f005oldIWGq+8QwlSgj2QVQAJYO8XU/DFUFcDC8pyjIMiDr1Lsb 5FYO2EGSr/HIQL1P7CpIW9pZINxg6aYUi3cBv2SyyugFuKiXrNEGqBKJg8C1wILIdPIE kh/DUOv6VTpNrXv6mMDDRhFxnSxHmc0WP4x9bsFIS/2iP5FZ14bnREjo8hqweKAYEWp4 ImUXQQTBb3+do4Dp4SuoDneL7BZMdnAv1S84t2Ovscf/MXeOBceoxZov5ehp/ruWYOuX NxCA== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@samsung.com header.s=mail20170921 header.b=QoXXe5lO; 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=NONE dis=NONE) header.from=samsung.com Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id g4-20020a50ee04000000b005068286d9e8si9433134eds.509.2023.04.18.03.33.38; Tue, 18 Apr 2023 03:33:38 -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=@samsung.com header.s=mail20170921 header.b=QoXXe5lO; 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=NONE dis=NONE) header.from=samsung.com Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 4DCEF68BEAB; Tue, 18 Apr 2023 13:33:36 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mailout2.w1.samsung.com (mailout2.w1.samsung.com [210.118.77.12]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id C6B5668BE7B for ; Tue, 18 Apr 2023 13:33:34 +0300 (EEST) Received: from eucas1p1.samsung.com (unknown [182.198.249.206]) by mailout2.w1.samsung.com (KnoxPortal) with ESMTP id 20230418103334euoutp0227486be6d9ac099f3a9ca3fd43e9f9a1~XAO92CARV1503315033euoutp02c for ; Tue, 18 Apr 2023 10:33:34 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 mailout2.w1.samsung.com 20230418103334euoutp0227486be6d9ac099f3a9ca3fd43e9f9a1~XAO92CARV1503315033euoutp02c DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=samsung.com; s=mail20170921; t=1681814014; bh=oaE2PGrDEtopKbCdZxSR/xfEQy1Ca6DqpBeiuiVJsaU=; h=From:To:Cc:Subject:Date:References:From; b=QoXXe5lOqiUZn5XBJHVUsAqkkSfs+H0M5LM+RSxUg6bVR0cOwYH4i9h6lAI0ImDoP L851m15PZbU5bw/ehKNp5MvltidT0YVB6hQ64bEnFjgwVuOjI/mxhB8gvxITd1IrJH 21qpbmNiO8Yk0p0KKGCncJFv1OC+QWD9aclfrCMs= Received: from eusmges2new.samsung.com (unknown [203.254.199.244]) by eucas1p1.samsung.com (KnoxPortal) with ESMTP id 20230418103334eucas1p15386088427710eb67d9637f1fdea07cc~XAO9pUBSA0597505975eucas1p1W; Tue, 18 Apr 2023 10:33:34 +0000 (GMT) Received: from eucas1p2.samsung.com ( [182.198.249.207]) by eusmges2new.samsung.com (EUCPMTA) with SMTP id 60.6F.09966.DF17E346; Tue, 18 Apr 2023 11:33:34 +0100 (BST) Received: from eusmtrp1.samsung.com (unknown [182.198.249.138]) by eucas1p1.samsung.com (KnoxPortal) with ESMTPA id 20230418103333eucas1p153270cdb9c76ba511fd18956ad54d85c~XAO9TX-Yr3138331383eucas1p1x; Tue, 18 Apr 2023 10:33:33 +0000 (GMT) Received: from eusmgms1.samsung.com (unknown [182.198.249.179]) by eusmtrp1.samsung.com (KnoxPortal) with ESMTP id 20230418103333eusmtrp1e651e6d353acab372791e8d63e525c35~XAO9S6oxD1467814678eusmtrp1u; Tue, 18 Apr 2023 10:33:33 +0000 (GMT) X-AuditID: cbfec7f4-d39ff700000026ee-38-643e71fd2f46 Received: from eusmtip2.samsung.com ( [203.254.199.222]) by eusmgms1.samsung.com (EUCPMTA) with SMTP id 0E.66.22108.DF17E346; Tue, 18 Apr 2023 11:33:33 +0100 (BST) Received: from AMDN5164.EU.corp.samsungelectronics.net (unknown [106.210.132.171]) by eusmtip2.samsung.com (KnoxPortal) with ESMTPA id 20230418103333eusmtip20ed799c6cb44455c0971f1856013934c~XAO87GVZC1909519095eusmtip2k; Tue, 18 Apr 2023 10:33:33 +0000 (GMT) From: Dawid Kozinski To: d.frankiewic@samsung.com, ffmpeg-devel@ffmpeg.org Date: Tue, 18 Apr 2023 12:33:21 +0200 Message-Id: <20230418103321.883-1-d.kozinski@samsung.com> X-Mailer: git-send-email 2.37.3.windows.1 MIME-Version: 1.0 X-Unsent: 1 X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFnrJIsWRmVeSWpSXmKPExsWy7djP87r/Cu1SDA7sYrL4cu0Ls8XKb79Z LL59OsPswOzxZ9FmFo++LasYA5iiuGxSUnMyy1KL9O0SuDLm9kkWLGCt6Lgs2MA4laWLkZND QsBEomn1VLYuRi4OIYEVjBIHf0+Ecr4wSvR/mcwI4XxmlGiYtZsdpmXp3H4miMRyRokDl5pZ IZx2Joldr9+xgVSxCehKvPzwiAnEFhEwlTjZvBcsziygLbHu7ncwW1jAUeL8ojPMIDaLgKrE 84eLwI7iFbCU2HbgKyPENk2JCVvmMEHEBSVOznwCdTi3xLpZl1ghZspLNG+dzQwR/8guMXFS OITtIvHzxzU2CFtY4tXxLVAfyEicntwDNIcDyC6WONTvAGHWSBz6kQ5RYS3xtvE4I0iYGeiC 9bv0IcKOEkeXLmCEqOaTuPFWEGI/n8SkbdOZIcK8Eh1tQhCmikRfpxhEo5TE02VzoC70kGjf cph1AqPiLCRPzULyyCyEtQsYmVcxiqeWFuempxYb5aWW6xUn5haX5qXrJefnbmIEpobT/45/ 2cG4/NVHvUOMTByMhxglOJiVRHjPuFqlCPGmJFZWpRblxxeV5qQWH2KU5mBREufVtj2ZLCSQ nliSmp2aWpBaBJNl4uCUamDasI731L51O17ZrJS6Ppn1TW/0l453O2bxToitX5E1n+3m73Xb dX7scgs9o7zN1i08SP20vU/2kbl7zdddk467VHZfbVHwj2WllSV+TyOFE/csNW5S/nll+x6G iS6dcx1N3vUf2bpjwgGdmXMuukjfXtbPMpXr9cxLPaX3tlY6/S+KXvfH8unsh8uvnp90SDr/ eRhf5t296+cZPuB+xGqQq2EU4/qooPnn3fevvac57mqY+iH817Mrb45Pi76wd/HyqgreI/8z v0y69SSFj2el6nHW2w0ub88LuF17qhDHfS76TdA+v3m6Kl/s3RNkkr40P1ko+Nt+q3vS3H2r K5pEf9kyyrep7WX4ODOmvLfFJVWJpTgj0VCLuag4EQBBjwb0fAMAAA== X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFrrALMWRmVeSWpSXmKPExsVy+t/xe7p/C+1SDHbuUrP4cu0Ls8XKb79Z LL59OsPswOzxZ9FmFo++LasYA5ii9GyK8ktLUhUy8otLbJWiDS2M9AwtLfSMTCz1DI3NY62M TJX07WxSUnMyy1KL9O0S9DLm9kkWLGCt6Lgs2MA4laWLkZNDQsBEYuncfqYuRi4OIYGljBId d1ayQSSkJJYuXcQIYQtL/LnWxQZR1MokMWHXWmaQBJuArsTLD4+YQGwRAXOJi+tugTUwC2hL rLv7HWyQsICjxPlFZ8DqWQRUJZ4/XAS2mVfAUmLbga9QCzQlJmyZwwQRF5Q4OfMJ1HXcEutm XWKFmCkv0bx1NvMERv5ZSMpmIUktYGRaxSiSWlqcm55bbKhXnJhbXJqXrpecn7uJERi02479 3LyDcd6rj3qHGJk4GA8xSnAwK4nwnnG1ShHiTUmsrEotyo8vKs1JLT7EaAp060RmKdHkfGDc 5JXEG5oZmBqamFkamFqaGSuJ83oWdCQKCaQnlqRmp6YWpBbB9DFxcEo1MFU8svdj6BDcvDBa 625G+sqd1fcf7mKdsSjzdklrwj8JNZmFpy33t6Z97GlzPMA31eFqHmfWtc8Hl/9OD7160+dI Ya3tC2+3PVePL1g5jeWXp+7dIxOYO+8cXXov3PmUlkRKxU421/xD17kc/8XyLfWJOLx8s2y/ +LTIOEYXi0lFJ7YfPxj/8Irgpvjb3/ffYF1x+MSX9143/bf31rmG1bJZ/+T01D48/34G58k9 TRcXCjXLcBq7nXvp8UxMe++E2WwuFRq1Eu3VQnc09M30yorsrfedEUtXdKj4cPDQlctfYp05 1NzEIlc8nnybd9HyK73xDo3u65Nk3it/aLfgy2ULznlVY6W3sVRkQlBumBJLcUaioRZzUXEi AP09wADjAgAA X-CMS-MailID: 20230418103333eucas1p153270cdb9c76ba511fd18956ad54d85c X-Msg-Generator: CA X-RootMTR: 20230418103333eucas1p153270cdb9c76ba511fd18956ad54d85c X-EPHeader: CA CMS-TYPE: 201P X-CMS-RootMailID: 20230418103333eucas1p153270cdb9c76ba511fd18956ad54d85c References: Subject: [FFmpeg-devel] [PATCH v20 09/10] avcodec/evc: Changes in Changelog file 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: Dawid Kozinski Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: O12auCTAUg3q - Changelog update Signed-off-by: Dawid Kozinski --- Changelog | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Changelog b/Changelog index a40f32c23f..9a588bcaa7 100644 --- a/Changelog +++ b/Changelog @@ -75,6 +75,8 @@ version 5.1: - remap_opencl filter - added chromakey_cuda filter - added bilateral_cuda filter +- eXtra-fast Essential Video Encoder (XEVE) +- eXtra-fast Essential Video Decoder (XEVD) version 5.0: @@ -122,7 +124,6 @@ version 5.0: - anlmf audio filter - IMF demuxer (experimental) - version 4.4: - AudioToolbox output device - MacCaption demuxer From patchwork Tue Apr 18 10:33:46 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Dawid Kozinski X-Patchwork-Id: 41241 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a20:4645:b0:e3:3194:9d20 with SMTP id eb5csp3039947pzb; Tue, 18 Apr 2023 03:34:09 -0700 (PDT) X-Google-Smtp-Source: AKy350bMXX9ZkNP/WYiND0p4ixwtV/VeVHXLDU0+/M1bUQsO+tu3CSsrZxwiY3aJOSHuaCwSyTp3 X-Received: by 2002:a17:907:8a11:b0:94f:720b:1b14 with SMTP id sc17-20020a1709078a1100b0094f720b1b14mr6345701ejc.29.1681814049028; Tue, 18 Apr 2023 03:34:09 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1681814049; cv=none; d=google.com; s=arc-20160816; b=KNOUELvB1TfO8DpW4EOGMNO2wbTKQmVoIydTmo7qtVP3TZf58ypVSGfSBAWsrl8HuD 48/GvyAjCrGFitzPYkt3HWvTwQAkqa3PF+xgSC5JKxbIXYBqVxgAgtQajtdP9ycxf11e Tn9GayWbzP2Nh4gApiN7x3YAwVGi/Q+xNv6mgifEhIjhc5PybvkG6yUwWVvtPqVMA2ID FKuC0S96KtUPuqBr54/a/tgj9XbHmiKWmMt3dfUciA9cgv0PLZAQaDOhCbKFvfyXx7Q2 DZD8etuPeKxIKfqOOEItPVDsQsWMBn2vdPk/8QqhJhdWvCiIzALfrizqI7PAr2jdzmi2 a92g== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:cc:reply-to :list-subscribe:list-help:list-post:list-archive:list-unsubscribe :list-id:precedence:subject:references:cms-type:mime-version :message-id:date:to:from:dkim-signature:dkim-filter:delivered-to; bh=8EKgdpv8sDMpOOlbO7gWwjhCpAApdjEGFoIHIGD+Hcw=; b=E9QnqSI2pbbnsQFq/TW21E6TUEIOyb44vVSKGdNWsk4SZL2HGDz0PKNHWIrO+TUyv0 L5JotZ8BsLA1Gnbwxs3RZZD/N6FiDF4Gaf2fbOCPfBzVUJoIerQ2RZWJHkAcREqg9ffw TEvuF9MWkGwIe2BXtfCOGe1DJFDlAYdArDekUUwQrdLBOYGVEpyFxY8flx5SfdNP2hiY izXorkosUcDkHnC0PO6EQPE4ipF/TPAEpLrAnjXxXidqpic8Q6P+s797kYKtLOR1Kjeo 9Taezw3GDYvd2qWlyxv/ejMDB5Hnr9U9SuUDZQyEJ+Hwg3X0d7pe4kwiDiRfIuhSOVot vRFQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@samsung.com header.s=mail20170921 header.b=iZk+aQUq; 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=NONE dis=NONE) header.from=samsung.com Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id ec12-20020a170906b6cc00b0094e4aa7d750si11919485ejb.745.2023.04.18.03.34.08; Tue, 18 Apr 2023 03:34:09 -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=@samsung.com header.s=mail20170921 header.b=iZk+aQUq; 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=NONE dis=NONE) header.from=samsung.com Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 5622568BEB2; Tue, 18 Apr 2023 13:34:06 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mailout1.w1.samsung.com (mailout1.w1.samsung.com [210.118.77.11]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 7B83F68BE86 for ; Tue, 18 Apr 2023 13:33:59 +0300 (EEST) Received: from eucas1p1.samsung.com (unknown [182.198.249.206]) by mailout1.w1.samsung.com (KnoxPortal) with ESMTP id 20230418103359euoutp019751fdbc6c99f80aebcf44266e0b084a~XAPU6d6Ap1791017910euoutp01h for ; Tue, 18 Apr 2023 10:33:59 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 mailout1.w1.samsung.com 20230418103359euoutp019751fdbc6c99f80aebcf44266e0b084a~XAPU6d6Ap1791017910euoutp01h DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=samsung.com; s=mail20170921; t=1681814039; bh=+wzJiyFqiG0j20zA9XB4jAU+Q4dcfHDGAXn95Awj9PE=; h=From:To:Cc:Subject:Date:References:From; b=iZk+aQUqViqaCyrg7nsV9r78kmIOQoJn68HTUYtMyLOouiu6bNqfTFogu1BfzU650 dvplkicB5UB5+lgf550QT7jCrlfTnW9uSMkz32tkkVQx0w4PfBStY5nCmayw2c7tMy Wsp4CLe26qsPk30bDGur/xuJoyiC3DnDQuQXylQk= Received: from eusmges1new.samsung.com (unknown [203.254.199.242]) by eucas1p1.samsung.com (KnoxPortal) with ESMTP id 20230418103358eucas1p1f79f726269923b841d5facdb74a230fa~XAPUpJmoe0597305973eucas1p19; Tue, 18 Apr 2023 10:33:58 +0000 (GMT) Received: from eucas1p1.samsung.com ( [182.198.249.206]) by eusmges1new.samsung.com (EUCPMTA) with SMTP id D3.E2.09503.6127E346; Tue, 18 Apr 2023 11:33:58 +0100 (BST) Received: from eusmtrp1.samsung.com (unknown [182.198.249.138]) by eucas1p2.samsung.com (KnoxPortal) with ESMTPA id 20230418103358eucas1p21b6faea91cfc6ca8bfbbb943d01659a9~XAPUZMsxr2343623436eucas1p2V; Tue, 18 Apr 2023 10:33:58 +0000 (GMT) Received: from eusmgms1.samsung.com (unknown [182.198.249.179]) by eusmtrp1.samsung.com (KnoxPortal) with ESMTP id 20230418103358eusmtrp102a8ae6eb640bb9bf3d96aa7c9948a8f~XAPUYqnQd1499514995eusmtrp1F; Tue, 18 Apr 2023 10:33:58 +0000 (GMT) X-AuditID: cbfec7f2-ea5ff7000000251f-1e-643e721602e8 Received: from eusmtip2.samsung.com ( [203.254.199.222]) by eusmgms1.samsung.com (EUCPMTA) with SMTP id 32.86.22108.6127E346; Tue, 18 Apr 2023 11:33:58 +0100 (BST) Received: from AMDN5164.EU.corp.samsungelectronics.net (unknown [106.210.132.171]) by eusmtip2.samsung.com (KnoxPortal) with ESMTPA id 20230418103358eusmtip288a4954b8477d4bec75aeff5c231af92~XAPUFh1VV1350013500eusmtip2r; Tue, 18 Apr 2023 10:33:58 +0000 (GMT) From: Dawid Kozinski To: d.frankiewic@samsung.com, ffmpeg-devel@ffmpeg.org Date: Tue, 18 Apr 2023 12:33:46 +0200 Message-Id: <20230418103346.1559-1-d.kozinski@samsung.com> X-Mailer: git-send-email 2.37.3.windows.1 MIME-Version: 1.0 X-Unsent: 1 X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFnrNIsWRmVeSWpSXmKPExsWy7djPc7piRXYpBr17tS2+XPvCbLHy228W i2+fzjA7MHv8WbSZxaNvyyrGAKYoLpuU1JzMstQifbsErozHLTEFpzkr7p74ztbA+Jeli5GT Q0LAROL/hL+sXYxcHEICKxglPr9/xAjhfGGUaFrzB8r5zCgx4dF7uJZFGzYxQySWM0rMa5vG BuG0M0mcXjWPDaSKTUBX4uWHR0wgtoiAqcTJ5r1gcWYBbYl1d7+D2cICzhKtd9eygtgsAqoS +1v2MYPYvAJWEl2PP7FBbNOUmLBlDhNEXFDi5MwnUFdwS6ybdYkVYqa8RPPW2WAXSQj8ZJfY cuAHM0SRi8TBe1+gGoQlXh3fwg5hy0icntwDFOcAsoslDvU7QJg1Eod+pENUWEu8bTzOCBJm Bjph/S59iLCjxMLT91ghqvkkbrwVhDiAT2LStunMEGFeiY42IQhTRaKvUwyiUUri6bI5UFd5 SHy/vIttAqPiLCRfzULyySyEtQsYmVcxiqeWFuempxYb5qWW6xUn5haX5qXrJefnbmIEpofT /45/2sE499VHvUOMTByMhxglOJiVRHjPuFqlCPGmJFZWpRblxxeV5qQWH2KU5mBREufVtj2Z LCSQnliSmp2aWpBaBJNl4uCUamBqe7Jj40/25zMXRkwPqFZqE9Pnfv0ubeHL+LU7ZaRDn4tY lWjIHXuzoWj/Q/Z/l527O3Y+v2Lf2aHm2mGl0zn1wMWrFRalvS95bhzbIPhaQqDJfpUUV9X+ Wn/hDWFaYQxWlo+SJWt5zjWv3nwzR6CncVuCXu6M9jjZJ1qsS85MNbv8I+RAFfvuSe95BTX+ p7OH7ygs/9qdZsn23vlGxN9H30S104PExZaG165wtz/649ZZb6+dJ7Lv8uTPu3xi1tWi3ctb p3hWbTV9eZv5eur3dKtNhRsXP29pFmOfE3722u1rDWtaK7Pf8x457GuW9Kp6odHSKn+h4OnM 71idqm67eszb+CfTpc632rnd64cSS3FGoqEWc1FxIgC/CU7tfgMAAA== X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFrrILMWRmVeSWpSXmKPExsVy+t/xe7piRXYpBrM+y1p8ufaF2WLlt98s Ft8+nWF2YPb4s2gzi0ffllWMAUxRejZF+aUlqQoZ+cUltkrRhhZGeoaWFnpGJpZ6hsbmsVZG pkr6djYpqTmZZalF+nYJehmPW2IKTnNW3D3xna2B8S9LFyMnh4SAicSiDZuYuxi5OIQEljJK dM7azQ6RkJJYunQRI4QtLPHnWhcbRFErk8T1M6uZQRJsAroSLz88YgKxRQTMJS6uuwXWwCyg LbHu7nc2EFtYwFmi9e5aVhCbRUBVYn/LPrBeXgEria7Hn9ggFmhKTNgyhwkiLihxcuYTqOu4 JdbNusQKMVNeonnrbOYJjPyzkJTNQpJawMi0ilEktbQ4Nz232FCvODG3uDQvXS85P3cTIzBs tx37uXkH47xXH/UOMTJxMB5ilOBgVhLhPeNqlSLEm5JYWZValB9fVJqTWnyI0RTo1onMUqLJ +cDIySuJNzQzMDU0MbM0MLU0M1YS5/Us6EgUEkhPLEnNTk0tSC2C6WPi4JRqYMpeuijmngb/ tygtruu5s8MbnizXvrZlTvWFb6zx+Z95+Nhjizv6/6o1b9HinV87zUjkVJLNB/Wz+W6SDN5n DZ/r7P2ybUl55b/ZnBtfrtos98hp5c2t9Xt29QfPzPlUw65oEqm4XGOt85YVrPNz77VsmmP2 OUjyZV1Sa91C768hOUX79tSscGTVLGJIKPvslHl1beWBF1NP22fe8lrMJLfm25GFs7Sm/7H/ fkTCtekq5y3vnXM3eyWpT139anfFAp6zhUFFVzJmO7zVD2gKDEvPdpNT9EgpXXo5adO1UH2u 6+fK4rLsdFtVl8nmv315P3daZ21Q5oTDc4XdTC9/eHDhQt3byfct67W2TyqezaDEUpyRaKjF XFScCABRq+xy5AIAAA== X-CMS-MailID: 20230418103358eucas1p21b6faea91cfc6ca8bfbbb943d01659a9 X-Msg-Generator: CA X-RootMTR: 20230418103358eucas1p21b6faea91cfc6ca8bfbbb943d01659a9 X-EPHeader: CA CMS-TYPE: 201P X-CMS-RootMailID: 20230418103358eucas1p21b6faea91cfc6ca8bfbbb943d01659a9 References: Subject: [FFmpeg-devel] [PATCH v20 10/10] avcodec/evc: Changes in MAINTAINERS file 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: Dawid Kozinski Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: D+lfnQcxlHpv - MAINTAINERS update Signed-off-by: Dawid Kozinski --- MAINTAINERS | 3 +++ 1 file changed, 3 insertions(+) diff --git a/MAINTAINERS b/MAINTAINERS index 854ccc3fa4..ce7da9681e 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -198,6 +198,8 @@ Codecs: libvpx* James Zern libxavs.c Stefan Gehrer libxavs2.c Huiwen Ren + libxevd.c Samsung (Dawid Kozinski) + libxeve.c Samsung (Dawid Kozinski) libzvbi-teletextdec.c Marton Balint lzo.h, lzo.c Reimar Doeffinger mdec.c Michael Niedermayer @@ -417,6 +419,7 @@ Muxers/Demuxers: dv.c Roman Shaposhnik electronicarts.c Peter Ross epafdec.c Paul B Mahol + evc* Samsung (Dawid Kozinski) ffm* Baptiste Coudurier flic.c Mike Melanson flvdec.c Michael Niedermayer