FFmpeg
Loading...
Searching...
No Matches
vf_selectivecolor.c File Reference
#include "libavutil/avassert.h"
#include "libavutil/file.h"
#include "libavutil/intreadwrite.h"
#include "libavutil/opt.h"
#include "libavutil/pixdesc.h"
#include "libavcodec/mathops.h"
#include "avfilter.h"
#include "drawutils.h"
#include "filters.h"
#include "video.h"

Go to the source code of this file.

Data Structures

struct  process_range
 
struct  ThreadData
 Used for passing data between threads. More...
 
struct  SelectiveColorContext
 

Macros

#define R   0
 
#define G   1
 
#define B   2
 
#define A   3
 
#define OFFSET(x)
 
#define FLAGS   AV_OPT_FLAG_FILTERING_PARAM|AV_OPT_FLAG_VIDEO_PARAM
 
#define RANGE_OPTION(color_name, range)
 
#define DECLARE_RANGE_SCALE_FUNCS(nbits)
 
#define READ16(dst)
 
#define DECLARE_SELECTIVE_COLOR_FUNC(nbits)
 
#define DEF_SELECTIVE_COLOR_FUNC(name, direct, correction_method, nbits)
 
#define DEF_SELECTIVE_COLOR_FUNCS(nbits)
 

Typedefs

typedef int(* get_range_scale_func) (int r, int g, int b, int min_val, int max_val)
 
typedef int(* selective_color_func_type) (AVFilterContext *ctx, void *td, int jobnr, int nb_jobs)
 

Enumerations

enum  color_range {
  RANGE_REDS , RANGE_YELLOWS , RANGE_GREENS , RANGE_CYANS ,
  RANGE_BLUES , RANGE_MAGENTAS , RANGE_WHITES , RANGE_NEUTRALS ,
  RANGE_BLACKS , NB_RANGES
}
 
enum  correction_method { CORRECTION_METHOD_ABSOLUTE , CORRECTION_METHOD_RELATIVE , NB_CORRECTION_METHODS }
 

Functions

 AVFILTER_DEFINE_CLASS (selectivecolor)
 
static int get_rgb_scale (int r, int g, int b, int min_val, int max_val)
 
static int get_cmy_scale (int r, int g, int b, int min_val, int max_val)
 
static int register_range (AVFilterContext *ctx, int range_id)
 
static int parse_psfile (AVFilterContext *ctx, const char *fname)
 
static int config_input (AVFilterLink *inlink)
 
static int comp_adjust (int scale, float value, float adjust, float k, int correction_method)
 
static int filter_frame (AVFilterLink *inlink, AVFrame *in)
 

Variables

static const char *const color_names [NB_RANGES]
 
static const AVOption selectivecolor_options []
 
static enum AVPixelFormat pix_fmts []
 
static const AVFilterPad selectivecolor_inputs []
 
const FFFilter ff_vf_selectivecolor
 

Macro Definition Documentation

◆ R

#define R   0
See also
http://blog.pkh.me/p/22-understanding-selective-coloring-in-adobe-photoshop.html
Todo
  • use integers so it can be made bitexact and a FATE test can be added

Definition at line 38 of file vf_selectivecolor.c.

◆ G

#define G   1

Definition at line 39 of file vf_selectivecolor.c.

◆ B

#define B   2

Definition at line 40 of file vf_selectivecolor.c.

◆ A

#define A   3

Definition at line 41 of file vf_selectivecolor.c.

◆ OFFSET

#define OFFSET ( x)
Value:

Definition at line 92 of file vf_selectivecolor.c.

◆ FLAGS

Definition at line 93 of file vf_selectivecolor.c.

◆ RANGE_OPTION

#define RANGE_OPTION ( color_name,
range )
Value:
{ color_name"s", "adjust "color_name" regions", OFFSET(opt_cmyk_adjust[range]), AV_OPT_TYPE_STRING, {.str=NULL}, 0, 0, FLAGS }
#define FLAGS
Definition cmdutils.c:598
#define NULL
Definition coverity.c:32
#define OFFSET(x)
@ AV_OPT_TYPE_STRING
Underlying C type is a uint8_t* that is either NULL or points to a C string allocated with the av_mal...
Definition opt.h:275
enum AVColorRange range

