| @@ -729,7 +729,8 @@ int ff_filter_frame(AVFilterLink *link, AVFrame *frame) | |||||
| { | { | ||||
| int (*filter_frame)(AVFilterLink *, AVFrame *); | int (*filter_frame)(AVFilterLink *, AVFrame *); | ||||
| AVFilterPad *dst = link->dstpad; | AVFilterPad *dst = link->dstpad; | ||||
| AVFrame *out; | |||||
| AVFrame *out = NULL; | |||||
| int ret; | |||||
| FF_DPRINTF_START(NULL, filter_frame); | FF_DPRINTF_START(NULL, filter_frame); | ||||
| ff_dlog_link(NULL, link, 1); | ff_dlog_link(NULL, link, 1); | ||||
| @@ -748,13 +749,18 @@ int ff_filter_frame(AVFilterLink *link, AVFrame *frame) | |||||
| case AVMEDIA_TYPE_AUDIO: | case AVMEDIA_TYPE_AUDIO: | ||||
| out = ff_get_audio_buffer(link, frame->nb_samples); | out = ff_get_audio_buffer(link, frame->nb_samples); | ||||
| break; | break; | ||||
| default: return AVERROR(EINVAL); | |||||
| default: | |||||
| ret = AVERROR(EINVAL); | |||||
| goto fail; | |||||
| } | } | ||||
| if (!out) { | if (!out) { | ||||
| av_frame_free(&frame); | |||||
| return AVERROR(ENOMEM); | |||||
| ret = AVERROR(ENOMEM); | |||||
| goto fail; | |||||
| } | } | ||||
| av_frame_copy_props(out, frame); | |||||
| ret = av_frame_copy_props(out, frame); | |||||
| if (ret < 0) | |||||
| goto fail; | |||||
| switch (link->type) { | switch (link->type) { | ||||
| case AVMEDIA_TYPE_VIDEO: | case AVMEDIA_TYPE_VIDEO: | ||||
| @@ -767,7 +773,9 @@ int ff_filter_frame(AVFilterLink *link, AVFrame *frame) | |||||
| av_get_channel_layout_nb_channels(frame->channel_layout), | av_get_channel_layout_nb_channels(frame->channel_layout), | ||||
| frame->format); | frame->format); | ||||
| break; | break; | ||||
| default: return AVERROR(EINVAL); | |||||
| default: | |||||
| ret = AVERROR(EINVAL); | |||||
| goto fail; | |||||
| } | } | ||||
| av_frame_free(&frame); | av_frame_free(&frame); | ||||
| @@ -775,6 +783,11 @@ int ff_filter_frame(AVFilterLink *link, AVFrame *frame) | |||||
| out = frame; | out = frame; | ||||
| return filter_frame(link, out); | return filter_frame(link, out); | ||||
| fail: | |||||
| av_frame_free(&out); | |||||
| av_frame_free(&frame); | |||||
| return ret; | |||||
| } | } | ||||
| const AVClass *avfilter_get_class(void) | const AVClass *avfilter_get_class(void) | ||||