static void draw_slice(AVFilterLink *link, int y, int h) { SliceContext *slice = link->dst->priv; int y2; for (y2 = y; y2 + slice->h <= y + h; y2 += slice->h) avfilter_draw_slice(link->dst->outputs[0], y2, slice->h); if (y2 < y + h) avfilter_draw_slice(link->dst->outputs[0], y2, y + h - y2); }
static void draw_slice(AVFilterLink *inlink, int y, int h, int slice_dir) { PixdescTestContext *priv = inlink->dst->priv; AVFilterBufferRef *inpic = inlink->cur_buf; AVFilterBufferRef *outpic = inlink->dst->outputs[0]->out_buf; int i, c, w = inlink->w; for (c = 0; c < priv->pix_desc->nb_components; c++) { int w1 = c == 1 || c == 2 ? w>>priv->pix_desc->log2_chroma_w : w; int h1 = c == 1 || c == 2 ? h>>priv->pix_desc->log2_chroma_h : h; int y1 = c == 1 || c == 2 ? y>>priv->pix_desc->log2_chroma_h : y; for (i = y1; i < y1 + h1; i++) { av_read_image_line(priv->line, inpic->data, inpic->linesize, priv->pix_desc, 0, i, c, w1, 0); av_write_image_line(priv->line, outpic->data, outpic->linesize, priv->pix_desc, 0, i, c, w1); } } avfilter_draw_slice(inlink->dst->outputs[0], y, h, slice_dir); }
static int request_frame(AVFilterLink *outlink) { FifoContext *fifo = outlink->src->priv; BufPic *tmp; int ret; if (!fifo->root.next) { if ((ret = avfilter_request_frame(outlink->src->inputs[0]) < 0)) return ret; } /* by doing this, we give ownership of the reference to the next filter, * so we don't have to worry about dereferencing it ourselves. */ avfilter_start_frame(outlink, fifo->root.next->picref); avfilter_draw_slice (outlink, 0, outlink->h, 1); avfilter_end_frame (outlink); if (fifo->last == fifo->root.next) fifo->last = &fifo->root; tmp = fifo->root.next->next; av_free(fifo->root.next); fifo->root.next = tmp; return 0; }
static void draw_slice(AVFilterLink *inlink, int y, int h, int slice_dir) { SelectContext *select = inlink->dst->priv; if (select->select && !select->cache_frames) avfilter_draw_slice(inlink->dst->outputs[0], y, h, slice_dir); }
static int request_frame(AVFilterLink *link) { BufferSourceContext *c = link->src->priv; AVFilterBufferRef *picref; if (!c->has_frame) { av_log(link->src, AV_LOG_ERROR, "request_frame() called with no available frame!\n"); return -1; } picref = avfilter_get_video_buffer(link, AV_PERM_WRITE, link->w, link->h); av_image_copy(picref->data, picref->linesize, c->frame.data, c->frame.linesize, picref->format, link->w, link->h); picref->pts = c->pts; picref->video->interlaced = c->frame.interlaced_frame; picref->video->top_field_first = c->frame.top_field_first; avfilter_start_frame(link, avfilter_ref_buffer(picref, ~0)); avfilter_draw_slice(link, 0, link->h, 1); avfilter_end_frame(link); avfilter_unref_buffer(picref); c->has_frame = 0; return 0; }
static int request_frame(AVFilterLink *outlink) { AVFilterContext *ctx = outlink->src; SelectContext *select = ctx->priv; AVFilterLink *inlink = outlink->src->inputs[0]; select->select = 0; if (av_fifo_size(select->pending_frames)) { AVFilterBufferRef *picref; av_fifo_generic_read(select->pending_frames, &picref, sizeof(picref), NULL); avfilter_start_frame(outlink, avfilter_ref_buffer(picref, ~0)); avfilter_draw_slice(outlink, 0, outlink->h, 1); avfilter_end_frame(outlink); avfilter_unref_buffer(picref); return 0; } while (!select->select) { int ret = avfilter_request_frame(inlink); if (ret < 0) return ret; } return 0; }
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 void draw_slice(AVFilterLink *inlink, int y0, int h0, int slice_dir) { AVFilterContext *ctx = inlink->dst; BoxBlurContext *boxblur = ctx->priv; AVFilterLink *outlink = inlink->dst->outputs[0]; AVFilterBufferRef *inpicref = inlink ->cur_buf; AVFilterBufferRef *outpicref = outlink->out_buf; int plane; int cw = inlink->w >> boxblur->hsub, ch = h0 >> boxblur->vsub; int w[4] = { inlink->w, cw, cw, inlink->w }; int h[4] = { h0, ch, ch, h0 }; for (plane = 0; inpicref->data[plane] && plane < 4; plane++) hblur(outpicref->data[plane], outpicref->linesize[plane], inpicref ->data[plane], inpicref ->linesize[plane], w[plane], h[plane], boxblur->radius[plane], boxblur->power[plane], boxblur->temp); for (plane = 0; inpicref->data[plane] && plane < 4; plane++) vblur(outpicref->data[plane], outpicref->linesize[plane], outpicref->data[plane], outpicref->linesize[plane], w[plane], h[plane], boxblur->radius[plane], boxblur->power[plane], boxblur->temp); avfilter_draw_slice(outlink, y0, h0, slice_dir); }
static int request_frame(AVFilterLink *link) { BufferSourceContext *c = link->src->priv; AVFilterBufferRef *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->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_buffer(picref, ~0)); avfilter_draw_slice(link, 0, link->h, 1); avfilter_end_frame(link); avfilter_unref_buffer(picref); c->has_frame = 0; return 0; }
static void end_frame(AVFilterLink *inlink) { RemovelogoContext *removelogo = inlink->dst->priv; AVFilterLink *outlink = inlink->dst->outputs[0]; AVFilterBufferRef *inpicref = inlink ->cur_buf; AVFilterBufferRef *outpicref = outlink->out_buf; int direct = inpicref == outpicref; blur_image(removelogo->mask, inpicref ->data[0], inpicref ->linesize[0], outpicref->data[0], outpicref->linesize[0], removelogo->full_mask_data, inlink->w, inlink->w, inlink->h, direct, &removelogo->full_mask_bbox); blur_image(removelogo->mask, inpicref ->data[1], inpicref ->linesize[1], outpicref->data[1], outpicref->linesize[1], removelogo->half_mask_data, inlink->w/2, inlink->w/2, inlink->h/2, direct, &removelogo->half_mask_bbox); blur_image(removelogo->mask, inpicref ->data[2], inpicref ->linesize[2], outpicref->data[2], outpicref->linesize[2], removelogo->half_mask_data, inlink->w/2, inlink->w/2, inlink->h/2, direct, &removelogo->half_mask_bbox); avfilter_draw_slice(outlink, 0, inlink->h, 1); avfilter_end_frame(outlink); avfilter_unref_buffer(inpicref); if (!direct) avfilter_unref_buffer(outpicref); }
static void draw_slice(AVFilterLink *inlink, int y, int h, int slice_dir) { AVFilterContext *ctx = inlink->dst; int i; for (i = 0; i < ctx->output_count; i++) avfilter_draw_slice(ctx->outputs[i], y, h, slice_dir); }
static void draw_slice(AVFilterLink *link, int y, int h, int slice_dir) { SliceContext *slice = link->dst->priv; int y2; if (slice_dir == 1) { for (y2 = y; y2 + slice->h <= y + h; y2 += slice->h) avfilter_draw_slice(link->dst->outputs[0], y2, slice->h, slice_dir); if (y2 < y + h) avfilter_draw_slice(link->dst->outputs[0], y2, y + h - y2, slice_dir); } else if (slice_dir == -1) { for (y2 = y + h; y2 - slice->h >= y; y2 -= slice->h) avfilter_draw_slice(link->dst->outputs[0], y2 - slice->h, slice->h, slice_dir); if (y2 > y) avfilter_draw_slice(link->dst->outputs[0], y, y2 - y, slice_dir); } }
void avfilter_default_draw_slice(AVFilterLink *link, int y, int h) { AVFilterLink *out = NULL; if(link->dst->output_count) out = link->dst->outputs[0]; if(out) avfilter_draw_slice(out, y, h); }
void avfilter_default_draw_slice(AVFilterLink *inlink, int y, int h, int slice_dir) { AVFilterLink *outlink = NULL; if (inlink->dst->output_count) outlink = inlink->dst->outputs[0]; if (outlink) avfilter_draw_slice(outlink, y, h, slice_dir); }
static int mpsrc_request_frame(AVFilterLink *link) { struct mpsrc_priv *c = link->src->priv; struct vf_instance *vf = c->vf; if (!vf->priv->in_buf) return AVERROR(EINVAL); avfilter_start_frame(link, avfilter_ref_buffer(vf->priv->in_buf, ~0)); avfilter_draw_slice(link, 0, link->h, 1); avfilter_end_frame(link); vf->priv->in_buf = NULL; return 0; }
static void end_frame(AVFilterLink *link) { PluginContext *plugin = link->dst->priv; AVFilterBufferRef *in = link->cur_buf; AVFilterBufferRef *out = link->dst->outputs[0]->out_buf; if ( plugin->process( out->data, out->linesize, in->data, in->linesize, link->w, link->h ) < 0 ) av_log(link->dst, AV_LOG_ERROR, "function process failed\n" ); avfilter_unref_buffer(in); avfilter_draw_slice(link->dst->outputs[0], 0, link->h, 1); avfilter_end_frame(link->dst->outputs[0]); avfilter_unref_buffer(out); }
static void end_frame(AVFilterLink *inlink) { AVFilterLink *outlink = inlink->dst->outputs[0]; AVFilterBufferRef *inpicref = inlink->cur_buf; AVFilterBufferRef *outpicref = outlink->out_buf; super2xsai(inlink->dst, inpicref->data[0], inpicref->linesize[0], outpicref->data[0], outpicref->linesize[0], inlink->w, inlink->h); avfilter_unref_buffer(inpicref); avfilter_draw_slice(outlink, 0, outlink->h, 1); avfilter_end_frame(outlink); avfilter_unref_buffer(outpicref); }
static void end_frame(AVFilterLink *inlink) { Frei0rContext *frei0r = inlink->dst->priv; AVFilterLink *outlink = inlink->dst->outputs[0]; AVFilterBufferRef *inpicref = inlink->cur_buf; AVFilterBufferRef *outpicref = outlink->out_buf; frei0r->update(frei0r->instance, inpicref->pts * av_q2d(inlink->time_base) * 1000, (const uint32_t *)inpicref->data[0], (uint32_t *)outpicref->data[0]); avfilter_unref_buffer(inpicref); avfilter_draw_slice(outlink, 0, outlink->h, 1); avfilter_end_frame(outlink); avfilter_unref_buffer(outpicref); }
static void draw_slice(AVFilterLink *inlink, int y, int h, int slice_dir) { AVFilterContext *ctx = inlink->dst; BlackFrameContext *blackframe = ctx->priv; AVFilterBufferRef *picref = inlink->cur_buf; int x, i; uint8_t *p = picref->data[0] + y * picref->linesize[0]; for (i = 0; i < h; i++) { for (x = 0; x < inlink->w; x++) blackframe->nblack += p[x] < blackframe->bthresh; p += picref->linesize[0]; } avfilter_draw_slice(ctx->outputs[0], y, h, slice_dir); }
static int source_request_frame(AVFilterLink *outlink) { Frei0rContext *frei0r = outlink->src->priv; AVFilterBufferRef *picref = avfilter_get_video_buffer(outlink, AV_PERM_WRITE, outlink->w, outlink->h); picref->video->pixel_aspect = (AVRational) {1, 1}; picref->pts = frei0r->pts++; picref->pos = -1; avfilter_start_frame(outlink, avfilter_ref_buffer(picref, ~0)); frei0r->update(frei0r->instance, av_rescale_q(picref->pts, frei0r->time_base, (AVRational){1,1000}), NULL, (uint32_t *)picref->data[0]); avfilter_draw_slice(outlink, 0, outlink->h, 1); avfilter_end_frame(outlink); avfilter_unref_buffer(picref); return 0; }
static void end_frame(AVFilterLink *link) { AVFilterContext *ctx = link->dst; ColorMatrixContext *color = ctx->priv; AVFilterBufferRef *out = link->dst->outputs[0]->out_buf; if (link->cur_buf->format == PIX_FMT_YUV422P) process_frame_yuv422p(color, out, link->cur_buf); else if (link->cur_buf->format == PIX_FMT_YUV420P) process_frame_yuv420p(color, out, link->cur_buf); else process_frame_uyvy422(color, out, link->cur_buf); avfilter_draw_slice(ctx->outputs[0], 0, link->dst->outputs[0]->h, 1); avfilter_end_frame(ctx->outputs[0]); avfilter_unref_buffer(link->cur_buf); }
static void draw_slice(AVFilterLink *inlink, int y, int h, int slice_dir) { AVFilterContext *ctx = inlink->dst; FieldOrderContext *fieldorder = ctx->priv; AVFilterLink *outlink = ctx->outputs[0]; AVFilterBufferRef *inpicref = inlink->cur_buf; /** can only currently do slices if this filter is doing nothing * because this filter is moving picture content, the output * slice will contain different video lines than the input slice * and that complexity will be added later */ if ( !inpicref->video->interlaced || inpicref->video->top_field_first == fieldorder->dst_tff) { avfilter_draw_slice(outlink, y, h, slice_dir); } }
static int request_frame(AVFilterLink *link) { BufferSourceContext *c = link->src->priv; if (!c->picref) { av_log(link->src, AV_LOG_WARNING, "request_frame() called with no available frame!\n"); return AVERROR(EINVAL); } avfilter_start_frame(link, avfilter_ref_buffer(c->picref, ~0)); avfilter_draw_slice(link, 0, link->h, 1); avfilter_end_frame(link); avfilter_unref_buffer(c->picref); c->picref = NULL; return 0; }
static int color_request_frame(AVFilterLink *link) { ColorContext *color = link->src->priv; AVFilterBufferRef *picref = avfilter_get_video_buffer(link, AV_PERM_WRITE, color->w, color->h); picref->video->pixel_aspect = (AVRational) {1, 1}; picref->pts = av_rescale_q(color->pts++, color->time_base, AV_TIME_BASE_Q); picref->pos = 0; avfilter_start_frame(link, avfilter_ref_buffer(picref, ~0)); ff_draw_rectangle(picref->data, picref->linesize, color->line, color->line_step, color->hsub, color->vsub, 0, 0, color->w, color->h); avfilter_draw_slice(link, 0, color->h, 1); avfilter_end_frame(link); avfilter_unref_buffer(picref); return 0; }
static void smooth_end_frame(AVFilterLink *inlink) { SmoothContext *smooth = inlink->dst->priv; AVFilterLink *outlink = inlink->dst->outputs[0]; AVFilterBufferRef *inpicref = inlink ->cur_buf; AVFilterBufferRef *outpicref = outlink->out_buf; IplImage inimg, outimg; fill_iplimage_from_picref(&inimg , inpicref , inlink->format); fill_iplimage_from_picref(&outimg, outpicref, inlink->format); cvSmooth(&inimg, &outimg, smooth->type, smooth->param1, smooth->param2, smooth->param3, smooth->param4); fill_picref_from_iplimage(outpicref, &outimg, inlink->format); avfilter_unref_buffer(inpicref); avfilter_draw_slice(outlink, 0, outlink->h, 1); avfilter_end_frame(outlink); avfilter_unref_buffer(outpicref); }
static void end_frame(AVFilterLink *inlink) { AVFilterContext *ctx = inlink->dst; OCVContext *ocv = ctx->priv; AVFilterLink *outlink= inlink->dst->outputs[0]; AVFilterBufferRef *inpicref = inlink ->cur_buf; AVFilterBufferRef *outpicref = outlink->out_buf; IplImage inimg, outimg; fill_iplimage_from_picref(&inimg , inpicref , inlink->format); fill_iplimage_from_picref(&outimg, outpicref, inlink->format); ocv->end_frame_filter(ctx, &inimg, &outimg); fill_picref_from_iplimage(outpicref, &outimg, inlink->format); avfilter_unref_buffer(inpicref); avfilter_draw_slice(outlink, 0, outlink->h, 1); avfilter_end_frame(outlink); avfilter_unref_buffer(outpicref); }
static int request_frame(AVFilterLink *link) { BufferSourceContext *c = link->src->priv; AVFilterBufferRef *buf; if (!av_fifo_size(c->fifo)) { av_log(link->src, AV_LOG_WARNING, "request_frame() called with no available frame!\n"); return AVERROR(EINVAL); } av_fifo_generic_read(c->fifo, &buf, sizeof(buf), NULL); avfilter_start_frame(link, avfilter_ref_buffer(buf, ~0)); avfilter_draw_slice(link, 0, link->h, 1); avfilter_end_frame(link); avfilter_unref_buffer(buf); return 0; }
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 end_frame(AVFilterLink *inlink) { AVFilterContext *ctx = inlink->dst; FieldOrderContext *fieldorder = ctx->priv; AVFilterLink *outlink = ctx->outputs[0]; AVFilterBufferRef *inpicref = inlink->cur_buf; AVFilterBufferRef *outpicref = outlink->out_buf; int h, plane, line_step, line_size, line; uint8_t *cpy_src, *cpy_dst; if ( inpicref->video->interlaced && inpicref->video->top_field_first != fieldorder->dst_tff) { av_dlog(ctx, "picture will move %s one line\n", fieldorder->dst_tff ? "up" : "down"); h = inpicref->video->h; for (plane = 0; plane < 4 && inpicref->data[plane]; plane++) { line_step = inpicref->linesize[plane]; line_size = fieldorder->line_size[plane]; cpy_src = inpicref->data[plane]; cpy_dst = outpicref->data[plane]; if (fieldorder->dst_tff) { /** Move every line up one line, working from * the top to the bottom of the frame. * The original top line is lost. * The new last line is created as a copy of the * penultimate line from that field. */ for (line = 0; line < h; line++) { if (1 + line < outpicref->video->h) { memcpy(cpy_dst, cpy_src + line_step, line_size); } else { memcpy(cpy_dst, cpy_src - line_step - line_step, line_size); } cpy_src += line_step; cpy_dst += line_step; } } else { /** Move every line down one line, working from * the bottom to the top of the frame. * The original bottom line is lost. * The new first line is created as a copy of the * second line from that field. */ cpy_src += (h - 1) * line_step; cpy_dst += (h - 1) * line_step; for (line = h - 1; line >= 0 ; line--) { if (line > 0) { memcpy(cpy_dst, cpy_src - line_step, line_size); } else { memcpy(cpy_dst, cpy_src + line_step + line_step, line_size); } cpy_src -= line_step; cpy_dst -= line_step; } } } outpicref->video->top_field_first = fieldorder->dst_tff; avfilter_draw_slice(outlink, 0, h, 1); } else { av_dlog(ctx, "not interlaced or field order already correct\n"); } avfilter_end_frame(outlink); avfilter_unref_buffer(inpicref); }
void avfilter_null_draw_slice(AVFilterLink *link, int y, int h, int slice_dir) { avfilter_draw_slice(link->dst->outputs[0], y, h, slice_dir); }