From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org [79.124.17.100]) by master.gitmailbox.com (Postfix) with ESMTP id 729D8458C8 for ; Thu, 27 Apr 2023 07:27:21 +0000 (UTC) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 5439D68BF41; Thu, 27 Apr 2023 10:27:20 +0300 (EEST) Received: from mailout2.w1.samsung.com (mailout2.w1.samsung.com [210.118.77.12]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id A92F068BD0B for ; Thu, 27 Apr 2023 10:27:18 +0300 (EEST) Received: from eucas1p2.samsung.com (unknown [182.198.249.207]) by mailout2.w1.samsung.com (KnoxPortal) with ESMTP id 20230427072718euoutp02ad684f47c7859913bd7a6cd57590a2ed~Zuf5oiYus0637506375euoutp02_ for ; Thu, 27 Apr 2023 07:27:18 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 mailout2.w1.samsung.com 20230427072718euoutp02ad684f47c7859913bd7a6cd57590a2ed~Zuf5oiYus0637506375euoutp02_ DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=samsung.com; s=mail20170921; t=1682580438; bh=JcTD0d8ssdjqEKkYFeU80Qa0RpSimeL8J+ew0DQR1I0=; h=From:To:Cc:Subject:Date:References:From; b=VPdY6HXIYh2hY2zaP9p9HbEcklJqNGQCmvk+I94hwbG5LMBl3ivKHzcB49pCFl7CZ 5UMB//bgjOBmS3Tkx08Ky2rhtpsAMs0zjAMf1VINf8I9GJ7yU1rM2Fa8kbXSncGNqb 0CIia7/4EbfaDy+d3RmJkIUvdqaqjZCDzd5rvLHM= Received: from eusmges3new.samsung.com (unknown [203.254.199.245]) by eucas1p1.samsung.com (KnoxPortal) with ESMTP id 20230427072717eucas1p1f6ee2ae1a68c22f0b6da9f6f580788bc~Zuf5fs0ud2899828998eucas1p1i; Thu, 27 Apr 2023 07:27:17 +0000 (GMT) Received: from eucas1p1.samsung.com ( [182.198.249.206]) by eusmges3new.samsung.com (EUCPMTA) with SMTP id BB.FD.37758.5D32A446; Thu, 27 Apr 2023 08:27:17 +0100 (BST) Received: from eusmtrp2.samsung.com (unknown [182.198.249.139]) by eucas1p1.samsung.com (KnoxPortal) with ESMTPA id 20230427072717eucas1p16482b1d09dc5ccf2401849c4a9556c51~Zuf5JZMl00735407354eucas1p1n; Thu, 27 Apr 2023 07:27:17 +0000 (GMT) Received: from eusmgms2.samsung.com (unknown [182.198.249.180]) by eusmtrp2.samsung.com (KnoxPortal) with ESMTP id 20230427072717eusmtrp2a57a30c447ce64f62404e7a99ff456d2~Zuf5I4mKO1728117281eusmtrp2x; Thu, 27 Apr 2023 07:27:17 +0000 (GMT) X-AuditID: cbfec7f5-7ffff7000002937e-6f-644a23d58717 Received: from eusmtip1.samsung.com ( [203.254.199.221]) by eusmgms2.samsung.com (EUCPMTA) with SMTP id 2A.20.14344.5D32A446; Thu, 27 Apr 2023 08:27:17 +0100 (BST) Received: from AMDN5164.EU.corp.samsungelectronics.net (unknown [106.120.40.55]) by eusmtip1.samsung.com (KnoxPortal) with ESMTPA id 20230427072717eusmtip16c79ed005506372d7c70ba6357b50a9f~Zuf4ysSYO0155001550eusmtip13; Thu, 27 Apr 2023 07:27:17 +0000 (GMT) From: Dawid Kozinski To: d.frankiewic@samsung.com, ffmpeg-devel@ffmpeg.org Date: Thu, 27 Apr 2023 09:27:06 +0200 Message-Id: <20230427072706.772-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+NgFnrJIsWRmVeSWpSXmKPExsWy7djPc7pXlb1SDObuMLH4cu0Ls8XKb79Z LL59OsPswOzxZ9FmFo++LasYA5iiuGxSUnMyy1KL9O0SuDIm961jLZigVfFxxxaWBsYf8l2M nBwSAiYSc6efYe5i5OIQEljBKHH5/gdWCOcLo8TCOU+YQKqEBD4zSvxZnQbTca19DjtEfDmj xJOd9hB2K5PElUcFIDabgK7Eyw+PwHpFBEwlTjbvZQOxmQW0Jdbd/Q5mCwskSVyYep8VxGYR UJV4vXQDWD2vgKXE7f5uZohdmhITtsyBigtKnJz5hAUizi2xbtYlVoiZ8hLNW2eDfSAh8JVd 4vHhe1BFLhIvd21lg7CFJV4d38IOYctI/N85H2goB5BdLHGo3wHCrJE49CMdosJa4m3jcUaQ MDPQCet36UOEHSUuX3zLBlHNJ3HjrSDEAXwSk7ZNZ4YI80p0tAlBmCoSfZ1iEI1SEk+XzYF6 yUPiwL2dzBMYFWch+WoWkk9mIaxdwMi8ilE8tbQ4Nz212DgvtVyvODG3uDQvXS85P3cTIzA1 nP53/OsOxhWvPuodYmTiYDzEKMHBrCTCy1vpniLEm5JYWZValB9fVJqTWnyIUZqDRUmcV9v2 ZLKQQHpiSWp2ampBahFMlomDU6qBiWfhAsk5yad3rrbaXSNtqbPO+uLJz02/M5LYFoTY3f17 dEMYJ5u2fHq8neDfB4cOft3sn2ZUxPGvI81pm0qQDtuN/5+WpCu7dLT+v1F/u+ZnX+PuH0t6 /l7w61Sb/tC90f3U/ikvttyR6vH6dP3MNZXpVl1+sRNTJu9yiX02/ZL/3+sM+wVf/23mrp+W Vuz3/+8Svyc/CucxOYQa39Vf7xMqeXA/uytbsloFR/N97fOXM04mN/jl8xRP+FEYrflwg9nz L7O0iu5ZsV4MC0kyetHcdYZvW09JiyHbqs0rNwrNV2Pb9NnDbf2PfW5v31+P98iWyTVaulRa 1f3iyaLPcy5sj2KQfbmmVvPNKaGAciWW4oxEQy3mouJEABSvuFd8AwAA X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFrrELMWRmVeSWpSXmKPExsVy+t/xu7pXlb1SDN6tk7H4cu0Ls8XKb79Z LL59OsPswOzxZ9FmFo++LasYA5ii9GyK8ktLUhUy8otLbJWiDS2M9AwtLfSMTCz1DI3NY62M TJX07WxSUnMyy1KL9O0S9DIm961jLZigVfFxxxaWBsYf8l2MnBwSAiYS19rnsHcxcnEICSxl lOi53cgIkZCSWLp0EZQtLPHnWhcbRFEzk8Tjr7OZQBJsAroSLz88ArNFBMwlLq67BdbALKAt se7udzYQW1ggQeLrhP+sIDaLgKrE66UbwOp5BSwlbvd3M0Ms0JSYsGUOVFxQ4uTMJywQcW6J dbMusULMlJdo3jqbeQIj/ywkZbOQpBYwMq1iFEktLc5Nzy020itOzC0uzUvXS87P3cQIDNxt x35u2cG48tVHvUOMTByMhxglOJiVRHh5K91ThHhTEiurUovy44tKc1KLDzGaAt06kVlKNDkf GDt5JfGGZgamhiZmlgamlmbGSuK8ngUdiUIC6YklqdmpqQWpRTB9TBycUg1MFrsVDTfoL/YI /yYiuINtd0Iv11K7DzcDrsUcvrPT42u2t+u7tEVeqiudhKI9gi68tdR0UlGd+eQpjwlvapDT szV/v/a/fWgrVr86a+bLDauOxeqs8yo9a6p4kpM1/F5DeSdvX3FYYKfIxkc/mabP6HkhGX/4 rZptwHLnuKCO/9YBR7MZj00RjzqlfvPhs8I5B9ne9jLtePG+8fi0aRpPV8YZnu+ef5J5+R0P 8bnJC8O+Hlq9hCO9Q+JE60sN752N01/azFmf8lKYxbvlK395w4eV6q47lucLH+irvvT5E0vc tTkx/i8Kpv1+YD7D7oblnX+BLC2/zKv8d3x73CfCuGpB/FGxd/7KoltZbnkuVGIpzkg01GIu Kk4EAAGgJ3HlAgAA X-CMS-MailID: 20230427072717eucas1p16482b1d09dc5ccf2401849c4a9556c51 X-Msg-Generator: CA X-RootMTR: 20230427072717eucas1p16482b1d09dc5ccf2401849c4a9556c51 X-EPHeader: CA CMS-TYPE: 201P X-CMS-RootMailID: 20230427072717eucas1p16482b1d09dc5ccf2401849c4a9556c51 References: Subject: [FFmpeg-devel] [PATCH v21 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 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" Archived-At: List-Archive: List-Post: - 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 a734ad64ca..bd717dc6b5 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 2ad142d8f7..eb14c79bfa 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) -- 2.25.1 _______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org https://ffmpeg.org/mailman/listinfo/ffmpeg-devel To unsubscribe, visit link above, or email ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".