From patchwork Mon Aug 1 09:29:01 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Dawid Kozinski X-Patchwork-Id: 37060 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a21:1649:b0:8b:613a:194d with SMTP id no9csp2384673pzb; Mon, 1 Aug 2022 02:29:26 -0700 (PDT) X-Google-Smtp-Source: AGRyM1savxfYTKUyv7n5SDnlJrwXTvv14iBymfuPWblrWBGri0wRR+qbxda6q9zuzPaUV5PepvtO X-Received: by 2002:a17:906:2ed7:b0:72f:d080:411 with SMTP id s23-20020a1709062ed700b0072fd0800411mr11801553eji.203.1659346166465; Mon, 01 Aug 2022 02:29:26 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1659346166; cv=none; d=google.com; s=arc-20160816; b=NS5xKqFD8+4A5bqHhhFzEoJ+hIJrHVlFxr4ODWeFvsbCojgrhHkM0hghv392W8sGYk GReatl+Ak2qxLKKd41x8AaHMvktlkPnINrH3tCKvS36pZNn3mcE+5PGYUnE8yg5dXpTo 1klnap/7HOBuXbVYN/csa3YNbVVIj9aEXiuvjEQLwVxdfO/110Lr7PX48u60RZDFRInk hvqYr7VVUudpkDuu6nfZCow+JckPhuDvQWi/aEukjNS9PEzjmClBIzh8zeRI6UD96zHx Hm13byjpElYrlKg7aKy60MNmwsDRb4G2WyYlKoFo82vpHqPl9weFaID+KhnWLFNKMpAK VKwQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:reply-to:list-subscribe :list-help:list-post:list-archive:list-unsubscribe:list-id :precedence:subject:references:cms-type:content-language :thread-index:mime-version:message-id:date:to:from:dkim-signature :dkim-filter:delivered-to; bh=yRCWNyHNgCa9Axi1KZhyRyKc6OJHFVOiEYR4mGJlFaQ=; b=boBQ6foFl3ojNQ04AX/HtTgDfRevW4iTKEcBEHKUA4hE1O5oVgHEHCFKY7fzTaoT/m 4gMiLtmBtg5eBkbz3xaXsUUAe2O0atgJX7LiY1AOFqhifpw1mdsN6IFtH1DvvZvWNCqb lVfA0HuCg2ZkUdusTq2jNqGTrCGcI0+JsQ7k7JCmYcj6QlcHsly9/A3LsbFs+NRo4PAn A/VoNG2N8wyOMkWyfe6bpwuuZgRfeULJxqhQ//UoH3jNxEPBnmPp9JzJvV4EXSdDp5nn ii9QBcroOzc0fhIARxFhXEbQ8mZTSEDb3VKQR5EMhHVl0KRTtVU4ki+l1lgCBbM2QJRh BrcQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@samsung.com header.s=mail20170921 header.b=B1GNwExo; 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 b12-20020aa7c90c000000b0043a90a31070si8495494edt.284.2022.08.01.02.29.26; Mon, 01 Aug 2022 02:29:26 -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=B1GNwExo; 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 D455068BAB9; Mon, 1 Aug 2022 12:29:10 +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 61A6068BAA2 for ; Mon, 1 Aug 2022 12:29:04 +0300 (EEST) Received: from eucas1p2.samsung.com (unknown [182.198.249.207]) by mailout1.w1.samsung.com (KnoxPortal) with ESMTP id 20220801092903euoutp018dc068a9600f709201fd9ffb23a1758d~HLoaL6G7o2257422574euoutp01h for ; Mon, 1 Aug 2022 09:29:03 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 mailout1.w1.samsung.com 20220801092903euoutp018dc068a9600f709201fd9ffb23a1758d~HLoaL6G7o2257422574euoutp01h DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=samsung.com; s=mail20170921; t=1659346143; bh=ZOMhDjaEbVNkJjMOtHcLvE1c28ILaAg8MZOlTyWgh/k=; h=From:To:Subject:Date:References:From; b=B1GNwExoN+qkKd4LT6ASvtEfRIGTcUJtQLXfMIbJov/CBqKL4kf5jWnLOB9W1VAZ7 aRYRkQ7GuM/rpuy122XIKtjqdTR/qT1WjlhA4Rk7OzJG7q9cFYPWi+8kig4OuUdPIN ojZdbjoSPC3cuUoBuR/7Mzfl0j06Cl71/TswnCaQ= Received: from eusmges2new.samsung.com (unknown [203.254.199.244]) by eucas1p2.samsung.com (KnoxPortal) with ESMTP id 20220801092902eucas1p274f672f45fb4a69b8e7ac479dec9163e~HLoZoeV8R2174021740eucas1p2l for ; Mon, 1 Aug 2022 09:29:02 +0000 (GMT) Received: from eucas1p2.samsung.com ( [182.198.249.207]) by eusmges2new.samsung.com (EUCPMTA) with SMTP id 80.A0.10067.EDC97E26; Mon, 1 Aug 2022 10:29:02 +0100 (BST) Received: from eusmtrp1.samsung.com (unknown [182.198.249.138]) by eucas1p1.samsung.com (KnoxPortal) with ESMTPA id 20220801092901eucas1p1f8d764e6269c88872566d616b74a6b99~HLoY3JPoN1386713867eucas1p1V for ; Mon, 1 Aug 2022 09:29:01 +0000 (GMT) Received: from eusmgms1.samsung.com (unknown [182.198.249.179]) by eusmtrp1.samsung.com (KnoxPortal) with ESMTP id 20220801092901eusmtrp18fb54a0c4a438e9b7b4d11dc28eb824b~HLoY2Pugo0157501575eusmtrp18 for ; Mon, 1 Aug 2022 09:29:01 +0000 (GMT) X-AuditID: cbfec7f4-dc1ff70000002753-52-62e79cde57fe Received: from eusmtip2.samsung.com ( [203.254.199.222]) by eusmgms1.samsung.com (EUCPMTA) with SMTP id 9E.28.09095.DDC97E26; Mon, 1 Aug 2022 10:29:01 +0100 (BST) Received: from AMDN3260 (unknown [106.210.132.171]) by eusmtip2.samsung.com (KnoxPortal) with ESMTPA id 20220801092901eusmtip25275583155407f225fd8aa62a15c1638~HLoYhzqih2595925959eusmtip2E for ; Mon, 1 Aug 2022 09:29:01 +0000 (GMT) From: "Dawid Kozinski" To: Date: Mon, 1 Aug 2022 11:29:01 +0200 Message-ID: <002001d8a589$2272a170$6757e450$@samsung.com> MIME-Version: 1.0 X-Mailer: Microsoft Outlook 16.0 Thread-Index: Adilhy2AwS27z/RzS4OhJlBU+aCB7Q== Content-Language: pl X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFnrGIsWRmVeSWpSXmKPExsWy7djP87r35jxPMnjVJ2Xx7dMZZgdGjz+L NrMEMEZx2aSk5mSWpRbp2yVwZfz8+pmt4HRixc+W9SwNjIs8uxg5OSQETCQmbN3CBmILCaxg lPh3rw7CnsQksf1vRRcjF5A9kUlizbfjjDANa+41MkMkljNK/Fl/GsppY5LYPfEZO0gVm4C+ xMxFn8DGigjISqz+NwXMFhYIlZj8+CeYzSKgIjFp332wel4BS4lJ3XdYIWxBiZMzn7CA2MwC 8hLb385hhtisIPHz6TJWiJl6Ers33maCqBGRuPGohRHkCAmBn+wShzc8YYVocJE4NmsZVLOw xKvjW9ghbBmJ05N7gBZwANnFEof6HSDMGolDP9IhKqwl3jaCPMwBNF5TYv0ufYgKR4mtZ7Qg TD6JG28FIfbzSUzaNp0ZIswr0dEmBGGqSPR1ikGMk5J4ugzmCw+Jratfs01gVJyF5NlZSJ6d heSpWQgXLGBkWcUonlpanJueWmyUl1quV5yYW1yal66XnJ+7iRGYFE7/O/5lB+PyVx/1DjEy cTAeYpTgYFYS4b3j8jxJiDclsbIqtSg/vqg0J7X4EKM0B4uSOG9y5oZEIYH0xJLU7NTUgtQi mCwTB6dUA1NIg/bnR8z3ehM/n967fc2G+VGnhI6muZ1VUjXR510Q+dzHwmr3g9mJhrHNClWy NpVV5+O4pj1e+19n7Rmpr74W5/d8PX3jx+xfvJsV9z09H8rgPVMn7oHC81vNdklMi9LV4tTe qySIVbLEX3jfFXuiOPfvpIris/sdK/yfSXzujRHr4Fu88RWj880Nc08aZy/NcggK/bcjgnfz Efc8octlrxJk4x8pdvxP5zc9dLyBxZCn9V8c0+ZgE/X95949medRrXvP0rbozzk2wUtXFM/U djd88kqfrN7NGmGb/v6+f97VrcFtATL/w/inPj4ws3LXG7vwgNiGF/Lrb9oI8Aj2eObnyOma R5XtWaf6X4mlOCPRUIu5qDgRAEwzgm15AwAA X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFnrGLMWRmVeSWpSXmKPExsVy+t/xe7p35zxPMjjSpm7x7dMZZgdGjz+L NrMEMEbp2RTll5akKmTkF5fYKkUbWhjpGVpa6BmZWOoZGpvHWhmZKunb2aSk5mSWpRbp2yXo Zfz8+pmt4HRixc+W9SwNjIs8uxg5OSQETCTW3GtkBrGFBJYySuy+VgQRl5JYunQRI4QtLPHn WhdbFyMXUE0Lk8SeP/dYQBJsAvoSMxd9YgOxRQRkJVb/mwJmCwsESzw+8wWsmUVARWLSvvvs IDavgKXEpO47rBC2oMTJmU/A5jALaEv0PmxlhLDlJba/ncMMsVhB4ufTZawQ8/Ukdm+8zQRR IyJx41EL4wRGgVlIRs1CMmoWklGzkLQsYGRZxSiSWlqcm55bbKhXnJhbXJqXrpecn7uJERjg 24793LyDcd6rj3qHGJk4GA8xSnAwK4nw3nF5niTEm5JYWZValB9fVJqTWnyI0RTot4nMUqLJ +cAYyyuJNzQzMDU0MbM0MLU0M1YS5/Us6EgUEkhPLEnNTk0tSC2C6WPi4JRqYJrC+G3+tXw+ kbo31xi7EhhsVmyZrXTrbx+r4QtPqwWKbkbTN5nYlyn8mL++SeOE+K8oM1nhU6ZHuhkf2rlU rpqR81/3w6Md1xU/d4q6bLOIWWjsOPH5RPWjz2V3/Hy+sd3i0MHNEnsfbjc2b5h78tS9m799 5jG5r5/UXBcwb7X4ps+2v9POnuxrupQlN2Pyhk36KfXLctx1k9VeqkrNt+SeosAufi5ZRF08 o2nHIbkKb61sv+17cyP3hivt4p/zq/mjePBKh4+hC2z8Pn5Rnhg8wUM3/cbSwGUuZg++vhIO Orh2ec7FBSIrlN52yNr0X5z+b+c33a2ZvPtLZNWOH76Vv/HkbqlnT5bpfJ/D9W6GEktxRqKh FnNRcSIAyEyq4vkCAAA= X-CMS-MailID: 20220801092901eucas1p1f8d764e6269c88872566d616b74a6b99 X-Msg-Generator: CA X-RootMTR: 20220801092901eucas1p1f8d764e6269c88872566d616b74a6b99 X-EPHeader: CA CMS-TYPE: 201P X-CMS-RootMailID: 20220801092901eucas1p1f8d764e6269c88872566d616b74a6b99 References: Subject: [FFmpeg-devel] [PATCH 2/2] Provided support for MPEG-5 EVC (Essential Video Coding) codec 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 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: LR2MU44WAu3Z - Added muxer for EVC format (MP4, raw) - Added demuxer for EVC format (MP4) - Added evc extension to the list of extensions for ff_mov_demuxer Signed-off-by: Dawid Kozinski --- doc/muxers.texi | 6 ++ libavformat/Makefile | 2 + libavformat/allformats.c | 2 + libavformat/evcdec.c | 142 +++++++++++++++++++++++++++++++++++++++ libavformat/isom_tags.c | 2 + libavformat/mov.c | 2 +- libavformat/movenc.c | 29 +++++++- libavformat/rawenc.c | 13 ++++ 8 files changed, 196 insertions(+), 2 deletions(-) create mode 100644 libavformat/evcdec.c diff --git a/doc/muxers.texi b/doc/muxers.texi index b2f4326aae..08ab20c09e 100644 --- a/doc/muxers.texi +++ b/doc/muxers.texi @@ -2124,6 +2124,12 @@ DTS Coherent Acoustics (DCA) audio. Dolby Digital Plus, also known as Enhanced AC-3, audio. +@subsection evc + +MPEG-5 Essential Video Coding (EVC) / EVC / MPEG-5 Part 1 EVC video. + +Extensions: evc + @subsection g722 ITU-T G.722 audio. diff --git a/libavformat/Makefile b/libavformat/Makefile index e420384355..8d01c89731 100644 --- a/libavformat/Makefile +++ b/libavformat/Makefile @@ -249,6 +249,8 @@ 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 OBJS-$(CONFIG_HNM_DEMUXER) += hnm.o diff --git a/libavformat/allformats.c b/libavformat/allformats.c index ae4479fb7a..dfce49d149 100644 --- a/libavformat/allformats.c +++ b/libavformat/allformats.c @@ -148,6 +148,8 @@ 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; extern const AVOutputFormat ff_ffmetadata_muxer; diff --git a/libavformat/evcdec.c b/libavformat/evcdec.c new file mode 100644 index 0000000000..58dc671d24 --- /dev/null +++ b/libavformat/evcdec.c @@ -0,0 +1,142 @@ +/* + * 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 "rawdec.h" +#include "avformat.h" + +// The length field that indicates the length in bytes of the following NAL unit is configured to be of 4 bytes +#define EVC_NAL_UNIT_LENGTH_BYTE (4) /* byte */ + +#define EVC_NAL_HEADER_SIZE (2) /* byte */ +#define MAX_SPS_CNT (16) /* defined value in EVC standard */ + +// NALU types +// @see ISO_IEC_23094-1_2020 7.4.2.2 NAL unit header semantics +// +#define EVC_NUT_NONIDR (0) /* Coded slice of a non-IDR picture */ +#define EVC_NUT_IDR (1) /* Coded slice of an IDR picture */ +#define EVC_NUT_SPS (24) /* Sequence parameter set */ +#define EVC_NUT_PPS (25) /* Picture paremeter set */ +#define EVC_NUT_APS (26) /* Adaptation parameter set */ +#define EVC_NUT_FD (27) /* Filler data */ +#define EVC_NUT_SEI (28) /* Supplemental enhancement information */ + +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) { + av_log(NULL, AV_LOG_ERROR, "Cannot get bitstream information. Malformed bitstream.\n"); + 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_NUT_SPS) + ev->got_sps++; + else if (nalu_type == EVC_NUT_PPS) + ev->got_pps++; + else if (nalu_type == EVC_NUT_IDR ) + ev->got_idr++; + else if (nalu_type == EVC_NUT_NONIDR) + 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) diff --git a/libavformat/isom_tags.c b/libavformat/isom_tags.c index c5fd7987f6..cd7ec7903a 100644 --- a/libavformat/isom_tags.c +++ b/libavformat/isom_tags.c @@ -147,6 +147,8 @@ const AVCodecTag ff_codec_movvideo_tags[] = { { AV_CODEC_ID_H264, MKTAG('d', 'v', 'a', '1') }, /* AVC-based Dolby Vision derived from avc1 */ { AV_CODEC_ID_H264, MKTAG('d', 'v', 'a', 'v') }, /* AVC-based Dolby Vision derived from avc3 */ + { AV_CODEC_ID_EVC, MKTAG('e', 'v', 'c', '1') }, /* EVC/MPEG-5 */ + { AV_CODEC_ID_VP8, MKTAG('v', 'p', '0', '8') }, /* VP8 */ { AV_CODEC_ID_VP9, MKTAG('v', 'p', '0', '9') }, /* VP9 */ { AV_CODEC_ID_AV1, MKTAG('a', 'v', '0', '1') }, /* AV1 */ diff --git a/libavformat/mov.c b/libavformat/mov.c index a09a762d91..5effe45289 100644 --- a/libavformat/mov.c +++ b/libavformat/mov.c @@ -9061,7 +9061,7 @@ const AVInputFormat ff_mov_demuxer = { .long_name = NULL_IF_CONFIG_SMALL("QuickTime / MOV"), .priv_class = &mov_class, .priv_data_size = sizeof(MOVContext), - .extensions = "mov,mp4,m4a,3gp,3g2,mj2,psp,m4b,ism,ismv,isma,f4v,avif", + .extensions = "mov,mp4,m4a,3gp,3g2,mj2,psp,m4b,ism,ismv,isma,f4v,avif,evc", .flags_internal = FF_FMT_INIT_CLEANUP, .read_probe = mov_probe, .read_header = mov_read_header, diff --git a/libavformat/movenc.c b/libavformat/movenc.c index 5608afde42..d0b094c30d 100644 --- a/libavformat/movenc.c +++ b/libavformat/movenc.c @@ -1392,6 +1392,16 @@ static int mov_write_hvcc_tag(AVIOContext *pb, MOVTrack *track) return update_size(pb, pos); } +static int mov_write_evcc_tag(AVIOContext *pb, MOVTrack *track) +{ + int64_t pos = avio_tell(pb); + + avio_wb32(pb, 0); + ffio_wfourcc(pb, "evcC"); + + return update_size(pb, pos); +} + /* also used by all avid codecs (dv, imx, meridien) and their variants */ static int mov_write_avid_tag(AVIOContext *pb, MOVTrack *track) { @@ -1641,6 +1651,16 @@ static int mov_get_h264_codec_tag(AVFormatContext *s, MOVTrack *track) return tag; } +static int mov_get_evc_codec_tag(AVFormatContext *s, MOVTrack *track) +{ + int tag = track->par->codec_tag; + + if (!tag) + tag = MKTAG('e', 'v', 'c', 'i'); + + return tag; +} + static const struct { enum AVPixelFormat pix_fmt; uint32_t tag; @@ -1722,6 +1742,8 @@ static unsigned int mov_get_codec_tag(AVFormatContext *s, MOVTrack *track) tag = mov_get_mpeg2_xdcam_codec_tag(s, track); else if (track->par->codec_id == AV_CODEC_ID_H264) tag = mov_get_h264_codec_tag(s, track); + else if (track->par->codec_id == AV_CODEC_ID_EVC) + tag = mov_get_evc_codec_tag(s, track); else if (track->par->codec_id == AV_CODEC_ID_DNXHD) tag = mov_get_dnxhd_codec_tag(s, track); else if (track->par->codec_type == AVMEDIA_TYPE_VIDEO) { @@ -2280,6 +2302,9 @@ static int mov_write_video_tag(AVFormatContext *s, AVIOContext *pb, MOVMuxContex mov_write_avcc_tag(pb, track); if (track->mode == MODE_IPOD) mov_write_uuid_tag_ipod(pb); + } + else if (track->par->codec_id ==AV_CODEC_ID_EVC) { + mov_write_evcc_tag(pb, track); } else if (track->par->codec_id == AV_CODEC_ID_VP9) { mov_write_vpcc_tag(mov->fc, pb, track); } else if (track->par->codec_id == AV_CODEC_ID_AV1) { @@ -6030,7 +6055,8 @@ int ff_mov_write_packet(AVFormatContext *s, AVPacket *pkt) if ((par->codec_id == AV_CODEC_ID_DNXHD || par->codec_id == AV_CODEC_ID_H264 || par->codec_id == AV_CODEC_ID_HEVC || - par->codec_id == AV_CODEC_ID_TRUEHD) && !trk->vos_len && + par->codec_id == AV_CODEC_ID_TRUEHD || + par->codec_id == AV_CODEC_ID_EVC) && !trk->vos_len && !TAG_IS_AVCI(trk->tag)) { /* copy frame to create needed atoms */ trk->vos_len = size; @@ -7689,6 +7715,7 @@ static const AVCodecTag codec_mp4_tags[] = { { AV_CODEC_ID_H264, MKTAG('a', 'v', 'c', '3') }, { AV_CODEC_ID_HEVC, MKTAG('h', 'e', 'v', '1') }, { AV_CODEC_ID_HEVC, MKTAG('h', 'v', 'c', '1') }, + { AV_CODEC_ID_EVC, MKTAG('e', 'v', 'c', '1') }, { AV_CODEC_ID_MPEG2VIDEO, MKTAG('m', 'p', '4', 'v') }, { AV_CODEC_ID_MPEG1VIDEO, MKTAG('m', 'p', '4', 'v') }, { AV_CODEC_ID_MJPEG, MKTAG('m', 'p', '4', 'v') }, diff --git a/libavformat/rawenc.c b/libavformat/rawenc.c index 26099cb1c1..48dedfa375 100644 --- a/libavformat/rawenc.c +++ b/libavformat/rawenc.c @@ -401,6 +401,19 @@ const AVOutputFormat ff_hevc_muxer = { }; #endif +#if CONFIG_EVC_MUXER +AVOutputFormat ff_evc_muxer = { + .name = "evc", + .long_name = NULL_IF_CONFIG_SMALL("raw EVC video"), + .extensions = "evc", + .audio_codec = AV_CODEC_ID_NONE, + .video_codec = AV_CODEC_ID_EVC, + .write_header = force_one_stream, + .write_packet = ff_raw_write_packet, + .flags = AVFMT_NOTIMESTAMPS, +}; +#endif + #if CONFIG_M4V_MUXER const AVOutputFormat ff_m4v_muxer = { .name = "m4v",