return 0;
}
-#define COPY_INT_LIST(list_copy, list, type) { \
- int count = 0; \
- if (list) \
- for (count = 0; list[count] != -1; count++) \
- ; \
- list_copy = av_calloc(count+1, sizeof(type)); \
- if (list_copy) { \
- memcpy(list_copy, list, sizeof(type) * count); \
- list_copy[count] = -1; \
- } \
-}
-
#define MAKE_FORMAT_LIST(type, field, count_field) \
type *formats; \
int count = 0; \
if (!(*f) && !(*f = av_mallocz(sizeof(**f)))) \
return AVERROR(ENOMEM); \
\
- fmts = av_realloc((*f)->list, \
- sizeof(*(*f)->list) * ((*f)->nb + 1));\
+ fmts = av_realloc_array((*f)->list, (*f)->nb + 1, \
+ sizeof(*(*f)->list)); \
if (!fmts) { \
if (!oldf) \
av_freep(f); \
return ret;
}
-#define FORMATS_REF(f, ref) \
-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)
-
-void ff_channel_layouts_ref(AVFilterChannelLayouts *f, AVFilterChannelLayouts **ref)
+#define FORMATS_REF(f, ref) \
+ void *tmp; \
+ \
+ if (!ref) \
+ return AVERROR_BUG; \
+ \
+ tmp = av_realloc_array(f->refs, sizeof(*f->refs), f->refcount + 1); \
+ if (!tmp) \
+ return AVERROR(ENOMEM); \
+ f->refs = tmp; \
+ f->refs[f->refcount++] = ref; \
+ *ref = f; \
+ return 0
+
+int ff_channel_layouts_ref(AVFilterChannelLayouts *f, AVFilterChannelLayouts **ref)
{
FORMATS_REF(f, ref);
}
-void ff_formats_ref(AVFilterFormats *f, AVFilterFormats **ref)
+int ff_formats_ref(AVFilterFormats *f, AVFilterFormats **ref)
{
FORMATS_REF(f, ref);
}
}
#define SET_COMMON_FORMATS(ctx, fmts, in_fmts, out_fmts, ref, list) \
-if (fmts) { \
int count = 0, i; \
\
+ if (!fmts) \
+ return AVERROR_BUG; \
+ \
for (i = 0; i < ctx->nb_inputs; i++) { \
if (ctx->inputs[i] && !ctx->inputs[i]->out_fmts) { \
- ref(fmts, &ctx->inputs[i]->out_fmts); \
+ int ret = ref(fmts, &ctx->inputs[i]->out_fmts); \
+ if (ret < 0) \
+ return ret; \
count++; \
} \
} \
for (i = 0; i < ctx->nb_outputs; i++) { \
if (ctx->outputs[i] && !ctx->outputs[i]->in_fmts) { \
- ref(fmts, &ctx->outputs[i]->in_fmts); \
+ int ret = ref(fmts, &ctx->outputs[i]->in_fmts); \
+ if (ret < 0) \
+ return ret; \
count++; \
} \
} \
av_freep(&fmts->refs); \
av_freep(&fmts); \
} \
-}
+ \
+ return 0;
-void ff_set_common_channel_layouts(AVFilterContext *ctx,
- AVFilterChannelLayouts *layouts)
+int ff_set_common_channel_layouts(AVFilterContext *ctx,
+ AVFilterChannelLayouts *layouts)
{
SET_COMMON_FORMATS(ctx, layouts, in_channel_layouts, out_channel_layouts,
ff_channel_layouts_ref, channel_layouts);
}
-void ff_set_common_samplerates(AVFilterContext *ctx,
- AVFilterFormats *samplerates)
+int ff_set_common_samplerates(AVFilterContext *ctx,
+ AVFilterFormats *samplerates)
{
SET_COMMON_FORMATS(ctx, samplerates, in_samplerates, out_samplerates,
ff_formats_ref, formats);
* formats. If there are no links hooked to this filter, the list of formats is
* freed.
*/
-void ff_set_common_formats(AVFilterContext *ctx, AVFilterFormats *formats)
+int ff_set_common_formats(AVFilterContext *ctx, AVFilterFormats *formats)
{
SET_COMMON_FORMATS(ctx, formats, in_formats, out_formats,
ff_formats_ref, formats);
static int default_query_formats_common(AVFilterContext *ctx,
AVFilterChannelLayouts *(layouts)(void))
{
+ int ret;
enum AVMediaType type = ctx->inputs && ctx->inputs [0] ? ctx->inputs [0]->type :
ctx->outputs && ctx->outputs[0] ? ctx->outputs[0]->type :
AVMEDIA_TYPE_VIDEO;
- ff_set_common_formats(ctx, ff_all_formats(type));
+ ret = ff_set_common_formats(ctx, ff_all_formats(type));
+ if (ret < 0)
+ return ret;
if (type == AVMEDIA_TYPE_AUDIO) {
- ff_set_common_channel_layouts(ctx, layouts());
- ff_set_common_samplerates(ctx, ff_all_samplerates());
+ ret = ff_set_common_channel_layouts(ctx, layouts());
+ if (ret < 0)
+ return ret;
+ ret = ff_set_common_samplerates(ctx, ff_all_samplerates());
+ if (ret < 0)
+ return ret;
}
return 0;