diff --git a/doc/APIchanges b/doc/APIchanges index ebd5faa841..63457aab7b 100644 --- a/doc/APIchanges +++ b/doc/APIchanges @@ -12,6 +12,9 @@ libavutil: 2009-03-08 API changes, most recent first: +2010-12-04 - r25878 - lavcore 1.15.0 - av_image_alloc() + Add av_image_alloc() to libavcore/imgutils.h. + 2010-12-02 - r25862 - lavfi 1.67.0 - avfilter_graph_create_filter() Add function avfilter_graph_create_filter() in avfiltergraph.h. diff --git a/libavcore/avcore.h b/libavcore/avcore.h index 3d661369b0..b19efe8cdb 100644 --- a/libavcore/avcore.h +++ b/libavcore/avcore.h @@ -27,7 +27,7 @@ #include "libavutil/avutil.h" #define LIBAVCORE_VERSION_MAJOR 0 -#define LIBAVCORE_VERSION_MINOR 14 +#define LIBAVCORE_VERSION_MINOR 15 #define LIBAVCORE_VERSION_MICRO 0 #define LIBAVCORE_VERSION_INT AV_VERSION_INT(LIBAVCORE_VERSION_MAJOR, \ diff --git a/libavcore/imgutils.c b/libavcore/imgutils.c index cf7909342d..0f449ff427 100644 --- a/libavcore/imgutils.c +++ b/libavcore/imgutils.c @@ -172,6 +172,35 @@ int ff_set_systematic_pal2(uint32_t pal[256], enum PixelFormat pix_fmt) return 0; } +int av_image_alloc(uint8_t *pointers[4], int linesizes[4], + int w, int h, enum PixelFormat pix_fmt, int align) +{ + int i, ret; + uint8_t *buf; + + if ((ret = av_image_check_size(w, h, 0, NULL)) < 0) + return ret; + if ((ret = av_image_fill_linesizes(linesizes, pix_fmt, w)) < 0) + return ret; + + for (i = 0; i < 4; i++) + linesizes[i] = FFALIGN(linesizes[i], align); + + if ((ret = av_image_fill_pointers(pointers, pix_fmt, h, NULL, linesizes)) < 0) + return ret; + buf = av_malloc(ret + align); + if (!buf) + return AVERROR(ENOMEM); + if ((ret = av_image_fill_pointers(pointers, pix_fmt, h, buf, linesizes)) < 0) { + av_free(buf); + return ret; + } + if (av_pix_fmt_descriptors[pix_fmt].flags & PIX_FMT_PAL) + ff_set_systematic_pal2((uint32_t*)pointers[1], pix_fmt); + + return ret; +} + typedef struct ImgUtils { const AVClass *class; int log_offset; diff --git a/libavcore/imgutils.h b/libavcore/imgutils.h index 8458fc6bb0..6c39d53119 100644 --- a/libavcore/imgutils.h +++ b/libavcore/imgutils.h @@ -77,6 +77,19 @@ int av_image_fill_linesizes(int linesizes[4], enum PixelFormat pix_fmt, int widt int av_image_fill_pointers(uint8_t *data[4], enum PixelFormat pix_fmt, int height, uint8_t *ptr, const int linesizes[4]); +/** + * Allocate an image with size w and h and pixel format pix_fmt, and + * fill pointers and linesizes accordingly. + * The allocated image buffer has to be freed by using + * av_freep(&pointers[0]). + * + * @param align the value to use for buffer size alignment + * @return the size in bytes required for the image buffer, a negative + * error code in case of failure + */ +int av_image_alloc(uint8_t *pointers[4], int linesizes[4], + int w, int h, enum PixelFormat pix_fmt, int align); + /** * Copy image plane from src to dst. * That is, copy "height" number of lines of "bytewidth" bytes each. diff --git a/libavfilter/avfilter.h b/libavfilter/avfilter.h index 4dea65310c..aa83a5245a 100644 --- a/libavfilter/avfilter.h +++ b/libavfilter/avfilter.h @@ -26,7 +26,7 @@ #define LIBAVFILTER_VERSION_MAJOR 1 #define LIBAVFILTER_VERSION_MINOR 67 -#define LIBAVFILTER_VERSION_MICRO 0 +#define LIBAVFILTER_VERSION_MICRO 1 #define LIBAVFILTER_VERSION_INT AV_VERSION_INT(LIBAVFILTER_VERSION_MAJOR, \ LIBAVFILTER_VERSION_MINOR, \ diff --git a/libavfilter/defaults.c b/libavfilter/defaults.c index 4a48a3aff1..aa3739cca6 100644 --- a/libavfilter/defaults.c +++ b/libavfilter/defaults.c @@ -37,26 +37,18 @@ 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) { - char *buf = NULL; - int linesize[4], i, tempsize; + int linesize[4]; uint8_t *data[4]; AVFilterBufferRef *picref = NULL; - av_image_fill_linesizes(linesize, link->format, w); - for (i = 0; i < 4; i++) - 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) + // +2 is needed for swscaler, +16 to be SIMD-friendly + if (av_image_alloc(data, linesize, w, h, link->format, 16) < 0) 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); + av_free(data[0]); return NULL; }