From patchwork Tue Sep 6 11:43:02 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Dawid Kozinski X-Patchwork-Id: 37704 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a20:139a:b0:8f:1db5:eae2 with SMTP id w26csp3202858pzh; Tue, 6 Sep 2022 04:43:33 -0700 (PDT) X-Google-Smtp-Source: AA6agR7G2UbU6lPJBhmeO8igMg2Np5IlMdwgAG5IOF0tt/+IlT1w6CyX8EAeaPPuQOaS4KWZtRWt X-Received: by 2002:a05:6402:84c:b0:44e:d797:6df9 with SMTP id b12-20020a056402084c00b0044ed7976df9mr2030512edz.186.1662464612872; Tue, 06 Sep 2022 04:43:32 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1662464612; cv=none; d=google.com; s=arc-20160816; b=vMFOnA+wlACZ0r2ZZr1ZLn5ebLnrdjDlcceNixnpAHEa47vvcMouOckJ5vbGJvZw7Y TDgsaUQLEzxSxdoIxhwJXxuaoeNoKHI2CjcrAnO4EO1W/FbvYuDl0xS4EwpAywlFX1W8 +BJOZloTmcnSzshrw0vOA8CUSCUW7iRayPa8EqepBGxL7NGM5SIRvAtLUEp6BW/wiTT5 Bepl7ZK1B2kD9qyXN0XpxN+t3S1iykTUsdpcwYsNhYdZhLhzg6mW8Sc8TcSDwaZ0J22x CRMiGz2UfcEmlLQTtEz4Wc3Yywg81vZOVHjN9SjrjUARu1wDPTsPJiUuyTbS6nXB1bxN f7+w== 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=UgLcfGPDDYCloqiKTbnErctE6kJm6OCSPQz33Wa0VBM=; b=ABhgQ1WgH1cMS3HVsiBQFK36YKNzu1umiksMfJ+bGD4jM1E2m9pNjfiVq1wzO4LFIT Ac6mOG89QOgBZz+DKv/2mDvB/izIhC3GkxRtqd3BP7OTrJL5687bFwD04u9WIqUni8I3 aI+bp8J66zbg1HgJuN3hW+liOFnfx2oJUWzuH7XGpy6R+5v1ePfrXYE2L0JXpX+snffK Bqi/vjQMY5OGadGg8G0cQxPofEprkQmXv7MYFyBFETJhHwuM1GLx9+yjrWwAY6d/Eor9 3zm6QsLlqpLabizKXuqWytPXigW49FVfpGPAzTqNj8b/W33BB09icOzPrJekcxUvUTA/ v8gA== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@samsung.com header.s=mail20170921 header.b=snbYTHQD; 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 b20-20020a056402351400b0044ecd80f257si1685540edd.603.2022.09.06.04.43.29; Tue, 06 Sep 2022 04:43:32 -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=snbYTHQD; 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 748A268BB1A; Tue, 6 Sep 2022 14:43:27 +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 482FF68BAD8 for ; Tue, 6 Sep 2022 14:43:21 +0300 (EEST) Received: from eucas1p1.samsung.com (unknown [182.198.249.206]) by mailout1.w1.samsung.com (KnoxPortal) with ESMTP id 20220906114310euoutp01b4c9101bb55ed98ddf51f78b5b314adb~SQry9oKnR2931529315euoutp01b for ; Tue, 6 Sep 2022 11:43:10 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 mailout1.w1.samsung.com 20220906114310euoutp01b4c9101bb55ed98ddf51f78b5b314adb~SQry9oKnR2931529315euoutp01b DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=samsung.com; s=mail20170921; t=1662464590; bh=ltZitOY8so7UQLAst8+MabcAZsztRK7PMaR72p9Z1UU=; h=From:To:Cc:Subject:Date:References:From; b=snbYTHQDHHfcqJrUs9PAQWY17yW2DqYVeIbbcKBZ9+pcymHbw+XKVjt3FjqEdlth1 6WsaKTez86uOAqNRKlMufyk36EM7413wQGHmFIeG6TzzoU5eq6Z/cz4cAguQ9NHOLI MNSeaVXclG0ksCSqyUzU5LSh/jWhJEjhrROlTJDM= Received: from eusmges1new.samsung.com (unknown [203.254.199.242]) by eucas1p1.samsung.com (KnoxPortal) with ESMTP id 20220906114310eucas1p1f1b466551f90d2e165f88b687e5569aa~SQryxInr62772027720eucas1p1g; Tue, 6 Sep 2022 11:43:10 +0000 (GMT) Received: from eucas1p1.samsung.com ( [182.198.249.206]) by eusmges1new.samsung.com (EUCPMTA) with SMTP id 34.E6.29727.E4237136; Tue, 6 Sep 2022 12:43:10 +0100 (BST) Received: from eusmtrp1.samsung.com (unknown [182.198.249.138]) by eucas1p2.samsung.com (KnoxPortal) with ESMTPA id 20220906114310eucas1p2aa699c5b353ec9e62d47a7fc71dd8855~SQryfiKkP1867018670eucas1p2H; Tue, 6 Sep 2022 11:43:10 +0000 (GMT) Received: from eusmgms1.samsung.com (unknown [182.198.249.179]) by eusmtrp1.samsung.com (KnoxPortal) with ESMTP id 20220906114310eusmtrp1184646fdc17d2e018ba6719cad6d36d3~SQryZw39l1546715467eusmtrp1n; Tue, 6 Sep 2022 11:43:10 +0000 (GMT) X-AuditID: cbfec7f2-7932da800001741f-ba-6317324e1be8 Received: from eusmtip1.samsung.com ( [203.254.199.221]) by eusmgms1.samsung.com (EUCPMTA) with SMTP id FF.99.07473.E4237136; Tue, 6 Sep 2022 12:43:10 +0100 (BST) Received: from AMDN3260.EU.corp.samsungelectronics.net (unknown [106.210.132.171]) by eusmtip1.samsung.com (KnoxPortal) with ESMTPA id 20220906114309eusmtip19a721d6e37eab68578a5d0052c48e55d~SQrx9V6vF2663926639eusmtip1Q; Tue, 6 Sep 2022 11:43:09 +0000 (GMT) From: Dawid Kozinski To: d.frankiewic@samsung.com, ffmpeg-devel@ffmpeg.org Date: Tue, 6 Sep 2022 13:43:02 +0200 Message-Id: <20220906114302.216-1-d.kozinski@samsung.com> X-Mailer: git-send-email 2.24.0.windows.2 MIME-Version: 1.0 X-Unsent: 1 X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFnrNIsWRmVeSWpSXmKPExsWy7djPc7p+RuLJBofeKlt8ufaF2WLlt98s Ft8+nWF2YPb4s2gzi0ffllWMAUxRXDYpqTmZZalF+nYJXBlLH05nKZijVTFjxVX2BsaP8l2M nBwSAiYSXf/mMHcxcnEICaxglPi25DkLhPOFUaLxPIzzmVFiwZczjDAtS/s3sIDYQgLLGSUu bFOBKGpnkjh3/RsrSIJNQFfi5YdHTCC2iICpxMnmvWwgNrOAtsS6u9/BbGGBBIlTrYfAbBYB VYl9n6eB1fMKWEp87XjOCrFMU2L2hHZmiLigxMmZT1gg4twS62ZdYoWYKS/RvHU22A8SAj/Z Jf7vfMoOUeQi8Wh5I9TVwhKvjm+BistInJ7cAzSIA8guljjU7wBh1kgc+pEOUWEt8bbxOCNI mBnohPW79CHCjhIfXj2BauSTuPFWEOIAPolJ26YzQ4R5JTrahCBMFYm+TjGIRimJp8vmMEPY HhJ3Vt5mn8CoOAvJV7OQfDILYe0CRuZVjOKppcW56anFhnmp5XrFibnFpXnpesn5uZsYgenh 9L/jn3Ywzn31Ue8QIxMH4yFGCQ5mJRHelB0iyUK8KYmVValF+fFFpTmpxYcYpTlYlMR5kzM3 JAoJpCeWpGanphakFsFkmTg4pRqY8r9Pm9x9OvrqBNcjYtzPu1muKkozSDSe61kSmvQof5qI /8xPkicYwi7O5N/bl3+9qHt74bJv0x7Pn7nleoqGm4hx46EdDk47LRN1PDvXaHL9ecTruORt 2+oio92bD+768D1UK1f8xeXq5yznG0IlBRZpTBe5dsphVZjR2mlCTWoqGilSfZuELHlU8iXk F1r3iKpvZG46kB1odIzPI7Llg1jGntj9EziPSQZoPWeYeSWOa9cCc+Ufv9+/Ose8V5U9iPNF ZSnncgYTr61RhT//PpS8d2eKq/Au+bUX7/qL7Pj5wC5t5lXFPxOnBt11ncsuKP/b49CRm8sS Fy/9f+dzzTZNGfXc+0dmp5YceDMrR4mlOCPRUIu5qDgRACT+Jax+AwAA X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFrrELMWRmVeSWpSXmKPExsVy+t/xu7p+RuLJBvOXc1t8ufaF2WLlt98s Ft8+nWF2YPb4s2gzi0ffllWMAUxRejZF+aUlqQoZ+cUltkrRhhZGeoaWFnpGJpZ6hsbmsVZG pkr6djYpqTmZZalF+nYJehlLH05nKZijVTFjxVX2BsaP8l2MnBwSAiYSS/s3sHQxcnEICSxl lPh+4AoTREJKYunSRYwQtrDEn2tdbBBFrUwS805sBCtiE9CVePnhEZgtImAucXHdLbAGZgFt iXV3v7OB2MICcRJXTzxgB7FZBFQl9n2eBlbPK2Ap8bXjOSvEAk2J2RPamSHighInZz5hgYhz S6ybdYkVYqa8RPPW2cwTGPlnISmbhSS1gJFpFaNIamlxbnpusaFecWJucWleul5yfu4mRmDg bjv2c/MOxnmvPuodYmTiYDzEKMHBrCTCm7JDJFmINyWxsiq1KD++qDQntfgQoynQrROZpUST 84Gxk1cSb2hmYGpoYmZpYGppZqwkzutZ0JEoJJCeWJKanZpakFoE08fEwSnVwLTZ7GvW2vDd HhceGy66t2XD4uOx2/Sj3s6+UyJqrPxx/9YLVZqy91LWXDaqrQ1XTt0mLCIiqLFj3WY2tj79 7fLbBQOvmLKoRDNKr3k5vz64TWVHwVx+xbBXS/+ZZOSf7GvmvSrJ9eTRKelTHhMeTrDhNeBi Sz9ivj9yo3pMguFy++jARconvZ+lbIt5EbDp+OcGpmfMETkt8m9XScxUcDnlfXFm+mWVSNHS O4skHl7bnSDAmHb2iTSP6KzqA1I/n4rP9Pt2flvsv54VKltdu+duin1o+K8m6+Sfje21AhNv 3nf+uZf18LOaqOnCD2pK50R+y/S02ve0Mjv4T1GaTW97nXrR52ksHqLzy45/d1RiKc5INNRi LipOBABCCLh75QIAAA== X-CMS-MailID: 20220906114310eucas1p2aa699c5b353ec9e62d47a7fc71dd8855 X-Msg-Generator: CA X-RootMTR: 20220906114310eucas1p2aa699c5b353ec9e62d47a7fc71dd8855 X-EPHeader: CA CMS-TYPE: 201P X-CMS-RootMailID: 20220906114310eucas1p2aa699c5b353ec9e62d47a7fc71dd8855 References: Subject: [FFmpeg-devel] [PATCH v12 4/9] 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: IRivmNQp3aG9 - Provided AVInputFormat structure describing EVC input format (ff_evc_demuxer) Signed-off-by: Dawid Kozinski --- libavformat/Makefile | 1 + libavformat/allformats.c | 1 + libavformat/evcdec.c | 124 +++++++++++++++++++++++++++++++++++++++ 3 files changed, 126 insertions(+) create mode 100644 libavformat/evcdec.c diff --git a/libavformat/Makefile b/libavformat/Makefile index 99553e9dfa..09debd8897 100644 --- a/libavformat/Makefile +++ b/libavformat/Makefile @@ -249,6 +249,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 31508b69f0..dfce49d149 100644 --- a/libavformat/allformats.c +++ b/libavformat/allformats.c @@ -148,6 +148,7 @@ extern const AVInputFormat ff_ea_cdata_demuxer; extern const AVInputFormat ff_eac3_demuxer; extern const AVOutputFormat ff_eac3_muxer; extern const AVInputFormat ff_epaf_demuxer; +extern const AVInputFormat ff_evc_demuxer; extern const AVOutputFormat ff_evc_muxer; extern const AVOutputFormat 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..ffb7449c4d --- /dev/null +++ b/libavformat/evcdec.c @@ -0,0 +1,124 @@ +/* + * 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_NAL_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_NAL_UNIT_LENGTH_BYTE) { + + int t = 0; + unsigned char *p = (unsigned char *)bits; + + for(int i=0; ibuf; + int bytes_to_read = p->buf_size; + + while(bytes_to_read > EVC_NAL_UNIT_LENGTH_BYTE) { + + nalu_size = read_nal_unit_length(bits, EVC_NAL_UNIT_LENGTH_BYTE); + if(nalu_size == 0) break; + + bits += EVC_NAL_UNIT_LENGTH_BYTE; + bytes_to_read -= EVC_NAL_UNIT_LENGTH_BYTE; + + 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)