diff options
author | Anton Khirnov <anton@khirnov.net> | 2012-11-29 03:15:40 +0400 |
---|---|---|
committer | Michael Niedermayer <michaelni@gmx.at> | 2012-11-29 03:15:40 +0400 |
commit | 71f82c3805ebefe57a42c13f5a02a963d51f7955 (patch) | |
tree | e20d0385c936984f8d6edb1a59d28ba9d5c2524c /libavfilter | |
parent | a42b89910b072e2d2c9b2385b66134cc90caeb5a (diff) |
vf_crop: switch to filter_frame
Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
Diffstat (limited to 'libavfilter')
-rw-r--r-- | libavfilter/vf_crop.c | 65 |
1 files changed, 17 insertions, 48 deletions
diff --git a/libavfilter/vf_crop.c b/libavfilter/vf_crop.c index 17b24c4c36..d0f464f20d 100644 --- a/libavfilter/vf_crop.c +++ b/libavfilter/vf_crop.c @@ -262,24 +262,19 @@ static int config_output(AVFilterLink *link) return 0; } -static int start_frame(AVFilterLink *link, AVFilterBufferRef *picref) +static int filter_frame(AVFilterLink *link, AVFilterBufferRef *frame) { AVFilterContext *ctx = link->dst; CropContext *crop = ctx->priv; - AVFilterBufferRef *ref2; const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(link->format); int i; - ref2 = avfilter_ref_buffer(picref, ~0); - if (!ref2) - return AVERROR(ENOMEM); + frame->video->w = crop->w; + frame->video->h = crop->h; - ref2->video->w = crop->w; - ref2->video->h = crop->h; - - crop->var_values[VAR_T] = picref->pts == AV_NOPTS_VALUE ? - NAN : picref->pts * av_q2d(link->time_base); - crop->var_values[VAR_POS] = picref->pos == -1 ? NAN : picref->pos; + crop->var_values[VAR_T] = frame->pts == AV_NOPTS_VALUE ? + NAN : frame->pts * av_q2d(link->time_base); + crop->var_values[VAR_POS] = frame->pos == -1 ? NAN : frame->pos; crop->var_values[VAR_X] = av_expr_eval(crop->x_pexpr, crop->var_values, NULL); crop->var_values[VAR_Y] = av_expr_eval(crop->y_pexpr, crop->var_values, NULL); crop->var_values[VAR_X] = av_expr_eval(crop->x_pexpr, crop->var_values, NULL); @@ -298,60 +293,34 @@ static int start_frame(AVFilterLink *link, AVFilterBufferRef *picref) (int)crop->var_values[VAR_N], crop->var_values[VAR_T], crop->x, crop->y, crop->x+crop->w, crop->y+crop->h); - ref2->data[0] += crop->y * ref2->linesize[0]; - ref2->data[0] += crop->x * crop->max_step[0]; + frame->data[0] += crop->y * frame->linesize[0]; + frame->data[0] += crop->x * crop->max_step[0]; if (!(desc->flags & PIX_FMT_PAL || desc->flags & PIX_FMT_PSEUDOPAL)) { for (i = 1; i < 3; i ++) { - if (ref2->data[i]) { - ref2->data[i] += (crop->y >> crop->vsub) * ref2->linesize[i]; - ref2->data[i] += (crop->x * crop->max_step[i]) >> crop->hsub; + if (frame->data[i]) { + frame->data[i] += (crop->y >> crop->vsub) * frame->linesize[i]; + frame->data[i] += (crop->x * crop->max_step[i]) >> crop->hsub; } } } /* alpha plane */ - if (ref2->data[3]) { - ref2->data[3] += crop->y * ref2->linesize[3]; - ref2->data[3] += crop->x * crop->max_step[3]; + if (frame->data[3]) { + frame->data[3] += crop->y * frame->linesize[3]; + frame->data[3] += crop->x * crop->max_step[3]; } - return ff_start_frame(link->dst->outputs[0], ref2); -} - -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 0; - - if (y < crop->y) { - h -= crop->y - y; - y = crop->y; - } - if (y + h > crop->y + crop->h) - h = crop->y + crop->h - y; - - return ff_draw_slice(ctx->outputs[0], y - crop->y, h, slice_dir); -} - -static int end_frame(AVFilterLink *link) -{ - CropContext *crop = link->dst->priv; - crop->var_values[VAR_N] += 1.0; - return ff_end_frame(link->dst->outputs[0]); + + return ff_filter_frame(link->dst->outputs[0], frame); } static const AVFilterPad avfilter_vf_crop_inputs[] = { { .name = "default", .type = AVMEDIA_TYPE_VIDEO, - .start_frame = start_frame, - .draw_slice = draw_slice, - .end_frame = end_frame, + .filter_frame = filter_frame, .get_video_buffer = ff_null_get_video_buffer, .config_props = config_input, }, |