From patchwork Mon Jan 2 12:54:01 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Dawid Kozinski/Multimedia \\(PLT\\) /SRPOL/Staff Engineer/Samsung Electronics" X-Patchwork-Id: 39821 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a20:bc95:b0:ad:ade2:bfd2 with SMTP id fx21csp7369516pzb; Mon, 2 Jan 2023 04:54:22 -0800 (PST) X-Google-Smtp-Source: AMrXdXvtkp6UhKehSHKd6TABC1Cx7fF7EEwkI4DACRk303GGf93Mp/dfJDDnBwmsqBO/UaYE8HKG X-Received: by 2002:a05:6402:78e:b0:487:a00e:192f with SMTP id d14-20020a056402078e00b00487a00e192fmr19564954edy.33.1672664062789; Mon, 02 Jan 2023 04:54:22 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1672664062; cv=none; d=google.com; s=arc-20160816; b=B0ArBADVobVpORoM3gLpIgskDbWO7UgtnN39LwHAXM2F7npqtSn1w4YqZvbcZtXEKO p//hOD0sLlSA+HFyGIAXFQGCCAuDQi5osXMtU2nwyCH/RkCVQafQ84imjwtmrdYUiOCZ TVL5JqXRxfQHce9R9eKD1myueX4qR6eaZFd/6viuTtyEEjnuS2sMafJ8MexbcmW6YUjY Q2YlEzPyZ5eenAOx2wkQAfzQPEY+o94T9LaGOYG/+etwAuHEZF7UXUByw8iDoNtPedAK Orh/mgZh50xOe8u2ugqLRkTWgm8NQnaEc0kyqw8MIzWsMNTmqHfVK5tKh6rPW6lZiyGI QgRg== 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=GQdsD3XkyNzeDRTWhe1axlkQWkqaWJeMPPn9yHhnRr4=; b=wVAhXxJGbNWxCr0seJ6D9JMvepdFzQPuqlWvtPtTiwyHf6yPQgi4Z5Agz0UEeyL7+/ D058skPB30ETCdQuo7aWt0E/sa0khSjVmYGQFNIrMkvBttH5eYSS5la9EvYnA9SyRV4i r7HzriCBYaKYLImrM9GFM+XKa+wvvK72JfXggtLYE24edSQI2umQ10ZwjoVr3uVErmjy Z5OVvjIrUkULoiwANShwRHCgPhOIJub38SK4zH8Q8YCSFGC5HVufFUK4y36ueKCeoQa3 9URVtiVsQj/0RA1Q4CjLbXvQ0Ymy4VVJvx5r72isNqqHDA/+woB/sA4PxEpiDRGt9rdn eSqQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@samsung.com header.s=mail20170921 header.b=gq2glnPM; 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 j16-20020a05640211d000b0048afff70577si7919652edw.595.2023.01.02.04.54.22; Mon, 02 Jan 2023 04:54:22 -0800 (PST) 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=gq2glnPM; 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 435B168BC94; Mon, 2 Jan 2023 14:54:20 +0200 (EET) 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 66D3168BC2D for ; Mon, 2 Jan 2023 14:54:14 +0200 (EET) Received: from eucas1p1.samsung.com (unknown [182.198.249.206]) by mailout1.w1.samsung.com (KnoxPortal) with ESMTP id 20230102125413euoutp01203ddc7cd5f22661eb6daee03fb7fd3a~2fxhKY9YP0185901859euoutp01b for ; Mon, 2 Jan 2023 12:54:13 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 mailout1.w1.samsung.com 20230102125413euoutp01203ddc7cd5f22661eb6daee03fb7fd3a~2fxhKY9YP0185901859euoutp01b DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=samsung.com; s=mail20170921; t=1672664053; bh=reW5IXlpxXTu6vLXWAmMsi7swHlZUV5K1fLZoGvdM0M=; h=From:To:Cc:Subject:Date:References:From; b=gq2glnPM46uLxoF16kOPAvuu8ri4pyOmE4KIKftOn9Jx5g0qUqIUF5bZuf6EBKEXX kbMw5oEhVMm5ZmCDedcE8fs91g6JkMjGIbNQsl+gfmH3+t0yVdkA1toJaDc2N3LJjT k0Wy5lLyiwWBWjDvVfhSwsR4GTfj/9nUr5XcCBcQ= Received: from eusmges3new.samsung.com (unknown [203.254.199.245]) by eucas1p2.samsung.com (KnoxPortal) with ESMTP id 20230102125413eucas1p220f042f89a72decaef993da8de8857de~2fxhBwBS-0656806568eucas1p2C; Mon, 2 Jan 2023 12:54:13 +0000 (GMT) Received: from eucas1p1.samsung.com ( [182.198.249.206]) by eusmges3new.samsung.com (EUCPMTA) with SMTP id F8.08.43884.5F3D2B36; Mon, 2 Jan 2023 12:54:13 +0000 (GMT) Received: from eusmtrp2.samsung.com (unknown [182.198.249.139]) by eucas1p2.samsung.com (KnoxPortal) with ESMTPA id 20230102125413eucas1p2726bd4262c5ae86f8c902a5c716f57f6~2fxgwNGr10653806538eucas1p2H; Mon, 2 Jan 2023 12:54:13 +0000 (GMT) Received: from eusmgms1.samsung.com (unknown [182.198.249.179]) by eusmtrp2.samsung.com (KnoxPortal) with ESMTP id 20230102125413eusmtrp2fa34ecdd05eb00aa0a2e6e970d2e6051~2fxgvvyPW2034320343eusmtrp2M; Mon, 2 Jan 2023 12:54:13 +0000 (GMT) X-AuditID: cbfec7f5-271ff7000000ab6c-1a-63b2d3f595f0 Received: from eusmtip2.samsung.com ( [203.254.199.222]) by eusmgms1.samsung.com (EUCPMTA) with SMTP id 3A.D8.23420.5F3D2B36; Mon, 2 Jan 2023 12:54:13 +0000 (GMT) Received: from AMDN5164.EU.corp.samsungelectronics.net (unknown [106.210.132.171]) by eusmtip2.samsung.com (KnoxPortal) with ESMTPA id 20230102125413eusmtip2c8e044984e3ee1e9628fdc5173e2cf0c~2fxgdTOyG3080130801eusmtip2H; Mon, 2 Jan 2023 12:54:13 +0000 (GMT) From: Dawid Kozinski To: d.frankiewic@samsung.com, ffmpeg-devel@ffmpeg.org Date: Mon, 2 Jan 2023 13:54:01 +0100 Message-Id: <20230102125401.450-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+NgFnrFIsWRmVeSWpSXmKPExsWy7djPc7pfL29KNvi9UcPiy7UvzBYrv/1m sfj26QyzA7PHn0WbWTz6tqxiDGCK4rJJSc3JLEst0rdL4Mr4cLC4YL9WRX/LGpYGxj6FLkZO DgkBE4l1vW8YQWwhgRWMEo2TfLsYuYDsL4wST1+cZIVwPjNK3Jy+hhGmo/3GaajEckaJ26ta WSCcdiaJd4enMoFUsQnoSrz88AjMFhEwlTjZvJcNxGYW0JZYd/c7mC0skCDxsmkR2FQWAVWJ zX8egsV5BSwlLs9oZ4bYpikxYcscJoi4oMTJmU9YIOLcEutmXWKFmCkv0bx1NjPIERICX9kl 3m/vYoUocpHYcOQF1NnCEq+Ob2GHsGUk/u+cDzSUA8guljjU7wBh1kgc+pEOUWEt8bbxOCNI mBnohPW79CHCjhLL522GauSTuPFWEOIAPolJ26YzQ4R5JTrahCBMFYm+TjGIRimJp8vmQL3k IbH61B/2CYyKs5B8NQvJJ7MQ1i5gZF7FKJ5aWpybnlpsnJdarlecmFtcmpeul5yfu4kRmBxO /zv+dQfjilcf9Q4xMnEwHmKU4GBWEuG9/HldshBvSmJlVWpRfnxRaU5q8SFGaQ4WJXHeGVvn JwsJpCeWpGanphakFsFkmTg4pRqYulZxdevaTDqjVSa972w1b8a1SZxsJ56UPzA+vSE8bgL/ ZzWPfsliVcfz5V2KVl77mA97xAjNOWfBxMxx/U1QNcPS5TGF/UyzH3Sa5C5/NPHKmqWyDRxM IsEfpjft9U6ytIr43JoUyPzt7YLAFdsq77AukNSO/cPP8Dw6/PXHmHVxJtbHL7Grr/m/bvKp RtHCaVKcS8vD852fRT2Y+P2k+60n18oWcssVdR9UL1VVcHabn6veztxf/fJO4Q7BPw+WXfdo 0mcpjJr8qPhRT9xsrq/PKq491ZAqu5onEil/SE5wg3jR6b45B6R9Et2tlXd/mGK+5Obn46Xl 1tZeKwpVeGdW3zJ9Nis+++2Pd+pKLMUZiYZazEXFiQCmhOzrfQMAAA== X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFrrALMWRmVeSWpSXmKPExsVy+t/xe7pfL29KNpj7RdLiy7UvzBYrv/1m sfj26QyzA7PHn0WbWTz6tqxiDGCK0rMpyi8tSVXIyC8usVWKNrQw0jO0tNAzMrHUMzQ2j7Uy MlXSt7NJSc3JLEst0rdL0Mv4cLC4YL9WRX/LGpYGxj6FLkZODgkBE4n2G6dZQWwhgaWMErfu aUPEpSSWLl3ECGELS/y51sXWxcgFVNPKJHH3TB9YA5uArsTLD4+YQGwRAXOJi+tugTUwC2hL rLv7nQ3EFhaIk5g45w0LiM0ioCqx+c9DsDivgKXE5RntzBALNCUmbJnDBBEXlDg58wkLRJxb Yt2sS6wQM+UlmrfOZp7AyD8LSdksJKkFjEyrGEVSS4tz03OLDfWKE3OLS/PS9ZLzczcxAoN2 27Gfm3cwznv1Ue8QIxMH4yFGCQ5mJRHey5/XJQvxpiRWVqUW5ccXleakFh9iNAW6dSKzlGhy PjBu8kriDc0MTA1NzCwNTC3NjJXEeT0LOhKFBNITS1KzU1MLUotg+pg4OKUamCzPsEYuWKLl Vt5+/unNuimKLGtfcD90b2bIXtaT+KbkU4qDdhhTzs3MMwnnitsrbYPWbXtyzqWpf5FXqUx7 zLlWH/2pHPcOHGaIk2N9ved72PS6XY8+W2+2eVo5MeKIVUB0z64/10r09nO4zefxi75eIeDV /aySxTxT9cjfbP/g+bY8au1qR07bb5/nkt1nNSnherLNiRm2uum6WbkOkcknjx35f1gl8K5F TxHHAzNxocSo91vFlr8JmKcezXJy9VuGD08eWIcn/br7/P5B7dQ6k61Jmx8ck+TkWvJz5of2 63l/e36x8KV5+xhO+r+5/IbDdoEJLGZz/zhMNZ0ocv1w2/YXSo8W9nNWP06qVGIpzkg01GIu Kk4EAO4GG13jAgAA X-CMS-MailID: 20230102125413eucas1p2726bd4262c5ae86f8c902a5c716f57f6 X-Msg-Generator: CA X-RootMTR: 20230102125413eucas1p2726bd4262c5ae86f8c902a5c716f57f6 X-EPHeader: CA CMS-TYPE: 201P X-CMS-RootMailID: 20230102125413eucas1p2726bd4262c5ae86f8c902a5c716f57f6 References: Subject: [FFmpeg-devel] [PATCH v16 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: Zq7UmAVjC27L - 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 aabc9b5f99..a963c0223d 100644 --- a/libavformat/allformats.c +++ b/libavformat/allformats.c @@ -153,6 +153,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..7887f0b591 --- /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_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; ibuf; + 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)