X-Git-Url: http://git.ffmpeg.org/gitweb/ffmpeg.git/blobdiff_plain/5ced2c996dff65fff7a0f5221794efa0155e52c4..f6a1fa850af7ab031708737be417f6c94c53799a:/libavfilter/formats.c diff --git a/libavfilter/formats.c b/libavfilter/formats.c index c237c8a..3a44cfd 100644 --- a/libavfilter/formats.c +++ b/libavfilter/formats.c @@ -21,6 +21,23 @@ #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; @@ -29,38 +46,25 @@ AVFilterFormats *avfilter_merge_formats(AVFilterFormats *a, AVFilterFormats *b) ret = av_mallocz(sizeof(AVFilterFormats)); /* merge list of formats */ - ret->formats = av_malloc(sizeof(int) * FFMIN(a->format_count, - b->format_count)); + ret->formats = av_malloc(sizeof(*ret->formats) * FFMIN(a->format_count, + b->format_count)); for(i = 0; i < a->format_count; i ++) for(j = 0; j < b->format_count; j ++) 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; } @@ -72,7 +76,7 @@ AVFilterFormats *avfilter_make_format_list(int len, ...) va_list vl; ret = av_mallocz(sizeof(AVFilterFormats)); - ret->formats = av_malloc(sizeof(int) * len); + ret->formats = av_malloc(sizeof(*ret->formats) * len); ret->format_count = len; va_start(vl, len); @@ -83,25 +87,35 @@ AVFilterFormats *avfilter_make_format_list(int len, ...) return ret; } +AVFilterFormats *avfilter_make_format_list2(enum PixelFormat *pix_fmt) +{ + AVFilterFormats *formats; + int count; + + for (count = 0; pix_fmt[count] != PIX_FMT_NONE; count++) + ; + + formats = av_mallocz(sizeof(AVFilterFormats)); + formats->formats = av_malloc(sizeof(*formats->formats) * count); + formats->format_count = count; + memcpy(formats->formats, pix_fmt, sizeof(*formats->formats) * count); + + return formats; +} + 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; + int i; + + ret = av_mallocz(sizeof(AVFilterFormats)); + ret->formats = av_malloc(sizeof(*ret->formats) * PIX_FMT_NB); + ret->format_count = PIX_FMT_NB; + + for(i = 0; i < PIX_FMT_NB; i ++) + ret->formats[i] = i; + + return ret; } void avfilter_formats_ref(AVFilterFormats *f, AVFilterFormats **ref) @@ -122,9 +136,9 @@ static int find_ref_index(AVFilterFormats **ref) void avfilter_formats_unref(AVFilterFormats **ref) { - int idx; + int idx = find_ref_index(ref); - if((idx = find_ref_index(ref)) >= 0) + if(idx >= 0) memmove((*ref)->refs + idx, (*ref)->refs + idx+1, sizeof(AVFilterFormats**) * ((*ref)->refcount-idx-1)); @@ -139,9 +153,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;