diff options
Diffstat (limited to 'chromium/third_party/ffmpeg/libavfilter/avfilter.c')
-rw-r--r-- | chromium/third_party/ffmpeg/libavfilter/avfilter.c | 30 |
1 files changed, 22 insertions, 8 deletions
diff --git a/chromium/third_party/ffmpeg/libavfilter/avfilter.c b/chromium/third_party/ffmpeg/libavfilter/avfilter.c index 2567ce92c1c..7e166e04f8c 100644 --- a/chromium/third_party/ffmpeg/libavfilter/avfilter.c +++ b/chromium/third_party/ffmpeg/libavfilter/avfilter.c @@ -295,7 +295,7 @@ int avfilter_config_links(AVFilterContext *filter) if ((config_link = link->dstpad->config_props)) if ((ret = config_link(link)) < 0) { - av_log(link->src, AV_LOG_ERROR, + av_log(link->dst, AV_LOG_ERROR, "Failed to configure input pad on %s\n", link->dst->name); return ret; @@ -456,6 +456,7 @@ int avfilter_process_command(AVFilterContext *filter, const char *cmd, const cha } static AVFilter *first_filter; +static AVFilter **last_filter = &first_filter; #if !FF_API_NOCONST_GET_NAME const @@ -476,7 +477,7 @@ AVFilter *avfilter_get_by_name(const char *name) int avfilter_register(AVFilter *filter) { - AVFilter **f = &first_filter; + AVFilter **f = last_filter; int i; /* the filter must select generic or internal exclusively */ @@ -492,6 +493,7 @@ int avfilter_register(AVFilter *filter) while(*f || avpriv_atomic_ptr_cas((void * volatile *)f, NULL, filter)) f = &(*f)->next; + last_filter = &filter->next; return 0; } @@ -997,7 +999,7 @@ static int ff_filter_frame_framed(AVFilterLink *link, AVFrame *frame) int (*filter_frame)(AVFilterLink *, AVFrame *); AVFilterContext *dstctx = link->dst; AVFilterPad *dst = link->dstpad; - AVFrame *out; + AVFrame *out = NULL; int ret; AVFilterCommand *cmd= link->dst->command_queue; int64_t pts; @@ -1022,13 +1024,18 @@ static int ff_filter_frame_framed(AVFilterLink *link, AVFrame *frame) case AVMEDIA_TYPE_AUDIO: out = ff_get_audio_buffer(link, frame->nb_samples); break; - default: return AVERROR(EINVAL); + default: + ret = AVERROR(EINVAL); + goto fail; } 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) { case AVMEDIA_TYPE_VIDEO: @@ -1041,7 +1048,9 @@ static int ff_filter_frame_framed(AVFilterLink *link, AVFrame *frame) av_get_channel_layout_nb_channels(frame->channel_layout), frame->format); break; - default: return AVERROR(EINVAL); + default: + ret = AVERROR(EINVAL); + goto fail; } av_frame_free(&frame); @@ -1074,6 +1083,11 @@ static int ff_filter_frame_framed(AVFilterLink *link, AVFrame *frame) link->frame_requested = 0; ff_update_link_current_pts(link, pts); return ret; + +fail: + av_frame_free(&out); + av_frame_free(&frame); + return ret; } static int ff_filter_frame_needs_framing(AVFilterLink *link, AVFrame *frame) |