static void end_frame(AVFilterLink *link) { TransContext *trans = link->dst->priv; AVFilterPicRef *in = link->cur_pic; AVFilterPicRef *out = link->dst->outputs[0]->outpic; AVFilterPicRef *pic = link->cur_pic; AVFilterLink *output = link->dst->outputs[0]; int i, j, plane; /* luma plane */ for(i = 0; i < pic->h; i ++) for(j = 0; j < pic->w; j ++) *(out->data[0] + j *out->linesize[0] + i) = *(in->data[0]+ i * in->linesize[0] + j); /* chroma planes */ for(plane = 1; plane < 3; plane ++) { for(i = 0; i < pic->h >> trans->vsub; i++) { for(j = 0; j < pic->w >> trans->hsub; j++) *(out->data[plane] + j *out->linesize[plane] + i) = *(in->data[plane]+ i * in->linesize[plane] + j); } } avfilter_unref_pic(in); avfilter_draw_slice(output, 0, out->h, 1); avfilter_end_frame(output); avfilter_unref_pic(out); }
static int request_frame(AVFilterLink *link) { BufferSourceContext *c = link->src->priv; AVFilterPicRef *picref; if (!c->has_frame) { av_log(link->src, AV_LOG_ERROR, "request_frame() called with no available frame!\n"); //return -1; } /* This picture will be needed unmodified later for decoding the next * frame */ picref = avfilter_get_video_buffer(link, AV_PERM_WRITE | AV_PERM_PRESERVE | AV_PERM_REUSE2, link->w, link->h); av_picture_copy((AVPicture *)&picref->data, (AVPicture *)&c->frame, picref->pic->format, link->w, link->h); picref->pts = c->pts; picref->pixel_aspect = c->pixel_aspect; picref->interlaced = c->frame.interlaced_frame; picref->top_field_first = c->frame.top_field_first; avfilter_start_frame(link, avfilter_ref_pic(picref, ~0)); avfilter_draw_slice(link, 0, link->h, 1); avfilter_end_frame(link); avfilter_unref_pic(picref); c->has_frame = 0; return 0; }
void avfilter_default_end_frame(AVFilterLink *link) { AVFilterLink *out = NULL; if(link->dst->output_count) out = link->dst->outputs[0]; avfilter_unref_pic(link->cur_pic); link->cur_pic = NULL; if(out) { if(out->outpic) { avfilter_unref_pic(out->outpic); out->outpic = NULL; } avfilter_end_frame(out); } }
static int request_frame(AVFilterLink *link) { FPSContext *fps = link->src->priv; if (fps->videoend) return -1; if (!fps->has_frame) // support for filtering without poll_frame usage while(!fps->pic || fps->pic->pts < fps->pts) if(avfilter_request_frame(link->src->inputs[0])) return -1; fps->has_frame=0; avfilter_start_frame(link, avfilter_ref_pic(fps->pic, ~AV_PERM_WRITE)); avfilter_draw_slice (link, 0, fps->pic->h, 1); avfilter_end_frame (link); avfilter_unref_pic(fps->pic); fps->pic = NULL; fps->pts += fps->timebase; return 0; }
static void start_frame(AVFilterLink *link, AVFilterPicRef *picref) { FPSContext *fps = link->dst->priv; if(fps->pic) avfilter_unref_pic(fps->pic); fps->pic = picref; }
static av_cold void uninit(AVFilterContext *ctx) { FPSContext *fps = ctx->priv; if(fps->pic) avfilter_unref_pic(fps->pic); }