X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=libavfilter%2Fformats.c;h=2a9bdb0bd0600b7001651ad8b49be709a5cfe3c7;hb=98137a1a5b1a4438ab4d84e63a957dc83c7dacaf;hp=bd8ce6258fae0f4f25b86eefd0907a648dab26cb;hpb=243370cb4dec0b1620cf741f71e5225c21060ffd;p=ffmpeg diff --git a/libavfilter/formats.c b/libavfilter/formats.c index bd8ce6258fa..2a9bdb0bd06 100644 --- a/libavfilter/formats.c +++ b/libavfilter/formats.c @@ -19,8 +19,26 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ +#include "libavutil/pixdesc.h" #include "avfilter.h" +/** + * Add all refs from a to ret and destroy a. + */ +static void merge_ref(AVFilterFormats *ret, AVFilterFormats *a) +{ + int i; + + for(i = 0; i < a->refcount; i ++) { + ret->refs[ret->refcount] = a->refs[i]; + *ret->refs[ret->refcount++] = ret; + } + + av_free(a->refs); + av_free(a->formats); + av_free(a); +} + AVFilterFormats *avfilter_merge_formats(AVFilterFormats *a, AVFilterFormats *b) { AVFilterFormats *ret; @@ -36,72 +54,65 @@ AVFilterFormats *avfilter_merge_formats(AVFilterFormats *a, AVFilterFormats *b) if(a->formats[i] == b->formats[j]) ret->formats[k++] = a->formats[i]; + ret->format_count = k; /* check that there was at least one common format */ - if(!(ret->format_count = k)) { + if(!ret->format_count) { av_free(ret->formats); av_free(ret); return NULL; } - /* merge and update all the references */ ret->refs = av_malloc(sizeof(AVFilterFormats**)*(a->refcount+b->refcount)); - for(i = 0; i < a->refcount; i ++) { - ret->refs[ret->refcount] = a->refs[i]; - *ret->refs[ret->refcount++] = ret; - } - for(i = 0; i < b->refcount; i ++) { - ret->refs[ret->refcount] = b->refs[i]; - *ret->refs[ret->refcount++] = ret; - } - av_free(a->refs); - av_free(a->formats); - av_free(a); - - av_free(b->refs); - av_free(b->formats); - av_free(b); + merge_ref(ret, a); + merge_ref(ret, b); return ret; } -AVFilterFormats *avfilter_make_format_list(int len, ...) +AVFilterFormats *avfilter_make_format_list(const enum PixelFormat *pix_fmts) { - AVFilterFormats *ret; - int i; - va_list vl; + AVFilterFormats *formats; + int count; - ret = av_mallocz(sizeof(AVFilterFormats)); - ret->formats = av_malloc(sizeof(*ret->formats) * len); - ret->format_count = len; + for (count = 0; pix_fmts[count] != PIX_FMT_NONE; count++) + ; - va_start(vl, len); - for(i = 0; i < len; i ++) - ret->formats[i] = va_arg(vl, int); - va_end(vl); + formats = av_mallocz(sizeof(AVFilterFormats)); + formats->formats = av_malloc(sizeof(*formats->formats) * count); + formats->format_count = count; + memcpy(formats->formats, pix_fmts, sizeof(*formats->formats) * count); - return ret; + return formats; +} + +int avfilter_add_colorspace(AVFilterFormats **avff, enum PixelFormat pix_fmt) +{ + enum PixelFormat *pix_fmts; + + if (!(*avff) && !(*avff = av_mallocz(sizeof(AVFilterFormats)))) + return AVERROR(ENOMEM); + + pix_fmts = av_realloc((*avff)->formats, + sizeof((*avff)->formats) * ((*avff)->format_count+1)); + if (!pix_fmts) + return AVERROR(ENOMEM); + + (*avff)->formats = pix_fmts; + (*avff)->formats[(*avff)->format_count++] = pix_fmt; + return 0; } AVFilterFormats *avfilter_all_colorspaces(void) { - return avfilter_make_format_list(35, - PIX_FMT_YUV444P, PIX_FMT_YUV422P, PIX_FMT_YUV420P, - PIX_FMT_YUV411P, PIX_FMT_YUV410P, - PIX_FMT_YUYV422, PIX_FMT_UYVY422, PIX_FMT_UYYVYY411, - PIX_FMT_YUVJ444P, PIX_FMT_YUVJ422P, PIX_FMT_YUVJ420P, - PIX_FMT_YUV440P, PIX_FMT_YUVJ440P, - PIX_FMT_RGB32, PIX_FMT_BGR32, - PIX_FMT_RGB32_1, PIX_FMT_BGR32_1, - PIX_FMT_RGB24, PIX_FMT_BGR24, - PIX_FMT_RGB565, PIX_FMT_BGR565, - PIX_FMT_RGB555, PIX_FMT_BGR555, - PIX_FMT_RGB8, PIX_FMT_BGR8, - PIX_FMT_RGB4_BYTE,PIX_FMT_BGR4_BYTE, - PIX_FMT_GRAY16BE, PIX_FMT_GRAY16LE, - PIX_FMT_GRAY8, PIX_FMT_PAL8, - PIX_FMT_MONOWHITE,PIX_FMT_MONOBLACK, - PIX_FMT_NV12, PIX_FMT_NV21); + AVFilterFormats *ret = NULL; + enum PixelFormat pix_fmt; + + for (pix_fmt = 0; pix_fmt < PIX_FMT_NB; pix_fmt++) + if (!(av_pix_fmt_descriptors[pix_fmt].flags & PIX_FMT_HWACCEL)) + avfilter_add_colorspace(&ret, pix_fmt); + + return ret; } void avfilter_formats_ref(AVFilterFormats *f, AVFilterFormats **ref) @@ -124,7 +135,12 @@ void avfilter_formats_unref(AVFilterFormats **ref) { int idx; - if((idx = find_ref_index(ref)) >= 0) + if (!*ref) + return; + + idx = find_ref_index(ref); + + if(idx >= 0) memmove((*ref)->refs + idx, (*ref)->refs + idx+1, sizeof(AVFilterFormats**) * ((*ref)->refcount-idx-1)); @@ -139,9 +155,9 @@ void avfilter_formats_unref(AVFilterFormats **ref) void avfilter_formats_changeref(AVFilterFormats **oldref, AVFilterFormats **newref) { - int idx; + int idx = find_ref_index(oldref); - if((idx = find_ref_index(oldref)) >= 0) { + if(idx >= 0) { (*oldref)->refs[idx] = newref; *newref = *oldref; *oldref = NULL;