int avfilter_fill_frame_from_buffer_ref(AVFrame *frame, const AVFilterBufferRef *ref) { if (!ref) return AVERROR(EINVAL); return ref->video ? avfilter_fill_frame_from_video_buffer_ref(frame, ref) : avfilter_fill_frame_from_audio_buffer_ref(frame, ref); }
int filter(AVFrame* src, AVFrame *dst) { int ret; AVFilterBufferRef *picref; /* push the decoded frame into the filtergraph. 3rd parameter might not be needed with new ffmpeg */ av_vsrc_buffer_add_frame(buffersrc_ctx, src, 0); /* pull filtered pictures from the filtergraph */ ret = avfilter_poll_frame(buffersink_ctx->inputs[0]); if (ret > 0) { av_vsink_buffer_get_video_buffer_ref(buffersink_ctx, &picref, 0); if (picref) { avfilter_fill_frame_from_video_buffer_ref(dst, picref); dst->pts = picref->pts; avfilter_unref_buffer(picref); } } if (ret != 1) { av_log(NULL, AV_LOG_WARNING, "filter unexpected number of immediately available frames: %d\n", ret); } return ret; }