From patchwork Tue Mar 28 13:48:02 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Dawid Kozinski X-Patchwork-Id: 40893 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a20:7a30:b0:df:834d:2c1a with SMTP id t48csp2196783pzh; Tue, 28 Mar 2023 06:48:48 -0700 (PDT) X-Google-Smtp-Source: AKy350aoRP5KNDwInExXL0npsWsGrPzhkd5eQjIdO8Ib1y1mMxfv8HyJicWTjGTxqUXrIuLz9sMD X-Received: by 2002:a17:907:1819:b0:931:dcd4:4ff0 with SMTP id lg25-20020a170907181900b00931dcd44ff0mr19092644ejc.75.1680011328101; Tue, 28 Mar 2023 06:48:48 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1680011328; cv=none; d=google.com; s=arc-20160816; b=wJQvAzZ3G4JsSRjZzbCdV+bSqIaVzGP6VTAePLNSW09KeByIYeOoKxkJx+U+L1NK/7 IiSMDI23MTftOTJTwGSA1ys5foXlcqnCuFMkkRmJC3w7FGmpTdW0clja3nhU3Ob33YeC RhqXzSBYnSbswGv4QKZnlqdrk0z4+06/HZpU+UfgbNTfgPoDK4IMyMoKu2HDeFwIml2Q 4JoXb3pOh/E8d9eYWL8eqN5tx/Sb6OhF8cFg75O4jy9VEGmEMhqzaccDSHuQMLCHAsF3 eHKR5FXiDyi7U8P/6OZphKoXtzhNQl/Cc0IEcUheAMNZBGB7h4ZBpknWezN3XaPI3eFp BKSw== 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=xeKg/8alJXarla+UdJzXP1kphYNhBMsimxRK6BqxPKk=; b=Vxkd3vD/xhr4mdgxZkhfrQcmctQh8he5xgmeDNt7vPy3x7fQk7HprxSIt0Gv1VdKNe oBB1+pDL1BWoYgDqJndP3CHsXWnEpPSmu5Qe2DtceLVA0nzcRtNT8QJ7DzPrJQB3Qew+ npi4gt2lsmrSa0E7ZIP0l47aPtVPYzPjCRFV4kaE1l5zIs46aHw57kKTZMPCdzW3F8bs ASKLnVnGH1X+tV5gp9xBO7sS94b7CpwmgW2G4CTnnD0zP8uFtAwUCyq5qnja7sTqm1jj 4LgE7Dn/TQvlNdKtL8HA7STeK9eD765OnDG0lKJ1pgEt473GxkQvlESWS3+B0CF8kSnQ qp/A== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@samsung.com header.s=mail20170921 header.b=F25ieJQv; 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 x10-20020a1709060eea00b0093dfd2eab9dsi10051805eji.2.2023.03.28.06.48.47; Tue, 28 Mar 2023 06:48:48 -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=F25ieJQv; 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 EBDE068CB5E; Tue, 28 Mar 2023 16:48:45 +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 2699368CAFA for ; Tue, 28 Mar 2023 16:48:40 +0300 (EEST) Received: from eucas1p2.samsung.com (unknown [182.198.249.207]) by mailout1.w1.samsung.com (KnoxPortal) with ESMTP id 20230328134839euoutp01a50a6bd7c844dee7a022ecdb814d66bc~QmWTprQFx3152631526euoutp01n for ; Tue, 28 Mar 2023 13:48:39 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 mailout1.w1.samsung.com 20230328134839euoutp01a50a6bd7c844dee7a022ecdb814d66bc~QmWTprQFx3152631526euoutp01n DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=samsung.com; s=mail20170921; t=1680011319; bh=GIoD4J0tXxCWhDvkGUSECYeMtB83b+2XBjqG22mbxJE=; h=From:To:Cc:Subject:Date:References:From; b=F25ieJQvta8M5yftpNTYCXwUy1GI238wj2A1KvgbkLzEBAW1Qxg+8Tg2YP9hKA+wy c/W73YRxVdk1yLm6CwLYu1OcA9zne5mUSyyt6EviKTvXMiktbOxXHPfCeJD2k4zabH tT4eOOc2AFCXzkFc+u1UzoOc42pJSNxaP0BBr4Ew= Received: from eusmges2new.samsung.com (unknown [203.254.199.244]) by eucas1p2.samsung.com (KnoxPortal) with ESMTP id 20230328134839eucas1p2a3306728e29b1223408473071940f458~QmWTXRzo-0170301703eucas1p28; Tue, 28 Mar 2023 13:48:39 +0000 (GMT) Received: from eucas1p2.samsung.com ( [182.198.249.207]) by eusmges2new.samsung.com (EUCPMTA) with SMTP id 9B.64.09966.730F2246; Tue, 28 Mar 2023 14:48:39 +0100 (BST) Received: from eusmtrp1.samsung.com (unknown [182.198.249.138]) by eucas1p2.samsung.com (KnoxPortal) with ESMTPA id 20230328134839eucas1p248ee444f23e53affdac274cdbac1b7ff~QmWTCHbq61735417354eucas1p2H; Tue, 28 Mar 2023 13:48:39 +0000 (GMT) Received: from eusmgms1.samsung.com (unknown [182.198.249.179]) by eusmtrp1.samsung.com (KnoxPortal) with ESMTP id 20230328134839eusmtrp198416809db044c628c3da403b3c5358e~QmWTBoWel0065100651eusmtrp1K; Tue, 28 Mar 2023 13:48:39 +0000 (GMT) X-AuditID: cbfec7f4-d4fff700000026ee-84-6422f03780a9 Received: from eusmtip2.samsung.com ( [203.254.199.222]) by eusmgms1.samsung.com (EUCPMTA) with SMTP id 65.32.08862.630F2246; Tue, 28 Mar 2023 14:48:38 +0100 (BST) Received: from AMDN5164.EU.corp.samsungelectronics.net (unknown [106.210.132.171]) by eusmtip2.samsung.com (KnoxPortal) with ESMTPA id 20230328134838eusmtip235dfded02d14357f82ed2180ee33b442~QmWSq8K-P2572925729eusmtip2a; Tue, 28 Mar 2023 13:48:38 +0000 (GMT) From: Dawid Kozinski To: d.frankiewic@samsung.com, ffmpeg-devel@ffmpeg.org Date: Tue, 28 Mar 2023 15:48:02 +0200 Message-Id: <20230328134802.1665-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+NgFnrBIsWRmVeSWpSXmKPExsWy7djP87rmH5RSDPZuELL4cu0Ls8XKb79Z LL59OsPswOzxZ9FmFo++LasYA5iiuGxSUnMyy1KL9O0SuDL2zZjGXjBBq2L1ipuMDYw/5LsY OTgkBEwkjpxz72Lk4hASWMEo8WHJKfYuRk4g5wujxKJfSRCJz4wSx6/fAkuANLQcX8EMUbSc UWLyHQ2IonYmiVkbHoMVsQnoSrz88IgJxBYRMJU42byXDcRmFtCWWHf3OxvIZmGBJImPC0VB wiwCqhIbDn0Am8krYCVx+PcrFohdmhITtsxhgogLSpyc+QQqzi2xbtYlVoiR8hLNW2czg9wg IfCTXaL5zw5miCIXia0X17NB2MISr45vgXpARuL05B4WiO+LJQ71O0CYNRKHfqRDVFhLvG08 zggSZgY6Yf0ufYiwo8S3F+uZIar5JG68FYQ4gE9i0rbpUGFeiY42IQhTRaKvUwyiUUri6bI5 UFd5SBxb85JlAqPiLCRfzULyySyEtQsYmVcxiqeWFuempxYb5aWW6xUn5haX5qXrJefnbmIE JobT/45/2cG4/NVHvUOMTByMhxglOJiVRHh/X1NKEeJNSaysSi3Kjy8qzUktPsQozcGiJM6r bXsyWUggPbEkNTs1tSC1CCbLxMEp1cC08HYS05KIOF3unxffm2j8L3u2+e6nqY5ioiELU4yS fm84e1XGfoHf5Zuf5TYJCxiz3qu+5rLnRIhm6vUZT8S+s8+4MEX70bQ3/N9Wz7J4kLLg9/fP SWGs+bHpwn/7txrpd+te01C+lMRpF1l0S/QTz8JmIf2T7MF/NGWjZ/2PCJjG/auT9QLDnBXb dLbs5FAvmyrN0/NTkTm2QGPngYzgozvNpA0+crmvvKnIKrcpalfg3Hl1HOu4qqI+WP468/7j TvaTE+QW/t7lIRsr9EtfR3ItL0/65mdLLRtb9vmy1mwTndntt0BXvapLlmvV5S1/33Ku/RX6 IsBCunH940VdPznkXr2sDN6RvOf7U8dVSizFGYmGWsxFxYkAMRTz33sDAAA= X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFrrELMWRmVeSWpSXmKPExsVy+t/xe7pmH5RSDLrPWFh8ufaF2WLlt98s Ft8+nWF2YPb4s2gzi0ffllWMAUxRejZF+aUlqQoZ+cUltkrRhhZGeoaWFnpGJpZ6hsbmsVZG pkr6djYpqTmZZalF+nYJehn7ZkxjL5igVbF6xU3GBsYf8l2MnBwSAiYSLcdXMHcxcnEICSxl lPj/t4kdIiElsXTpIkYIW1jiz7UuNoiiViaJ6zN2gRWxCehKvPzwiAnEFhEwl7i47hZYA7OA tsS6u9/ZQGxhgQSJxe/Xs4DYLAKqEhsOfWAGsXkFrCQO/37FArFAU2LCljlMEHFBiZMzn0DF uSXWzbrECjFTXqJ562zmCYz8s5CUzUKSWsDItIpRJLW0ODc9t9hQrzgxt7g0L10vOT93EyMw cLcd+7l5B+O8Vx/1DjEycTAeYpTgYFYS4f19TSlFiDclsbIqtSg/vqg0J7X4EKMp0K0TmaVE k/OBsZNXEm9oZmBqaGJmaWBqaWasJM7rWdCRKCSQnliSmp2aWpBaBNPHxMEp1cC02cBg2mVe yysb1jJMsDhjui3l+8V3cklPHM/sED2ZO+lDvkWr1V/eJNcLOsISQbGVk3L3/XnyL077fXBe +39raTXL4OIZa3uL+L4G7F14ZI2GApvJ1pYbXl5bdt67InBl+YpJfp82hT3oVVj9X/ftWdvF MZyvzEv6S69I/crYdDT+8wsel+UdzwomZa1h2Lma5RKjcXeD3BpthQfXr+U8s+Pm5vJ1CVnA nKwc+E5mS8TJrybpM5v3m6Ub7+neLn099PdRnWmT/ncq9G/J2shi9X6LWnH6lZfFB3ukpt82 Z0x/zvf3iPQckwTJjX0eDtmirzYd91v5vctQztsveFXeqrIPzx2bU27xvph1a7+rEktxRqKh FnNRcSIA0upW/eUCAAA= X-CMS-MailID: 20230328134839eucas1p248ee444f23e53affdac274cdbac1b7ff X-Msg-Generator: CA X-RootMTR: 20230328134839eucas1p248ee444f23e53affdac274cdbac1b7ff X-EPHeader: CA CMS-TYPE: 201P X-CMS-RootMailID: 20230328134839eucas1p248ee444f23e53affdac274cdbac1b7ff References: Subject: [FFmpeg-devel] [PATCH v18 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 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: NPpzL32jE9Jp - 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 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)