|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#ifndef AVFILTER_EQ_H |
|
#define AVFILTER_EQ_H |
|
|
|
#include "avfilter.h" |
|
#include "libavutil/eval.h" |
|
|
|
static const char *const var_names[] = { |
|
"n", |
|
#if FF_API_FRAME_PKT |
|
"pos", |
|
#endif |
|
"r", |
|
"t", |
|
NULL |
|
}; |
|
|
|
enum var_name { |
|
VAR_N, |
|
#if FF_API_FRAME_PKT |
|
VAR_POS, |
|
#endif |
|
VAR_R, |
|
VAR_T, |
|
VAR_NB |
|
}; |
|
|
|
typedef struct EQParameters { |
|
void (*adjust)(struct EQParameters *eq, uint8_t *dst, int dst_stride, |
|
const uint8_t *src, int src_stride, int w, int h); |
|
|
|
uint8_t lut[256]; |
|
|
|
double brightness, contrast, gamma, gamma_weight; |
|
int lut_clean; |
|
|
|
} EQParameters; |
|
|
|
typedef struct EQContext { |
|
const AVClass *class; |
|
|
|
EQParameters param[3]; |
|
|
|
char *contrast_expr; |
|
AVExpr *contrast_pexpr; |
|
double contrast; |
|
|
|
char *brightness_expr; |
|
AVExpr *brightness_pexpr; |
|
double brightness; |
|
|
|
char *saturation_expr; |
|
AVExpr *saturation_pexpr; |
|
double saturation; |
|
|
|
char *gamma_expr; |
|
AVExpr *gamma_pexpr; |
|
double gamma; |
|
|
|
char *gamma_weight_expr; |
|
AVExpr *gamma_weight_pexpr; |
|
double gamma_weight; |
|
|
|
char *gamma_r_expr; |
|
AVExpr *gamma_r_pexpr; |
|
double gamma_r; |
|
|
|
char *gamma_g_expr; |
|
AVExpr *gamma_g_pexpr; |
|
double gamma_g; |
|
|
|
char *gamma_b_expr; |
|
AVExpr *gamma_b_pexpr; |
|
double gamma_b; |
|
|
|
double var_values[VAR_NB]; |
|
|
|
void (*process)(struct EQParameters *par, uint8_t *dst, int dst_stride, |
|
const uint8_t *src, int src_stride, int w, int h); |
|
|
|
enum EvalMode { EVAL_MODE_INIT, EVAL_MODE_FRAME, EVAL_MODE_NB } eval_mode; |
|
} EQContext; |
|
|
|
static void process_c(EQParameters *param, uint8_t *dst, int dst_stride, |
|
const uint8_t *src, int src_stride, int w, int h) |
|
{ |
|
int contrast = (int) (param->contrast * 256 * 16); |
|
int brightness = ((int) (100.0 * param->brightness + 100.0) * 511) / 200 - 128 - contrast / 32; |
|
|
|
for (int y = 0; y < h; y++) { |
|
for (int x = 0; x < w; x++) { |
|
int pel = ((src[y * src_stride + x] * contrast) >> 12) + brightness; |
|
|
|
if (pel & ~255) |
|
pel = (-pel) >> 31; |
|
|
|
dst[y * dst_stride + x] = pel; |
|
} |
|
} |
|
} |
|
|
|
void ff_eq_init_x86(EQContext *eq); |
|
|
|
static av_unused void ff_eq_init(EQContext *eq) |
|
{ |
|
eq->process = process_c; |
|
#if ARCH_X86 |
|
ff_eq_init_x86(eq); |
|
#endif |
|
} |
|
|
|
#endif |
|
|