[FFmpeg-devel] [PATCH 1/4] Implement avfilter_ref_video_buffer().
Stefano Sabatini
stefano.sabatini-lala
Thu Nov 25 21:49:23 CET 2010
On date Thursday 2010-11-25 20:34:42 +0100, Michael Niedermayer encoded:
> On Thu, Nov 25, 2010 at 07:36:37PM +0100, Stefano Sabatini wrote:
> > On date Thursday 2010-11-25 17:15:42 +0100, Michael Niedermayer encoded:
> > > On Wed, Nov 24, 2010 at 07:20:28PM +0100, Stefano Sabatini wrote:
> > > > On date Wednesday 2010-11-24 17:03:41 +0100, Michael Niedermayer encoded:
> > > > > On Tue, Nov 23, 2010 at 11:23:58PM +0100, Stefano Sabatini wrote:
> > > > > > On date Tuesday 2010-11-23 23:11:46 +0100, Michael Niedermayer encoded:
> > > > > > > On Tue, Nov 23, 2010 at 12:56:33AM +0100, Stefano Sabatini wrote:
> > > [...]
> > > > > > > > This change also requires to make public the
> > > ^^^^^^^^^^^^^^^^^^^^^^^
> > >
> > > > > > > > avfilter_default_free_buffer() function, as in the attached patch.
> > > > > > >
> > > > > > > why?
> > > ^^^^
> > >
> > > > > >
> > > > > > I prefer to place the callback for freeing the buffer in the library
> > > > > > code,
> > > > >
> > > > > my question was "why make it public" not "why in the lib" sorry if that was
> > > > > unclear
> > > >
> > > > That's completely indifferent to me, and since it is currently
> > > > non-used in application code maybe it's even better to declare them
> > > ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
> > >
> > > IMHO if its not needed for anything then we should not make it public.
> > > The function pointer comparission bugs we had with the matching function
> > > for AVPacket cant happen if the function is not public ...
> >
> > Updated.
> > --
> > FFmpeg = Fucking and Fundamentalist Mean Portentous Efficient Gem
>
> > defaults.c | 7 ++++---
> > internal.h | 3 +++
> > 2 files changed, 7 insertions(+), 3 deletions(-)
> > 9c8a5b3e04d4ba568dd100d8228edce2080b61a8 0001-Make-avfilter_default_free_buffer-an-internal-shared.patch
> > From e1803ceb2686f47a3452d703eaa6a74d636845fa Mon Sep 17 00:00:00 2001
> > From: Stefano Sabatini <stefano.sabatini-lala at poste.it>
> > Date: Tue, 23 Nov 2010 00:39:57 +0100
> > Subject: [PATCH] Make avfilter_default_free_buffer() an internal shared symbol, so that
> > it can be referenced outside defaults.c.
> >
> > ---
> > libavfilter/defaults.c | 7 ++++---
> > libavfilter/internal.h | 3 +++
> > 2 files changed, 7 insertions(+), 3 deletions(-)
> >
> > diff --git a/libavfilter/defaults.c b/libavfilter/defaults.c
> > index c7b4b47..e895ccd 100644
> > --- a/libavfilter/defaults.c
> > +++ b/libavfilter/defaults.c
> > @@ -23,9 +23,10 @@
> > #include "libavcore/imgutils.h"
> > #include "libavcore/samplefmt.h"
> > #include "avfilter.h"
> > +#include "internal.h"
> >
> > /* TODO: buffer pool. see comment for avfilter_default_get_video_buffer() */
> > -static void avfilter_default_free_buffer(AVFilterBuffer *ptr)
> > +void ff_avfilter_default_free_buffer(AVFilterBuffer *ptr)
> > {
> > av_free(ptr->data[0]);
> > av_free(ptr);
> > @@ -54,7 +55,7 @@ AVFilterBufferRef *avfilter_default_get_video_buffer(AVFilterLink *link, int per
> >
> > pic->refcount = 1;
> > ref->format = link->format;
> > - pic->free = avfilter_default_free_buffer;
> > + pic->free = ff_avfilter_default_free_buffer;
> > av_image_fill_linesizes(pic->linesize, ref->format, ref->video->w);
> >
> > for (i = 0; i < 4; i++)
> > @@ -108,7 +109,7 @@ AVFilterBufferRef *avfilter_default_get_audio_buffer(AVFilterLink *link, int per
> > ref->perms = perms | AV_PERM_READ;
> >
> > samples->refcount = 1;
> > - samples->free = avfilter_default_free_buffer;
> > + samples->free = ff_avfilter_default_free_buffer;
> >
> > sample_size = av_get_bits_per_sample_fmt(sample_fmt) >>3;
> > chans_nb = av_get_channel_layout_nb_channels(channel_layout);
> > diff --git a/libavfilter/internal.h b/libavfilter/internal.h
> > index 37d085d..8f352ef 100644
> > --- a/libavfilter/internal.h
> > +++ b/libavfilter/internal.h
> > @@ -57,4 +57,7 @@ int ff_avfilter_graph_config_links(AVFilterGraph *graphctx, AVClass *log_ctx);
> > */
> > int ff_avfilter_graph_config_formats(AVFilterGraph *graphctx, AVClass *log_ctx);
> >
> > +/** default handler for freeing audio/video buffer when there are no references left */
> > +void ff_avfilter_default_free_buffer(AVFilterBuffer *buf);
> > +
> > #endif /* AVFILTER_INTERNAL_H */
> > --
> > 1.7.1
> >
>
> > doc/APIchanges | 3 +++
> > libavfilter/avfilter.c | 40 ++++++++++++++++++++++++++++++++++++++++
> > libavfilter/avfilter.h | 17 ++++++++++++++++-
> > libavfilter/defaults.c | 49 +++++++++++++++----------------------------------
> > 4 files changed, 74 insertions(+), 35 deletions(-)
> > 8214b1e48338970fe326f52d772e75ea7978d8db 0002-Implement-avfilter_get_video_buffer_ref_from_arrays.patch
> > From 6fe8c905545f40275199e8e87ef3effdb19f8170 Mon Sep 17 00:00:00 2001
> > From: Stefano Sabatini <stefano.sabatini-lala at poste.it>
> > Date: Mon, 1 Nov 2010 15:31:50 +0100
> > Subject: [PATCH] Implement avfilter_get_video_buffer_ref_from_arrays().
> >
> > ---
> > doc/APIchanges | 3 ++
> > libavfilter/avfilter.c | 40 +++++++++++++++++++++++++++++++++++++++
> > libavfilter/avfilter.h | 17 +++++++++++++++-
> > libavfilter/defaults.c | 49 ++++++++++++++---------------------------------
> > 4 files changed, 74 insertions(+), 35 deletions(-)
> >
> > diff --git a/doc/APIchanges b/doc/APIchanges
> > index 8a3a938..7573d99 100644
> > --- a/doc/APIchanges
> > +++ b/doc/APIchanges
> > @@ -12,6 +12,9 @@ libavutil: 2009-03-08
> >
> >
> > API changes, most recent first:
> > +2010-11-22 - r25804 - lavfi 1.65.0 - avfilter_get_video_buffer_ref_from_arrays()
> > + Add function avfilter_get_video_buffer_ref_from_arrays() in
> > + avfilter.h.
> >
> > 2010-11-21 - r25787 - lavcore 0.14.0 - audioconvert.h
> > Add a public audio channel API in audioconvert.h, and deprecate the
> > diff --git a/libavfilter/avfilter.c b/libavfilter/avfilter.c
> > index a761c81..6146a3a 100644
> > --- a/libavfilter/avfilter.c
> > +++ b/libavfilter/avfilter.c
> > @@ -267,6 +267,46 @@ AVFilterBufferRef *avfilter_get_video_buffer(AVFilterLink *link, int perms, int
> > return ret;
> > }
> >
> > +AVFilterBufferRef *
> > +avfilter_get_video_buffer_ref_from_arrays(uint8_t *data[4], int linesize[4], int perms,
> > + int w, int h, enum PixelFormat format)
> > +{
> > + AVFilterBuffer *pic = av_mallocz(sizeof(AVFilterBuffer));
> > + AVFilterBufferRef *picref = av_mallocz(sizeof(AVFilterBufferRef));
> > +
> > + if (!pic || !picref)
> > + goto fail;
> > +
> > + picref->buf = pic;
> > + picref->buf->free = ff_avfilter_default_free_buffer;
> > + if (!(picref->video = av_mallocz(sizeof(AVFilterBufferRefVideoProps))))
> > + goto fail;
> > +
> > + picref->video->w = w;
> > + picref->video->h = h;
> > +
> > + /* make sure the buffer gets read permission or it's useless for output */
> > + picref->perms = perms | AV_PERM_READ;
> > +
> > + pic->refcount = 1;
> > + picref->type = AVMEDIA_TYPE_VIDEO;
> > + picref->format = format;
> > +
> > + memcpy(pic->data, data, sizeof(pic->data));
> > + memcpy(pic->linesize, linesize, sizeof(pic->linesize));
> > + memcpy(picref->data, pic->data, sizeof(picref->data));
> > + memcpy(picref->linesize, pic->linesize, sizeof(picref->linesize));
> > +
> > + return picref;
> > +
> > +fail:
> > + if (picref && picref->video)
> > + av_free(picref->video);
> > + av_free(picref);
> > + av_free(pic);
> > + return NULL;
> > +}
> > +
> > AVFilterBufferRef *avfilter_get_audio_buffer(AVFilterLink *link, int perms,
> > enum AVSampleFormat sample_fmt, int size,
> > int64_t channel_layout, int planar)
> > diff --git a/libavfilter/avfilter.h b/libavfilter/avfilter.h
> > index f49a523..8c9092c 100644
> > --- a/libavfilter/avfilter.h
> > +++ b/libavfilter/avfilter.h
> > @@ -25,7 +25,7 @@
> > #include "libavutil/avutil.h"
> >
> > #define LIBAVFILTER_VERSION_MAJOR 1
> > -#define LIBAVFILTER_VERSION_MINOR 64
> > +#define LIBAVFILTER_VERSION_MINOR 65
> > #define LIBAVFILTER_VERSION_MICRO 0
> >
> > #define LIBAVFILTER_VERSION_INT AV_VERSION_INT(LIBAVFILTER_VERSION_MAJOR, \
>
> > @@ -649,6 +649,21 @@ AVFilterBufferRef *avfilter_get_video_buffer(AVFilterLink *link, int perms,
> > int w, int h);
> >
> > /**
> > + * Create a buffer reference wrapped around an already allocated video
> > + * buffer.
>
> image, picture whatever, not video please
>
>
> > + *
> > + * @param data pointers to the planes of the video buffer to reference
>
> same
>
>
> > + * @param linesize linesizes for the planes of the video buffer to reference
>
> same
>
> otherwise patches should be ok
OK thanks, applied.
--
FFmpeg = Friendly & Fundamentalist Merciless Practical Elegant Gospel
More information about the ffmpeg-devel
mailing list