Definition at line 94 of file vf_selectivecolor.c.

◆ DECLARE_RANGE_SCALE_FUNCS

#define DECLARE_RANGE_SCALE_FUNCS ( nbits)
Value:
static int get_neutrals_scale##nbits(int r, int g, int b, int min_val, int max_val) \
{ \
/* 1 - (|max-0.5| + |min-0.5|) */ \
return (((1<<nbits)-1)*2 - ( abs((max_val<<1) - ((1<<nbits)-1)) \
+ abs((min_val<<1) - ((1<<nbits)-1))) + 1) >> 1; \
} \
\
static int get_whites_scale##nbits(int r, int g, int b, int min_val, int max_val) \
{ \
/* (min - 0.5) * 2 */ \
return (min_val<<1) - ((1<<nbits)-1); \
} \
\
static int get_blacks_scale##nbits(int r, int g, int b, int min_val, int max_val) \
{ \
/* (0.5 - max) * 2 */ \
return ((1<<nbits)-1) - (max_val<<1); \
} \
#define abs(x)
#define r
Definition input.c:42
#define b
Definition input.c:43
const char * g
Definition vf_curves.c:128

Definition at line 126 of file vf_selectivecolor.c.

◆ READ16

#define READ16 ( dst)
Value:
do { \
if (size < 2) { \
goto end; \
} \
dst = AV_RB16(buf); \
buf += 2; \
size -= 2; \
} while (0)
uint8_t ptrdiff_t const uint8_t ptrdiff_t int intptr_t intptr_t int int16_t * dst
Definition dsp.h:87
#define AVERROR_INVALIDDATA
Invalid data found when processing input.
Definition error.h:61
#define AV_RB16(p)
int size

Referenced by parse_psfile().

◆ DECLARE_SELECTIVE_COLOR_FUNC

#define DECLARE_SELECTIVE_COLOR_FUNC ( nbits)

Definition at line 309 of file vf_selectivecolor.c.

◆ DEF_SELECTIVE_COLOR_FUNC

#define DEF_SELECTIVE_COLOR_FUNC ( name,
direct,
correction_method,
nbits )
Value:
static int selective_color_##name##_##nbits(AVFilterContext *ctx, void *arg, int jobnr, int nb_jobs) \
{ \
return selective_color_##nbits(ctx, arg, jobnr, nb_jobs, direct, correction_method); \
}
#define _
static AVFormatContext * ctx
const char * arg
Definition jacosubdec.c:65
const char * name
Definition qsvenc.c:142
An instance of a filter.
Definition avfilter.h:273
correction_method

Definition at line 409 of file vf_selectivecolor.c.

◆ DEF_SELECTIVE_COLOR_FUNCS

#define DEF_SELECTIVE_COLOR_FUNCS ( nbits)
Value:
DEF_SELECTIVE_COLOR_FUNC(indirect_absolute, 0, CORRECTION_METHOD_ABSOLUTE, nbits) \
DEF_SELECTIVE_COLOR_FUNC(indirect_relative, 0, CORRECTION_METHOD_RELATIVE, nbits) \
DEF_SELECTIVE_COLOR_FUNC( direct_absolute, 1, CORRECTION_METHOD_ABSOLUTE, nbits) \
DEF_SELECTIVE_COLOR_FUNC( direct_relative, 1, CORRECTION_METHOD_RELATIVE, nbits)
#define DECLARE_SELECTIVE_COLOR_FUNC(nbits)
@ CORRECTION_METHOD_ABSOLUTE
@ CORRECTION_METHOD_RELATIVE

Definition at line 415 of file vf_selectivecolor.c.

Typedef Documentation

◆ get_range_scale_func

typedef int(* get_range_scale_func) (int r, int g, int b, int min_val, int max_val)

Definition at line 67 of file vf_selectivecolor.c.

◆ selective_color_func_type

typedef int(* selective_color_func_type) (AVFilterContext *ctx, void *td, int jobnr, int nb_jobs)

