From patchwork Wed Apr 20 09:54:27 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Dawid Kozinski X-Patchwork-Id: 35357 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a20:3b9e:b0:7d:cfb5:dc7c with SMTP id b30csp780971pzh; Wed, 20 Apr 2022 02:54:51 -0700 (PDT) X-Google-Smtp-Source: ABdhPJxbyhz2F6BekDZXrzAlJvNSizEPRb/qlZO/7fXaFL3Ap8HXIfm4cBjc9hsleMvVgFo+ow77 X-Received: by 2002:aa7:c4da:0:b0:41d:5866:4dfb with SMTP id p26-20020aa7c4da000000b0041d58664dfbmr22518188edr.117.1650448491122; Wed, 20 Apr 2022 02:54:51 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1650448491; cv=none; d=google.com; s=arc-20160816; b=BrQMQYuO/3LkJMSd5whGdu0LmyUWX8YggYNEL/lOHMp4s4Lo+V+1mg8M9DVvgTUCoU wcjiaAMuBo/k/c+/5e916y/8vYEVKN8AoD+mt3qGWSpHbM+BgZKjGJGa+YIxsLzT/ico GvLm7pmscEtZZFTHxZ6DP0ONtwosxAMfmJ1eoe53d8BVEa9Ssou7xAt7XQPgSJqRDHaT T8z0PvVtjsl9frFluBFBwVxVY1mUaf3gZzOyHRT3WbLJkzJ8NSVWE6dYFERyAKBcEhcM uJobCMuHHcRHa7OPNR1KP0BLRYomYTl6JPINFsGHUWiEc89YDGG+3T1t4+sAYLiw/9sW yDXA== 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=OkPpISVeNPoh/MgkYnX2sLPqzjduNpyuAWkVVtE8e1M=; b=iWTQhETfWalFKu/Ibx1CDxZFdgF1uc98eXOFqovCJlfPCdAKUreYpqNXM/6hGa6l3Y zX2I6WsK/Sf941w3GZZdfuUshUB37pXAKtGiNALESRFpHV2y5e2mfcpg8VjDl4vMR1I2 cbrvyLQ/jaRHfHthRHoaAIKUR7Fcz8asYR3m9ZcDJGJZTdck84/DHQt2ocbqs9spAAZc STL7f2UOoWrunXMHrXacRwFmb7Xr9JKkif1W1GxaIg3n7MTBnnItE0EoeOhIdqcQn+pw nlCR6T2EjRfiEJYW7FERaxthLzLKb0Zy/7NpZHQWUkYikGqCclVTc8Hz0NmDgBf+k+B3 zWnw== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@samsung.com header.s=mail20170921 header.b=jcZRSklq; 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 t19-20020aa7db13000000b00423d46f5981si1004446eds.293.2022.04.20.02.54.50; Wed, 20 Apr 2022 02:54:51 -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=jcZRSklq; 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 4D03E68B3ED; Wed, 20 Apr 2022 12:54:35 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mailout2.w1.samsung.com (mailout2.w1.samsung.com [210.118.77.12]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 5E45B68B3CA for ; Wed, 20 Apr 2022 12:54:29 +0300 (EEST) Received: from eucas1p2.samsung.com (unknown [182.198.249.207]) by mailout2.w1.samsung.com (KnoxPortal) with ESMTP id 20220420095428euoutp02dd3853eac191986c39a6dcec74ac618d~nkiNVDgXe0426204262euoutp028 for ; Wed, 20 Apr 2022 09:54:28 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 mailout2.w1.samsung.com 20220420095428euoutp02dd3853eac191986c39a6dcec74ac618d~nkiNVDgXe0426204262euoutp028 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=samsung.com; s=mail20170921; t=1650448468; bh=qc+p4v3tzOL7v5UhVYeaokBs+inFAX1dktaesBqUHy0=; h=From:To:Subject:Date:References:From; b=jcZRSklq0dM6qgazLMmgeRm50/1ojGdlbo4PYHtp8swDcJ6OOTwrRTCMhkFN+s36k Eq+gTv6EdwGBuwAlquXND5rlsyXk5FEWA2qRWbwE/+DF6MGX6QC2ibwhg6FLTAnTLs DToTeG0SwhSoMFNfxPEjegYP7A3gkZU1W781eWJg= Received: from eusmges1new.samsung.com (unknown [203.254.199.242]) by eucas1p2.samsung.com (KnoxPortal) with ESMTP id 20220420095428eucas1p2bcb3e6ac82240195c4ec9903e1d62b5f~nkiNLQm502365223652eucas1p2Q for ; Wed, 20 Apr 2022 09:54:28 +0000 (GMT) Received: from eucas1p2.samsung.com ( [182.198.249.207]) by eusmges1new.samsung.com (EUCPMTA) with SMTP id BD.37.10009.458DF526; Wed, 20 Apr 2022 10:54:28 +0100 (BST) Received: from eusmtrp1.samsung.com (unknown [182.198.249.138]) by eucas1p1.samsung.com (KnoxPortal) with ESMTPA id 20220420095428eucas1p10af334bf2cfab73dd91e5c29037b225c~nkiMwXcmj1105311053eucas1p17 for ; Wed, 20 Apr 2022 09:54:28 +0000 (GMT) Received: from eusmgms1.samsung.com (unknown [182.198.249.179]) by eusmtrp1.samsung.com (KnoxPortal) with ESMTP id 20220420095428eusmtrp1474f9567fa3edc02ed3552d111241b51~nkiMsqYFb3040230402eusmtrp1K for ; Wed, 20 Apr 2022 09:54:28 +0000 (GMT) X-AuditID: cbfec7f2-e7fff70000002719-15-625fd8548a88 Received: from eusmtip1.samsung.com ( [203.254.199.221]) by eusmgms1.samsung.com (EUCPMTA) with SMTP id 23.CF.09522.458DF526; Wed, 20 Apr 2022 10:54:28 +0100 (BST) Received: from AMDN3260 (unknown [106.210.132.171]) by eusmtip1.samsung.com (KnoxPortal) with ESMTPA id 20220420095427eusmtip15efdde708cfd943577dad5473e351773~nkiMbYiMg0922209222eusmtip1w for ; Wed, 20 Apr 2022 09:54:27 +0000 (GMT) From: "Dawid Kozinski" To: Date: Wed, 20 Apr 2022 11:54:27 +0200 Message-ID: <004c01d8549c$9fcd68a0$df6839e0$@samsung.com> MIME-Version: 1.0 X-Mailer: Microsoft Outlook 16.0 Thread-Index: AdhUmlLnifeQvw+JTFyha8ncXeBN9A== Content-Language: pl X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFnrBIsWRmVeSWpSXmKPExsWy7djP87ohN+KTDF7c0LL49ukMswOjx59F m1kCGKO4bFJSczLLUov07RK4Mh6f38ZW8CSqYs21BpYGxn8uXYwcHBICJhLtN6q7GLk4hARW MEo8P32DGcKZxCTx7skHVghnIpNE+/pV7F2MnGAdX5r3MkIkljNKLGqeCtXSxiTxYWEvE0gV m4C+xMxFn9hAbBEBWYnV/6awgewTFgiV2LSNHyTMIqAqsXPLZUYQm1fAUmLGk/nMELagxMmZ T1hAbGYBI4klq+czQdjyEtvfzmGGOEJB4ufTZawQ4/UkVl08AVUvInHjUQsjRM1HdonbN2sh bBeJmz3dUA8IS7w6vgXKlpE4PbmHBRIUxRKH+h0gzBqJQz/SISqsJd42Hoea6Cix6/RtJogS PokbbwUhlvJJTNo2nRkizCvR0SYEYapI9HWKQTRKSTxdBnO6h8Tmy6vZJjAqzkLy7Swk385C 8u0sJF8tYGRZxSieWlqcm55abJiXWq5XnJhbXJqXrpecn7uJEZgYTv87/mkH49xXH/UOMTJx MB5ilOBgVhLhDZ0ZnyTEm5JYWZValB9fVJqTWnyIUZqDRUmcNzlzQ6KQQHpiSWp2ampBahFM lomDU6qBqZZLQNxGJvukWfXS3dPzTgk1tPHHTzXf6x3KvpDNoemD6orM1KXfeZObD8QwnGT+ X3dR++E6prLVNxS1zwgvMpNRllgW/SpgwXrTU/raMc9zNrkYLHV4/t06tdRjjskD8UnBe47t +itse2GThFJJ/q6qqSt3ny+dIn760pfktKc3LLeo+My4+XfupnLfIybtSwpvpKaxvj0RGFGx gzV7+9lJm4IOrLW/WlNscOjH9GOXBK075J97Wb/zEuVyqP4pfX0TU0f/vOp3SV15C2Imq0wR OHjbLOSb+mfu0CMhKw1s79vPLt/fnGsY8MDL7st+iwxHmdv2S2vtDuzJ+N54s6U7tujP9aQH JotKFQOjlViKMxINtZiLihMBRy7nMHsDAAA= X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFnrOLMWRmVeSWpSXmKPExsVy+t/xu7ohN+KTDI68ZrP49ukMswOjx59F m1kCGKP0bIryS0tSFTLyi0tslaINLYz0DC0t9IxMLPUMjc1jrYxMlfTtbFJSczLLUov07RL0 Mh6f38ZW8CSqYs21BpYGxn8uXYycHBICJhJfmvcydjFycQgJLGWUmHhoGytEQkpi6dJFjBC2 sMSfa11sEEUtTBJvr01jBkmwCehLzFz0iQ3EFhGQlVj9bwqYLSwQLPFq2z4WEJtFQFVi55bL YIN4BSwlZjyZzwxhC0qcnPkErIYZ6IrGw91QtrzE9rdzmCEWK0j8fLqMFWK+nsSqiyegakQk bjxqYZzAKDALyahZSEbNQjJqFpKWBYwsqxhFUkuLc9Nziw31ihNzi0vz0vWS83M3MQJDfNux n5t3MM579VHvECMTB+MhRgkOZiUR3tCZ8UlCvCmJlVWpRfnxRaU5qcWHGE2BfpvILCWanA+M srySeEMzA1NDEzNLA1NLM2MlcV7Pgo5EIYH0xJLU7NTUgtQimD4mDk6pBqYDWvqB37ZF+v5z 39Z+a+od9Sl/nynuTUpzCrjYwHDqS5bo967kaZpLnW8+a19hHa136N/MLdek4u8dsk7dfKHl +x6rF+cFulg5Jzled3v5c9aXjzYZXbl/fytcn5Z9sfWKja3Iykl/2hlVmr1nTQztW+mdVar9 s7utcAdDtF9CVKW2Zp2SXPke25qPLY8eLK0U8MyrbFwV63Ds6vakjeE6ZRJ3pmY6hIknzwjK Fuk24pnYGNCzv074T1lWWpnygl9ff7Kf9X1ldND5eqvNnR03xALsZ2treykcWNihYrvMMUjJ siRVMH/Dyurs95x9nI9Xz3RZdclbxYGtX3hdy4fTsjw1WXKmzKcn/rKaqcRSnJFoqMVcVJwI AGq+O2z6AgAA X-CMS-MailID: 20220420095428eucas1p10af334bf2cfab73dd91e5c29037b225c X-Msg-Generator: CA X-RootMTR: 20220420095428eucas1p10af334bf2cfab73dd91e5c29037b225c X-EPHeader: CA CMS-TYPE: 201P X-CMS-RootMailID: 20220420095428eucas1p10af334bf2cfab73dd91e5c29037b225c References: Subject: [FFmpeg-devel] [PATCH 3/3] 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: n5kPHJ6stJDP - 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 | 127 +++++++++++++++++++++++++++++++++++++++ libavformat/isom_tags.c | 2 + libavformat/mov.c | 2 +- libavformat/movenc.c | 28 +++++++++ libavformat/rawenc.c | 13 ++++ 8 files changed, 181 insertions(+), 1 deletion(-) create mode 100644 libavformat/evcdec.c diff --git a/doc/muxers.texi b/doc/muxers.texi index 1ea98a69a3..198cb90fe9 100644 --- a/doc/muxers.texi +++ b/doc/muxers.texi @@ -2097,6 +2097,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 84e73e3c63..db461e79b7 100644 --- a/libavformat/Makefile +++ b/libavformat/Makefile @@ -241,6 +241,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 d066a7745b..1148024e71 100644 --- a/libavformat/allformats.c +++ b/libavformat/allformats.c @@ -145,6 +145,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..21f3f0f0e4 --- /dev/null +++ b/libavformat/evcdec.c @@ -0,0 +1,127 @@ +/* + * 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 + +#include "libavcodec/get_bits.h" +#include "libavcodec/golomb.h" +#include "libavcodec/internal.h" + +#include "rawdec.h" +#include "avformat.h" + +#define EVC_NAL_HEADER_SIZE 2 /* byte */ + +typedef struct EVCParserContext { + int got_sps; + int got_pps; + int got_idr; + int got_nonidr; +} EVCParserContext; + +static int get_nalu_type(const uint8_t *bs, int bs_size) +{ + int nal_unit_type_plus1 = 0; + XEVD_INFO info; + int ret; + + if(bs_size >= EVC_NAL_HEADER_SIZE) { + ret = xevd_info((void*)bs, EVC_NAL_HEADER_SIZE, 1, &info); + if (XEVD_FAILED(ret)) { + av_log(NULL, AV_LOG_ERROR, "Cannot get bitstream information\n"); + return -1; + } + nal_unit_type_plus1 = info.nalu_type; + } + + return nal_unit_type_plus1 - 1; +} + +static uint32_t read_nal_unit_length(const uint8_t *bs, int bs_size) +{ + uint32_t len = 0; + XEVD_INFO info; + int ret; + + if(bs_size >= XEVD_NAL_UNIT_LENGTH_BYTE) { + ret = xevd_info((void *)bs, XEVD_NAL_UNIT_LENGTH_BYTE, 1, &info); + if (XEVD_FAILED(ret)) { + av_log(NULL, AV_LOG_ERROR, "Cannot get bitstream information\n"); + return 0; + } + len = info.nalu_len; + if(len == 0) { + av_log(NULL, AV_LOG_ERROR, "Invalid bitstream size! [%d]\n", bs_size); + return 0; + } + } + + return 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 > XEVD_NAL_UNIT_LENGTH_BYTE) { + + nalu_size = read_nal_unit_length(bits, XEVD_NAL_UNIT_LENGTH_BYTE); + if(nalu_size == 0) break; + + bits += XEVD_NAL_UNIT_LENGTH_BYTE; + bytes_to_read -= XEVD_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 == XEVD_NUT_SPS) + ev->got_sps++; + else if (nalu_type == XEVD_NUT_PPS) + ev->got_pps++; + else if (nalu_type == XEVD_NUT_IDR ) + ev->got_idr++; + else if (nalu_type == XEVD_NUT_NONIDR) + ev->got_nonidr++; + } + + return 0; +} + +static int evc_probe(const AVProbeData *p) +{ + EVCParserContext ev = {}; + 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 62e60470a8..0245cfb999 100644 --- a/libavformat/isom_tags.c +++ b/libavformat/isom_tags.c @@ -145,6 +145,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 6fb09df7e1..e83872fbe2 100644 --- a/libavformat/mov.c +++ b/libavformat/mov.c @@ -8568,7 +8568,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", + .extensions = "mov,mp4,m4a,3gp,3g2,mj2,psp,m4b,ism,ismv,isma,f4v,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 4c868919ae..110b7e1864 100644 --- a/libavformat/movenc.c +++ b/libavformat/movenc.c @@ -1342,6 +1342,17 @@ 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"); + ff_isom_write_avcc(pb, track->vos_data, track->vos_len); + + 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) { @@ -1591,6 +1602,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; @@ -1672,6 +1693,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) { @@ -2208,6 +2231,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) { @@ -5737,6 +5763,7 @@ 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_EVC || par->codec_id == AV_CODEC_ID_TRUEHD || par->codec_id == AV_CODEC_ID_AC3) && !trk->vos_len && !TAG_IS_AVCI(trk->tag)) { @@ -7311,6 +7338,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 4bbae7717b..de7fecce6c 100644 --- a/libavformat/rawenc.c +++ b/libavformat/rawenc.c @@ -386,6 +386,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",