mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2024-12-23 12:43:46 +02:00
lavfi: add error handling to draw_slice().
This commit is contained in:
parent
ebc8d97481
commit
e9b992d035
@ -295,8 +295,10 @@ struct AVFilterPad {
|
||||
* and should do its processing.
|
||||
*
|
||||
* Input video pads only.
|
||||
*
|
||||
* @return >= 0 on success, a negative AVERROR on error.
|
||||
*/
|
||||
void (*draw_slice)(AVFilterLink *link, int y, int height, int slice_dir);
|
||||
int (*draw_slice)(AVFilterLink *link, int y, int height, int slice_dir);
|
||||
|
||||
/**
|
||||
* Samples filtering callback. This is where a filter receives audio data
|
||||
|
@ -100,7 +100,10 @@ static void queue_pop(FifoContext *s)
|
||||
|
||||
static void end_frame(AVFilterLink *inlink) { }
|
||||
|
||||
static void draw_slice(AVFilterLink *inlink, int y, int h, int slice_dir) { }
|
||||
static int draw_slice(AVFilterLink *inlink, int y, int h, int slice_dir)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* Move data pointers and pts offset samples forward.
|
||||
|
@ -106,8 +106,10 @@ struct AVFilterPad {
|
||||
* and should do its processing.
|
||||
*
|
||||
* Input video pads only.
|
||||
*
|
||||
* @return >= 0 on success, a negative AVERROR on error.
|
||||
*/
|
||||
void (*draw_slice)(AVFilterLink *link, int y, int height, int slice_dir);
|
||||
int (*draw_slice)(AVFilterLink *link, int y, int height, int slice_dir);
|
||||
|
||||
/**
|
||||
* Samples filtering callback. This is where a filter receives audio data
|
||||
|
@ -77,13 +77,17 @@ static int start_frame(AVFilterLink *inlink, AVFilterBufferRef *picref)
|
||||
return ret;
|
||||
}
|
||||
|
||||
static void draw_slice(AVFilterLink *inlink, int y, int h, int slice_dir)
|
||||
static int draw_slice(AVFilterLink *inlink, int y, int h, int slice_dir)
|
||||
{
|
||||
AVFilterContext *ctx = inlink->dst;
|
||||
int i;
|
||||
int i, ret = 0;
|
||||
|
||||
for (i = 0; i < ctx->nb_outputs; i++)
|
||||
ff_draw_slice(ctx->outputs[i], y, h, slice_dir);
|
||||
for (i = 0; i < ctx->nb_outputs; i++) {
|
||||
ret = ff_draw_slice(ctx->outputs[i], y, h, slice_dir);
|
||||
if (ret < 0)
|
||||
break;
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
static void end_frame(AVFilterLink *inlink)
|
||||
|
@ -74,7 +74,7 @@ static av_cold int init(AVFilterContext *ctx, const char *args)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void draw_slice(AVFilterLink *inlink, int y, int h, int slice_dir)
|
||||
static int draw_slice(AVFilterLink *inlink, int y, int h, int slice_dir)
|
||||
{
|
||||
AVFilterContext *ctx = inlink->dst;
|
||||
BlackFrameContext *blackframe = ctx->priv;
|
||||
@ -88,7 +88,7 @@ static void draw_slice(AVFilterLink *inlink, int y, int h, int slice_dir)
|
||||
p += picref->linesize[0];
|
||||
}
|
||||
|
||||
ff_draw_slice(ctx->outputs[0], y, h, slice_dir);
|
||||
return ff_draw_slice(ctx->outputs[0], y, h, slice_dir);
|
||||
}
|
||||
|
||||
static void end_frame(AVFilterLink *inlink)
|
||||
|
@ -306,7 +306,7 @@ static void vblur(uint8_t *dst, int dst_linesize, const uint8_t *src, int src_li
|
||||
h, radius, power, temp);
|
||||
}
|
||||
|
||||
static void draw_slice(AVFilterLink *inlink, int y0, int h0, int slice_dir)
|
||||
static int draw_slice(AVFilterLink *inlink, int y0, int h0, int slice_dir)
|
||||
{
|
||||
AVFilterContext *ctx = inlink->dst;
|
||||
BoxBlurContext *boxblur = ctx->priv;
|
||||
@ -330,7 +330,7 @@ static void draw_slice(AVFilterLink *inlink, int y0, int h0, int slice_dir)
|
||||
w[plane], h[plane], boxblur->radius[plane], boxblur->power[plane],
|
||||
boxblur->temp);
|
||||
|
||||
ff_draw_slice(outlink, y0, h0, slice_dir);
|
||||
return ff_draw_slice(outlink, y0, h0, slice_dir);
|
||||
}
|
||||
|
||||
AVFilter avfilter_vf_boxblur = {
|
||||
|
@ -297,13 +297,13 @@ static int start_frame(AVFilterLink *link, AVFilterBufferRef *picref)
|
||||
return ff_start_frame(link->dst->outputs[0], ref2);
|
||||
}
|
||||
|
||||
static void draw_slice(AVFilterLink *link, int y, int h, int slice_dir)
|
||||
static int draw_slice(AVFilterLink *link, int y, int h, int slice_dir)
|
||||
{
|
||||
AVFilterContext *ctx = link->dst;
|
||||
CropContext *crop = ctx->priv;
|
||||
|
||||
if (y >= crop->y + crop->h || y + h <= crop->y)
|
||||
return;
|
||||
return 0;
|
||||
|
||||
if (y < crop->y) {
|
||||
h -= crop->y - y;
|
||||
@ -312,7 +312,7 @@ static void draw_slice(AVFilterLink *link, int y, int h, int slice_dir)
|
||||
if (y + h > crop->y + crop->h)
|
||||
h = crop->y + crop->h - y;
|
||||
|
||||
ff_draw_slice(ctx->outputs[0], y - crop->y, h, slice_dir);
|
||||
return ff_draw_slice(ctx->outputs[0], y - crop->y, h, slice_dir);
|
||||
}
|
||||
|
||||
static void end_frame(AVFilterLink *link)
|
||||
|
@ -245,7 +245,10 @@ static int start_frame(AVFilterLink *inlink, AVFilterBufferRef *inpicref)
|
||||
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;
|
||||
}
|
||||
|
||||
static void end_frame(AVFilterLink *inlink)
|
||||
{
|
||||
|
@ -94,7 +94,7 @@ static int config_input(AVFilterLink *inlink)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void draw_slice(AVFilterLink *inlink, int y0, int h, int slice_dir)
|
||||
static int draw_slice(AVFilterLink *inlink, int y0, int h, int slice_dir)
|
||||
{
|
||||
DrawBoxContext *drawbox = inlink->dst->priv;
|
||||
int plane, x, y, xb = drawbox->x, yb = drawbox->y;
|
||||
@ -120,7 +120,7 @@ static void draw_slice(AVFilterLink *inlink, int y0, int h, int slice_dir)
|
||||
}
|
||||
}
|
||||
|
||||
ff_draw_slice(inlink->dst->outputs[0], y0, h, 1);
|
||||
return ff_draw_slice(inlink->dst->outputs[0], y0, h, 1);
|
||||
}
|
||||
|
||||
AVFilter avfilter_vf_drawbox = {
|
||||
|
@ -791,7 +791,10 @@ static int draw_text(AVFilterContext *ctx, AVFilterBufferRef *picref,
|
||||
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;
|
||||
}
|
||||
|
||||
static inline int normalize_double(int *n, double d)
|
||||
{
|
||||
|
@ -97,7 +97,7 @@ static int config_props(AVFilterLink *inlink)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void draw_slice(AVFilterLink *inlink, int y, int h, int slice_dir)
|
||||
static int draw_slice(AVFilterLink *inlink, int y, int h, int slice_dir)
|
||||
{
|
||||
FadeContext *fade = inlink->dst->priv;
|
||||
AVFilterBufferRef *outpic = inlink->cur_buf;
|
||||
@ -134,7 +134,7 @@ static void draw_slice(AVFilterLink *inlink, int y, int h, int slice_dir)
|
||||
}
|
||||
}
|
||||
|
||||
ff_draw_slice(inlink->dst->outputs[0], y, h, slice_dir);
|
||||
return ff_draw_slice(inlink->dst->outputs[0], y, h, slice_dir);
|
||||
}
|
||||
|
||||
static void end_frame(AVFilterLink *inlink)
|
||||
|
@ -144,7 +144,7 @@ static int start_frame(AVFilterLink *inlink, AVFilterBufferRef *inpicref)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void draw_slice(AVFilterLink *inlink, int y, int h, int slice_dir)
|
||||
static int draw_slice(AVFilterLink *inlink, int y, int h, int slice_dir)
|
||||
{
|
||||
AVFilterContext *ctx = inlink->dst;
|
||||
FieldOrderContext *fieldorder = ctx->priv;
|
||||
@ -158,8 +158,9 @@ static void draw_slice(AVFilterLink *inlink, int y, int h, int slice_dir)
|
||||
* and that complexity will be added later */
|
||||
if ( !inpicref->video->interlaced
|
||||
|| inpicref->video->top_field_first == fieldorder->dst_tff) {
|
||||
ff_draw_slice(outlink, y, h, slice_dir);
|
||||
return ff_draw_slice(outlink, y, h, slice_dir);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void end_frame(AVFilterLink *inlink)
|
||||
|
@ -248,8 +248,9 @@ static int null_start_frame(AVFilterLink *link, AVFilterBufferRef *buf)
|
||||
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_fps = {
|
||||
|
@ -340,7 +340,10 @@ static int query_formats(AVFilterContext *ctx)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void null_draw_slice(AVFilterLink *inlink, int y, int h, int slice_dir) { }
|
||||
static int null_draw_slice(AVFilterLink *inlink, int y, int h, int slice_dir)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void end_frame(AVFilterLink *inlink)
|
||||
{
|
||||
|
@ -210,7 +210,10 @@ static int start_frame(AVFilterLink *inlink, AVFilterBufferRef *inpicref)
|
||||
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;
|
||||
}
|
||||
|
||||
static void end_frame(AVFilterLink *inlink)
|
||||
{
|
||||
|
@ -81,7 +81,7 @@ static int config_props(AVFilterLink *inlink)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void draw_slice(AVFilterLink *inlink, int y, int h, int slice_dir)
|
||||
static int draw_slice(AVFilterLink *inlink, int y, int h, int slice_dir)
|
||||
{
|
||||
FlipContext *flip = inlink->dst->priv;
|
||||
AVFilterBufferRef *inpic = inlink->cur_buf;
|
||||
@ -142,7 +142,7 @@ static void draw_slice(AVFilterLink *inlink, int y, int h, int slice_dir)
|
||||
}
|
||||
}
|
||||
|
||||
ff_draw_slice(inlink->dst->outputs[0], y, h, slice_dir);
|
||||
return ff_draw_slice(inlink->dst->outputs[0], y, h, slice_dir);
|
||||
}
|
||||
|
||||
AVFilter avfilter_vf_hflip = {
|
||||
|
@ -290,7 +290,10 @@ static int config_input(AVFilterLink *inlink)
|
||||
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;
|
||||
}
|
||||
|
||||
static void end_frame(AVFilterLink *inlink)
|
||||
{
|
||||
|
@ -67,7 +67,10 @@ static int query_formats(AVFilterContext *ctx)
|
||||
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;
|
||||
}
|
||||
|
||||
typedef struct {
|
||||
const char *name;
|
||||
|
@ -294,7 +294,7 @@ static int config_props(AVFilterLink *inlink)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void draw_slice(AVFilterLink *inlink, int y, int h, int slice_dir)
|
||||
static int draw_slice(AVFilterLink *inlink, int y, int h, int slice_dir)
|
||||
{
|
||||
AVFilterContext *ctx = inlink->dst;
|
||||
LutContext *lut = ctx->priv;
|
||||
@ -339,7 +339,7 @@ static void draw_slice(AVFilterLink *inlink, int y, int h, int slice_dir)
|
||||
}
|
||||
}
|
||||
|
||||
ff_draw_slice(outlink, y, h, slice_dir);
|
||||
return ff_draw_slice(outlink, y, h, slice_dir);
|
||||
}
|
||||
|
||||
static const AVFilterPad inputs[] = {
|
||||
|
@ -320,7 +320,7 @@ static void blend_slice(AVFilterContext *ctx,
|
||||
}
|
||||
}
|
||||
|
||||
static void draw_slice(AVFilterLink *inlink, int y, int h, int slice_dir)
|
||||
static int draw_slice(AVFilterLink *inlink, int y, int h, int slice_dir)
|
||||
{
|
||||
AVFilterContext *ctx = inlink->dst;
|
||||
AVFilterLink *outlink = ctx->outputs[0];
|
||||
@ -334,7 +334,7 @@ static void draw_slice(AVFilterLink *inlink, int y, int h, int slice_dir)
|
||||
over->overpicref->video->w, over->overpicref->video->h,
|
||||
y, outpicref->video->w, h);
|
||||
}
|
||||
ff_draw_slice(outlink, y, h, slice_dir);
|
||||
return ff_draw_slice(outlink, y, h, slice_dir);
|
||||
}
|
||||
|
||||
static void end_frame(AVFilterLink *inlink)
|
||||
@ -342,7 +342,10 @@ static void end_frame(AVFilterLink *inlink)
|
||||
ff_end_frame(inlink->dst->outputs[0]);
|
||||
}
|
||||
|
||||
static void null_draw_slice(AVFilterLink *inlink, int y, int h, int slice_dir) { }
|
||||
static int null_draw_slice(AVFilterLink *inlink, int y, int h, int slice_dir)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void null_end_frame(AVFilterLink *inlink) { }
|
||||
|
||||
|
@ -367,10 +367,10 @@ static void end_frame(AVFilterLink *link)
|
||||
ff_end_frame(link->dst->outputs[0]);
|
||||
}
|
||||
|
||||
static void draw_send_bar_slice(AVFilterLink *link, int y, int h, int slice_dir, int before_slice)
|
||||
static int draw_send_bar_slice(AVFilterLink *link, int y, int h, int slice_dir, int before_slice)
|
||||
{
|
||||
PadContext *pad = link->dst->priv;
|
||||
int bar_y, bar_h = 0;
|
||||
int bar_y, bar_h = 0, ret = 0;
|
||||
|
||||
if (slice_dir * before_slice == 1 && y == pad->y) {
|
||||
/* top bar */
|
||||
@ -387,15 +387,17 @@ static void draw_send_bar_slice(AVFilterLink *link, int y, int h, int slice_dir,
|
||||
link->dst->outputs[0]->out_buf->linesize,
|
||||
pad->line, pad->line_step, pad->hsub, pad->vsub,
|
||||
0, bar_y, pad->w, bar_h);
|
||||
ff_draw_slice(link->dst->outputs[0], bar_y, bar_h, slice_dir);
|
||||
ret = ff_draw_slice(link->dst->outputs[0], bar_y, bar_h, slice_dir);
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
static void draw_slice(AVFilterLink *link, int y, int h, int slice_dir)
|
||||
static int draw_slice(AVFilterLink *link, int y, int h, int slice_dir)
|
||||
{
|
||||
PadContext *pad = link->dst->priv;
|
||||
AVFilterBufferRef *outpic = link->dst->outputs[0]->out_buf;
|
||||
AVFilterBufferRef *inpic = link->cur_buf;
|
||||
int ret;
|
||||
|
||||
y += pad->y;
|
||||
|
||||
@ -403,7 +405,7 @@ static void draw_slice(AVFilterLink *link, int y, int h, int slice_dir)
|
||||
h &= ~((1 << pad->vsub) - 1);
|
||||
|
||||
if (!h)
|
||||
return;
|
||||
return 0;
|
||||
draw_send_bar_slice(link, y, h, slice_dir, 1);
|
||||
|
||||
/* left border */
|
||||
@ -421,9 +423,11 @@ static void draw_slice(AVFilterLink *link, int y, int h, int slice_dir)
|
||||
ff_draw_rectangle(outpic->data, outpic->linesize,
|
||||
pad->line, pad->line_step, pad->hsub, pad->vsub,
|
||||
pad->x + pad->in_w, y, pad->w - pad->x - pad->in_w, h);
|
||||
ff_draw_slice(link->dst->outputs[0], y, h, slice_dir);
|
||||
ret = ff_draw_slice(link->dst->outputs[0], y, h, slice_dir);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
draw_send_bar_slice(link, y, h, slice_dir, -1);
|
||||
return draw_send_bar_slice(link, y, h, slice_dir, -1);
|
||||
}
|
||||
|
||||
AVFilter avfilter_vf_pad = {
|
||||
|
@ -90,7 +90,7 @@ static int start_frame(AVFilterLink *inlink, AVFilterBufferRef *picref)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void draw_slice(AVFilterLink *inlink, int y, int h, int slice_dir)
|
||||
static int draw_slice(AVFilterLink *inlink, int y, int h, int slice_dir)
|
||||
{
|
||||
PixdescTestContext *priv = inlink->dst->priv;
|
||||
AVFilterBufferRef *inpic = inlink->cur_buf;
|
||||
@ -117,7 +117,7 @@ static void draw_slice(AVFilterLink *inlink, int y, int h, int slice_dir)
|
||||
}
|
||||
}
|
||||
|
||||
ff_draw_slice(inlink->dst->outputs[0], y, h, slice_dir);
|
||||
return ff_draw_slice(inlink->dst->outputs[0], y, h, slice_dir);
|
||||
}
|
||||
|
||||
AVFilter avfilter_vf_pixdesctest = {
|
||||
|
@ -291,16 +291,15 @@ static int start_frame(AVFilterLink *link, AVFilterBufferRef *picref)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void draw_slice(AVFilterLink *link, int y, int h, int slice_dir)
|
||||
static int draw_slice(AVFilterLink *link, int y, int h, int slice_dir)
|
||||
{
|
||||
ScaleContext *scale = link->dst->priv;
|
||||
int out_h;
|
||||
int out_h, ret;
|
||||
AVFilterBufferRef *cur_pic = link->cur_buf;
|
||||
const uint8_t *data[4];
|
||||
|
||||
if (!scale->sws) {
|
||||
ff_draw_slice(link->dst->outputs[0], y, h, slice_dir);
|
||||
return;
|
||||
return ff_draw_slice(link->dst->outputs[0], y, h, slice_dir);
|
||||
}
|
||||
|
||||
if (scale->slice_y == 0 && slice_dir == -1)
|
||||
@ -319,9 +318,10 @@ static void draw_slice(AVFilterLink *link, int y, int h, int slice_dir)
|
||||
|
||||
if (slice_dir == -1)
|
||||
scale->slice_y -= out_h;
|
||||
ff_draw_slice(link->dst->outputs[0], scale->slice_y, out_h, slice_dir);
|
||||
ret = ff_draw_slice(link->dst->outputs[0], scale->slice_y, out_h, slice_dir);
|
||||
if (slice_dir == 1)
|
||||
scale->slice_y += out_h;
|
||||
return ret;
|
||||
}
|
||||
|
||||
AVFilter avfilter_vf_scale = {
|
||||
|
@ -249,12 +249,13 @@ static int start_frame(AVFilterLink *inlink, AVFilterBufferRef *picref)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void draw_slice(AVFilterLink *inlink, int y, int h, int slice_dir)
|
||||
static int draw_slice(AVFilterLink *inlink, int y, int h, int slice_dir)
|
||||
{
|
||||
SelectContext *select = inlink->dst->priv;
|
||||
|
||||
if (select->select && !select->cache_frames)
|
||||
ff_draw_slice(inlink->dst->outputs[0], y, h, slice_dir);
|
||||
return ff_draw_slice(inlink->dst->outputs[0], y, h, slice_dir);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void end_frame(AVFilterLink *inlink)
|
||||
|
@ -78,24 +78,31 @@ static int start_frame(AVFilterLink *link, AVFilterBufferRef *picref)
|
||||
return ff_start_frame(link->dst->outputs[0], picref);
|
||||
}
|
||||
|
||||
static void draw_slice(AVFilterLink *link, int y, int h, int slice_dir)
|
||||
static int draw_slice(AVFilterLink *link, int y, int h, int slice_dir)
|
||||
{
|
||||
SliceContext *slice = link->dst->priv;
|
||||
int y2;
|
||||
int y2, ret = 0;
|
||||
|
||||
if (slice_dir == 1) {
|
||||
for (y2 = y; y2 + slice->h <= y + h; y2 += slice->h)
|
||||
ff_draw_slice(link->dst->outputs[0], y2, slice->h, slice_dir);
|
||||
for (y2 = y; y2 + slice->h <= y + h; y2 += slice->h) {
|
||||
ret = ff_draw_slice(link->dst->outputs[0], y2, slice->h, slice_dir);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
}
|
||||
|
||||
if (y2 < y + h)
|
||||
ff_draw_slice(link->dst->outputs[0], y2, y + h - y2, slice_dir);
|
||||
return ff_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)
|
||||
ff_draw_slice(link->dst->outputs[0], y2 - slice->h, slice->h, slice_dir);
|
||||
for (y2 = y + h; y2 - slice->h >= y; y2 -= slice->h) {
|
||||
ret = ff_draw_slice(link->dst->outputs[0], y2 - slice->h, slice->h, slice_dir);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
}
|
||||
|
||||
if (y2 > y)
|
||||
ff_draw_slice(link->dst->outputs[0], y, y2 - y, slice_dir);
|
||||
return ff_draw_slice(link->dst->outputs[0], y, y2 - y, slice_dir);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
AVFilter avfilter_vf_slicify = {
|
||||
|
@ -229,8 +229,9 @@ static void end_frame(AVFilterLink *link)
|
||||
ff_end_frame(link->dst->outputs[0]);
|
||||
}
|
||||
|
||||
static void draw_slice(AVFilterLink *link, int y, int h, int slice_dir)
|
||||
static int draw_slice(AVFilterLink *link, int y, int h, int slice_dir)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
AVFilter avfilter_vf_unsharp = {
|
||||
|
@ -82,11 +82,11 @@ static int start_frame(AVFilterLink *link, AVFilterBufferRef *inpicref)
|
||||
return ff_start_frame(link->dst->outputs[0], outpicref);
|
||||
}
|
||||
|
||||
static void draw_slice(AVFilterLink *link, int y, int h, int slice_dir)
|
||||
static int draw_slice(AVFilterLink *link, int y, int h, int slice_dir)
|
||||
{
|
||||
AVFilterContext *ctx = link->dst;
|
||||
|
||||
ff_draw_slice(ctx->outputs[0], link->h - (y+h), h, -1 * slice_dir);
|
||||
return ff_draw_slice(ctx->outputs[0], link->h - (y+h), h, -1 * slice_dir);
|
||||
}
|
||||
|
||||
AVFilter avfilter_vf_vflip = {
|
||||
|
@ -377,7 +377,10 @@ static av_cold int init(AVFilterContext *ctx, const char *args)
|
||||
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;
|
||||
}
|
||||
|
||||
static int config_props(AVFilterLink *link)
|
||||
{
|
||||
|
@ -263,12 +263,12 @@ void ff_end_frame(AVFilterLink *link)
|
||||
clear_link(link);
|
||||
}
|
||||
|
||||
void ff_null_draw_slice(AVFilterLink *link, int y, int h, int slice_dir)
|
||||
int ff_null_draw_slice(AVFilterLink *link, int y, int h, int slice_dir)
|
||||
{
|
||||
ff_draw_slice(link->dst->outputs[0], y, h, slice_dir);
|
||||
return ff_draw_slice(link->dst->outputs[0], y, h, slice_dir);
|
||||
}
|
||||
|
||||
static void default_draw_slice(AVFilterLink *inlink, int y, int h, int slice_dir)
|
||||
static int default_draw_slice(AVFilterLink *inlink, int y, int h, int slice_dir)
|
||||
{
|
||||
AVFilterLink *outlink = NULL;
|
||||
|
||||
@ -276,14 +276,15 @@ static void default_draw_slice(AVFilterLink *inlink, int y, int h, int slice_dir
|
||||
outlink = inlink->dst->outputs[0];
|
||||
|
||||
if (outlink)
|
||||
ff_draw_slice(outlink, y, h, slice_dir);
|
||||
return ff_draw_slice(outlink, y, h, slice_dir);
|
||||
return 0;
|
||||
}
|
||||
|
||||
void ff_draw_slice(AVFilterLink *link, int y, int h, int slice_dir)
|
||||
int ff_draw_slice(AVFilterLink *link, int y, int h, int slice_dir)
|
||||
{
|
||||
uint8_t *src[4], *dst[4];
|
||||
int i, j, vsub;
|
||||
void (*draw_slice)(AVFilterLink *, int, int, int);
|
||||
int i, j, vsub, ret;
|
||||
int (*draw_slice)(AVFilterLink *, int, int, int);
|
||||
|
||||
FF_DPRINTF_START(NULL, draw_slice); ff_dlog_link(NULL, link, 0); av_dlog(NULL, " y:%d h:%d dir:%d\n", y, h, slice_dir);
|
||||
|
||||
@ -317,5 +318,8 @@ void ff_draw_slice(AVFilterLink *link, int y, int h, int slice_dir)
|
||||
|
||||
if (!(draw_slice = link->dstpad->draw_slice))
|
||||
draw_slice = default_draw_slice;
|
||||
draw_slice(link, y, h, slice_dir);
|
||||
ret = draw_slice(link, y, h, slice_dir);
|
||||
if (ret < 0)
|
||||
clear_link(link);
|
||||
return ret;
|
||||
}
|
||||
|
@ -40,7 +40,7 @@ AVFilterBufferRef *ff_get_video_buffer(AVFilterLink *link, int perms,
|
||||
int w, int h);
|
||||
|
||||
int ff_null_start_frame(AVFilterLink *link, AVFilterBufferRef *picref);
|
||||
void ff_null_draw_slice(AVFilterLink *link, int y, int h, int slice_dir);
|
||||
int ff_null_draw_slice(AVFilterLink *link, int y, int h, int slice_dir);
|
||||
void ff_null_end_frame(AVFilterLink *link);
|
||||
|
||||
/**
|
||||
@ -78,7 +78,9 @@ void ff_end_frame(AVFilterLink *link);
|
||||
* from the top slice to the bottom slice if the value is 1,
|
||||
* from the bottom slice to the top slice if the value is -1,
|
||||
* for other values the behavior of the function is undefined.
|
||||
*
|
||||
* @return >= 0 on success, a negative AVERROR on error.
|
||||
*/
|
||||
void ff_draw_slice(AVFilterLink *link, int y, int h, int slice_dir);
|
||||
int ff_draw_slice(AVFilterLink *link, int y, int h, int slice_dir);
|
||||
|
||||
#endif /* AVFILTER_VIDEO_H */
|
||||
|
Loading…
Reference in New Issue
Block a user