|
|
|
@ -94,7 +94,7 @@ int attribute_align_arg av_buffersrc_add_frame(AVFilterContext *ctx, |
|
|
|
|
{ |
|
|
|
|
BufferSourceContext *s = ctx->priv; |
|
|
|
|
AVFrame *copy; |
|
|
|
|
int ret; |
|
|
|
|
int refcounted, ret; |
|
|
|
|
|
|
|
|
|
if (!frame) { |
|
|
|
|
s->eof = 1; |
|
|
|
@ -102,6 +102,8 @@ int attribute_align_arg av_buffersrc_add_frame(AVFilterContext *ctx, |
|
|
|
|
} else if (s->eof) |
|
|
|
|
return AVERROR(EINVAL); |
|
|
|
|
|
|
|
|
|
refcounted = !!frame->buf[0]; |
|
|
|
|
|
|
|
|
|
switch (ctx->outputs[0]->type) { |
|
|
|
|
case AVMEDIA_TYPE_VIDEO: |
|
|
|
|
CHECK_VIDEO_PARAM_CHANGE(ctx, s, frame->width, frame->height, |
|
|
|
@ -122,10 +124,20 @@ int attribute_align_arg av_buffersrc_add_frame(AVFilterContext *ctx, |
|
|
|
|
|
|
|
|
|
if (!(copy = av_frame_alloc())) |
|
|
|
|
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(©); |
|
|
|
|
return ret; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if ((ret = av_fifo_generic_write(s->fifo, ©, sizeof(copy), NULL)) < 0) { |
|
|
|
|
av_frame_move_ref(frame, copy); |
|
|
|
|
if (refcounted) |
|
|
|
|
av_frame_move_ref(frame, copy); |
|
|
|
|
av_frame_free(©); |
|
|
|
|
return ret; |
|
|
|
|
} |
|
|
|
|