X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=libavfilter%2Fformats.c;h=33fec163a52a4e34587590be992a5f60622ca02e;hb=15fe16f4a44a2d54a4c99edb1cd7504bc7fc5871;hp=3748030c0e97f29f1665d2a727939f960d695d65;hpb=eac2495095dc2e61f8b7539e2f9e3f5de1f01120;p=ffmpeg diff --git a/libavfilter/formats.c b/libavfilter/formats.c index 3748030c0e9..33fec163a52 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); @@ -85,21 +89,17 @@ AVFilterFormats *avfilter_make_format_list(int len, ...) AVFilterFormats *avfilter_all_colorspaces(void) { - return avfilter_make_format_list(31, - 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); + 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) @@ -120,9 +120,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)); @@ -137,9 +137,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;