| 
				
				
					
				
				
				 | 
			
			 | 
			@@ -34,9 +34,10 @@ typedef struct FloodfillContext { | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    const AVClass *class; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    int x, y; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    int s0, s1, s2, s3; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    int d0, d1, d2, d3; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    int s[4]; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    int d[4]; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    int nb_planes; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    int back, front; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    Points *points; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
  | 
		
		
	
	
		
			
				| 
				
					
				
				
					
				
				
				 | 
			
			 | 
			@@ -238,12 +239,12 @@ static int config_input(AVFilterLink *inlink) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(inlink->format); | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    AVFilterContext *ctx = inlink->dst; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    FloodfillContext *s = ctx->priv; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    int nb_planes = av_pix_fmt_count_planes(inlink->format); | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    int depth; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    s->nb_planes = av_pix_fmt_count_planes(inlink->format); | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    depth = desc->comp[0].depth; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    if (depth == 8) { | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        switch (nb_planes) { | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        switch (s->nb_planes) { | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        case 1: s->set_pixel  = set_pixel1; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			                s->is_same    = is_same1; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			                s->pick_pixel = pick_pixel1; break; | 
		
		
	
	
		
			
				| 
				
				
				
					
				
				 | 
			
			 | 
			@@ -255,7 +256,7 @@ static int config_input(AVFilterLink *inlink) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			                s->pick_pixel = pick_pixel4; break; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			       } | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    } else { | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        switch (nb_planes) { | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        switch (s->nb_planes) { | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        case 1: s->set_pixel  = set_pixel1_16; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			                s->is_same    = is_same1_16; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			                s->pick_pixel = pick_pixel1_16; break; | 
		
		
	
	
		
			
				| 
				
				
				
					
				
				 | 
			
			 | 
			@@ -280,17 +281,25 @@ static int filter_frame(AVFilterLink *link, AVFrame *frame) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			{ | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    AVFilterContext *ctx = link->dst; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    FloodfillContext *s = ctx->priv; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    const unsigned d0 = s->d0; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    const unsigned d1 = s->d1; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    const unsigned d2 = s->d2; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    const unsigned d3 = s->d3; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    int s0 = s->s0; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    int s1 = s->s1; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    int s2 = s->s2; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    int s3 = s->s3; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    const unsigned d0 = s->d[0]; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    const unsigned d1 = s->d[1]; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    const unsigned d2 = s->d[2]; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    const unsigned d3 = s->d[3]; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    int s0 = s->s[0]; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    int s1 = s->s[1]; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    int s2 = s->s[2]; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    int s3 = s->s[3]; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    const int w = frame->width; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    const int h = frame->height; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    int ret; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    int i, ret; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    for (i = 0; i < s->nb_planes; i++) { | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        if (s->s[i] != s->d[i]) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			            break; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    } | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    if (i == s->nb_planes) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        goto end; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    if (ret = av_frame_make_writable(frame)) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        return ret; | 
		
		
	
	
		
			
				| 
				
					
				
				
					
				
				
				 | 
			
			 | 
			@@ -337,6 +346,7 @@ static int filter_frame(AVFilterLink *link, AVFrame *frame) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        } | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    } | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			end: | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    return ff_filter_frame(ctx->outputs[0], frame); | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			} | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
  | 
		
		
	
	
		
			
				| 
				
					
				
				
					
				
				
				 | 
			
			 | 
			@@ -405,16 +415,16 @@ static const AVFilterPad floodfill_outputs[] = { | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			#define FLAGS AV_OPT_FLAG_FILTERING_PARAM|AV_OPT_FLAG_VIDEO_PARAM | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			static const AVOption floodfill_options[] = { | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    { "x",  "set pixel x coordinate",             OFFSET(x),  AV_OPT_TYPE_INT, {.i64=0}, 0, UINT16_MAX, FLAGS }, | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    { "y",  "set pixel y coordinate",             OFFSET(y),  AV_OPT_TYPE_INT, {.i64=0}, 0, UINT16_MAX, FLAGS }, | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    { "s0", "set source #0 component value",      OFFSET(s0), AV_OPT_TYPE_INT, {.i64=0},-1, UINT16_MAX, FLAGS }, | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    { "s1", "set source #1 component value",      OFFSET(s1), AV_OPT_TYPE_INT, {.i64=0},-1, UINT16_MAX, FLAGS }, | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    { "s2", "set source #2 component value",      OFFSET(s2), AV_OPT_TYPE_INT, {.i64=0},-1, UINT16_MAX, FLAGS }, | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    { "s3", "set source #3 component value",      OFFSET(s3), AV_OPT_TYPE_INT, {.i64=0},-1, UINT16_MAX, FLAGS }, | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    { "d0", "set destination #0 component value", OFFSET(d0), AV_OPT_TYPE_INT, {.i64=0}, 0, UINT16_MAX, FLAGS }, | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    { "d1", "set destination #1 component value", OFFSET(d1), AV_OPT_TYPE_INT, {.i64=0}, 0, UINT16_MAX, FLAGS }, | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    { "d2", "set destination #2 component value", OFFSET(d2), AV_OPT_TYPE_INT, {.i64=0}, 0, UINT16_MAX, FLAGS }, | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    { "d3", "set destination #3 component value", OFFSET(d3), AV_OPT_TYPE_INT, {.i64=0}, 0, UINT16_MAX, FLAGS }, | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    { "x",  "set pixel x coordinate",             OFFSET(x),    AV_OPT_TYPE_INT, {.i64=0}, 0, UINT16_MAX, FLAGS }, | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    { "y",  "set pixel y coordinate",             OFFSET(y),    AV_OPT_TYPE_INT, {.i64=0}, 0, UINT16_MAX, FLAGS }, | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    { "s0", "set source #0 component value",      OFFSET(s[0]), AV_OPT_TYPE_INT, {.i64=0},-1, UINT16_MAX, FLAGS }, | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    { "s1", "set source #1 component value",      OFFSET(s[1]), AV_OPT_TYPE_INT, {.i64=0},-1, UINT16_MAX, FLAGS }, | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    { "s2", "set source #2 component value",      OFFSET(s[2]), AV_OPT_TYPE_INT, {.i64=0},-1, UINT16_MAX, FLAGS }, | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    { "s3", "set source #3 component value",      OFFSET(s[3]), AV_OPT_TYPE_INT, {.i64=0},-1, UINT16_MAX, FLAGS }, | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    { "d0", "set destination #0 component value", OFFSET(d[0]), AV_OPT_TYPE_INT, {.i64=0}, 0, UINT16_MAX, FLAGS }, | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    { "d1", "set destination #1 component value", OFFSET(d[1]), AV_OPT_TYPE_INT, {.i64=0}, 0, UINT16_MAX, FLAGS }, | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    { "d2", "set destination #2 component value", OFFSET(d[2]), AV_OPT_TYPE_INT, {.i64=0}, 0, UINT16_MAX, FLAGS }, | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    { "d3", "set destination #3 component value", OFFSET(d[3]), AV_OPT_TYPE_INT, {.i64=0}, 0, UINT16_MAX, FLAGS }, | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    { NULL } | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			}; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
  | 
		
		
	
	
		
			
				| 
				
					
				
				
				
				 | 
			
			 | 
			
  |