From: Gyan Doshi <ffmpeg@gyani.pro> To: ffmpeg-devel@ffmpeg.org Subject: Re: [FFmpeg-devel] [PATCH] avformat/flvenc: allow to write qualifying metadata as number Date: Tue, 14 Feb 2023 14:16:18 +0530 Message-ID: <840c1827-ffcb-e50e-caf0-d478d4237d4a@gyani.pro> (raw) In-Reply-To: <20230211110251.6726-1-ffmpeg@gyani.pro> 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".
next prev parent reply other threads:[~2023-02-14 8:46 UTC|newest] Thread overview: 7+ messages / expand[flat|nested] mbox.gz Atom feed top 2023-02-11 11:02 Gyan Doshi 2023-02-14 8:46 ` Gyan Doshi [this message] 2023-02-14 10:05 ` Anton Khirnov 2023-02-14 12:51 ` Gyan Doshi 2023-02-19 8:13 ` Gyan Doshi 2023-02-20 16:40 ` Anton Khirnov 2023-02-21 4:47 ` Gyan Doshi
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=840c1827-ffcb-e50e-caf0-d478d4237d4a@gyani.pro \ --to=ffmpeg@gyani.pro \ --cc=ffmpeg-devel@ffmpeg.org \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: link
Git Inbox Mirror of the ffmpeg-devel mailing list - see https://ffmpeg.org/mailman/listinfo/ffmpeg-devel This inbox may be cloned and mirrored by anyone: git clone --mirror https://master.gitmailbox.com/ffmpegdev/0 ffmpegdev/git/0.git # If you have public-inbox 1.1+ installed, you may # initialize and index your mirror using the following commands: public-inbox-init -V2 ffmpegdev ffmpegdev/ https://master.gitmailbox.com/ffmpegdev \ ffmpegdev@gitmailbox.com public-inbox-index ffmpegdev Example config snippet for mirrors. AGPL code for this site: git clone https://public-inbox.org/public-inbox.git