if (a == b)
return a;
- MERGE_FORMATS(ret, a, b, formats, format_count, AVFilterFormats, fail);
+ MERGE_FORMATS(ret, a, b, formats, nb_formats, AVFilterFormats, fail);
return ret;
fail:
if (a == b) return a;
- if (a->format_count && b->format_count) {
- MERGE_FORMATS(ret, a, b, formats, format_count, AVFilterFormats, fail);
- } else if (a->format_count) {
+ if (a->nb_formats && b->nb_formats) {
+ MERGE_FORMATS(ret, a, b, formats, nb_formats, AVFilterFormats, fail);
+ } else if (a->nb_formats) {
MERGE_REF(a, b, formats, AVFilterFormats, fail);
ret = a;
} else {
;
formats = av_mallocz(sizeof(*formats));
- if (count)
+ if (!formats)
+ return NULL;
+ if (count) {
formats->formats = av_malloc(sizeof(*formats->formats) * count);
- formats->format_count = count;
+ if (!formats->formats) {
+ av_freep(&formats);
+ return NULL;
+ }
+ }
+ formats->nb_formats = count;
memcpy(formats->formats, fmts, sizeof(*formats->formats) * count);
return formats;
\
fmts = av_realloc((*f)->list, \
sizeof(*(*f)->list) * ((*f)->nb + 1));\
- if (!fmts) \
+ if (!fmts) { \
+ av_freep(&f); \
return AVERROR(ENOMEM); \
+ } \
\
(*f)->list = fmts; \
(*f)->list[(*f)->nb++] = fmt; \
int ff_add_format(AVFilterFormats **avff, int fmt)
{
- ADD_FORMAT(avff, fmt, int, formats, format_count);
+ ADD_FORMAT(avff, fmt, int, formats, nb_formats);
}
int ff_add_channel_layout(AVFilterChannelLayouts **l, uint64_t channel_layout)
AVFilterFormats *ff_all_formats(enum AVMediaType type)
{
AVFilterFormats *ret = NULL;
- int fmt;
- int num_formats = type == AVMEDIA_TYPE_VIDEO ? AV_PIX_FMT_NB :
- type == AVMEDIA_TYPE_AUDIO ? AV_SAMPLE_FMT_NB : 0;
- for (fmt = 0; fmt < num_formats; fmt++) {
- const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(fmt);
- if ((type != AVMEDIA_TYPE_VIDEO) ||
- (type == AVMEDIA_TYPE_VIDEO && !(desc->flags & PIX_FMT_HWACCEL)))
+ if (type == AVMEDIA_TYPE_VIDEO) {
+ const AVPixFmtDescriptor *desc = NULL;
+ while ((desc = av_pix_fmt_desc_next(desc))) {
+ ff_add_format(&ret, av_pix_fmt_desc_get_id(desc));
+ }
+ } else if (type == AVMEDIA_TYPE_AUDIO) {
+ enum AVSampleFormat fmt = 0;
+ while (av_get_sample_fmt_name(fmt)) {
ff_add_format(&ret, fmt);
+ fmt++;
+ }
}
return ret;
do { \
*ref = f; \
f->refs = av_realloc(f->refs, sizeof(*f->refs) * ++f->refcount); \
+ if (!f->refs) \
+ return; \
f->refs[f->refcount-1] = ref; \
} while (0)