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 5465A44CE6 for ; Tue, 14 Feb 2023 08:46:46 +0000 (UTC) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 0638768BE2E; Tue, 14 Feb 2023 10:46:44 +0200 (EET) Received: from mout-p-103.mailbox.org (mout-p-103.mailbox.org [80.241.56.161]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 8862968BDFD for ; Tue, 14 Feb 2023 10:46:36 +0200 (EET) Received: from smtp202.mailbox.org (smtp202.mailbox.org [10.196.197.202]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange ECDHE (P-384) server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) by mout-p-103.mailbox.org (Postfix) with ESMTPS id 4PGFDn6G2Gz9sl4 for ; Tue, 14 Feb 2023 09:46:33 +0100 (CET) Message-ID: <840c1827-ffcb-e50e-caf0-d478d4237d4a@gyani.pro> Date: Tue, 14 Feb 2023 14:16:18 +0530 MIME-Version: 1.0 Content-Language: en-US To: ffmpeg-devel@ffmpeg.org References: <20230211110251.6726-1-ffmpeg@gyani.pro> From: Gyan Doshi In-Reply-To: <20230211110251.6726-1-ffmpeg@gyani.pro> Subject: Re: [FFmpeg-devel] [PATCH] avformat/flvenc: allow to write qualifying metadata as number 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 Content-Transfer-Encoding: 7bit Content-Type: text/plain; charset="us-ascii"; Format="flowed" Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" Archived-At: List-Archive: List-Post: On 2023-02-11 04:32 pm, Gyan Doshi wrote: > The FLV format can store metadata as numbers which are used and handled > by many streaming platforms. > > Now, metadata values can be sent as AMF Number type if > 1) tag key starts with "num_" > 2) value is scanned and can be represented as a double. > > Written tag will have "num_" prefix removed if written as AMF Number. Comments? > --- > doc/muxers.texi | 2 ++ > libavformat/flvenc.c | 33 ++++++++++++++++++++++++++++----- > 2 files changed, 30 insertions(+), 5 deletions(-) > > diff --git a/doc/muxers.texi b/doc/muxers.texi > index ed5341be39..c9bafeec19 100644 > --- a/doc/muxers.texi > +++ b/doc/muxers.texi > @@ -509,6 +509,8 @@ ffmpeg -re -i ... -c:v libx264 -c:a aac -f fifo -fifo_format flv -map 0:v -map 0 > @section flv > > Adobe Flash Video Format muxer. > +This muxer will store user metadata whose keys start with @code{num_} and whose value is identified as a > +pure value of type double as an AMF Number. All other user metadata is stored as a String. > > This muxer accepts the following options: > > diff --git a/libavformat/flvenc.c b/libavformat/flvenc.c > index 81d9b6100d..25d09ef304 100644 > --- a/libavformat/flvenc.c > +++ b/libavformat/flvenc.c > @@ -23,6 +23,7 @@ > #include "libavutil/dict.h" > #include "libavutil/intfloat.h" > #include "libavutil/avassert.h" > +#include "libavutil/eval.h" > #include "libavutil/mathematics.h" > #include "libavcodec/codec_desc.h" > #include "libavcodec/mpeg4audio.h" > @@ -275,8 +276,10 @@ static void write_metadata(AVFormatContext *s, unsigned int ts) > AVIOContext *pb = s->pb; > FLVContext *flv = s->priv_data; > int write_duration_filesize = !(flv->flags & FLV_NO_DURATION_FILESIZE); > - int metadata_count = 0; > + int metadata_count = 0, is_num; > int64_t metadata_count_pos; > + double numvalue; > + char *key, *tail; > const AVDictionaryEntry *tag = NULL; > > /* write meta_tag */ > @@ -378,10 +381,30 @@ static void write_metadata(AVFormatContext *s, unsigned int ts) > av_log(s, AV_LOG_DEBUG, "Ignoring metadata for %s\n", tag->key); > continue; > } > - put_amf_string(pb, tag->key); > - avio_w8(pb, AMF_DATA_TYPE_STRING); > - put_amf_string(pb, tag->value); > - metadata_count++; > + > + is_num = !strncmp(tag->key, "num_", 4) && *(tag->key + 4); > + key = is_num ? (tag->key + 4) : tag->key; > + > + if (is_num) { > + numvalue = av_strtod(tag->value, &tail); > + if (*tail || numvalue == HUGE_VAL) { > + av_log(s, AV_LOG_ERROR, "Value %s for key %s cannot be stored as a double-typed number. Will be written as a string\n", tag->value, key); > + key = tag->key; > + is_num = 0; > + } > + } > + > + av_log(s, AV_LOG_DEBUG, "Writing tag %s with value %s count: %d\n", key, tag->value, metadata_count); > + > + put_amf_string(pb, key); > + if (is_num) { > + put_amf_double(pb, numvalue); > + } else { > + avio_w8(pb, AMF_DATA_TYPE_STRING); > + put_amf_string(pb, tag->value); > + } > + > + metadata_count++; > } > > if (write_duration_filesize) { _______________________________________________ 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".