diff mbox

[FFmpeg-devel] avfilter/image2: Add source file path and basename to each packet side data.

Message ID 16dd576f-d23c-f2b1-f475-9cbc5cb3be36@gmail.com
State Superseded
Headers show

Commit Message

Alexandre Heitor Schmidt Dec. 17, 2019, 2:30 p.m. UTC
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@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.

Comments

Michael Niedermayer Dec. 19, 2019, 4:46 p.m. UTC | #1
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@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.schmidt@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@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


[...]
Alexandre Heitor Schmidt Dec. 21, 2019, 3:46 p.m. UTC | #2
On 19/12/2019 16:46, Michael Niedermayer wrote:
 > 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@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.schmidt@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@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, would you mind sharing your ./configure and make lines, so I 
can try to reproduce your environment here and thus avoid sending 
non-working patches?

Thank you!

Alex.
diff mbox

Patch

From 7177c9c55f0f38ccdd6b7845f8027ee454766d11 Mon Sep 17 00:00:00 2001
From: Alexandre Heitor Schmidt <alexandre.schmidt@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@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:
diff --git a/libavformat/img2dec.c b/libavformat/img2dec.c
index f8b4a655a5..86f9f1f657 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'.
+ */
+static int add_filename_as_pkt_side_data(char *filename, AVPacket *pkt) {
+    uint8_t* metadata;
+    int metadata_len;
+    AVDictionary *d = NULL;
+    char *packed_metadata = NULL;
+
+    av_dict_set(&d, "lavf.image2dec.source_path", filename, 0);
+    av_dict_set(&d, "lavf.image2dec.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;
@@ -486,6 +512,12 @@  int ff_img_read_packet(AVFormatContext *s1, AVPacket *pkt)
     if (s->is_pipe)
         pkt->pos = avio_tell(f[0]);
 
+    if (!s->is_pipe) {
+        res = add_filename_as_pkt_side_data(filename, pkt);
+        if (res < 0)
+            goto fail;
+    }
+
     pkt->size = 0;
     for (i = 0; i < 3; i++) {
         if (f[i]) {
-- 
2.17.1