From patchwork Mon Mar 27 10:47:58 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Dawid Kozinski X-Patchwork-Id: 40863 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a20:7a30:b0:df:834d:2c1a with SMTP id t48csp1220698pzh; Mon, 27 Mar 2023 03:48:19 -0700 (PDT) X-Google-Smtp-Source: AKy350bcbIcP0/0U6vaaAok1OH1xJ3K1HjSGFYB8zIzJDeLGERVETavVpAYBY6WVbpuPonBkFaVy X-Received: by 2002:a05:6402:c4:b0:502:4875:721 with SMTP id i4-20020a05640200c400b0050248750721mr1068629edu.15.1679914099168; Mon, 27 Mar 2023 03:48:19 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1679914099; cv=none; d=google.com; s=arc-20160816; b=Q9TC46xKgTE0MtjITj3+HiCM3drPzrGPynrfyC3wrEiBQTtjOKbmiQs7gyt/7haXhO a9OzwX6BqtSrkB07lOs75+ez3pa2tdfiK99kiITG6dAS7Xcklai+kVLIaSpX6IkdMlbv fB5JvYnxzt2L++YMl9fTqdPiKZj1RpCLuaok9Ntf14ZidiiqkaWWlm0X9VSOIlTMmdZ+ CckkTLYY/nqlbZ3lG24KKcnMW9kYh8tlukJtBpUHsIEvxugM+503NZt/PutlEZRsS+pa G2JiIVC5CYuIJPne1sQcZpEE4xDBixz9nBogq3BizUY88w22zbfw7QqGltTToO78r82J dmgA== 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=qtnvfHe+RoBEj3uigv9SRrP6dTNktv+x7ajtsbwo4Jk=; b=AXnXdEvqdkp0K11zEN81kSSWNhJmvr4pQqP1IqNArH8L1i3HAAmlNtkhWxH8BI92VW ywU60Z+kWXMocgWstjqc6Jd4yYXOuvGgZs1EHvzxK1ipoLSJr9x3QccECN/Bqw6+MOdc WFIaYajTB3iI2ifhv2LwmnWzlSh4qzyIBfYXE4ThMh5UkMTIGhDoHTcoJVErvWSOQX8w 4jSLdL1Q+cZkH2kCBhmukZSpiszUZeTAtyYFffBLTnQqUx2UcC2r7dF4HzwohSOiXbe6 Qgy3voiGMXt4zc3npY3iSBrPLOnTuOsrEjtGZMSf+IHMeMyCYaRhOOlNsaBCvvv7ShVG zf1g== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@samsung.com header.s=mail20170921 header.b=kaHI55ZZ; 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 tg4-20020a1709078dc400b0093e6f0395c1si7090054ejc.687.2023.03.27.03.48.18; Mon, 27 Mar 2023 03:48: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=kaHI55ZZ; 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 AB22768CAA2; Mon, 27 Mar 2023 13:48:16 +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 0208168C9B0 for ; Mon, 27 Mar 2023 13:48:10 +0300 (EEST) Received: from eucas1p1.samsung.com (unknown [182.198.249.206]) by mailout2.w1.samsung.com (KnoxPortal) with ESMTP id 20230327104810euoutp0213bba1659fb73199da97a118158c3a59~QQPb1q97y1105311053euoutp02P for ; Mon, 27 Mar 2023 10:48:10 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 mailout2.w1.samsung.com 20230327104810euoutp0213bba1659fb73199da97a118158c3a59~QQPb1q97y1105311053euoutp02P DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=samsung.com; s=mail20170921; t=1679914090; bh=cRZiWB8DVu9BxmCHAZJvCcYP24RzllcU/8TR+QU89I0=; h=From:To:Cc:Subject:Date:References:From; b=kaHI55ZZ22Vbm+T1QgY4+y/bxzFzYpPoBkQ8YfDua0xBmjvQuPoWCNgpdRG4xHgwX 6EzzmAgpKeztLH2BTX28xjRcVuSvonEB9MQ8ty+6tCQpDzdTCD55D0EjG4Q81YB57t ctPtIN74u1NloiZem2DvNd0q6KaWXNzzGjKuwVQk= Received: from eusmges3new.samsung.com (unknown [203.254.199.245]) by eucas1p2.samsung.com (KnoxPortal) with ESMTP id 20230327104810eucas1p2b0bd94f7c18d6924b34edea676a9b4ea~QQPbj5Tut0699606996eucas1p2f; Mon, 27 Mar 2023 10:48:10 +0000 (GMT) Received: from eucas1p2.samsung.com ( [182.198.249.207]) by eusmges3new.samsung.com (EUCPMTA) with SMTP id 49.82.10014.A6471246; Mon, 27 Mar 2023 11:48:10 +0100 (BST) Received: from eusmtrp1.samsung.com (unknown [182.198.249.138]) by eucas1p2.samsung.com (KnoxPortal) with ESMTPA id 20230327104809eucas1p238296974019037dcfb16061ec38eabd8~QQPbXDBRt0697806978eucas1p2d; Mon, 27 Mar 2023 10:48:09 +0000 (GMT) Received: from eusmgms2.samsung.com (unknown [182.198.249.180]) by eusmtrp1.samsung.com (KnoxPortal) with ESMTP id 20230327104809eusmtrp116a46935506c9f68f3c69d09c1839417~QQPbWY4q71184611846eusmtrp14; Mon, 27 Mar 2023 10:48:09 +0000 (GMT) X-AuditID: cbfec7f5-b8bff7000000271e-d8-6421746a2197 Received: from eusmtip2.samsung.com ( [203.254.199.222]) by eusmgms2.samsung.com (EUCPMTA) with SMTP id B2.A4.09583.96471246; Mon, 27 Mar 2023 11:48:09 +0100 (BST) Received: from AMDN5164.EU.corp.samsungelectronics.net (unknown [106.210.132.171]) by eusmtip2.samsung.com (KnoxPortal) with ESMTPA id 20230327104809eusmtip2f408ec668cef56d19cdb5be3f2a1d024~QQPbDJlKE2414724147eusmtip2T; Mon, 27 Mar 2023 10:48:09 +0000 (GMT) From: Dawid Kozinski To: d.frankiewic@samsung.com, ffmpeg-devel@ffmpeg.org Date: Mon, 27 Mar 2023 12:47:58 +0200 Message-Id: <20230327104758.1538-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+NgFnrDIsWRmVeSWpSXmKPExsWy7djP87pZJYopBjunsFl8ufaF2WLlt98s Ft8+nWF2YPb4s2gzi0ffllWMAUxRXDYpqTmZZalF+nYJXBl7v5xnLLipWXHgQg97A+MJ+S5G Tg4JAROJ/4/Ps3cxcnEICaxglPhw/h8LhPOFUWLKo4dMEM5nRomvH08wwbTMOX6VFSKxnFFi 2bknjBBOO5PEj76zjCBVbAK6Ei8/PALrEBEwlTjZvJcNxGYW0JZYd/c7mC0skCCx7NZudhCb RUBVYt+bKywgNq+AlcT81gPMENs0JSZsmcMEEReUODnzCQtEnFti3axLrBAz5SWat85mBjlC QuAru8SHDYugTnWRaO1eywhhC0u8Or6FHcKWkTg9uQdoEAeQXSxxqN8BwqyROPQjHaLCWuJt 43FGkDAz0Anrd+lDhB0lrv1cCtXIJ3HjrSDEAXwSk7ZNZ4YI80p0tAlBmCoSfZ1iEI1SEk+X zYF6yUPi5PXXjBMYFWch+WoWkk9mIaxdwMi8ilE8tbQ4Nz212DgvtVyvODG3uDQvXS85P3cT IzBBnP53/OsOxhWvPuodYmTiYDzEKMHBrCTCu9lbMUWINyWxsiq1KD++qDQntfgQozQHi5I4 r7btyWQhgfTEktTs1NSC1CKYLBMHp1QDU8rGkOlhxuGRE3yWfNkSFyH5K7ZHe6LnRLaU3gcN jQ71Uw60TnQSufy4fs2TyGfNKb4Rxn3SswQXr6ywbZt+ukCAx+Xpp9dJMw77P7h4zO9OXOvx ax8/rK59+uEzd9XsI9JMbj9sijsvb7KKjNKyO+Lz9/9UvtKs/NX1gjythikLmhI/bLpV5Cvh +aFcJ+Gaw5kzW1VOtd9UWNY7tfyvhMt65a1nj05/2z/D8aD5oY/Xj72eG/bdgnHDlyMf/V+m 31c5k+3TyMcVbMXvdveQ517HtgmFi7uP2F7+yVp683dzj+9ln0tRR1bMu6hwvNZTO/aoTUtE xXoJ7kOca6skVQyyV0T3XntgwKfSXFQmpsRSnJFoqMVcVJwIAFd17DB/AwAA X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFrrELMWRmVeSWpSXmKPExsVy+t/xe7qZJYopBq+eGVt8ufaF2WLlt98s Ft8+nWF2YPb4s2gzi0ffllWMAUxRejZF+aUlqQoZ+cUltkrRhhZGeoaWFnpGJpZ6hsbmsVZG pkr6djYpqTmZZalF+nYJehl7v5xnLLipWXHgQg97A+MJ+S5GTg4JAROJOcevsnYxcnEICSxl lDg4fTYjREJKYunSRVC2sMSfa11sEEWtTBITl7QwgSTYBHQlXn54BGaLCJhLXFx3C6yBWUBb Yt3d72wgtrBAnMSHmYtZQGwWAVWJfW+ugNm8AlYS81sPMEMs0JSYsGUOE0RcUOLkzCcsEHFu iXWzLrFCzJSXaN46m3kCI/8sJGWzkKQWMDKtYhRJLS3OTc8tNtIrTswtLs1L10vOz93ECAzc bcd+btnBuPLVR71DjEwcjIcYJTiYlUR4N3srpgjxpiRWVqUW5ccXleakFh9iNAW6dSKzlGhy PjB28kriDc0MTA1NzCwNTC3NjJXEeT0LOhKFBNITS1KzU1MLUotg+pg4OKUamHxU1zWLcO9J 1Jlo0hk2wXiO0S821z6bzvz9ZdEpOTkJp6fJCQv4+2UoTe/8/OSosd4V9nnHt12vnny+5K2u 0uU3Lt/Sc1Z4a/k0JjeuLfn5xW0j8/bQWXHVz6QOMkz52/jOgpH/ga9YR78qd3/vwkUCgdPV Sn3cfJfpS53tjjrAp3lh+r9jp8I3qAUdnfdg2raAo+amDy5LR6TLX856a7ZsV+m3rYZrvTYk 8nxsOTM/jb9cuqxjz8TDV5+f99Lb+Pv6UgV/FyabSY+Ou52ecjWl8LB66wfuihvP+EsWhbY+ 8dkYfidye2FJzxOnR0U/u/SeagWx88vFPdvedlRU7/ZVq4RbYQnTVu+NOhZepsRSnJFoqMVc VJwIANOXRaXlAgAA X-CMS-MailID: 20230327104809eucas1p238296974019037dcfb16061ec38eabd8 X-Msg-Generator: CA X-RootMTR: 20230327104809eucas1p238296974019037dcfb16061ec38eabd8 X-EPHeader: CA CMS-TYPE: 201P X-CMS-RootMailID: 20230327104809eucas1p238296974019037dcfb16061ec38eabd8 References: Subject: [FFmpeg-devel] [PATCH v17 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: lt0N3e9xMd2t - Provided AVInputFormat structure describing EVC input format (ff_evc_demuxer) --- 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)