Definition at line 425 of file vf_selectivecolor.c.

Enumeration Type Documentation

◆ color_range

Enumerator
RANGE_REDS 
RANGE_YELLOWS 
RANGE_GREENS 
RANGE_CYANS 
RANGE_BLUES 
RANGE_MAGENTAS 
RANGE_WHITES 
RANGE_NEUTRALS 
RANGE_BLACKS 
NB_RANGES 

Definition at line 43 of file vf_selectivecolor.c.

◆ correction_method

Enumerator
CORRECTION_METHOD_ABSOLUTE 
CORRECTION_METHOD_RELATIVE 
NB_CORRECTION_METHODS 

Definition at line 57 of file vf_selectivecolor.c.

Function Documentation

◆ AVFILTER_DEFINE_CLASS()

AVFILTER_DEFINE_CLASS ( selectivecolor )

◆ get_rgb_scale()

static int get_rgb_scale ( int r,
int g,
int b,
int min_val,
int max_val )
static

Definition at line 116 of file vf_selectivecolor.c.

Referenced by register_range().

◆ get_cmy_scale()

static int get_cmy_scale ( int r,
int g,
int b,
int min_val,
int max_val )
static

Definition at line 121 of file vf_selectivecolor.c.

Referenced by register_range().

◆ register_range()

static int register_range ( AVFilterContext * ctx,
int range_id )
static

Definition at line 149 of file vf_selectivecolor.c.

Referenced by config_input(), parse_psfile(), and register_range().

◆ parse_psfile()

static int parse_psfile ( AVFilterContext * ctx,
const char * fname )
static

Definition at line 185 of file vf_selectivecolor.c.

Referenced by config_input().

◆ config_input()

static int config_input ( AVFilterLink * inlink)
static

Definition at line 238 of file vf_selectivecolor.c.

◆ comp_adjust()

static int comp_adjust ( int scale,
float value,
float adjust,
float k,
int correction_method )
inlinestatic

Definition at line 299 of file vf_selectivecolor.c.

◆ filter_frame()

static int filter_frame ( AVFilterLink * inlink,
AVFrame * in )
static

Definition at line 427 of file vf_selectivecolor.c.

Variable Documentation

◆ color_names

const char* const color_names[NB_RANGES]
static
Initial value:
= {
"red", "yellow", "green", "cyan", "blue", "magenta", "white", "neutral", "black"
}

Definition at line 63 of file vf_selectivecolor.c.

Referenced by config_input(), register_range(), and test_av_parse_color().

◆ selectivecolor_options

const AVOption selectivecolor_options[]
static
Initial value:
= {
{ "correction_method", "select correction method", OFFSET(correction_method), AV_OPT_TYPE_INT, {.i64 = CORRECTION_METHOD_ABSOLUTE}, 0, NB_CORRECTION_METHODS-1, FLAGS, .unit = "correction_method" },
{ "absolute", NULL, 0, AV_OPT_TYPE_CONST, {.i64=CORRECTION_METHOD_ABSOLUTE}, INT_MIN, INT_MAX, FLAGS, .unit = "correction_method" },
{ "relative", NULL, 0, AV_OPT_TYPE_CONST, {.i64=CORRECTION_METHOD_RELATIVE}, INT_MIN, INT_MAX, FLAGS, .unit = "correction_method" },
{ "psfile", "set Photoshop selectivecolor file name", OFFSET(psfile), AV_OPT_TYPE_STRING, {.str=NULL}, .flags = FLAGS },
{ NULL }
}
@ AV_OPT_TYPE_CONST
Special option type for declaring named constants.
Definition opt.h:298
@ AV_OPT_TYPE_INT
Underlying C type is int.
Definition opt.h:258
@ RANGE_GREENS
@ RANGE_YELLOWS
@ RANGE_REDS
@ RANGE_MAGENTAS
@ RANGE_CYANS
@ RANGE_BLUES
@ RANGE_NEUTRALS
@ RANGE_WHITES
@ RANGE_BLACKS
#define RANGE_OPTION(color_name, range)
@ NB_CORRECTION_METHODS

