From patchwork Fri Oct 7 09:12:10 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Dawid Kozinski X-Patchwork-Id: 38598 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a20:4d9:b0:9c:f4b:4e41 with SMTP id 25csp173618pzd; Fri, 7 Oct 2022 02:12:27 -0700 (PDT) X-Google-Smtp-Source: AMsMyM6XHV7V5cTO3xkuc5YWe+dTBeZATnVV3s/luz2qbcgo5xCAQKrZVLHk6mGWShKvr6U1tH11 X-Received: by 2002:a17:906:7945:b0:73b:e605:f31 with SMTP id l5-20020a170906794500b0073be6050f31mr3319225ejo.129.1665133947522; Fri, 07 Oct 2022 02:12:27 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1665133947; cv=none; d=google.com; s=arc-20160816; b=J21BS7Gsu4ImLjaAFAYKNqj/OHhl8JGbZIwUerhR29B86GB+LdHUHP7R00+3CSLTfp Z/LZqWzWARHCQAzqCZYeJIHMnBkm54DO8GXYTbKjfAP5ILnHdhxGBvP8UcZpwZQeZh9O vZyktlRpm1zauzIZeAdlBt799ivHIbtWwDuhXN1+mpv+qwF3YyldeIcEpJ/bi6wPSgnj /e2EeLFO97fGpzRPD8KRTn7nif39h9c844IsUJJDNb3KjOx0y2/2W3wKOiCBmMEY2AP2 ceb+1EKzT3fEzsxVzeqk/CGBEK5hiuIetWU7lNYGSG3mNawPgu+LvuxrzDqPQSCXBFMb TJeQ== 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=I8qOndhlUb/X/aGreetL7TQlY/khVpkdwfGKbetJn2Y=; b=FBFVnshZ05u1q64wS9G7jul4xtQCcdsIyz8kykyFmENGg/2FBkem91DW1DWZbbkeRY T+iPkoiP1K0VUzyF1dVorHmfxM97JSpJvRr9ldqJrXYKbSEJ8b0v5tIFMOsb7jrYbRb1 b8RlSFHeqHETOq0/SA6UUYXZZgzE2FaiocXdb+s298L7aFMpEYaSELji2ShB0HePNBfz FIIoG9aRjRLHuZvMHAixRRGUSkEOzcMHn4HUsadSy/7Tp5QGWcmxQJs4lc9yny+1MImf lOMrtJC12724bNQc11bL2Bi+bGwsM70H7tCAMDkCIGP0M/P+A/rtgUxl5u9gbhonZMRK usuQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@samsung.com header.s=mail20170921 header.b=U3e2s4ON; 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 f13-20020a056402354d00b0045915120659si1930203edd.284.2022.10.07.02.12.26; Fri, 07 Oct 2022 02:12:27 -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=U3e2s4ON; 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 E1D8768A72F; Fri, 7 Oct 2022 12:12:24 +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 7282A68A72F for ; Fri, 7 Oct 2022 12:12:23 +0300 (EEST) Received: from eucas1p2.samsung.com (unknown [182.198.249.207]) by mailout1.w1.samsung.com (KnoxPortal) with ESMTP id 20221007091222euoutp0101d7e8e5def78532fe0b12e34ae76fd4~bvn_xGody2797127971euoutp01w for ; Fri, 7 Oct 2022 09:12:22 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 mailout1.w1.samsung.com 20221007091222euoutp0101d7e8e5def78532fe0b12e34ae76fd4~bvn_xGody2797127971euoutp01w DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=samsung.com; s=mail20170921; t=1665133942; bh=NnlhAE8EQ9TqQjdG3v3TjYkbxpX0gkMebq4PXivsg1Y=; h=From:To:Cc:Subject:Date:References:From; b=U3e2s4ONy7esOqhI3/odG/aNhmyYw3hiw8dtUDJmYvfr0ywXpRG3aDQl3sTz+YJYp oJdoWYKUVTaYlNX2MaJbzve0aX5v9Hdika5jlcAWP65Wco3BfrtB1B0hiM0VvODhkd c1RruK4HFfmfqblC7NolXkcp7Q+FUFHgbReDNl2I= Received: from eusmges1new.samsung.com (unknown [203.254.199.242]) by eucas1p2.samsung.com (KnoxPortal) with ESMTP id 20221007091222eucas1p26d9b8e95aa49ec5a77e31962b62aff3e~bvn_jvPeg3043330433eucas1p2F; Fri, 7 Oct 2022 09:12:22 +0000 (GMT) Received: from eucas1p1.samsung.com ( [182.198.249.206]) by eusmges1new.samsung.com (EUCPMTA) with SMTP id 0F.ED.29727.57DEF336; Fri, 7 Oct 2022 10:12:22 +0100 (BST) Received: from eusmtrp1.samsung.com (unknown [182.198.249.138]) by eucas1p1.samsung.com (KnoxPortal) with ESMTPA id 20221007091221eucas1p194ad064eee911019b0af6f339a41660e~bvn9pe12r2634026340eucas1p1E; Fri, 7 Oct 2022 09:12:21 +0000 (GMT) Received: from eusmgms2.samsung.com (unknown [182.198.249.180]) by eusmtrp1.samsung.com (KnoxPortal) with ESMTP id 20221007091221eusmtrp169a6ad1602c3eff8a6bc2c3bf38dd1a4~bvn9ozUnm1568315683eusmtrp1U; Fri, 7 Oct 2022 09:12:21 +0000 (GMT) X-AuditID: cbfec7f2-205ff7000001741f-cb-633fed7528b4 Received: from eusmtip1.samsung.com ( [203.254.199.221]) by eusmgms2.samsung.com (EUCPMTA) with SMTP id 1C.A3.10862.57DEF336; Fri, 7 Oct 2022 10:12:21 +0100 (BST) Received: from AMDN5164.EU.corp.samsungelectronics.net (unknown [106.210.132.171]) by eusmtip1.samsung.com (KnoxPortal) with ESMTPA id 20221007091221eusmtip1c767adb633055ff110056ea8fc458e3b~bvn9INO312948229482eusmtip1e; Fri, 7 Oct 2022 09:12:21 +0000 (GMT) From: Dawid Kozinski To: d.frankiewic@samsung.com, ffmpeg-devel@ffmpeg.org Date: Fri, 7 Oct 2022 11:12:10 +0200 Message-Id: <20221007091210.1489-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+NgFnrBIsWRmVeSWpSXmKPExsWy7djPc7plb+2TDZYeZbT4cu0Ls8XKb79Z LL59OsPswOzxZ9FmFo++LasYA5iiuGxSUnMyy1KL9O0SuDJ2d29lK5ijVbF/9We2BsaP8l2M nBwSAiYSW/+3sIPYQgIrGCVm/lbpYuQCsr8wSux8vZoZIvGZUeLTHiuYhgPXdrNCFC1nlGg4 8Jwdwmlnkpi+ZRYLSBWbgK7Eyw+PmEBsEQFTiZPNe9lAbGYBbYl1d7+D2cICCRLrFs4Gq2ER UJWY8PUf2DZeASuJGRvOsUFs05SYsGUOE0RcUOLkzCcsEHFuiXWzLrFCzJSXaN46mxki/pNd Yv9C5S5GDiDbRWJdA9TRwhKvjm9hh7BlJE5P7mGBKCmWONTvAGHWSBz6kQ5RYS3xtvE4I0iY GeiA9bv0IcKOEu/OvmKFqOaTuPFWEGI9n8SkbdOZIcK8Eh1tQhCmikRfpxhEo5TE02VzoA70 kNi7rIl1AqPiLCQ/zULyxyyEtQsYmVcxiqeWFuempxYb5qWW6xUn5haX5qXrJefnbmIEJobT /45/2sE499VHvUOMTByMhxglOJiVRHh37rRLFuJNSaysSi3Kjy8qzUktPsQozcGiJM7LNkMr WUggPbEkNTs1tSC1CCbLxMEp1cA0Y9Fui8bSuIu/b7dfUPnVHVC06tDf95Nk9nUceXVuY5Dk u62uKjMn8E8VSTquLruZf8c0T+G3UiWFDWFXQgsPRgQGe4tuKnLa2f6iaIXAlnAGo8MT3yQp ZnTu0D5pZPTOtzP2W7q1rcDbZoYFc2ytrLM5i94fOfEvVdPpWCLrzrc8RxSnvDp15/HEDyJW NpG9scGlp1gWRzPGaypq+2uplvlqH9ime27X4iYJq26jE1Xt6w7HfI58u7ZLvOyW3ksOeX7h Y5/EspdfNxPZtFxFiuutWGXUzjDFPctKZp64kXfkXa5cEHdo1PsZwuLLrmqdOMM35e9etc8B BiprLtceupZU5ikooaXs9IRz9mslluKMREMt5qLiRAA2TrMyewMAAA== X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFrrILMWRmVeSWpSXmKPExsVy+t/xu7qlb+2TDV4dE7f4cu0Ls8XKb79Z LL59OsPswOzxZ9FmFo++LasYA5ii9GyK8ktLUhUy8otLbJWiDS2M9AwtLfSMTCz1DI3NY62M TJX07WxSUnMyy1KL9O0S9DJ2d29lK5ijVbF/9We2BsaP8l2MnBwSAiYSB67tZu1i5OIQEljK KPFp6TFmiISUxNKlixghbGGJP9e62CCKWpkk5i37BlbEJqAr8fLDIyYQW0TAXOLiultgDcwC 2hLr7n4HauDgEBaIk5i9hh8kzCKgKjHh6z+wVl4BK4kZG86xQczXlJiwZQ4TRFxQ4uTMJywQ cW6JdbMusUKMlJdo3jqbeQIj/ywkZbOQpBYwMq1iFEktLc5Nzy020itOzC0uzUvXS87P3cQI DNttx35u2cG48tVHvUOMTByMhxglOJiVRHh37rRLFuJNSaysSi3Kjy8qzUktPsRoCnTrRGYp 0eR8YOTklcQbmhmYGpqYWRqYWpoZK4nzehZ0JAoJpCeWpGanphakFsH0MXFwSjUwGfBopd5a 2bV9buWnY2730q+slq413lsiOl/6lvGVDywFtXZWFrs2py5UagyKFD7Eet5Rt0mwjKlq6YH/ J5avz57/JfnpoczVu0tW/uTa2NfmHv9NS3Ti83cHdRy7OM+ounn9Ostwrlnyu9m1aX0SOYxL 1uosEvtfGhHWIRfg7HhL/0y96c5jjw3r027PnxexgtvQ7avL4a5PqQ6LhSYwhNuq1BxlVnDg rd3sKVv04Zj6yvP8TVc75hnsb6ooSWozDWoPP54x8fPWowJpeWXFDWxsDA56pT9fTCl9z96l Fsa+ofNK79HUuJm7pnxa9nGNsJ0nk9GUiMKTionHmnY092Y0rc2Y1S0/2ba0o12JpTgj0VCL uag4EQDD+jyc5AIAAA== X-CMS-MailID: 20221007091221eucas1p194ad064eee911019b0af6f339a41660e X-Msg-Generator: CA X-RootMTR: 20221007091221eucas1p194ad064eee911019b0af6f339a41660e X-EPHeader: CA CMS-TYPE: 201P X-CMS-RootMailID: 20221007091221eucas1p194ad064eee911019b0af6f339a41660e References: Subject: [FFmpeg-devel] [PATCH v13 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: YrkV/85dijwy - 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 a14a759c1f..af175d2097 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 615d2bc3b1..e4cc112b90 100644 --- a/libavformat/allformats.c +++ b/libavformat/allformats.c @@ -150,6 +150,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)