| @@ -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 */ | |||