From 7e350379f87e7f74420b4813170fe808e2313911 Mon Sep 17 00:00:00 2001 From: Anton Khirnov Date: Wed, 28 Nov 2012 08:41:07 +0100 Subject: lavfi: switch to AVFrame. Deprecate AVFilterBuffer/AVFilterBufferRef and everything related to it and use AVFrame instead. --- libavfilter/video.c | 89 +++++++++++++---------------------------------------- 1 file changed, 21 insertions(+), 68 deletions(-) (limited to 'libavfilter/video.c') diff --git a/libavfilter/video.c b/libavfilter/video.c index cb68ca4162..23bf867a82 100644 --- a/libavfilter/video.c +++ b/libavfilter/video.c @@ -19,6 +19,7 @@ #include #include +#include "libavutil/buffer.h" #include "libavutil/imgutils.h" #include "libavutil/mem.h" @@ -26,77 +27,34 @@ #include "internal.h" #include "video.h" -#ifdef DEBUG -static char *ff_get_ref_perms_string(char *buf, size_t buf_size, int perms) +AVFrame *ff_null_get_video_buffer(AVFilterLink *link, int w, int h) { - snprintf(buf, buf_size, "%s%s%s%s%s%s", - perms & AV_PERM_READ ? "r" : "", - perms & AV_PERM_WRITE ? "w" : "", - perms & AV_PERM_PRESERVE ? "p" : "", - perms & AV_PERM_REUSE ? "u" : "", - perms & AV_PERM_REUSE2 ? "U" : "", - perms & AV_PERM_NEG_LINESIZES ? "n" : ""); - return buf; -} -#endif - -static void ff_dlog_ref(void *ctx, AVFilterBufferRef *ref, int end) -{ - av_unused char buf[16]; - av_dlog(ctx, - "ref[%p buf:%p refcount:%d perms:%s data:%p linesize[%d, %d, %d, %d] pts:%"PRId64" pos:%"PRId64, - ref, ref->buf, ref->buf->refcount, ff_get_ref_perms_string(buf, sizeof(buf), ref->perms), ref->data[0], - ref->linesize[0], ref->linesize[1], ref->linesize[2], ref->linesize[3], - ref->pts, ref->pos); - - if (ref->video) { - av_dlog(ctx, " a:%d/%d s:%dx%d i:%c iskey:%d type:%c", - ref->video->pixel_aspect.num, ref->video->pixel_aspect.den, - ref->video->w, ref->video->h, - !ref->video->interlaced ? 'P' : /* Progressive */ - ref->video->top_field_first ? 'T' : 'B', /* Top / Bottom */ - ref->video->key_frame, - av_get_picture_type_char(ref->video->pict_type)); - } - if (ref->audio) { - av_dlog(ctx, " cl:%"PRId64"d n:%d r:%d p:%d", - ref->audio->channel_layout, - ref->audio->nb_samples, - ref->audio->sample_rate, - ref->audio->planar); - } - - av_dlog(ctx, "]%s", end ? "\n" : ""); -} - -AVFilterBufferRef *ff_null_get_video_buffer(AVFilterLink *link, int perms, int w, int h) -{ - return ff_get_video_buffer(link->dst->outputs[0], perms, w, h); + return ff_get_video_buffer(link->dst->outputs[0], w, h); } /* TODO: set the buffer's priv member to a context structure for the whole * filter chain. This will allow for a buffer pool instead of the constant * alloc & free cycle currently implemented. */ -AVFilterBufferRef *ff_default_get_video_buffer(AVFilterLink *link, int perms, int w, int h) +AVFrame *ff_default_get_video_buffer(AVFilterLink *link, int w, int h) { - int linesize[4]; - uint8_t *data[4]; - AVFilterBufferRef *picref = NULL; + AVFrame *frame = av_frame_alloc(); + int ret; - // +2 is needed for swscaler, +16 to be SIMD-friendly - if (av_image_alloc(data, linesize, w, h, link->format, 16) < 0) + if (!frame) return NULL; - picref = avfilter_get_video_buffer_ref_from_arrays(data, linesize, - perms, w, h, link->format); - if (!picref) { - av_free(data[0]); - return NULL; - } + frame->width = w; + frame->height = h; + frame->format = link->format; - return picref; + ret = av_frame_get_buffer(frame, 32); + if (ret < 0) + av_frame_free(&frame); + + return frame; } +#if FF_API_AVFILTERBUFFER AVFilterBufferRef * avfilter_get_video_buffer_ref_from_arrays(uint8_t *data[4], int linesize[4], int perms, int w, int h, enum AVPixelFormat format) @@ -141,25 +99,20 @@ fail: av_free(pic); return NULL; } +#endif -AVFilterBufferRef *ff_get_video_buffer(AVFilterLink *link, int perms, int w, int h) +AVFrame *ff_get_video_buffer(AVFilterLink *link, int w, int h) { - AVFilterBufferRef *ret = NULL; + AVFrame *ret = NULL; av_unused char buf[16]; FF_DPRINTF_START(NULL, get_video_buffer); ff_dlog_link(NULL, link, 0); - av_dlog(NULL, " perms:%s w:%d h:%d\n", ff_get_ref_perms_string(buf, sizeof(buf), perms), w, h); if (link->dstpad->get_video_buffer) - ret = link->dstpad->get_video_buffer(link, perms, w, h); + ret = link->dstpad->get_video_buffer(link, w, h); if (!ret) - ret = ff_default_get_video_buffer(link, perms, w, h); - - if (ret) - ret->type = AVMEDIA_TYPE_VIDEO; - - FF_DPRINTF_START(NULL, get_video_buffer); ff_dlog_link(NULL, link, 0); av_dlog(NULL, " returning "); ff_dlog_ref(NULL, ret, 1); + ret = ff_default_get_video_buffer(link, w, h); return ret; } -- cgit v1.2.3