Definition at line 97 of file vf_selectivecolor.c.

◆ pix_fmts

enum AVPixelFormat pix_fmts[]
static
Initial value:
= {
}
#define AV_PIX_FMT_BGR48
Definition pixfmt.h:536
#define AV_PIX_FMT_RGBA64
Definition pixfmt.h:535
#define AV_PIX_FMT_RGB48
Definition pixfmt.h:531
@ AV_PIX_FMT_NONE
Definition pixfmt.h:72
@ AV_PIX_FMT_RGB24
packed RGB 8:8:8, 24bpp, RGBRGB...
Definition pixfmt.h:75
@ AV_PIX_FMT_BGR0
packed BGR 8:8:8, 32bpp, BGRXBGRX... X=unused/undefined
Definition pixfmt.h:265
@ AV_PIX_FMT_ARGB
packed ARGB 8:8:8:8, 32bpp, ARGBARGB...
Definition pixfmt.h:99
@ AV_PIX_FMT_BGRA
packed BGRA 8:8:8:8, 32bpp, BGRABGRA...
Definition pixfmt.h:102
@ AV_PIX_FMT_ABGR
packed ABGR 8:8:8:8, 32bpp, ABGRABGR...
Definition pixfmt.h:101
@ AV_PIX_FMT_0BGR
packed BGR 8:8:8, 32bpp, XBGRXBGR... X=unused/undefined
Definition pixfmt.h:264
@ AV_PIX_FMT_RGBA
packed RGBA 8:8:8:8, 32bpp, RGBARGBA...
Definition pixfmt.h:100
@ AV_PIX_FMT_RGB0
packed RGB 8:8:8, 32bpp, RGBXRGBX... X=unused/undefined
Definition pixfmt.h:263
@ AV_PIX_FMT_BGR24
packed RGB 8:8:8, 24bpp, BGRBGR...
Definition pixfmt.h:76
@ AV_PIX_FMT_0RGB
packed RGB 8:8:8, 32bpp, XRGBXRGB... X=unused/undefined
Definition pixfmt.h:262
#define AV_PIX_FMT_BGRA64
Definition pixfmt.h:540

Definition at line 288 of file vf_selectivecolor.c.

◆ selectivecolor_inputs

const AVFilterPad selectivecolor_inputs[]
static
Initial value:
= {
{
.name = "default",
.filter_frame = filter_frame,
.config_props = config_input,
},
}
static int config_input(AVFilterLink *inlink)
static int filter_frame(DBEDecodeContext *s, AVFrame *frame)
Definition dolby_e.c:1067
@ AVMEDIA_TYPE_VIDEO
Definition avutil.h:200

Definition at line 468 of file vf_selectivecolor.c.

◆ ff_vf_selectivecolor

const FFFilter ff_vf_selectivecolor
Initial value:
= {
.p.name = "selectivecolor",
.p.description = NULL_IF_CONFIG_SMALL("Apply CMYK adjustments to specific color ranges."),
.p.priv_class = &selectivecolor_class,
.priv_size = sizeof(SelectiveColorContext),
}
#define AVFILTER_FLAG_SUPPORT_TIMELINE_GENERIC
Some filters support a generic "enable" expression option that can be used to enable or disable a fil...
Definition avfilter.h:196
#define AVFILTER_FLAG_SLICE_THREADS
The filter supports multithreading by splitting frames into multiple parts and processing them concur...
Definition avfilter.h:166
#define FILTER_INPUTS(array)
Definition filters.h:264
#define FILTER_OUTPUTS(array)
Definition filters.h:265
#define FILTER_PIXFMTS_ARRAY(array)
Definition filters.h:244
#define NULL_IF_CONFIG_SMALL(x)
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification.
Definition internal.h:88
static enum AVPixelFormat pix_fmts[]
Definition libkvazaar.c:296
static const AVFilterPad selectivecolor_inputs[]
const AVFilterPad ff_video_default_filterpad[1]
An AVFilterPad array whose only entry has name "default" and is of type AVMEDIA_TYPE_VIDEO.
Definition video.c:37

Definition at line 477 of file vf_selectivecolor.c.