| @@ -46,55 +46,40 @@ · 45 unmodified lines |
| 46 | #define U 1 | 46 | #define U 1 |
| 47 | #define V 2 | 47 | #define V 2 |
| 48 | | 48 | |
| | 49 | #define FADE_IN 0 |
| | 50 | #define FADE_OUT 1 |
| | 51 | |
| 49 | typedef struct { | 52 | typedef struct { |
| 50 | const AVClass *class; | 53 | const AVClass *class; |
| | 54 | int type; |
| 51 | int factor, fade_per_frame; | 55 | int factor, fade_per_frame; |
| 52 | unsigned int frame_index, start_frame, stop_frame, nb_frames; | 56 | int start_frame, nb_frames; |
| | 57 | unsigned int frame_index, stop_frame; |
| 53 | int hsub, vsub, bpp; | 58 | int hsub, vsub, bpp; |
| 54 | unsigned int black_level, black_level_scaled; | 59 | unsigned int black_level, black_level_scaled; |
| 55 | uint8_t is_packed_rgb; | 60 | uint8_t is_packed_rgb; |
| 56 | uint8_t rgba_map[4]; | 61 | uint8_t rgba_map[4]; |
| 57 | int alpha; | 62 | int alpha; |
| 58 | | 63 | |
| 59 | char *type; | | |
| 60 | } FadeContext; | 64 | } FadeContext; |
| 61 | | 65 | |
| 62 | #define OFFSET(x) offsetof(FadeContext, x) | | |
| 63 | #define FLAGS AV_OPT_FLAG_VIDEO_PARAM|AV_OPT_FLAG_FILTERING_PARAM | | |
| 64 | | | |
| 65 | static const AVOption fade_options[] = { | | |
| 66 | { "type", "set the fade direction", OFFSET(type), AV_OPT_TYPE_STRING, {.str = "in" }, CHAR_MIN, CHAR_MAX, FLAGS }, | | |
| 67 | { "t", "set the fade direction", OFFSET(type), AV_OPT_TYPE_STRING, {.str = "in" }, CHAR_MIN, CHAR_MAX, FLAGS }, | | |
| 68 | { "start_frame", "set expression of frame to start fading", OFFSET(start_frame), AV_OPT_TYPE_INT, {.i64 = 0 }, 0, INT_MAX, FLAGS }, | | |
| 69 | { "s", "set expression of frame to start fading", OFFSET(start_frame), AV_OPT_TYPE_INT, {.i64 = 0 }, 0, INT_MAX, FLAGS }, | | |
| 70 | { "nb_frames", "set expression for fade duration in frames", OFFSET(nb_frames), AV_OPT_TYPE_INT, {.i64 = 25 }, 0, INT_MAX, FLAGS }, | | |
| 71 | { "n", "set expression for fade duration in frames", OFFSET(nb_frames), AV_OPT_TYPE_INT, {.i64 = 25 }, 0, INT_MAX, FLAGS }, | | |
| 72 | { "alpha", "fade alpha if it is available on the input", OFFSET(alpha), AV_OPT_TYPE_INT, {.i64 = 0 }, 0, 1, FLAGS }, | | |
| 73 | {NULL}, | | |
| 74 | }; | | |
| 75 | | | |
| 76 | AVFILTER_DEFINE_CLASS(fade); | | |
| 77 | | | |
| 78 | static av_cold int init(AVFilterContext *ctx, const char *args) | 66 | static av_cold int init(AVFilterContext *ctx, const char *args) |
| 79 | { | 67 | { |
| 80 | FadeContext *fade = ctx->priv; | 68 | FadeContext *fade = ctx->priv; |
| 81 | | 69 | |
| 82 | fade->fade_per_frame = (1 << 16) / fade->nb_frames; | 70 | fade->fade_per_frame = (1 << 16) / fade->nb_frames; |
| 83 | if (!strcmp(fade->type, "in")) | 71 | if (fade->type == FADE_IN) { |
| 84 | fade->factor = 0; | 72 | fade->factor = 0; |
| 85 | else if (!strcmp(fade->type, "out")) { | 73 | } else if (fade->type == FADE_OUT) { |
| 86 | fade->fade_per_frame = -fade->fade_per_frame; | 74 | fade->fade_per_frame = -fade->fade_per_frame; |
| 87 | fade->factor = (1 << 16); | 75 | fade->factor = (1 << 16); |
| 88 | } else { | | |
| 89 | av_log(ctx, AV_LOG_ERROR, | | |
| 90 | "Type argument must be 'in' or 'out' but '%s' was specified\n", fade->type); | | |
| 91 | return AVERROR(EINVAL); | | |
| 92 | } | 76 | } |
| 93 | fade->stop_frame = fade->start_frame + fade->nb_frames; | 77 | fade->stop_frame = fade->start_frame + fade->nb_frames; |
| 94 | | 78 | |
| 95 | av_log(ctx, AV_LOG_VERBOSE, | 79 | av_log(ctx, AV_LOG_VERBOSE, |
| 96 | "type:%s start_frame:%d nb_frames:%d alpha:%d\n", | 80 | "type:%s start_frame:%d nb_frames:%d alpha:%d\n", |
| 97 | fade->type, fade->start_frame, fade->nb_frames, fade->alpha); | 81 | fade->type == FADE_IN ? "in" : "out", fade->start_frame, |
| | 82 | fade->nb_frames, fade->alpha); |
| 98 | return 0; | 83 | return 0; |
| 99 | } | 84 | } |
| 100 | | 85 | |
| @@ -212,6 +197,29 @@ static int filter_frame(AVFilterLink *inlink, AVFrame *frame) · 111 unmodified lines |
| 212 | return ff_filter_frame(inlink->dst->outputs[0], frame); | 197 | return ff_filter_frame(inlink->dst->outputs[0], frame); |
| 213 | } | 198 | } |
| 214 | | 199 | |
| | 200 | |
| | 201 | #define OFFSET(x) offsetof(FadeContext, x) |
| | 202 | #define FLAGS AV_OPT_FLAG_VIDEO_PARAM|AV_OPT_FLAG_FILTERING_PARAM |
| | 203 | |
| | 204 | static const AVOption fade_options[] = { |
| | 205 | { "type", "'in' or 'out' for fade-in/fade-out", OFFSET(type), AV_OPT_TYPE_INT, { .i64 = FADE_IN }, FADE_IN, FADE_OUT, FLAGS, "type" }, |
| | 206 | { "t", "'in' or 'out' for fade-in/fade-out", OFFSET(type), AV_OPT_TYPE_INT, { .i64 = FADE_IN }, FADE_IN, FADE_OUT, FLAGS, "type" }, |
| | 207 | { "in", "fade-in", 0, AV_OPT_TYPE_CONST, { .i64 = FADE_IN }, .unit = "type" }, |
| | 208 | { "out", "fade-out", 0, AV_OPT_TYPE_CONST, { .i64 = FADE_OUT }, .unit = "type" }, |
| | 209 | { "start_frame", "Number of the first frame to which to apply the effect.", |
| | 210 | OFFSET(start_frame), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, INT_MAX, FLAGS }, |
| | 211 | { "s", "Number of the first frame to which to apply the effect.", |
| | 212 | OFFSET(start_frame), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, INT_MAX, FLAGS }, |
| | 213 | { "nb_frames", "Number of frames to which the effect should be applied.", |
| | 214 | OFFSET(nb_frames), AV_OPT_TYPE_INT, { .i64 = 25 }, 0, INT_MAX, FLAGS }, |
| | 215 | { "n", "Number of frames to which the effect should be applied.", |
| | 216 | OFFSET(nb_frames), AV_OPT_TYPE_INT, { .i64 = 25 }, 0, INT_MAX, FLAGS }, |
| | 217 | { "alpha", "fade alpha if it is available on the input", OFFSET(alpha), AV_OPT_TYPE_INT, {.i64 = 0 }, 0, 1, FLAGS }, |
| | 218 | { NULL }, |
| | 219 | }; |
| | 220 | |
| | 221 | AVFILTER_DEFINE_CLASS(fade); |
| | 222 | |
| 215 | static const AVFilterPad avfilter_vf_fade_inputs[] = { | 223 | static const AVFilterPad avfilter_vf_fade_inputs[] = { |
| 216 | { | 224 | { |
| 217 | .name = "default", | 225 | .name = "default", |
| @@ -232,17 +240,14 @@ static const AVFilterPad avfilter_vf_fade_outputs[] = { · 14 unmodified lines |
| 232 | { NULL } | 240 | { NULL } |
| 233 | }; | 241 | }; |
| 234 | | 242 | |
| 235 | static const char *const shorthand[] = { "type", "start_frame", "nb_frames", NULL }; | | |
| 236 | | | |
| 237 | AVFilter avfilter_vf_fade = { | 243 | AVFilter avfilter_vf_fade = { |
| 238 | .name = "fade", | 244 | .name = "fade", |
| 239 | .description = NULL_IF_CONFIG_SMALL("Fade in/out input video."), | 245 | .description = NULL_IF_CONFIG_SMALL("Fade in/out input video."), |
| 240 | .init = init, | 246 | .init = init, |
| 241 | .priv_size = sizeof(FadeContext), | 247 | .priv_size = sizeof(FadeContext), |
| | 248 | .priv_class = &fade_class, |
| 242 | .query_formats = query_formats, | 249 | .query_formats = query_formats, |
| 243 | | 250 | |
| 244 | .inputs = avfilter_vf_fade_inputs, | 251 | .inputs = avfilter_vf_fade_inputs, |
| 245 | .outputs = avfilter_vf_fade_outputs, | 252 | .outputs = avfilter_vf_fade_outputs, |
| 246 | .priv_class = &fade_class, | | |
| 247 | .shorthand = shorthand, | | |
| 248 | }; | 253 | }; |