{
BufferSourceContext *s = ctx->priv;
AVFrame *copy;
- int ret;
+ int refcounted, ret;
if (!frame) {
s->eof = 1;
} 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,
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;
}