summaryrefslogtreecommitdiffstats
path: root/libavfilter/formats.c
diff options
context:
space:
mode:
authorGanesh Ajjanagadde <gajjanagadde@gmail.com>2015-10-04 23:39:25 -0400
committerGanesh Ajjanagadde <gajjanagadde@gmail.com>2015-10-14 10:04:01 -0400
commit6aaac24d72a7da631173209841a3944fcb4a3309 (patch)
tree4b475e1648073cd36acad767e54486722ac3c15f /libavfilter/formats.c
parent8ededd583622359062622cf008144a1511d50bbd (diff)
downloadffmpeg-streaming-6aaac24d72a7da631173209841a3944fcb4a3309.zip
ffmpeg-streaming-6aaac24d72a7da631173209841a3944fcb4a3309.tar.gz
avfilter/all: propagate errors of functions from avfilter/formats
Many of the functions from avfilter/formats can return errors, usually AVERROR(ENOMEM). This propagates the return values. All of these were found by using av_warn_unused_result, demonstrating its utility. Tested with FATE. I am least sure of the changes to avfilter/filtergraph, since I don't know what/how reduce_format is intended to behave and how it should react to errors. Fixes: CID 1325680, 1325679, 1325678. Reviewed-by: Michael Niedermayer <michael@niedermayer.cc> Previous version Reviewed-by: Nicolas George <george@nsup.org> Previous version Reviewed-by: Clément Bœsch <u@pkh.me> Signed-off-by: Ganesh Ajjanagadde <gajjanagadde@gmail.com>
Diffstat (limited to 'libavfilter/formats.c')
-rw-r--r--libavfilter/formats.c56
1 files changed, 34 insertions, 22 deletions
diff --git a/libavfilter/formats.c b/libavfilter/formats.c
index a28be60..2b13cbf 100644
--- a/libavfilter/formats.c
+++ b/libavfilter/formats.c
@@ -300,17 +300,20 @@ AVFilterChannelLayouts *avfilter_make_format64_list(const int64_t *fmts)
return formats;
}
-#define ADD_FORMAT(f, fmt, type, list, nb) \
+#define ADD_FORMAT(f, fmt, unref_fn, type, list, nb) \
do { \
type *fmts; \
void *oldf = *f; \
\
- if (!(*f) && !(*f = av_mallocz(sizeof(**f)))) \
+ if (!(*f) && !(*f = av_mallocz(sizeof(**f)))) { \
+ unref_fn(f); \
return AVERROR(ENOMEM); \
+ } \
\
fmts = av_realloc_array((*f)->list, (*f)->nb + 1, \
sizeof(*(*f)->list)); \
if (!fmts) { \
+ unref_fn(f); \
if (!oldf) \
av_freep(f); \
return AVERROR(ENOMEM); \
@@ -322,14 +325,14 @@ do { \
int ff_add_format(AVFilterFormats **avff, int64_t fmt)
{
- ADD_FORMAT(avff, fmt, int, formats, nb_formats);
+ ADD_FORMAT(avff, fmt, ff_formats_unref, int, formats, nb_formats);
return 0;
}
int ff_add_channel_layout(AVFilterChannelLayouts **l, uint64_t channel_layout)
{
av_assert1(!(*l && (*l)->all_layouts));
- ADD_FORMAT(l, channel_layout, uint64_t, channel_layouts, nb_channel_layouts);
+ ADD_FORMAT(l, channel_layout, ff_channel_layouts_unref, uint64_t, channel_layouts, nb_channel_layouts);
return 0;
}
@@ -340,12 +343,14 @@ AVFilterFormats *ff_all_formats(enum AVMediaType type)
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));
+ if (ff_add_format(&ret, av_pix_fmt_desc_get_id(desc)) < 0)
+ return NULL;
}
} else if (type == AVMEDIA_TYPE_AUDIO) {
enum AVSampleFormat fmt = 0;
while (av_get_sample_fmt_name(fmt)) {
- ff_add_format(&ret, fmt);
+ if (ff_add_format(&ret, fmt) < 0)
+ return NULL;
fmt++;
}
}
@@ -370,7 +375,8 @@ AVFilterFormats *ff_planar_sample_fmts(void)
for (fmt = 0; av_get_bytes_per_sample(fmt)>0; fmt++)
if (av_sample_fmt_is_planar(fmt))
- ff_add_format(&ret, fmt);
+ if (ff_add_format(&ret, fmt) < 0)
+ return NULL;
return ret;
}
@@ -399,15 +405,17 @@ AVFilterChannelLayouts *ff_all_channel_counts(void)
return ret;
}
-#define FORMATS_REF(f, ref) \
+#define FORMATS_REF(f, ref, unref_fn) \
void *tmp; \
\
- if (!ref) \
- return AVERROR_BUG; \
+ if (!f || !ref) \
+ return AVERROR(ENOMEM); \
\
tmp = av_realloc_array(f->refs, sizeof(*f->refs), f->refcount + 1); \
- if (!tmp) \
+ if (!tmp) { \
+ unref_fn(&f); \
return AVERROR(ENOMEM); \
+ } \
f->refs = tmp; \
f->refs[f->refcount++] = ref; \
*ref = f; \
@@ -415,12 +423,12 @@ AVFilterChannelLayouts *ff_all_channel_counts(void)
int ff_channel_layouts_ref(AVFilterChannelLayouts *f, AVFilterChannelLayouts **ref)
{
- FORMATS_REF(f, ref);
+ FORMATS_REF(f, ref, ff_channel_layouts_unref);
}
int ff_formats_ref(AVFilterFormats *f, AVFilterFormats **ref)
{
- FORMATS_REF(f, ref);
+ FORMATS_REF(f, ref, ff_formats_unref);
}
#define FIND_REF_INDEX(ref, idx) \
@@ -488,25 +496,29 @@ void ff_formats_changeref(AVFilterFormats **oldref, AVFilterFormats **newref)
FORMATS_CHANGEREF(oldref, newref);
}
-#define SET_COMMON_FORMATS(ctx, fmts, in_fmts, out_fmts, ref, list) \
+#define SET_COMMON_FORMATS(ctx, fmts, in_fmts, out_fmts, ref_fn, unref_fn, list) \
int count = 0, i; \
\
if (!fmts) \
- return AVERROR_BUG; \
+ return AVERROR(ENOMEM); \
\
for (i = 0; i < ctx->nb_inputs; i++) { \
if (ctx->inputs[i] && !ctx->inputs[i]->out_fmts) { \
- int ret = ref(fmts, &ctx->inputs[i]->out_fmts); \
- if (ret < 0) \
+ int ret = ref_fn(fmts, &ctx->inputs[i]->out_fmts); \
+ if (ret < 0) { \
+ unref_fn(&fmts); \
return ret; \
+ } \
count++; \
} \
} \
for (i = 0; i < ctx->nb_outputs; i++) { \
if (ctx->outputs[i] && !ctx->outputs[i]->in_fmts) { \
- int ret = ref(fmts, &ctx->outputs[i]->in_fmts); \
- if (ret < 0) \
+ int ret = ref_fn(fmts, &ctx->outputs[i]->in_fmts); \
+ if (ret < 0) { \
+ unref_fn(&fmts); \
return ret; \
+ } \
count++; \
} \
} \
@@ -523,14 +535,14 @@ 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);
+ ff_channel_layouts_ref, ff_channel_layouts_unref, channel_layouts);
}
int ff_set_common_samplerates(AVFilterContext *ctx,
AVFilterFormats *samplerates)
{
SET_COMMON_FORMATS(ctx, samplerates, in_samplerates, out_samplerates,
- ff_formats_ref, formats);
+ ff_formats_ref, ff_formats_unref, formats);
}
/**
@@ -541,7 +553,7 @@ int ff_set_common_samplerates(AVFilterContext *ctx,
int ff_set_common_formats(AVFilterContext *ctx, AVFilterFormats *formats)
{
SET_COMMON_FORMATS(ctx, formats, in_formats, out_formats,
- ff_formats_ref, formats);
+ ff_formats_ref, ff_formats_unref, formats);
}
static int default_query_formats_common(AVFilterContext *ctx,
OpenPOWER on IntegriCloud