[FFmpeg-devel] [PATCH 1/2] libavfilter: Support the forks ABI for buffer sinks
Stefano Sabatini
stefasab at gmail.com
Fri Aug 31 23:44:50 CEST 2012
On date Friday 2012-08-31 22:38:29 +0200, Michael Niedermayer encoded:
> With this change avconv compiled against libav and linked to ffmpegs libs
> will run through the whole fate testsuite without any crashes.
> 857 tests pass, the remaining tests fail one way or another, which is
> to be expected as avconv is not a drop in replacement for ffmpeg
> The testsuite used was the ffmpeg fate testsuite, not libavs.
>
> Signed-off-by: Michael Niedermayer <michaelni at gmx.at>
> ---
> libavfilter/allfilters.c | 6 ++++++
> libavfilter/buffersink.c | 8 ++++++++
> libavfilter/sink_buffer.c | 39 ++++++++++++++++++++++++++++++++++++---
> 3 files changed, 50 insertions(+), 3 deletions(-)
>
> diff --git a/libavfilter/allfilters.c b/libavfilter/allfilters.c
> index 9e68d4c..6842ec9 100644
> --- a/libavfilter/allfilters.c
> +++ b/libavfilter/allfilters.c
> @@ -64,8 +64,11 @@ void avfilter_register_all(void)
> REGISTER_FILTER (ANULLSRC, anullsrc, asrc);
> REGISTER_FILTER (FLITE, flite, asrc);
>
> +#if !AV_HAVE_INCOMPATIBLE_FORK_ABI
> REGISTER_FILTER (ABUFFERSINK, abuffersink, asink);
> +#endif
After musing a few minutes I have to conclude that I'm lost at
correctly interpreting this:
INCOMPATIBLE (FORK ABI) => support the fork ABI, which is incompatible
or
(INCOMPATIBLE FORK) ABI => support the ABI of the incompatible fork
>From my understanding abuffersink is compiled only if has not an
incompatible (i.e. has a compatible) fork ABI, otherwise only
ffabuffersink (ff* version) is compiled in.
If this interpretation is correct then I'd suggest:
INCOMPATIBLE_FORK_ABI => !LIBAV_ABI_COMPATIBILITY, and the previous
code becomes:
#if AV_HAVE_LIBAV_ABI_COMPATIBILITY
REGISTER_FILTER (ABUFFERSINK, abuffersink, asink);
#endif
which seems easier to grasp to me.
> REGISTER_FILTER (ANULLSINK, anullsink, asink);
> + REGISTER_FILTER (FFABUFFERSINK, ffabuffersink, asink);
>
> REGISTER_FILTER (ALPHAEXTRACT, alphaextract, vf);
> REGISTER_FILTER (ALPHAMERGE, alphamerge, vf);
> @@ -140,7 +143,10 @@ void avfilter_register_all(void)
> REGISTER_FILTER (SMPTEBARS, smptebars, vsrc);
> REGISTER_FILTER (TESTSRC, testsrc, vsrc);
>
> +#if !AV_HAVE_INCOMPATIBLE_FORK_ABI
> REGISTER_FILTER (BUFFERSINK, buffersink, vsink);
> +#endif
> + REGISTER_FILTER (FFBUFFERSINK,ffbuffersink,vsink);
> REGISTER_FILTER (NULLSINK, nullsink, vsink);
>
> /* multimedia filters */
> diff --git a/libavfilter/buffersink.c b/libavfilter/buffersink.c
> index e66a099..50cd6d4 100644
> --- a/libavfilter/buffersink.c
> +++ b/libavfilter/buffersink.c
> @@ -141,7 +141,11 @@ int av_buffersink_read_samples(AVFilterContext *ctx, AVFilterBufferRef **pbuf,
> }
>
> AVFilter avfilter_vsink_buffer = {
> +#if AV_HAVE_INCOMPATIBLE_FORK_ABI
> + .name = "buffersink",
> +#else
> .name = "buffersink_old",
> +#endif
> .description = NULL_IF_CONFIG_SMALL("Buffer video frames, and make them available to the end of the filter graph."),
> .priv_size = sizeof(BufferSinkContext),
> .uninit = uninit,
> @@ -156,7 +160,11 @@ AVFilter avfilter_vsink_buffer = {
> };
>
> AVFilter avfilter_asink_abuffer = {
> +#if AV_HAVE_INCOMPATIBLE_FORK_ABI
> + .name = "abuffersink",
> +#else
> .name = "abuffersink_old",
> +#endif
> .description = NULL_IF_CONFIG_SMALL("Buffer audio frames, and make them available to the end of the filter graph."),
> .priv_size = sizeof(BufferSinkContext),
> .uninit = uninit,
> diff --git a/libavfilter/sink_buffer.c b/libavfilter/sink_buffer.c
> index 95ba590..81bded0 100644
> --- a/libavfilter/sink_buffer.c
> +++ b/libavfilter/sink_buffer.c
> @@ -143,7 +143,7 @@ int av_buffersink_get_buffer_ref(AVFilterContext *ctx,
> int ret;
> *bufref = NULL;
>
> - av_assert0(!strcmp(ctx->filter->name, "buffersink") || !strcmp(ctx->filter->name, "abuffersink"));
> + av_assert0(!strcmp(ctx->filter->name, "buffersink") || !strcmp(ctx->filter->name, "abuffersink") || !strcmp(ctx->filter->name, "ffbuffersink") || !strcmp(ctx->filter->name, "ffabuffersink"));
Nit: please split overly long line (and vertical align may help
readability), same below.
>
> /* no picref available, fetch it from the filterchain */
> if (!av_fifo_size(buf->fifo)) {
> @@ -166,7 +166,7 @@ int av_buffersink_get_buffer_ref(AVFilterContext *ctx,
>
> AVRational av_buffersink_get_frame_rate(AVFilterContext *ctx)
> {
> - av_assert0(!strcmp(ctx->filter->name, "buffersink"));
> + av_assert0(!strcmp(ctx->filter->name, "buffersink") || !strcmp(ctx->filter->name, "ffbuffersink"));
>
> return ctx->inputs[0]->frame_rate;
> }
> @@ -176,7 +176,7 @@ int av_buffersink_poll_frame(AVFilterContext *ctx)
> BufferSinkContext *buf = ctx->priv;
> AVFilterLink *inlink = ctx->inputs[0];
>
> - av_assert0(!strcmp(ctx->filter->name, "buffersink") || !strcmp(ctx->filter->name, "abuffersink"));
> + av_assert0(!strcmp(ctx->filter->name, "buffersink") || !strcmp(ctx->filter->name, "abuffersink") || !strcmp(ctx->filter->name, "ffbuffersink") || !strcmp(ctx->filter->name, "ffabuffersink"));
> return av_fifo_size(buf->fifo)/sizeof(AVFilterBufferRef *) + ff_poll_frame(inlink);
> }
--
FFmpeg = Foolish and Fast Mournful Pitiless Enhancing Gem
More information about the ffmpeg-devel
mailing list