}
}
-static void start_frame(AVFilterLink *inlink, AVFilterBufferRef *picref)
+static int start_frame(AVFilterLink *inlink, AVFilterBufferRef *picref)
{
AVFilterContext *ctx = inlink->dst;
TInterlaceContext *tinterlace = ctx->priv;
avfilter_unref_buffer(tinterlace->cur);
tinterlace->cur = tinterlace->next;
tinterlace->next = picref;
+ return 0;
}
-static void end_frame(AVFilterLink *inlink)
+static int end_frame(AVFilterLink *inlink)
{
AVFilterContext *ctx = inlink->dst;
AVFilterLink *outlink = ctx->outputs[0];
/* we need at least two frames */
if (!tinterlace->cur)
- return;
+ return 0;
switch (tinterlace->mode) {
case MODE_MERGE: /* move the odd frame into the upper field of the new image, even into
break;
case MODE_INTERLACEX2: /* re-interlace preserving image height, double frame rate */
/* output current frame first */
- out = avfilter_ref_buffer(cur, AV_PERM_READ);
+ out = avfilter_ref_buffer(cur, ~AV_PERM_WRITE);
out->video->interlaced = 1;
ff_start_frame(outlink, out);
ff_end_frame(outlink);
tinterlace->frame++;
+
+ return 0;
}
static int poll_frame(AVFilterLink *outlink)
return 0;
}
-static void null_draw_slice(AVFilterLink *link, int y, int h, int slice_dir) { }
+static int null_draw_slice(AVFilterLink *link, int y, int h, int slice_dir) { return 0; }
AVFilter avfilter_vf_tinterlace = {
.name = "tinterlace",