Merge commit '104a97beaffa6348e6fd2c2d07d67c1402322bb3'

* commit '104a97beaffa6348e6fd2c2d07d67c1402322bb3':
  buffersrc: handle non-refcounted frames in av_buffersrc_add_frame() correctly

Conflicts:
	libavfilter/buffersrc.c

Merged-by: Michael Niedermayer <michaelni@gmx.at>
This commit is contained in:
Michael Niedermayer 2014-01-17 16:38:10 +01:00
commit cd259cdaa9
1 changed files with 15 additions and 3 deletions

View File

@ -120,7 +120,7 @@ static int av_buffersrc_add_frame_internal(AVFilterContext *ctx,
{ {
BufferSourceContext *s = ctx->priv; BufferSourceContext *s = ctx->priv;
AVFrame *copy; AVFrame *copy;
int ret; int refcounted, ret;
s->nb_failed_requests = 0; s->nb_failed_requests = 0;
@ -130,6 +130,8 @@ static int av_buffersrc_add_frame_internal(AVFilterContext *ctx,
} else if (s->eof) } else if (s->eof)
return AVERROR(EINVAL); return AVERROR(EINVAL);
refcounted = !!frame->buf[0];
if (!(flags & AV_BUFFERSRC_FLAG_NO_CHECK_FORMAT)) { if (!(flags & AV_BUFFERSRC_FLAG_NO_CHECK_FORMAT)) {
switch (ctx->outputs[0]->type) { switch (ctx->outputs[0]->type) {
@ -157,10 +159,20 @@ static int av_buffersrc_add_frame_internal(AVFilterContext *ctx,
if (!(copy = av_frame_alloc())) if (!(copy = av_frame_alloc()))
return AVERROR(ENOMEM); return AVERROR(ENOMEM);
av_frame_move_ref(copy, frame);
if (refcounted) {
av_frame_move_ref(copy, frame);
} else {
ret = av_frame_ref(copy, frame);
if (ret < 0) {
av_frame_free(&copy);
return ret;
}
}
if ((ret = av_fifo_generic_write(s->fifo, &copy, sizeof(copy), NULL)) < 0) { if ((ret = av_fifo_generic_write(s->fifo, &copy, sizeof(copy), NULL)) < 0) {
av_frame_move_ref(frame, copy); if (refcounted)
av_frame_move_ref(frame, copy);
av_frame_free(&copy); av_frame_free(&copy);
return ret; return ret;
} }