From patchwork Mon Dec 16 22:41:04 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Alexandre Heitor Schmidt X-Patchwork-Id: 16838 Return-Path: X-Original-To: patchwork@ffaux-bg.ffmpeg.org Delivered-To: patchwork@ffaux-bg.ffmpeg.org Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org [79.124.17.100]) by ffaux.localdomain (Postfix) with ESMTP id ADF2144A267 for ; Tue, 17 Dec 2019 00:41:14 +0200 (EET) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 8E8EE68AE7B; Tue, 17 Dec 2019 00:41:14 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-wr1-f66.google.com (mail-wr1-f66.google.com [209.85.221.66]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 4D7E768AA7E for ; Tue, 17 Dec 2019 00:41:08 +0200 (EET) Received: by mail-wr1-f66.google.com with SMTP id y11so9205014wrt.6 for ; Mon, 16 Dec 2019 14:41:08 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=subject:to:references:from:message-id:date:user-agent:mime-version :in-reply-to:content-language; bh=n6s+ziy6tXyBJW9o49FTdmy5YbjnDlD9ZuWWbPmktIM=; b=VMUPbaojkyF7wJgy0H1pxH/Jl4K4An0WDeLfLWKmhaEHeFgl0LxE5J8W7y9SCSdWu5 FwcQRiv56Y/6MsVXeUeAE0AjhnHY6vv7rGLLh625nPyy/y6AKZueon/xjrpSQW3LiSNt nedGx5nGPq7DaTMuMNtpZDpEQejC6oU2vBnv9QQnPETqkaQpNjlpA67WVgDBY/MlH/Lc Wgu0lipBrJGHAaeESaEzwZTHifyfjVfCGlMdAw6ISWj2ilX1x0kE0aUIVpkGBRjSblUv W97lDuLT2r5iO+RWIsAwqrS3sn+W3M26i4H9jl6T6bP817I8etusJKPXeRePHDJsvzDH mqYw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:subject:to:references:from:message-id:date :user-agent:mime-version:in-reply-to:content-language; bh=n6s+ziy6tXyBJW9o49FTdmy5YbjnDlD9ZuWWbPmktIM=; b=p9/dgKcSP9ScA8m/fS69Io8n62ElxukrtvS4eKjeyNyNGDsSxSPOCEfIX23D4g/1nh gP7osTM+ecoIgA9xfBJbiYtPUGzu1NAbOtjQvn+ONhCOZ0rSm95SnFvO5RGKlu3jahbA nMu3HfRoWirAs1TXrW84/22wZS/UvCAutwtXr0aPw8IFS6YcHALMTQ9N8O56kaNi1dhc RTqmGTkSmBaS81NrzD/6w8Ayy4xn0DSGtymBKWC0jVAUHk9xQU4wYNFyeP9Sr+4IfXRd rHi1B8IReFlXL1x+RxoPFjH0A8HUQrMDytCyc6eaVLYwpEOLyFi/DZHQRzyMEIcGaga7 gaEw== X-Gm-Message-State: APjAAAWSy/SYLtHXnOdJ2fsbOHzwm5Z1MdfkvWiIL5hXH0TX24Aoe5w1 vbhsZ8jJn+RWpCANJab90U3M2oISVf8= X-Google-Smtp-Source: APXvYqzdJyrjAdF26JvOK2hWnAiyytPzWTwaT4RQu15tKnw1mazOtA15oBLbhJMwuTQs87FlT7PtOg== X-Received: by 2002:adf:f10a:: with SMTP id r10mr32877820wro.202.1576536067390; Mon, 16 Dec 2019 14:41:07 -0800 (PST) Received: from [192.168.1.9] (a94-132-34-60.cpe.netcabo.pt. [94.132.34.60]) by smtp.gmail.com with ESMTPSA id f1sm23036630wro.85.2019.12.16.14.41.06 for (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Mon, 16 Dec 2019 14:41:06 -0800 (PST) To: ffmpeg-devel@ffmpeg.org References: <20191216222608.19270-1-alexandre.schmidt@gmail.com> From: Alexandre Heitor Schmidt Message-ID: <028b57a8-886c-e1d5-571b-7113b30fa0ec@gmail.com> Date: Mon, 16 Dec 2019 22:41:04 +0000 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:68.0) Gecko/20100101 Thunderbird/68.2.2 MIME-Version: 1.0 In-Reply-To: <20191216222608.19270-1-alexandre.schmidt@gmail.com> Content-Language: en-US Subject: Re: [FFmpeg-devel] [PATCH] avfilter/image2: Add source file path and basename to each packet side data. X-BeenThere: ffmpeg-devel@ffmpeg.org X-Mailman-Version: 2.1.20 Precedence: list List-Id: FFmpeg development discussions and patches List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Reply-To: FFmpeg development discussions and patches Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" It didn't work. For some reason, when I send the patch, entries like this: +@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 + become this: + 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 + So I'm attaching the patch to make life easier. Thank you! Alex. On 16/12/2019 22:26, 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 > --- > 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)}. > > @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 > + > @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); > + > 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) { > + 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; > > pkt->size = 0; > for (i = 0; i < 3; i++) { From fd999c0bb6657fb60a67dbc10c6d91fe6b925066 Mon Sep 17 00:00:00 2001 From: Alexandre Heitor Schmidt Date: Mon, 16 Dec 2019 16:00:31 +0000 Subject: [PATCH] avfilter/image2: Add source file path and basename to each packet side data. 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 --- 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)}. @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 + @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); + 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) { + 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; pkt->size = 0; for (i = 0; i < 3; i++) { -- 2.17.1