diff options
Diffstat (limited to 'libavfilter/vf_interlace.c')
-rw-r--r-- | libavfilter/vf_interlace.c | 75 |
1 files changed, 27 insertions, 48 deletions
diff --git a/libavfilter/vf_interlace.c b/libavfilter/vf_interlace.c index ac435d768a..efa3128727 100644 --- a/libavfilter/vf_interlace.c +++ b/libavfilter/vf_interlace.c @@ -1,18 +1,23 @@ /* - * This file is part of Libav. + * Copyright (c) 2003 Michael Zucchi <notzed@ximian.com> + * Copyright (c) 2010 Baptiste Coudurier + * Copyright (c) 2011 Stefano Sabatini + * Copyright (c) 2013 Vittorio Giovara <vittorio.giovara@gmail.com> * - * Libav is free software; you can redistribute it and/or modify + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * - * Libav is distributed in the hope that it will be useful, + * FFmpeg is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along - * with Libav; if not, write to the Free Software Foundation, Inc., + * with FFmpeg; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ @@ -33,25 +38,20 @@ #include "video.h" #define OFFSET(x) offsetof(InterlaceContext, x) -#define V AV_OPT_FLAG_VIDEO_PARAM -static const AVOption options[] = { +#define FLAGS AV_OPT_FLAG_FILTERING_PARAM|AV_OPT_FLAG_VIDEO_PARAM +static const AVOption interlace_options[] = { { "scan", "scanning mode", OFFSET(scan), - AV_OPT_TYPE_INT, {.i64 = MODE_TFF }, 0, 1, .flags = V, .unit = "scan" }, + AV_OPT_TYPE_INT, {.i64 = MODE_TFF }, 0, 1, .flags = FLAGS, .unit = "scan" }, { "tff", "top field first", 0, - AV_OPT_TYPE_CONST, {.i64 = MODE_TFF }, INT_MIN, INT_MAX, .flags = V, .unit = "scan" }, + AV_OPT_TYPE_CONST, {.i64 = MODE_TFF }, INT_MIN, INT_MAX, .flags = FLAGS, .unit = "scan" }, { "bff", "bottom field first", 0, - AV_OPT_TYPE_CONST, {.i64 = MODE_BFF }, INT_MIN, INT_MAX, .flags = V, .unit = "scan" }, - { "lowpass", "enable vertical low-pass filter", OFFSET(lowpass), - AV_OPT_TYPE_INT, {.i64 = 1 }, 0, 1, .flags = V }, + AV_OPT_TYPE_CONST, {.i64 = MODE_BFF }, INT_MIN, INT_MAX, .flags = FLAGS, .unit = "scan" }, + { "lowpass", "set vertical low-pass filter", OFFSET(lowpass), + AV_OPT_TYPE_BOOL, {.i64 = 1 }, 0, 1, .flags = FLAGS }, { NULL } }; -static const AVClass class = { - .class_name = "interlace filter", - .item_name = av_default_item_name, - .option = options, - .version = LIBAVUTIL_VERSION_INT, -}; +AVFILTER_DEFINE_CLASS(interlace); static void lowpass_line_c(uint8_t *dstp, ptrdiff_t linesize, const uint8_t *srcp, @@ -76,8 +76,10 @@ static const enum AVPixelFormat formats_supported[] = { static int query_formats(AVFilterContext *ctx) { - ff_set_common_formats(ctx, ff_make_format_list(formats_supported)); - return 0; + AVFilterFormats *fmts_list = ff_make_format_list(formats_supported); + if (!fmts_list) + return AVERROR(ENOMEM); + return ff_set_common_formats(ctx, fmts_list); } static av_cold void uninit(AVFilterContext *ctx) @@ -86,8 +88,6 @@ static av_cold void uninit(AVFilterContext *ctx) av_frame_free(&s->cur); av_frame_free(&s->next); - - av_opt_free(s); } static int config_out_props(AVFilterLink *outlink) @@ -138,10 +138,8 @@ static void copy_picture_field(InterlaceContext *s, int plane, j; for (plane = 0; plane < desc->nb_components; plane++) { - int cols = (plane == 1 || plane == 2) ? AV_CEIL_RSHIFT(inlink->w, hsub) - : inlink->w; - int lines = (plane == 1 || plane == 2) ? AV_CEIL_RSHIFT(inlink->h, vsub) - : inlink->h; + int cols = (plane == 1 || plane == 2) ? -(-inlink->w) >> hsub : inlink->w; + int lines = (plane == 1 || plane == 2) ? AV_CEIL_RSHIFT(inlink->h, vsub) : inlink->h; uint8_t *dstp = dst_frame->data[plane]; const uint8_t *srcp = src_frame->data[plane]; @@ -198,7 +196,6 @@ static int filter_frame(AVFilterLink *inlink, AVFrame *buf) return AVERROR(ENOMEM); out->pts /= 2; // adjust pts to new framerate ret = ff_filter_frame(outlink, out); - s->got_output = 1; return ret; } @@ -221,20 +218,6 @@ static int filter_frame(AVFilterLink *inlink, AVFrame *buf) av_frame_free(&s->next); ret = ff_filter_frame(outlink, out); - s->got_output = 1; - - return ret; -} - -static int request_frame(AVFilterLink *outlink) -{ - AVFilterContext *ctx = outlink->src; - InterlaceContext *s = ctx->priv; - int ret = 0; - - s->got_output = 0; - while (ret >= 0 && !s->got_output) - ret = ff_request_frame(ctx->inputs[0]); return ret; } @@ -250,10 +233,9 @@ static const AVFilterPad inputs[] = { static const AVFilterPad outputs[] = { { - .name = "default", - .type = AVMEDIA_TYPE_VIDEO, - .config_props = config_out_props, - .request_frame = request_frame, + .name = "default", + .type = AVMEDIA_TYPE_VIDEO, + .config_props = config_out_props, }, { NULL } }; @@ -262,12 +244,9 @@ AVFilter ff_vf_interlace = { .name = "interlace", .description = NULL_IF_CONFIG_SMALL("Convert progressive video into interlaced."), .uninit = uninit, - - .priv_class = &class, + .priv_class = &interlace_class, .priv_size = sizeof(InterlaceContext), .query_formats = query_formats, - .inputs = inputs, .outputs = outputs, }; - |