Implement avfilter_get_video_buffer_ref_from_arrays().
Originally committed as revision 25827 to svn://svn.ffmpeg.org/ffmpeg/trunk
This commit is contained in:
parent
4723bc2868
commit
d38c340fdc
@ -12,6 +12,9 @@ libavutil: 2009-03-08
|
||||
|
||||
|
||||
API changes, most recent first:
|
||||
2010-11-22 - r25826 - 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
|
||||
|
@ -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)
|
||||
|
@ -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, \
|
||||
@ -648,6 +648,21 @@ int avfilter_config_links(AVFilterContext *filter);
|
||||
AVFilterBufferRef *avfilter_get_video_buffer(AVFilterLink *link, int perms,
|
||||
int w, int h);
|
||||
|
||||
/**
|
||||
* Create a buffer reference wrapped around an already allocated image
|
||||
* buffer.
|
||||
*
|
||||
* @param data pointers to the planes of the image to reference
|
||||
* @param linesize linesizes for the planes of the image to reference
|
||||
* @param perms the required access permissions
|
||||
* @param w the width of the image specified by the data and linesize arrays
|
||||
* @param h the height of the image specified by the data and linesize arrays
|
||||
* @param format the pixel format of the image specified by the data and linesize arrays
|
||||
*/
|
||||
AVFilterBufferRef *
|
||||
avfilter_get_video_buffer_ref_from_arrays(uint8_t *data[4], int linesize[4], int perms,
|
||||
int w, int h, enum PixelFormat format);
|
||||
|
||||
/**
|
||||
* Request an audio samples buffer with a specific set of permissions.
|
||||
*
|
||||
|
@ -37,49 +37,30 @@ void ff_avfilter_default_free_buffer(AVFilterBuffer *ptr)
|
||||
* alloc & free cycle currently implemented. */
|
||||
AVFilterBufferRef *avfilter_default_get_video_buffer(AVFilterLink *link, int perms, int w, int h)
|
||||
{
|
||||
AVFilterBuffer *pic = av_mallocz(sizeof(AVFilterBuffer));
|
||||
AVFilterBufferRef *ref = NULL;
|
||||
int i, tempsize;
|
||||
char *buf = NULL;
|
||||
int linesize[4], i, tempsize;
|
||||
uint8_t *data[4];
|
||||
AVFilterBufferRef *picref = NULL;
|
||||
|
||||
if (!pic || !(ref = av_mallocz(sizeof(AVFilterBufferRef))))
|
||||
goto fail;
|
||||
|
||||
ref->buf = pic;
|
||||
ref->video = av_mallocz(sizeof(AVFilterBufferRefVideoProps));
|
||||
ref->video->w = w;
|
||||
ref->video->h = h;
|
||||
|
||||
/* make sure the buffer gets read permission or it's useless for output */
|
||||
ref->perms = perms | AV_PERM_READ;
|
||||
|
||||
pic->refcount = 1;
|
||||
ref->format = link->format;
|
||||
pic->free = ff_avfilter_default_free_buffer;
|
||||
av_image_fill_linesizes(pic->linesize, ref->format, ref->video->w);
|
||||
|
||||
av_image_fill_linesizes(linesize, link->format, w);
|
||||
for (i = 0; i < 4; i++)
|
||||
pic->linesize[i] = FFALIGN(pic->linesize[i], 16);
|
||||
|
||||
tempsize = av_image_fill_pointers(pic->data, ref->format, ref->video->h, NULL, pic->linesize);
|
||||
linesize[i] = FFALIGN(linesize[i], 16);
|
||||
tempsize = av_image_fill_pointers(data, link->format, h, NULL, linesize);
|
||||
buf = av_malloc(tempsize + 16); // +2 is needed for swscaler, +16 to be
|
||||
// SIMD-friendly
|
||||
if (!buf)
|
||||
goto fail;
|
||||
av_image_fill_pointers(pic->data, ref->format, ref->video->h, buf, pic->linesize);
|
||||
|
||||
memcpy(ref->data, pic->data, sizeof(ref->data));
|
||||
memcpy(ref->linesize, pic->linesize, sizeof(ref->linesize));
|
||||
|
||||
return ref;
|
||||
|
||||
fail:
|
||||
av_free(buf);
|
||||
if (ref && ref->video)
|
||||
av_free(ref->video);
|
||||
av_free(ref);
|
||||
av_free(pic);
|
||||
return NULL;
|
||||
|
||||
av_image_fill_pointers(data, link->format, h, buf, linesize);
|
||||
|
||||
picref = avfilter_get_video_buffer_ref_from_arrays(data, linesize,
|
||||
perms, w, h, link->format);
|
||||
if (!picref) {
|
||||
av_free(buf);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
return picref;
|
||||
}
|
||||
|
||||
AVFilterBufferRef *avfilter_default_get_audio_buffer(AVFilterLink *link, int perms,
|
||||
|
Loading…
Reference in New Issue
Block a user