| @@ -46,55 +46,40 @@ · 45 unmodified lines |
| 46 | 46 | #define U 1 |
| 47 | 47 | #define V 2 |
| 48 | 48 | |
| 49 | +#define FADE_IN 0 |
| 50 | +#define FADE_OUT 1 |
| 51 | + |
| 49 | 52 | typedef struct { |
| 50 | 53 | const AVClass *class; |
| 54 | + int type; |
| 51 | 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 | 58 | int hsub, vsub, bpp; |
| 54 | 59 | unsigned int black_level, black_level_scaled; |
| 55 | 60 | uint8_t is_packed_rgb; |
| 56 | 61 | uint8_t rgba_map[4]; |
| 57 | 62 | int alpha; |
| 58 | 63 | |
| 59 | | − char *type; |
| 60 | 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 | 66 | static av_cold int init(AVFilterContext *ctx, const char *args) |
| 79 | 67 | { |
| 80 | 68 | FadeContext *fade = ctx->priv; |
| 81 | 69 | |
| 82 | 70 | fade->fade_per_frame = (1 << 16) / fade->nb_frames; |
| 83 | | − if (!strcmp(fade->type, "in")) |
| 71 | + if (fade->type == FADE_IN) { |
| 84 | 72 | fade->factor = 0; |
| 85 | | − else if (!strcmp(fade->type, "out")) { |
| 73 | + } else if (fade->type == FADE_OUT) { |
| 86 | 74 | fade->fade_per_frame = -fade->fade_per_frame; |
| 87 | 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 | 77 | fade->stop_frame = fade->start_frame + fade->nb_frames; |
| 94 | 78 | |
| 95 | 79 | av_log(ctx, AV_LOG_VERBOSE, |
| 96 | 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 | 83 | return 0; |
| 99 | 84 | } |
| 100 | 85 | |
| @@ -212,6 +197,29 @@ static int filter_frame(AVFilterLink *inlink, AVFrame *frame) · 111 unmodified lines |
| 212 | 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 | 223 | static const AVFilterPad avfilter_vf_fade_inputs[] = { |
| 216 | 224 | { |
| 217 | 225 | .name = "default", |
| @@ -232,17 +240,14 @@ static const AVFilterPad avfilter_vf_fade_outputs[] = { · 14 unmodified lines |
| 232 | 240 | { NULL } |
| 233 | 241 | }; |
| 234 | 242 | |
| 235 | | −static const char *const shorthand[] = { "type", "start_frame", "nb_frames", NULL }; |
| 236 | | − |
| 237 | 243 | AVFilter avfilter_vf_fade = { |
| 238 | 244 | .name = "fade", |
| 239 | 245 | .description = NULL_IF_CONFIG_SMALL("Fade in/out input video."), |
| 240 | 246 | .init = init, |
| 241 | 247 | .priv_size = sizeof(FadeContext), |
| 248 | + .priv_class = &fade_class, |
| 242 | 249 | .query_formats = query_formats, |
| 243 | 250 | |
| 244 | 251 | .inputs = avfilter_vf_fade_inputs, |
| 245 | 252 | .outputs = avfilter_vf_fade_outputs, |
| 246 | | − .priv_class = &fade_class, |
| 247 | | − .shorthand = shorthand, |
| 248 | 253 | }; |