[FFmpeg-devel] [PATCH] avfilter/image2: Add source file path and basename to each packet side data.
Michael Niedermayer
michael at niedermayer.cc
Thu Dec 19 18:46:51 EET 2019
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.schmidt at 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
> >>
> >> + at item
> >> +Plot special @var{source_basename} metadata, extracted from each input
> frame, or
> >> +the string "NA" if the metadata is not defined.
> >> + at example
> >> +drawtext="fontsize=20:fontcolor=white:fontfile=FreeSans.ttf:text='%{metadata\:source_basename\:NA}':x=10:y=10"
> >> + at 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.schmidt at 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.schmidt at 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):
> +
> + at table @option
> + at item lavf.image2dec.source_path
> +Corresponds to the full path to the input image being read.
> + at item lavf.image2dec.source_basename
> +Corresponds to the name of the file being read.
> + at 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
>
> + at item
> +Plot special @var{lavf.image2dec.source_basename} metadata onto each frame if
> +such metadata exists. Otherwise, plot the string "NA".
> + at example
> +drawtext="fontsize=20:fontcolor=white:fontfile=FreeSans.ttf:text='%{metadata\:lavf.image2dec.source_basename\:NA}':x=10:y=10"
> + at 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
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 181 bytes
Desc: not available
URL: <https://ffmpeg.org/pipermail/ffmpeg-devel/attachments/20191219/47445ac6/attachment.sig>
More information about the ffmpeg-devel
mailing list