[Libav-user] Watermarks implementation

Andrey Mochenov andrey2067 at gmail.com
Sun Aug 18 13:20:39 CEST 2013


Hi Paul,

Thank you for your answer. So, I have tried to use overlay filter.
I use two "buffer" filters for its inputs and one "buffersink" filter for
its ouput, as shown in the code below.
The problem is that the avfilter_graph_config() command causes the error:
'Output pad "default" with type video of the filter instance
"input_main_filter"
of buffer not connected to any destination.'

AVFormatContext *fmt_ctx_main;
AVCodecContext *dec_ctx_main;
AVFormatContext *fmt_ctx_wtrmrk;
AVCodecContext *dec_ctx_wtrmrk;
AVFilterContext *buffersink_ctx = NULL;
AVFilterContext *buffersrc_ctx = NULL;
AVFilterContext *bufferovrlay_ctx = NULL;
AVFilterGraph *filter_graph = NULL;

...
// All fmt_ctx_main, dec_ctx_main, fmt_ctx_wtrmrk, dec_ctx_wtrmrk
initializations are OK.

char argsStrMain[512] = "";
char argsStrOvrlay[512] = "";
int ret = 0;

AVFilter *buffersrc = avfilter_get_by_name("buffer");
AVFilter *bufferovrlay = avfilter_get_by_name("buffer");
AVFilter *buffersink = avfilter_get_by_name("buffersink");

AVFilterInOut *inputs = avfilter_inout_alloc();
AVFilterInOut *outputs = avfilter_inout_alloc();
AVFilterInOut *outputOvrlay = avfilter_inout_alloc();

enum AVPixelFormat pix_fmts[] = {AV_PIX_FMT_YUV420P, AV_PIX_FMT_NONE};

AVBufferSinkParams *buffersink_params = NULL;

sprintf_s(argsStrMain, sizeof(argsStrMain),
"video_size=%dx%d:pix_fmt=%d:time_base=%d/%d:pixel_aspect=%d/%d",
          dec_ctx_main->width, dec_ctx_main->height, dec_ctx_main->pix_fmt,
          dec_ctx_main->time_base.num, dec_ctx_main->time_base.den,
          dec_ctx_main->sample_aspect_ratio.num,
dec_ctx_main->sample_aspect_ratio.den);

sprintf_s(argsStrOvrlay, sizeof(argsStrOvrlay),
"video_size=%dx%d:pix_fmt=%d:time_base=%d/%d:pixel_aspect=%d/%d",
          dec_ctx_wtrmrk->width, dec_ctx_wtrmrk->height,
dec_ctx_wtrmrk->pix_fmt,
          dec_ctx_wtrmrk->time_base.num, dec_ctx_wtrmrk->time_base.den,
          dec_ctx_wtrmrk->sample_aspect_ratio.num,
dec_ctx_wtrmrk->sample_aspect_ratio.den);

buffersink_params = av_buffersink_params_alloc();
buffersink_params->pixel_fmts = pix_fmts;

filter_graph = avfilter_graph_alloc();

ret = avfilter_graph_create_filter(&buffersrc_ctx, buffersrc,
"input_main_filter", argsStrMain, NULL, filter_graph);
ret = avfilter_graph_create_filter(&bufferovrlay_ctx, bufferovrlay,
"input_overlay_filter", argsStrOvrlay, NULL, filter_graph);
ret = avfilter_graph_create_filter(&buffersink_ctx, buffersink,
"output_filter", NULL, buffersink_params, filter_graph);

outputs->name = av_strdup("in");
outputs->filter_ctx = buffersrc_ctx;
outputs->pad_idx    = 0;
outputs->next       = outputOvrlay;

outputOvrlay->name = av_strdup("overlay");   // unique name for this
input/output in the list
outputs->filter_ctx = bufferovrlay_ctx;      // filter context associated
to this input/output
outputs->pad_idx    = 0;                     // index of the filt_ctx pad
to use for linking
outputs->next       = NULL;                  // next input/output in the
list, NULL if this is the last

inputs->name = av_strdup("out");
inputs->filter_ctx = buffersink_ctx;
inputs->pad_idx    = 0;
inputs->next       = NULL;

ret = avfilter_graph_parse(filter_graph, "overlay", &inputs, &outputs,
NULL);

// Till now it looks all OK, but the following line causes the error:
// 'Output pad "default" with type video of the filter instance
"input_main_filter"
// of buffer not connected to any destination.'
ret = avfilter_graph_config(filter_graph, NULL);

I suppose, the reason is a wrong assigment of inputs/outputs.
But what exactly is wrong? What is the right way to link two ore more
inputs to a filter like the 'overlay' one? Please, help.

Andrey.
On Thu, Aug 15, 2013 at 2:43 PM, Paul B Mahol <onemda at gmail.com> wrote:

>  On 8/15/13, Andrey Mochenov <andrey2067 at gmail.com> wrote:
> > Hi,
> >
> > We are using FFmpeg libraries git-ee94362 libavformat v55.2.100.
> > Our purpose is to add watermark (semi-transparent PNG image) on the
> video.
> > The corresponding option in MMpeg application is "-vf".
> >
> > Our question: How to implement the feature using FFmpeg libraries?
>
> By using overlay filter, there are examples how to use filters with
> libraries.
>
> >
> > Andrey Mochenov.
> >
> _______________________________________________
> Libav-user mailing list
> Libav-user at ffmpeg.org
> http://ffmpeg.org/mailman/listinfo/libav-user
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://ffmpeg.org/pipermail/libav-user/attachments/20130818/a015688d/attachment.html>


More information about the Libav-user mailing list