[FFmpeg-devel] GSOC 2018 qualification task.

ANURAG SINGH IIT BHU anurag.singh.phy15 at iitbhu.ac.in
Wed Apr 18 12:15:36 EEST 2018


Hello Sir,

I have implemented the suggested changes, now the filter does not break
builds, also now it works for all inputs and

ffplay -f lavfi -i testsrc -vf hellosubs

works.

Sir I think passing the text using metadata to drawtext filter would not be
an efficient way in terms of time as drawtext filter calls a number of
functions which are not needed by the hellosubs filter, functions like
expand_text(), expand_func() etc, i.e drawtext filter is of 1525 lines
where as  hellosubs is more than 1/3 rd  times less in lines. and sir for
realtime subtitles I think we should emphasise more on reducing the time
taken by the filter to remove lag.


Thanks and regards,
Anurag Singh




On Mon, Apr 16, 2018 at 11:57 AM, ANURAG SINGH IIT BHU <
anurag.singh.phy15 at iitbhu.ac.in> wrote:

>
>
>
> Hello sir,
>
> Okay I'll implement the suggested changes and make sure that the filter
> does not break build without libfreetype.
>
> Thanks and regards
> Anurag Singh.
>
>
> On Mon, Apr 16, 2018 at 12:49 AM, Michael Niedermayer <
> michael at niedermayer.cc> wrote:
>
>> On Sun, Apr 15, 2018 at 07:36:09PM +0530, ANURAG SINGH IIT BHU wrote:
>> > Hello Sir,
>> >
>> > I have implemented the adviced changes for the hellosubs filter for the
>> > qualification task which writes Hello World time on frames, now the
>> filter
>> > does not uses libavformat, and it uses libfreetype to draw over video
>> > frames. I have attached the complete patch.
>> >
>> > libfretype and libfontconfig should be enabled to run the filter.
>> > (libfontconfig if no font file is provided.)
>> >
>> > Command to run the filter
>> > ffmpeg -i <videoname> -vf hellosubs <outputfilename>
>> >
>> > Thanks and regards,
>> > Anurag Singh.
>> >
>> >
>> >
>> >
>> >
>> > ‌
>> >
>> > On Fri, Apr 13, 2018 at 9:39 AM, ANURAG SINGH IIT BHU <
>> > anurag.singh.phy15 at iitbhu.ac.in> wrote:
>> >
>> > > Thank you sir, I'll implement the suggested reviews as soon as
>> possible.
>> > >
>> > >
>> > >
>> > >
>> > > ‌
>> > >
>> > > On Fri, Apr 13, 2018 at 4:04 AM, Michael Niedermayer <
>> > > michael at niedermayer.cc> wrote:
>> > >
>> > >> On Fri, Apr 13, 2018 at 02:13:53AM +0530, ANURAG SINGH IIT BHU wrote:
>> > >> > Hello,
>> > >> > I have implemented the reviews mentioned on previous patch, now
>> there
>> > >> is no
>> > >> > need to provide any subtitle file to the filter, I am attaching the
>> > >> > complete patch of the hellosubs filter.
>> > >> >
>> > >> > Command to run the filter
>> > >> > ffmpeg -i <videoname> -vf hellosubs=<videoname> helloout.mp4
>> > >> >
>> > >> >
>> > >> > Thanks and regards,
>> > >> > Anurag Singh.
>> > >> >
>> > >> >
>> > >> > ‌
>> > >> >
>> > >> > On Tue, Apr 10, 2018 at 4:55 AM, Rostislav Pehlivanov <
>> > >> atomnuker at gmail.com>
>> > >> > wrote:
>> > >> >
>> > >> > > On 9 April 2018 at 19:10, Paul B Mahol <onemda at gmail.com> wrote:
>> > >> > >
>> > >> > > > On 4/9/18, Rostislav Pehlivanov <atomnuker at gmail.com> wrote:
>> > >> > > > > On 9 April 2018 at 03:59, ANURAG SINGH IIT BHU <
>> > >> > > > > anurag.singh.phy15 at iitbhu.ac.in> wrote:
>> > >> > > > >
>> > >> > > > >> This mail is regarding the qualification task assigned to
>> me for
>> > >> the
>> > >> > > > >> GSOC project
>> > >> > > > >> in FFmpeg for automatic real-time subtitle generation using
>> > >> speech to
>> > >> > > > text
>> > >> > > > >> translation ML model.
>> > >> > > > >>
>> > >> > > > >
>> > >> > > > > i really don't think lavfi is the correct place for such
>> code,
>> > >> nor that
>> > >> > > > the
>> > >> > > > > project's repo should contain such code at all.
>> > >> > > > > This would need to be in another repo and a separate library.
>> > >> > > >
>> > >> > > > Why? Are you against ocr filter too?
>> > >> > > >
>> > >> > >
>> > >> > > The OCR filter uses libtessract so I'm fine with it. Like I
>> said, as
>> > >> long
>> > >> > > as the actual code to do it is in an external library I don't
>> mind.
>> > >> > > Mozilla recently released Deep Speech (
>> https://github.com/mozilla/
>> > >> > > DeepSpeech)
>> > >> > > which does pretty much exactly speech to text and is considered
>> to
>> > >> have the
>> > >> > > most accurate one out there. Someone just needs to convert the
>> > >> tensorflow
>> > >> > > code to something more usable.
>> > >> > > _______________________________________________
>> > >> > > ffmpeg-devel mailing list
>> > >> > > ffmpeg-devel at ffmpeg.org
>> > >> > > http://ffmpeg.org/mailman/listinfo/ffmpeg-devel
>> > >> > >
>> > >>
>> > >> >  Makefile       |    1
>> > >> >  allfilters.c   |    1
>> > >> >  vf_hellosubs.c |  513 ++++++++++++++++++++++++++++++
>> > >> +++++++++++++++++++++++++++
>> > >> >  3 files changed, 515 insertions(+)
>> > >> > 2432f100fddb7ec84e771be8282d4b66e3d1f50a
>> > >> 0001-avfilter-add-hellosubs-filter.patch
>> > >> > From ac0e09d431ea68aebfaef6e2ed0b450e76d473d9 Mon Sep 17 00:00:00
>> 2001
>> > >> > From: ddosvulnerability <anurag.singh.phy15 at iitbhu.ac.in>
>> > >> > Date: Thu, 12 Apr 2018 22:06:43 +0530
>> > >> > Subject: [PATCH] avfilter: add hellosubs filter.
>> > >> >
>> > >> > ---
>> > >> >  libavfilter/Makefile       |   1 +
>> > >> >  libavfilter/allfilters.c   |   1 +
>> > >> >  libavfilter/vf_hellosubs.c | 513 ++++++++++++++++++++++++++++++
>> > >> +++++++++++++++
>> > >> >  3 files changed, 515 insertions(+)
>> > >> >  create mode 100644 libavfilter/vf_hellosubs.c
>> > >> >
>> > >> > diff --git a/libavfilter/Makefile b/libavfilter/Makefile
>> > >> > index a90ca30..770b1b5 100644
>> > >> > --- a/libavfilter/Makefile
>> > >> > +++ b/libavfilter/Makefile
>> > >> > @@ -331,6 +331,7 @@ OBJS-$(CONFIG_SSIM_FILTER)                   +=
>> > >> vf_ssim.o framesync.o
>> > >> >  OBJS-$(CONFIG_STEREO3D_FILTER)               += vf_stereo3d.o
>> > >> >  OBJS-$(CONFIG_STREAMSELECT_FILTER)           += f_streamselect.o
>> > >> framesync.o
>> > >> >  OBJS-$(CONFIG_SUBTITLES_FILTER)              += vf_subtitles.o
>> > >> > +OBJS-$(CONFIG_HELLOSUBS_FILTER)              += vf_hellosubs.o
>> > >> >  OBJS-$(CONFIG_SUPER2XSAI_FILTER)             += vf_super2xsai.o
>> > >> >  OBJS-$(CONFIG_SWAPRECT_FILTER)               += vf_swaprect.o
>> > >> >  OBJS-$(CONFIG_SWAPUV_FILTER)                 += vf_swapuv.o
>> > >> > diff --git a/libavfilter/allfilters.c b/libavfilter/allfilters.c
>> > >> > index 6eac828..a008908 100644
>> > >> > --- a/libavfilter/allfilters.c
>> > >> > +++ b/libavfilter/allfilters.c
>> > >> > @@ -322,6 +322,7 @@ extern AVFilter ff_vf_ssim;
>> > >> >  extern AVFilter ff_vf_stereo3d;
>> > >> >  extern AVFilter ff_vf_streamselect;
>> > >> >  extern AVFilter ff_vf_subtitles;
>> > >> > +extern AVFilter ff_vf_hellosubs;
>> > >> >  extern AVFilter ff_vf_super2xsai;
>> > >> >  extern AVFilter ff_vf_swaprect;
>> > >> >  extern AVFilter ff_vf_swapuv;
>> > >> > diff --git a/libavfilter/vf_hellosubs.c
>> b/libavfilter/vf_hellosubs.c
>> > >> > new file mode 100644
>> > >> > index 0000000..b994050
>> > >> > --- /dev/null
>> > >> > +++ b/libavfilter/vf_hellosubs.c
>> > >> > @@ -0,0 +1,513 @@
>> > >> > +/*
>> > >> > + * Copyright (c) 2011 Baptiste Coudurier
>> > >> > + * Copyright (c) 2011 Stefano Sabatini
>> > >> > + * Copyright (c) 2012 Clément Bœsch
>> > >> > + *
>> > >> > + * This file is part of FFmpeg.
>> > >> > + *
>> > >> > + * FFmpeg is free software; you can redistribute it and/or
>> > >> > + * modify it under the terms of the GNU Lesser General Public
>> > >> > + * License as published by the Free Software Foundation; either
>> > >> > + * version 2.1 of the License, or (at your option) any later
>> version.
>> > >> > + *
>> > >> > + * FFmpeg is distributed in the hope that it will be useful,
>> > >> > + * but WITHOUT ANY WARRANTY; without even the implied warranty of
>> > >> > + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
>> GNU
>> > >> > + * Lesser General Public License for more details.
>> > >> > + *
>> > >> > + * You should have received a copy of the GNU Lesser General
>> Public
>> > >> > + * License along with FFmpeg; if not, write to the Free Software
>> > >> > + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
>> > >> 02110-1301 USA
>> > >> > + */
>> > >> > +
>> > >> > +/**
>> > >> > + * @file
>> > >> > + * Libass hellosubs burning filter.
>> > >> > + *
>> > >> > +
>> > >> > + */
>> > >> > +
>> > >> > +#include <ass/ass.h>
>> > >> > +
>> > >> > +#include "config.h"
>> > >> > +#if CONFIG_SUBTITLES_FILTER
>> > >> > +# include "libavcodec/avcodec.h"
>> > >> > +# include "libavformat/avformat.h"
>> > >> > +#endif
>> > >> > +#include "libavutil/avstring.h"
>> > >> > +#include "libavutil/imgutils.h"
>> > >> > +#include "libavutil/opt.h"
>> > >> > +#include "libavutil/parseutils.h"
>> > >> > +#include "drawutils.h"
>> > >> > +#include "avfilter.h"
>> > >> > +#include "internal.h"
>> > >> > +#include "formats.h"
>> > >> > +#include "video.h"
>> > >> > +#include <stdio.h>
>> > >> > +#include <stdlib.h>
>> > >> > +#include <string.h>
>> > >> > +
>> > >> > +typedef struct AssContext {
>> > >> > +    const AVClass *class;
>> > >> > +    ASS_Library  *library;
>> > >> > +    ASS_Renderer *renderer;
>> > >> > +    ASS_Track    *track;
>> > >> > +    char *filename;
>> > >> > +    char *fontsdir;
>> > >> > +    char *charenc;
>> > >> > +    char *force_style;
>> > >> > +    int stream_index;
>> > >> > +    int alpha;
>> > >> > +    uint8_t rgba_map[4];
>> > >> > +    int     pix_step[4];       ///< steps per pixel for each
>> plane of
>> > >> the main output
>> > >> > +    int original_w, original_h;
>> > >> > +    int shaping;
>> > >> > +    FFDrawContext draw;
>> > >> > +} AssContext;
>> > >> > +
>> > >> > +#define OFFSET(x) offsetof(AssContext, x)
>> > >> > +#define FLAGS AV_OPT_FLAG_FILTERING_PARAM|AV_OPT_FLAG_VIDEO_PARAM
>> > >> > +
>> > >> > +#define COMMON_OPTIONS \
>> > >> > +    {"filename",       "set the filename of file to read",
>> > >>              OFFSET(filename),   AV_OPT_TYPE_STRING,     {.str =
>> NULL},
>> > >> CHAR_MIN, CHAR_MAX, FLAGS }, \
>> > >> > +    {"f",              "set the filename of file to read",
>> > >>              OFFSET(filename),   AV_OPT_TYPE_STRING,     {.str =
>> NULL},
>> > >> CHAR_MIN, CHAR_MAX, FLAGS }, \
>> > >> > +    {"original_size",  "set the size of the original video (used
>> to
>> > >> scale fonts)", OFFSET(original_w), AV_OPT_TYPE_IMAGE_SIZE, {.str =
>> NULL},
>> > >> CHAR_MIN, CHAR_MAX, FLAGS }, \
>> > >> > +    {"fontsdir",       "set the directory containing the fonts to
>> > >> read",           OFFSET(fontsdir),   AV_OPT_TYPE_STRING,     {.str =
>> > >> NULL},  CHAR_MIN, CHAR_MAX, FLAGS }, \
>> > >> > +    {"alpha",          "enable processing of alpha channel",
>> > >>              OFFSET(alpha),      AV_OPT_TYPE_BOOL,       {.i64 = 0
>>  },
>> > >>      0,        1, FLAGS }, \
>> > >> > +
>> > >> > +/* libass supports a log level ranging from 0 to 7 */
>> > >> > +static const int ass_libavfilter_log_level_map[] = {
>> > >> > +    [0] = AV_LOG_FATAL,     /* MSGL_FATAL */
>> > >> > +    [1] = AV_LOG_ERROR,     /* MSGL_ERR */
>> > >> > +    [2] = AV_LOG_WARNING,   /* MSGL_WARN */
>> > >> > +    [3] = AV_LOG_WARNING,   /* <undefined> */
>> > >> > +    [4] = AV_LOG_INFO,      /* MSGL_INFO */
>> > >> > +    [5] = AV_LOG_INFO,      /* <undefined> */
>> > >> > +    [6] = AV_LOG_VERBOSE,   /* MSGL_V */
>> > >> > +    [7] = AV_LOG_DEBUG,     /* MSGL_DBG2 */
>> > >> > +};
>> > >> > +
>> > >> > +static void ass_log(int ass_level, const char *fmt, va_list args,
>> void
>> > >> *ctx)
>> > >> > +{
>> > >> > +    const int ass_level_clip = av_clip(ass_level, 0,
>> > >> > +        FF_ARRAY_ELEMS(ass_libavfilter_log_level_map) - 1);
>> > >> > +    const int level = ass_libavfilter_log_level_map[
>> ass_level_clip];
>> > >> > +
>> > >> > +    av_vlog(ctx, level, fmt, args);
>> > >> > +    av_log(ctx, level, "\n");
>> > >> > +}
>> > >> > +
>> > >> > +static av_cold int init(AVFilterContext *ctx)
>> > >> > +{
>> > >> > +    AssContext *ass = ctx->priv;
>> > >> > +
>> > >> > +    if (!ass->filename) {
>> > >> > +        av_log(ctx, AV_LOG_ERROR, "No filename provided!\n");
>> > >> > +        return AVERROR(EINVAL);
>> > >> > +    }
>> > >> > +
>> > >> > +    ass->library = ass_library_init();
>> > >> > +    if (!ass->library) {
>> > >> > +        av_log(ctx, AV_LOG_ERROR, "Could not initialize
>> libass.\n");
>> > >> > +        return AVERROR(EINVAL);
>> > >> > +    }
>> > >> > +    ass_set_message_cb(ass->library, ass_log, ctx);
>> > >> > +
>> > >> > +    ass_set_fonts_dir(ass->library, ass->fontsdir);
>> > >> > +
>> > >> > +    ass->renderer = ass_renderer_init(ass->library);
>> > >> > +    if (!ass->renderer) {
>> > >> > +        av_log(ctx, AV_LOG_ERROR, "Could not initialize libass
>> > >> renderer.\n");
>> > >> > +        return AVERROR(EINVAL);
>> > >> > +    }
>> > >> > +
>> > >> > +    return 0;
>> > >> > +}
>> > >> > +
>> > >> > +static av_cold void uninit(AVFilterContext *ctx)
>> > >> > +{
>> > >> > +    AssContext *ass = ctx->priv;
>> > >> > +
>> > >> > +    if (ass->track)
>> > >> > +        ass_free_track(ass->track);
>> > >> > +    if (ass->renderer)
>> > >> > +        ass_renderer_done(ass->renderer);
>> > >> > +    if (ass->library)
>> > >> > +        ass_library_done(ass->library);
>> > >> > +}
>> > >> > +
>> > >> > +static int query_formats(AVFilterContext *ctx)
>> > >> > +{
>> > >> > +    return ff_set_common_formats(ctx,
>> ff_draw_supported_pixel_format
>> > >> s(0));
>> > >> > +}
>> > >> > +
>> > >> > +static int config_input(AVFilterLink *inlink)
>> > >> > +{
>> > >> > +    AssContext *ass = inlink->dst->priv;
>> > >> > +
>> > >> > +    ff_draw_init(&ass->draw, inlink->format, ass->alpha ?
>> > >> FF_DRAW_PROCESS_ALPHA : 0);
>> > >> > +
>> > >> > +    ass_set_frame_size  (ass->renderer, inlink->w, inlink->h);
>> > >> > +    if (ass->original_w && ass->original_h)
>> > >> > +        ass_set_aspect_ratio(ass->renderer, (double)inlink->w /
>> > >> inlink->h,
>> > >> > +                             (double)ass->original_w /
>> > >> ass->original_h);
>> > >> > +    if (ass->shaping != -1)
>> > >> > +        ass_set_shaper(ass->renderer, ass->shaping);
>> > >> > +
>> > >> > +    return 0;
>> > >> > +}
>> > >> > +
>> > >> > +/* libass stores an RGBA color in the format RRGGBBTT, where TT
>> is the
>> > >> transparency level */
>> > >> > +#define AR(c)  ( (c)>>24)
>> > >> > +#define AG(c)  (((c)>>16)&0xFF)
>> > >> > +#define AB(c)  (((c)>>8) &0xFF)
>> > >> > +#define AA(c)  ((0xFF-(c)) &0xFF)
>> > >> > +
>> > >> > +static void overlay_ass_image(AssContext *ass, AVFrame *picref,
>> > >> > +                              const ASS_Image *image)
>> > >> > +{
>> > >> > +    for (; image; image = image->next) {
>> > >> > +        uint8_t rgba_color[] = {AR(image->color),
>> AG(image->color),
>> > >> AB(image->color), AA(image->color)};
>> > >> > +        FFDrawColor color;
>> > >> > +        ff_draw_color(&ass->draw, &color, rgba_color);
>> > >> > +        ff_blend_mask(&ass->draw, &color,
>> > >> > +                      picref->data, picref->linesize,
>> > >> > +                      picref->width, picref->height,
>> > >> > +                      image->bitmap, image->stride, image->w,
>> image->h,
>> > >> > +                      3, 0, image->dst_x, image->dst_y);
>> > >> > +    }
>> > >> > +}
>> > >> > +
>> > >> > +static int filter_frame(AVFilterLink *inlink, AVFrame *picref)
>> > >> > +{
>> > >> > +    AVFilterContext *ctx = inlink->dst;
>> > >> > +    AVFilterLink *outlink = ctx->outputs[0];
>> > >> > +    AssContext *ass = ctx->priv;
>> > >> > +    int detect_change = 0;
>> > >> > +    double time_ms = picref->pts * av_q2d(inlink->time_base) *
>> 1000;
>> > >> > +    ASS_Image *image = ass_render_frame(ass->renderer,
>> ass->track,
>> > >> > +                                        time_ms, &detect_change);
>> > >> > +
>> > >> > +    if (detect_change)
>> > >> > +        av_log(ctx, AV_LOG_DEBUG, "Change happened at time
>> ms:%f\n",
>> > >> time_ms);
>> > >> > +
>> > >> > +    overlay_ass_image(ass, picref, image);
>> > >> > +
>> > >> > +    return ff_filter_frame(outlink, picref);
>> > >> > +}
>> > >> > +
>> > >> > +static const AVFilterPad ass_inputs[] = {
>> > >> > +    {
>> > >> > +        .name             = "default",
>> > >> > +        .type             = AVMEDIA_TYPE_VIDEO,
>> > >> > +        .filter_frame     = filter_frame,
>> > >> > +        .config_props     = config_input,
>> > >> > +        .needs_writable   = 1,
>> > >> > +    },
>> > >> > +    { NULL }
>> > >> > +};
>> > >> > +
>> > >> > +static const AVFilterPad ass_outputs[] = {
>> > >> > +    {
>> > >> > +        .name = "default",
>> > >> > +        .type = AVMEDIA_TYPE_VIDEO,
>> > >> > +    },
>> > >> > +    { NULL }
>> > >> > +};
>> > >> > +
>> > >> > +
>> > >> > +
>> > >> > +
>> > >> > +
>> > >> > +static const AVOption hellosubs_options[] = {
>> > >> > +    COMMON_OPTIONS
>> > >> > +    {"charenc",      "set input character encoding",
>> OFFSET(charenc),
>> > >>     AV_OPT_TYPE_STRING, {.str = NULL}, CHAR_MIN, CHAR_MAX, FLAGS},
>> > >> > +    {"stream_index", "set stream index",
>> > >>  OFFSET(stream_index), AV_OPT_TYPE_INT,    { .i64 = -1 }, -1,
>> > >>  INT_MAX,  FLAGS},
>> > >> > +    {"si",           "set stream index",
>> > >>  OFFSET(stream_index), AV_OPT_TYPE_INT,    { .i64 = -1 }, -1,
>> > >>  INT_MAX,  FLAGS},
>> > >> > +    {"force_style",  "force subtitle style",
>> > >>  OFFSET(force_style),  AV_OPT_TYPE_STRING, {.str = NULL}, CHAR_MIN,
>> > >> CHAR_MAX, FLAGS},
>> > >> > +    {NULL},
>> > >> > +};
>> > >> > +
>> > >> > +static const char * const font_mimetypes[] = {
>> > >> > +    "application/x-truetype-font",
>> > >> > +    "application/vnd.ms-opentype",
>> > >> > +    "application/x-font-ttf",
>> > >> > +    NULL
>> > >> > +};
>> > >> > +
>> > >> > +static int attachment_is_font(AVStream * st)
>> > >> > +{
>> > >> > +    const AVDictionaryEntry *tag = NULL;
>> > >> > +    int n;
>> > >> > +
>> > >> > +    tag = av_dict_get(st->metadata, "mimetype", NULL,
>> > >> AV_DICT_MATCH_CASE);
>> > >> > +
>> > >> > +    if (tag) {
>> > >> > +        for (n = 0; font_mimetypes[n]; n++) {
>> > >> > +            if (av_strcasecmp(font_mimetypes[n], tag->value) ==
>> 0)
>> > >> > +                return 1;
>> > >> > +        }
>> > >> > +    }
>> > >> > +    return 0;
>> > >> > +}
>> > >> > +
>> > >> > +AVFILTER_DEFINE_CLASS(hellosubs);
>> > >> > +
>> > >> > +static av_cold int init_hellosubs(AVFilterContext *ctx)
>> > >> > +{
>> > >> > +    int j, ret, sid;long int z=0;int t1=0;
>> > >> > +    int k = 0;
>> > >> > +    AVDictionary *codec_opts = NULL;
>> > >> > +    AVFormatContext *fmt = NULL;
>> > >> > +    AVCodecContext *dec_ctx = NULL;
>> > >> > +    AVCodec *dec = NULL;
>> > >> > +    const AVCodecDescriptor *dec_desc;
>> > >> > +    AVStream *st;
>> > >> > +    AVPacket pkt;
>> > >> > +    AssContext *ass = ctx->priv;
>> > >>
>> > >> > +    FILE *file;
>> > >> > +    if ((file = fopen("hello.srt", "r")))
>> > >>
>> > >> there is no need for accessing an external file for the task of
>> > >> drawing a line of text.
>> > >>
>> > >>
>> > >> > +    {
>> > >> > +        fclose(file);
>> > >> > +
>> > >> > +    }
>> > >> > +    else
>> > >> > +   {
>> > >> > +   FILE * fp;
>> > >> > +   fp = fopen ("hello.srt","w");
>> > >>
>> > >> thats even more true for writing such file.
>> > >> It also would not work predictable with multiple filters
>> > >>
>> > >>
>> > >> > +   fprintf (fp, "1\n");
>> > >> > +   fprintf (fp, "00:00:05,615 --> 00:00:08,083\n");
>> > >> > +   fprintf (fp, "%s",ass->filename);
>> > >> > +   fclose (fp);
>> > >> > +
>> > >> > +   char cmd[300];
>> > >> > +   strcpy(cmd,"ffmpeg -i ");
>> > >> > +   strcat(cmd,ass->filename);
>> > >> > +   char fn[200];
>> > >> > +   strcpy(fn,ass->filename);
>> > >> > +   strcat(cmd," -vf hellosubs=hello.srt helloout");
>> > >> > +   int m=0;
>> > >> > +   for(int w=(strlen(fn)-1);w>=0;w--)
>> > >> > +   {if (fn[w]=='.')
>> > >> > +   {m=w;
>> > >> > +   break;}}
>> > >> > +   char join[5];
>> > >> > +   for(int loc=m;loc<strlen(fn);loc++)
>> > >> > +   join[loc-m]=fn[loc];
>> > >> > +   char rem[100];
>> > >> > +   char join1[100];
>> > >> > +   strcpy(join1,join);
>> > >> > +   strcpy(rem,"helloout");
>> > >> > +   strcat(rem,join1);
>> > >> > +   remove(rem);
>> > >> > +
>> > >> > +   strcat(cmd,join);
>> > >> > +   system(cmd);
>> > >> > +   remove("hello.srt");
>> > >> > +
>> > >> > +exit(0);
>> > >>
>> > >> also a filter cannot call exit(), in fact a library like libavfilter
>> must
>> > >> not
>> > >> call exit()
>> > >>
>> > >>
>> > >> > +}
>> > >> > +
>> > >> > +    /* Init libass */
>> > >> > +    ret = init(ctx);
>> > >> > +    if (ret < 0)
>> > >> > +        return ret;
>> > >> > +    ass->track = ass_new_track(ass->library);
>> > >> > +    if (!ass->track) {
>> > >> > +        av_log(ctx, AV_LOG_ERROR, "Could not create a libass
>> track\n");
>> > >> > +        return AVERROR(EINVAL);
>> > >> > +    }
>> > >> > +
>> > >> > +
>> > >>
>> > >> > +    ret = avformat_open_input(&fmt, ass->filename, NULL, NULL);
>> > >> > +    if (ret < 0) {
>> > >> > +        av_log(ctx, AV_LOG_ERROR, "Unable to open %s\n",
>> > >> ass->filename);
>> > >> > +
>> > >> > +    }
>> > >>
>> > >> also no function from libavformat is needed, this filter should draw
>> a
>> > >> line of
>> > >> text, not demux a file.
>> > >> You maybe misinterpredted my previous review. All unneeded code like
>> > >> every bit of
>> > >> libavformat use must be removed.
>> > >>
>> > >> You seem to be trying to workaround what i suggest not actually
>> solve the
>> > >> issues
>> > >> raised.
>> > >> Like writing a file to replace the impossibility of accessing some
>> input
>> > >> file
>> > >> directly. There really is no file and none can be written.
>> > >>
>> > >> The goal of this filter was to create subtitle packets/frames and
>> pass
>> > >> them on.
>> > >> As this turned out too hard in the time available. The simpler goal
>> now
>> > >> is to
>> > >> draw that text on a video frame.
>> > >>
>> > >> The filter gets video frames on its input and it passes them on to
>> the
>> > >> output.
>> > >> In there it should write that Hello world text with the advancing
>> number
>> > >> onto
>> > >> it
>> > >> For this there is no need to access any files, or use any demuxers.
>> > >> you can use the libass code from the subtitle filter as you do but
>> that
>> > >> code
>> > >> uses a external subtitle file. You have to change this so it no
>> longer
>> > >> uses a
>> > >> external file or demuxes this with libavformat. These steps are not
>> needed
>> > >> and are incorrect for this task
>> > >>
>> > >> i suggest you remove "include "libavformat *" that way you will see
>> > >> exactly what must be removed
>> > >> and this should make the code simpler, it just isnt needed to have
>> this
>> > >> baggage between the avcodec/libass and what you want to draw
>> > >>
>> > >> the libavformat code is there to read a subtitle file.
>> > >> There is no subtitle file. The filter should just draw a line saying
>> > >> hello world with a number.
>> > >>
>> > >>
>> > >> [...]
>> > >>
>> > >> --
>> > >> Michael     GnuPG fingerprint: 9FF2128B147EF6730BADF133611EC7
>> 87040B0FAB
>> > >>
>> > >> Dictatorship: All citizens are under surveillance, all their steps
>> and
>> > >> actions recorded, for the politicians to enforce control.
>> > >> Democracy: All politicians are under surveillance, all their steps
>> and
>> > >> actions recorded, for the citizens to enforce control.
>> > >>
>> > >> _______________________________________________
>> > >> ffmpeg-devel mailing list
>> > >> ffmpeg-devel at ffmpeg.org
>> > >> http://ffmpeg.org/mailman/listinfo/ffmpeg-devel
>> > >>
>> > >>
>> > >
>>
>> >  Makefile       |    1
>> >  allfilters.c   |    1
>> >  vf_hellosubs.c |  960 ++++++++++++++++++++++++++++++
>> +++++++++++++++++++++++++++
>> >  3 files changed, 962 insertions(+)
>> > 4232d543120e2ef383c33a584ddb06fe5f24ac11
>> 0001-avfilter-add-hellosubs-filter.patch
>> > From 7004d913495a0274bc13d6e79aea18249e057698 Mon Sep 17 00:00:00 2001
>> > From: ddosvulnerability <anurag.singh.phy15 at iitbhu.ac.in>
>> > Date: Sun, 15 Apr 2018 19:15:35 +0530
>> > Subject: [PATCH] avfilter: add hellosubs filter.
>> >
>> > ---
>> >  libavfilter/Makefile       |   1 +
>> >  libavfilter/allfilters.c   |   1 +
>> >  libavfilter/vf_hellosubs.c | 960 ++++++++++++++++++++++++++++++
>> +++++++++++++++
>> >  3 files changed, 962 insertions(+)
>> >  create mode 100644 libavfilter/vf_hellosubs.c
>> >
>> > diff --git a/libavfilter/Makefile b/libavfilter/Makefile
>> > index 3a9fb02..531faad 100644
>> > --- a/libavfilter/Makefile
>> > +++ b/libavfilter/Makefile
>> > @@ -216,6 +216,7 @@ OBJS-$(CONFIG_GBLUR_FILTER)                  +=
>> vf_gblur.o
>> >  OBJS-$(CONFIG_GEQ_FILTER)                    += vf_geq.o
>> >  OBJS-$(CONFIG_GRADFUN_FILTER)                += vf_gradfun.o
>> >  OBJS-$(CONFIG_HALDCLUT_FILTER)               += vf_lut3d.o framesync.o
>> > +OBJS-$(CONFIG_HELLOSUBS_FILTER)              += vf_hellosubs.o
>> >  OBJS-$(CONFIG_HFLIP_FILTER)                  += vf_hflip.o
>> >  OBJS-$(CONFIG_HISTEQ_FILTER)                 += vf_histeq.o
>> >  OBJS-$(CONFIG_HISTOGRAM_FILTER)              += vf_histogram.o
>> > diff --git a/libavfilter/allfilters.c b/libavfilter/allfilters.c
>> > index 68b2992..bde8a2e 100644
>> > --- a/libavfilter/allfilters.c
>> > +++ b/libavfilter/allfilters.c
>> > @@ -208,6 +208,7 @@ extern AVFilter ff_vf_gblur;
>> >  extern AVFilter ff_vf_geq;
>> >  extern AVFilter ff_vf_gradfun;
>> >  extern AVFilter ff_vf_haldclut;
>> > +extern AVFilter ff_vf_hellosubs;
>> >  extern AVFilter ff_vf_hflip;
>> >  extern AVFilter ff_vf_histeq;
>> >  extern AVFilter ff_vf_histogram;
>> > diff --git a/libavfilter/vf_hellosubs.c b/libavfilter/vf_hellosubs.c
>> > new file mode 100644
>> > index 0000000..65fa18b
>> > --- /dev/null
>> > +++ b/libavfilter/vf_hellosubs.c
>> > @@ -0,0 +1,960 @@
>> > +/*
>> > + * This file is part of FFmpeg.
>> > + *
>> > + * FFmpeg is free software; you can redistribute it and/or
>> > + * modify it under the terms of the GNU Lesser General Public
>> > + * License as published by the Free Software Foundation; either
>> > + * version 2.1 of the License, or (at your option) any later version.
>> > + *
>> > + * FFmpeg is distributed in the hope that it will be useful,
>> > + * but WITHOUT ANY WARRANTY; without even the implied warranty of
>> > + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
>> > + * Lesser General Public License for more details.
>> > + *
>> > + * You should have received a copy of the GNU Lesser General Public
>> > + * License along with FFmpeg; if not, write to the Free Software
>> > + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
>> 02110-1301 USA
>> > + */
>> > +
>> > +/**
>> > + * @file
>> > + * Libfreetype subtitles burning filter.
>>
>> > + * @see{http://www.matroska.org/technical/specs/subtitles/ssa.html}
>>
>> This is about SSA, the filter now is about libfreetype, this doesnt fit
>>
>>
>> > + */
>> > +
>> > +#include "config.h"
>> > +#include <stdio.h>
>> > +#if HAVE_SYS_TIME_H
>> > +#include <sys/time.h>
>> > +#endif
>> > +#include <sys/types.h>
>> > +#include <sys/stat.h>
>> > +#include <time.h>
>> > +#if HAVE_UNISTD_H
>> > +#include <unistd.h>
>> > +#endif
>> > +#include <fenv.h>
>> > +#if CONFIG_LIBFONTCONFIG
>> > +#include <fontconfig/fontconfig.h>
>> > +#endif
>> > +#include "libavutil/avstring.h"
>> > +#include "libavutil/bprint.h"
>> > +#include "libavutil/common.h"
>> > +#include "libavutil/file.h"
>> > +#include "libavutil/eval.h"
>> > +#include "libavutil/opt.h"
>> > +#include "libavutil/random_seed.h"
>> > +#include "libavutil/parseutils.h"
>> > +#include "libavutil/timecode.h"
>> > +#include "libavutil/time_internal.h"
>> > +#include "libavutil/tree.h"
>> > +#include "libavutil/lfg.h"
>> > +#include "avfilter.h"
>> > +#include "drawutils.h"
>> > +#include "formats.h"
>> > +#include "internal.h"
>> > +#include "video.h"
>> > +#include <ft2build.h>
>> > +#include FT_FREETYPE_H
>> > +#include FT_GLYPH_H
>> > +#include FT_STROKER_H
>>
>> as you are copying the code from the drawtext filter, you also have to
>> include the copyright / author information from the drawtext filter.
>>
>> also it doesnt work with all inputs, for example this doesnt work:
>>
>> ./ffplay -f lavfi -i testsrc -vf hellosubs
>>
>> also build fails without libfreetype.
>> The original code copied does not break build without libfreetype
>> ive previously pointed to this already and that you are missing
>> dependancy stuff in configure
>>
>> and duplicating all of the drawtext filter is suboptimal
>> it would be much cleaner if the hellosubs filter would send
>> the to be drawn text as metadata to a subsequent drawtext filter
>>
>> you can look at libavfilter/vf_find_rect.c and libavfilter/vf_cover_rect.c
>> which also communicate via metadata
>>
>> Thanks
>>
>> [...]
>>
>> --
>> Michael     GnuPG fingerprint: 9FF2128B147EF6730BADF133611EC787040B0FAB
>>
>> Its not that you shouldnt use gotos but rather that you should write
>> readable code and code with gotos often but not always is less readable
>>
>> _______________________________________________
>> ffmpeg-devel mailing list
>> ffmpeg-devel at ffmpeg.org
>> http://ffmpeg.org/mailman/listinfo/ffmpeg-devel
>>
>>
>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: 0001-avfilter-add-hellosubs-filter.patch
Type: text/x-patch
Size: 36552 bytes
Desc: not available
URL: <http://ffmpeg.org/pipermail/ffmpeg-devel/attachments/20180418/65ae14e6/attachment.bin>


More information about the ffmpeg-devel mailing list