Commit 104a97be authored by Anton Khirnov's avatar Anton Khirnov

buffersrc: handle non-refcounted frames in av_buffersrc_add_frame() correctly

parent 5ef11b8d
...@@ -94,7 +94,7 @@ int attribute_align_arg av_buffersrc_add_frame(AVFilterContext *ctx, ...@@ -94,7 +94,7 @@ int attribute_align_arg av_buffersrc_add_frame(AVFilterContext *ctx,
{ {
BufferSourceContext *s = ctx->priv; BufferSourceContext *s = ctx->priv;
AVFrame *copy; AVFrame *copy;
int ret; int refcounted, ret;
if (!frame) { if (!frame) {
s->eof = 1; s->eof = 1;
...@@ -102,6 +102,8 @@ int attribute_align_arg av_buffersrc_add_frame(AVFilterContext *ctx, ...@@ -102,6 +102,8 @@ int attribute_align_arg av_buffersrc_add_frame(AVFilterContext *ctx,
} else if (s->eof) } else if (s->eof)
return AVERROR(EINVAL); return AVERROR(EINVAL);
refcounted = !!frame->buf[0];
switch (ctx->outputs[0]->type) { switch (ctx->outputs[0]->type) {
case AVMEDIA_TYPE_VIDEO: case AVMEDIA_TYPE_VIDEO:
CHECK_VIDEO_PARAM_CHANGE(ctx, s, frame->width, frame->height, CHECK_VIDEO_PARAM_CHANGE(ctx, s, frame->width, frame->height,
...@@ -122,10 +124,20 @@ int attribute_align_arg av_buffersrc_add_frame(AVFilterContext *ctx, ...@@ -122,10 +124,20 @@ int attribute_align_arg av_buffersrc_add_frame(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;
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment