From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org [79.124.17.100]) by master.gitmailbox.com (Postfix) with ESMTP id 2A7B940D08 for ; Fri, 26 Jan 2024 14:04:12 +0000 (UTC) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 60F7568D149; Fri, 26 Jan 2024 16:04:09 +0200 (EET) Received: from mail-pg1-f180.google.com (mail-pg1-f180.google.com [209.85.215.180]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 14DC668C14E for ; Fri, 26 Jan 2024 16:04:03 +0200 (EET) Received: by mail-pg1-f180.google.com with SMTP id 41be03b00d2f7-5cdbc4334edso188008a12.3 for ; Fri, 26 Jan 2024 06:04:02 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=spin-digital-com.20230601.gappssmtp.com; s=20230601; t=1706277840; x=1706882640; darn=ffmpeg.org; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:from:to:cc:subject:date:message-id:reply-to; bh=GPynRX2UidPGi2PC4zuqIxKF6iwfa0UWIKtXWoZ9KSQ=; b=cOWY5FJvaEgg0l9pG93xjZYJFpd6SuNK4VhcgwxwVRTX8Q4XcCWouseRzObbBugGRA JO/XSHnweMdI348BEoFCwG+LTsZxLBphUG42rFmYkSt7Bkk3C3sXgBmjp6h4OYBLbArz FpvlhLqnuQhpgX4pbXgJ3lbhA0vhSspeDY3X9PN3qd6mWczkHka0FRdPmveCz6n7Vc04 ePOSWhhH1ucGB+g+B/KaNfhqjp/BlnKum4+dX+Pq9TNkQamWJ+CmhIoXwGqPK1l10vcx YHhxM8bpIQPYT69lWsgepQm7tyx84q9BpS1kiiBbdfplDokBOj8Xmi1pbX7r7jWE3vis fy+A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1706277840; x=1706882640; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=GPynRX2UidPGi2PC4zuqIxKF6iwfa0UWIKtXWoZ9KSQ=; b=RMRMChhvRl29B6EU03d6AYCk8t99hSfkeOE45BYOGq87DvA61NLF+glcPAuup4P/nl e8yytrJkAv58jDhttGGw78mHzXTh0hVP/ld081/Cb2yCY79n2hSlEodbr/fkkv4lmfmj vYK2qHe8ppMUQFIiHmlIFbDjRVeOmZoLgCl5nnv8JLTv9xatN++FkokP0w61H5PNw44b wMf8DUCIAJyu4m6gyx+EXveAPOKX8HzmDZJgJ/Kp+jeNkibSdmZiRzuLAsoCELciRGeS fOlVBMP7YqPvc0Ioq3ZoBSAyzuU5we8m2Mf61BgfzFLALRS8aE/gaw+yOiIe47+empnK po/g== X-Gm-Message-State: AOJu0YzJYxvyrQAjjor4mB+II0V04ZeJ+jjDzotVoWcRT/UGok3V2yJM 1EysWWcLT54rJQPNatdu947hAePAC2NJurRiO3L55jV9ND3mVM2TI0vr+ymyK1nhsLd9h0ZsWHe ttso5BxckkMh/fv44XNnJSTIDSZiTiQsjxNCup37olZfuks9Z X-Google-Smtp-Source: AGHT+IF4l2K6JRX2d8Kzbye7EBnm6KShwge0UXEDfNk1BlmG7gcR0YfgN0kglbhVskLz6YLNHnrD8tItnfjncQLpLoc= X-Received: by 2002:a17:90a:7c0a:b0:290:1743:7687 with SMTP id v10-20020a17090a7c0a00b0029017437687mr767653pjf.28.1706277840550; Fri, 26 Jan 2024 06:04:00 -0800 (PST) MIME-Version: 1.0 References: <20240125122601.5473-1-nuomi2021@gmail.com> In-Reply-To: From: Thomas Siedel Date: Fri, 26 Jan 2024 15:03:45 +0100 Message-ID: To: ffmpeg-devel@ffmpeg.org X-Content-Filtered-By: Mailman/MimeDel 2.1.29 Subject: Re: [FFmpeg-devel] [PATCH v2 1/2] avformat: add muxer support for H266/VVC 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: Nuo Mi Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" Archived-At: List-Archive: List-Post: Thanks for picking up the patch set! On Thu, 25 Jan 2024 at 13:26, Nuo Mi wrote: > From: Thomas Siedel > > Add muxer for vvcc byte stream format. > Add AV_CODEC_ID_VVC to ff_mp4_obj_type. > Add AV_CODEC_ID_VVC to ISO Media codec (VvcConfigurationBox vvi1, > vvc1 defined in ISO/IEC 14496-15:2021). > Add VvcConfigurationBox vvcC which extends FullBox type in > ISO/IEC 14496-15:2021. > Add ff_vvc_muxer to RAW muxers. > > Tested with: > ffmpeg -i NovosobornayaSquare_1920x1080.mp4 -c:v libvvenc test.mp4 && > ffmpeg -i test.mp4 -f null - > ffmpeg -i NovosobornayaSquare_1920x1080.mp4 -c:v copy test.mp4 && > ffmpeg -i test.mp4 -f md5 - > > Signed-off-by: Thomas Siedel > Co-Authored-By: Nuo Mi > --- > libavformat/Makefile | 6 +- > libavformat/isom.c | 1 + > libavformat/isom_tags.c | 3 + > libavformat/mov.c | 6 + > libavformat/movenc.c | 41 +- > libavformat/vvc.c | 971 ++++++++++++++++++++++++++++++++++++++++ > libavformat/vvc.h | 99 ++++ > 7 files changed, 1123 insertions(+), 4 deletions(-) > create mode 100644 libavformat/vvc.c > create mode 100644 libavformat/vvc.h > > diff --git a/libavformat/Makefile b/libavformat/Makefile > index dcc99eeac4..05b9b8a115 100644 > --- a/libavformat/Makefile > +++ b/libavformat/Makefile > @@ -343,7 +343,7 @@ OBJS-$(CONFIG_MATROSKA_DEMUXER) += > matroskadec.o matroska.o \ > oggparsevorbis.o > vorbiscomment.o \ > qtpalette.o replaygain.o > dovi_isom.o > OBJS-$(CONFIG_MATROSKA_MUXER) += matroskaenc.o matroska.o \ > - av1.o avc.o hevc.o \ > + av1.o avc.o hevc.o vvc.o\ > flacenc_header.o avlanguage.o > \ > vorbiscomment.o wv.o > dovi_isom.o > OBJS-$(CONFIG_MCA_DEMUXER) += mca.o > @@ -365,7 +365,7 @@ OBJS-$(CONFIG_MODS_DEMUXER) += mods.o > OBJS-$(CONFIG_MOFLEX_DEMUXER) += moflex.o > OBJS-$(CONFIG_MOV_DEMUXER) += mov.o mov_chan.o mov_esds.o \ > qtpalette.o replaygain.o > dovi_isom.o > -OBJS-$(CONFIG_MOV_MUXER) += movenc.o av1.o avc.o hevc.o > vpcc.o \ > +OBJS-$(CONFIG_MOV_MUXER) += movenc.o av1.o avc.o hevc.o > vvc.o vpcc.o \ > movenchint.o mov_chan.o rtp.o > \ > movenccenc.o movenc_ttml.o > rawutils.o \ > dovi_isom.o evc.o > @@ -520,7 +520,7 @@ OBJS-$(CONFIG_RTP_MUXER) += rtp.o > \ > rtpenc_vp8.o \ > rtpenc_vp9.o \ > rtpenc_xiph.o \ > - avc.o hevc.o > + avc.o hevc.o vvc.o > OBJS-$(CONFIG_RTSP_DEMUXER) += rtsp.o rtspdec.o httpauth.o \ > urldecode.o > OBJS-$(CONFIG_RTSP_MUXER) += rtsp.o rtspenc.o httpauth.o \ > diff --git a/libavformat/isom.c b/libavformat/isom.c > index 6d019881e5..9fbccd4437 100644 > --- a/libavformat/isom.c > +++ b/libavformat/isom.c > @@ -36,6 +36,7 @@ const AVCodecTag ff_mp4_obj_type[] = { > { AV_CODEC_ID_MPEG4 , 0x20 }, > { AV_CODEC_ID_H264 , 0x21 }, > { AV_CODEC_ID_HEVC , 0x23 }, > + { AV_CODEC_ID_VVC , 0x33 }, > { AV_CODEC_ID_AAC , 0x40 }, > { AV_CODEC_ID_MP4ALS , 0x40 }, /* 14496-3 ALS */ > { AV_CODEC_ID_MPEG2VIDEO , 0x61 }, /* MPEG-2 Main */ > diff --git a/libavformat/isom_tags.c b/libavformat/isom_tags.c > index a575b7c160..705811e950 100644 > --- a/libavformat/isom_tags.c > +++ b/libavformat/isom_tags.c > @@ -123,6 +123,9 @@ const AVCodecTag ff_codec_movvideo_tags[] = { > { AV_CODEC_ID_HEVC, MKTAG('d', 'v', 'h', 'e') }, /* HEVC-based Dolby > Vision derived from hev1 */ > /* dvh1 is handled > within mov.c */ > > + { AV_CODEC_ID_VVC, MKTAG('v', 'v', 'i', '1') }, /* VVC/H.266 which > indicates parameter sets may be in ES */ > + { AV_CODEC_ID_VVC, MKTAG('v', 'v', 'c', '1') }, /* VVC/H.266 which > indicates parameter shall not be in ES */ > + > { AV_CODEC_ID_H264, MKTAG('a', 'v', 'c', '1') }, /* AVC-1/H.264 */ > { AV_CODEC_ID_H264, MKTAG('a', 'v', 'c', '2') }, > { AV_CODEC_ID_H264, MKTAG('a', 'v', 'c', '3') }, > diff --git a/libavformat/mov.c b/libavformat/mov.c > index 4cffd6c7db..cf931d4594 100644 > --- a/libavformat/mov.c > +++ b/libavformat/mov.c > @@ -2123,6 +2123,11 @@ static int mov_read_glbl(MOVContext *c, AVIOContext > *pb, MOVAtom atom) > if ((uint64_t)atom.size > (1<<30)) > return AVERROR_INVALIDDATA; > > + if (atom.type == MKTAG('v','v','c','C')) { > + avio_skip(pb, 4); > + atom.size -= 4; > + } > + > if (atom.size >= 10) { > // Broken files created by legacy versions of libavformat will > // wrap a whole fiel atom inside of a glbl atom. > @@ -8129,6 +8134,7 @@ static const MOVParseTableEntry > mov_default_parse_table[] = { > { MKTAG('s','g','p','d'), mov_read_sgpd }, > { MKTAG('s','b','g','p'), mov_read_sbgp }, > { MKTAG('h','v','c','C'), mov_read_glbl }, > +{ MKTAG('v','v','c','C'), mov_read_glbl }, > { MKTAG('u','u','i','d'), mov_read_uuid }, > { MKTAG('C','i','n', 0x8e), mov_read_targa_y216 }, > { MKTAG('f','r','e','e'), mov_read_free }, > diff --git a/libavformat/movenc.c b/libavformat/movenc.c > index 8a27afbc57..40be71f3e0 100644 > --- a/libavformat/movenc.c > +++ b/libavformat/movenc.c > @@ -68,6 +68,7 @@ > #include "ttmlenc.h" > #include "version.h" > #include "vpcc.h" > +#include "vvc.h" > > static const AVOption options[] = { > { "brand", "Override major brand", offsetof(MOVMuxContext, > major_brand), AV_OPT_TYPE_STRING, {.str = NULL}, .flags = > AV_OPT_FLAG_ENCODING_PARAM }, > @@ -1473,6 +1474,23 @@ static int mov_write_evcc_tag(AVIOContext *pb, > MOVTrack *track) > return update_size(pb, pos); > } > > +static int mov_write_vvcc_tag(AVIOContext *pb, MOVTrack *track) > +{ > + int64_t pos = avio_tell(pb); > + > + avio_wb32(pb, 0); > + ffio_wfourcc(pb, "vvcC"); > + > + avio_w8 (pb, 0); /* version */ > + avio_wb24(pb, 0); /* flags */ > + > + if (track->tag == MKTAG('v','v','c','1')) > + ff_isom_write_vvcc(pb, track->vos_data, track->vos_len, 1); > + else > + ff_isom_write_vvcc(pb, track->vos_data, track->vos_len, 0); > + 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) > { > @@ -2382,6 +2400,8 @@ static int mov_write_video_tag(AVFormatContext *s, > AVIOContext *pb, MOVMuxContex > avid = 1; > } else if (track->par->codec_id == AV_CODEC_ID_HEVC) > mov_write_hvcc_tag(pb, track); > + else if (track->par->codec_id == AV_CODEC_ID_VVC) > + mov_write_vvcc_tag(pb, track); > else if (track->par->codec_id == AV_CODEC_ID_H264 && > !TAG_IS_AVCI(track->tag)) { > mov_write_avcc_tag(pb, track); > if (track->mode == MODE_IPOD) > @@ -6170,6 +6190,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_VVC || > par->codec_id == AV_CODEC_ID_VP9 || > par->codec_id == AV_CODEC_ID_EVC || > par->codec_id == AV_CODEC_ID_TRUEHD) && !trk->vos_len && > @@ -6235,6 +6256,18 @@ int ff_mov_write_packet(AVFormatContext *s, > AVPacket *pkt) > size = ff_hevc_annexb2mp4(pb, pkt->data, pkt->size, 0, > NULL); > } > } > + } else if (par->codec_id == AV_CODEC_ID_VVC && trk->vos_len > 6 && > + (AV_RB24(trk->vos_data) == 1 || AV_RB32(trk->vos_data) == > 1)) { > + /* extradata is Annex B, assume the bitstream is too and convert it > */ > + if (trk->hint_track >= 0 && trk->hint_track < mov->nb_tracks) { > + ret = ff_vvc_annexb2mp4_buf(pkt->data, &reformatted_data, > + &size, 0, NULL); > + if (ret < 0) > + return ret; > + avio_write(pb, reformatted_data, size); > + } else { > + size = ff_vvc_annexb2mp4(pb, pkt->data, pkt->size, 0, NULL); > + } > } else if (par->codec_id == AV_CODEC_ID_AV1) { > if (trk->hint_track >= 0 && trk->hint_track < mov->nb_tracks) { > ret = ff_av1_filter_obus_buf(pkt->data, &reformatted_data, > @@ -6281,6 +6314,9 @@ int ff_mov_write_packet(AVFormatContext *s, AVPacket > *pkt) > } else if(par->codec_id == AV_CODEC_ID_HEVC && > par->extradata_size > 21) { > int nal_size_length = (par->extradata[21] & 0x3) + 1; > ret = ff_mov_cenc_avc_write_nal_units(s, &trk->cenc, > nal_size_length, pb, pkt->data, size); > + } else if(par->codec_id == AV_CODEC_ID_VVC && > par->extradata_size > 21) { > + int nal_size_length = (par->extradata[21] & 0x3) + 1; > This is wrong for VVC (was noticed by James Almer in previous version of the patch set). Instead, it should be this: int nal_size_length = ((par->extradata[4]>>1) & 0x3) + 1; _______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org https://ffmpeg.org/mailman/listinfo/ffmpeg-devel To unsubscribe, visit link above, or email ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".