On Tue, Dec 17, 2019 at 02:30:39PM +0000, Alexandre Heitor Schmidt wrote: > On 17/12/2019 00:35, Marton Balint wrote: > > On Mon, 16 Dec 2019, Alexandre Heitor Schmidt wrote: > >> This is the second time I'm submiting this patch, now modified to be > >> less intrusive, as sugested by Marton Balint, and hopefully without git > >> send-email messing up with the diff by replacing '@' within > >> documentation entries. > >> > >> The patch modifies image2 filter to make available two special metadata > >> entries called source_path and source_file, which represents, > >> respectively, the complete path to the source image for the current > >> frame and the basename i.e. the file name related to the current frame. > >> These can then be used by filters like drawtext and others. > >> > >> doc/filters: The documentation for drawtext was also updated and an usage > >> example was added. > >> > >> Fixes #2874. > >> > >> Signed-off-by: Alexandre Heitor Schmidt <alexandre.schm...@gmail.com> > >> --- > >> doc/filters.texi | 15 +++++++++++++-- > >> libavformat/img2.h | 2 ++ > >> libavformat/img2dec.c | 28 ++++++++++++++++++++++++++++ > >> 3 files changed, 43 insertions(+), 2 deletions(-) > >> > >> diff --git a/doc/filters.texi b/doc/filters.texi > >> index c543203ce3..15498aee0d 100644 > >> --- a/doc/filters.texi > >> +++ b/doc/filters.texi > >> @@ -9723,8 +9723,12 @@ Available metadata can be identified by inspecting > entries > >> starting with TAG included within each frame section > >> printed by running @code{ffprobe -show_frames}. > >> > >> -String metadata generated in filters leading to > >> -the drawtext filter are also available. > >> +String metadata generated in filters leading to the drawtext filter are > also > >> +available. For example, image2 filter generates two special metadata > fields > >> +called @var{source_path} and @var{source_basename} for each input frame > >> +generated from a single image. @var{source_path} contains the entire > path > >> +to input filename, while @var{source_basename} contains the equivalent > >> +to @code{basename(source_path)}. > > > > This does not really belong here, you are documenting the image2 > *demuxer*'s behaviour of setting source_basename and source_path metadata > fields. > > Ok. Fixed that. Updated the example for drawtext and added the metadata tags > to demuxers.texi > > > The only thing that might be relevant here is that the metadata can not > > only come from filters but from demuxers as well. > > > > Also since the metadata names are demuxer specific probably it is better > to use hierarchical names, like "lavf.image2dec.source_path" and > "lavf.image2dec.source_basename", similar to how the filters set their > custom metadata fields. > > Right. Names of metadata tags changed accordingly. > > >> @item n, frame_num > >> The frame number, starting from 0. > >> @@ -9872,6 +9876,13 @@ > drawtext=fontfile=FreeSans.ttf:text=DOG:fontsize=24:x=10:y=20+24-max_glyph_a, > >> > drawtext=fontfile=FreeSans.ttf:text=cow:fontsize=24:x=80:y=20+24-max_glyph_a > >> @end example > >> > >> +@item > >> +Plot special @var{source_basename} metadata, extracted from each input > frame, or > >> +the string "NA" if the metadata is not defined. > >> +@example > >> +drawtext="fontsize=20:fontcolor=white:fontfile=FreeSans.ttf:text='%{metadata\:source_basename\:NA}':x=10:y=10" > >> +@end example > >> + > > > > The example can stay as is, that is fine. > > Ok. I just updated the metadata tag names. > > >> @end itemize > >> > >> For more information about libfreetype, check: > >> diff --git a/libavformat/img2.h b/libavformat/img2.h > >> index 0e5b374a6b..8208c1f58b 100644 > >> --- a/libavformat/img2.h > >> +++ b/libavformat/img2.h > >> @@ -74,5 +74,7 @@ extern const AVOption ff_img_options[]; > >> > >> int ff_img_read_header(AVFormatContext *s1); > >> > >> +int add_filename_as_pkt_side_data(char *filename, AVPacket *pkt); > >> + > > > > No need to make it part of the header. > > Removed. > > >> int ff_img_read_packet(AVFormatContext *s1, AVPacket *pkt); > >> #endif > >> diff --git a/libavformat/img2dec.c b/libavformat/img2dec.c > >> index f8b4a655a5..3fb7aa7967 100644 > >> --- a/libavformat/img2dec.c > >> +++ b/libavformat/img2dec.c > >> @@ -374,6 +374,32 @@ int ff_img_read_header(AVFormatContext *s1) > >> return 0; > >> } > >> > >> +/** > >> + * Add this frame's source path and basename to packet's sidedata > >> + * as a dictionary, so it can be used by filters like 'drawtext'. > >> + */ > >> +int add_filename_as_pkt_side_data(char *filename, AVPacket *pkt) { > > > > This can be made static. > > Done. > > >> + uint8_t* metadata; > >> + int metadata_len; > >> + AVDictionary *d = NULL; > >> + char *packed_metadata = NULL; > >> + > >> + av_dict_set(&d, "source_path", filename, 0); > >> + av_dict_set(&d, "source_basename", av_basename(filename), 0); > >> + > >> + packed_metadata = av_packet_pack_dictionary(d, &metadata_len); > >> + if (!packed_metadata) > >> + return AVERROR(ENOMEM); > >> + if (!(metadata = av_packet_new_side_data(pkt, > AV_PKT_DATA_STRINGS_METADATA, metadata_len))) { > >> + av_freep(&packed_metadata); > >> + return AVERROR(ENOMEM); > >> + } > >> + memcpy(metadata, packed_metadata, metadata_len); > >> + av_freep(&packed_metadata); > >> + > >> + return 0; > >> +} > >> + > >> int ff_img_read_packet(AVFormatContext *s1, AVPacket *pkt) > >> { > >> VideoDemuxData *s = s1->priv_data; > >> @@ -485,6 +511,8 @@ int ff_img_read_packet(AVFormatContext *s1, AVPacket > *pkt) > >> > >> if (s->is_pipe) > >> pkt->pos = avio_tell(f[0]); > >> + else if ( (res = add_filename_as_pkt_side_data(filename, pkt)) != 0 > ) > >> + goto fail; > > > > Cosmetics/nitpicking, a separate if and the usual way of checking for > errors is more readable IMHO: > > > > if (!s->is_pipe) { > > res = add_filename_as_pkt_side_data(filename, pkt); > > if (res < 0) > > goto fail; > > } > > Rewritten. > > > Thanks, > > Marton > > Thank YOU for the awesome support! > > New patch file attached. > > Alex. > > >
> doc/demuxers.texi | 11 +++++++++++ > doc/filters.texi | 7 +++++++ > libavformat/img2dec.c | 32 ++++++++++++++++++++++++++++++++ > 3 files changed, 50 insertions(+) > 62f78a0d6b40d6338759738e44c8decadad2d0a4 > 0001-avformat-image2-Metadata-identifying-the-source-path.patch > From 7177c9c55f0f38ccdd6b7845f8027ee454766d11 Mon Sep 17 00:00:00 2001 > From: Alexandre Heitor Schmidt <alexandre.schm...@gmail.com> > Date: Tue, 17 Dec 2019 12:31:41 +0000 > Subject: [PATCH] avformat/image2: Metadata identifying the source path of > input filename and documentation for its usage. > > libavformat/img2dec.c: Modify image2 demuxer to make available > two special metadata entries called lavf.image2dec.source_basename > and lavf.image2dec.source_basename, which represents, respectively, > the complete path to the source image for the current frame and > the basename i.e. the file name related to the current frame. > These can then be used by filters like drawtext and others. > > doc/demuxers.texti: Documented the two special metadata tags. > > doc/filters.texti: Added an usage example for these tags. > > Fixes #2874. > > Signed-off-by: Alexandre Heitor Schmidt <alexandre.schm...@gmail.com> > --- > doc/demuxers.texi | 11 +++++++++++ > doc/filters.texi | 7 +++++++ > libavformat/img2dec.c | 32 ++++++++++++++++++++++++++++++++ > 3 files changed, 50 insertions(+) > > diff --git a/doc/demuxers.texi b/doc/demuxers.texi > index 0d13bdd1b3..96cff22267 100644 > --- a/doc/demuxers.texi > +++ b/doc/demuxers.texi > @@ -362,6 +362,17 @@ determine the format of the images contained in the > files. > The size, the pixel format, and the format of each image must be the > same for all the files in the sequence. > > +Along with the metadata found within each file, two special metadata > +fields are made available for other filters (see @var{drawtext} filter > +for examples): > + > +@table @option > +@item lavf.image2dec.source_path > +Corresponds to the full path to the input image being read. > +@item lavf.image2dec.source_basename > +Corresponds to the name of the file being read. > +@end table > + > This demuxer accepts the following options: > @table @option > @item framerate > diff --git a/doc/filters.texi b/doc/filters.texi > index 527c6a08b2..ec0d4bd4a2 100644 > --- a/doc/filters.texi > +++ b/doc/filters.texi > @@ -9872,6 +9872,13 @@ > drawtext=fontfile=FreeSans.ttf:text=DOG:fontsize=24:x=10:y=20+24-max_glyph_a, > drawtext=fontfile=FreeSans.ttf:text=cow:fontsize=24:x=80:y=20+24-max_glyph_a > @end example > > +@item > +Plot special @var{lavf.image2dec.source_basename} metadata onto each frame if > +such metadata exists. Otherwise, plot the string "NA". > +@example > +drawtext="fontsize=20:fontcolor=white:fontfile=FreeSans.ttf:text='%{metadata\:lavf.image2dec.source_basename\:NA}':x=10:y=10" > +@end example > + > @end itemize > > For more information about libfreetype, check: make HTML doc/ffmpeg-all.html doc/filters.texi:9879: misplaced { doc/filters.texi:9879: misplaced } make: *** [doc/ffmpeg-all.html] Error 1 [...] -- Michael GnuPG fingerprint: 9FF2128B147EF6730BADF133611EC787040B0FAB The smallest minority on earth is the individual. Those who deny individual rights cannot claim to be defenders of minorities. - Ayn Rand
signature.asc
Description: PGP signature
_______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org https://ffmpeg.org/mailman/listinfo/ffmpeg-devel To unsubscribe, visit link above, or email ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe".