summaryrefslogtreecommitdiff
path: root/libavformat/img2dec.c
diff options
context:
space:
mode:
authorAlexandre Heitor Schmidt <alexandre.schmidt@gmail.com>2020-01-01 16:57:02 +0000
committerMarton Balint <cus@passwd.hu>2020-01-10 23:08:18 +0100
commitae436cc5e4d75c1a7deefb2b30820486e2f3d8af (patch)
tree7af074782f4590de4a57f960a3ca993ac517a610 /libavformat/img2dec.c
parentad1b0a12f34d57ed5bfb952ce67bce8f48b3ec0e (diff)
avformat/img2dec: add option to provide metadata fields related to input path
libavformat/img2.h: New field export_path_metadata to VideoDemuxData to only allow the use of the extra metadata upon explicit user request, for security reasons. libavformat/img2dec.c: Modify image2 demuxer to make available two special metadata entries called lavf.image2dec.source_path 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. The metadata fields will only be available when explicitly enabled with image2 option -export_path_metadata 1. doc/demuxers.texi: Documented the new metadata fields available for image2 and how to use them. doc/filters.texi: Added an example on how to use the new metadata fields with drawtext filter, in order to plot the input file path to each output frame. Usage example: ffmpeg -f image2 -export_path_metadata 1 -pattern_type glob -framerate 18 -i '/path/to/input/files/*.jpg' -filter_complex drawtext="fontsize=40:fontcolor=white: fontfile=FreeSans.ttf:borderw=2:bordercolor=black: text='%{metadata\:lavf.image2dec.source_basename\:NA}':x=5:y=50" output.avi Fixes #2874. Signed-off-by: Alexandre Heitor Schmidt <alexandre.schmidt@gmail.com> Signed-off-by: Marton Balint <cus@passwd.hu>
Diffstat (limited to 'libavformat/img2dec.c')
-rw-r--r--libavformat/img2dec.c39
1 files changed, 39 insertions, 0 deletions
diff --git a/libavformat/img2dec.c b/libavformat/img2dec.c
index f8b4a655a5..37ee1bb746 100644
--- a/libavformat/img2dec.c
+++ b/libavformat/img2dec.c
@@ -374,6 +374,33 @@ 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);
+ av_dict_free(&d);
+ 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 +513,17 @@ int ff_img_read_packet(AVFormatContext *s1, AVPacket *pkt)
if (s->is_pipe)
pkt->pos = avio_tell(f[0]);
+ /*
+ * export_path_metadata must be explicitly enabled via
+ * command line options for path metadata to be exported
+ * as packet side_data.
+ */
+ if (!s->is_pipe && s->export_path_metadata == 1) {
+ 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]) {
@@ -585,6 +623,7 @@ const AVOption ff_img_options[] = {
{ "none", "none", 0, AV_OPT_TYPE_CONST, {.i64 = 0 }, 0, 2, DEC, "ts_type" },
{ "sec", "second precision", 0, AV_OPT_TYPE_CONST, {.i64 = 1 }, 0, 2, DEC, "ts_type" },
{ "ns", "nano second precision", 0, AV_OPT_TYPE_CONST, {.i64 = 2 }, 0, 2, DEC, "ts_type" },
+ { "export_path_metadata", "enable metadata containing input path information", OFFSET(export_path_metadata), AV_OPT_TYPE_BOOL, {.i64 = 0 }, 0, 1, DEC }, \
COMMON_OPTIONS
};