20#include "common/macros.h"
25#define M_PI 3.14159265358979323846264338327
34#define ADM_CM_THRESH_S_0_0(angles,flt_angles,src_px_stride,accum,w,h,i,j) \
37 for (int theta = 0; theta < 3; ++theta) { \
38 const float *src_ptr = angles[theta]; \
39 const float *flt_ptr = flt_angles[theta]; \
41 sum += flt_ptr[src_px_stride + 1]; \
42 sum += flt_ptr[src_px_stride]; \
43 sum += flt_ptr[src_px_stride + 1]; \
45 sum += FLOAT_ONE_BY_15 * fabsf(src_ptr[0]); \
47 sum += flt_ptr[src_px_stride + 1]; \
48 sum += flt_ptr[src_px_stride]; \
49 sum += flt_ptr[src_px_stride + 1]; \
55#define ADM_CM_THRESH_S_0_W_M_1(angles,flt_angles,src_px_stride,accum,w,h,i,j) \
58 for (int theta = 0; theta < 3; ++theta) { \
59 const float *src_ptr = angles[theta]; \
60 const float *flt_ptr = flt_angles[theta]; \
62 sum += flt_ptr[src_px_stride + w - 2]; \
63 sum += flt_ptr[src_px_stride + w - 1]; \
64 sum += flt_ptr[src_px_stride + w - 1]; \
65 sum += flt_ptr[w - 2]; \
66 sum += FLOAT_ONE_BY_15 * fabsf(src_ptr[w - 1]); \
67 sum += flt_ptr[w - 1]; \
68 sum += flt_ptr[src_px_stride + w - 2]; \
69 sum += flt_ptr[src_px_stride + w - 1]; \
70 sum += flt_ptr[src_px_stride + w - 1]; \
76#define ADM_CM_THRESH_S_0_J(angles,flt_angles,src_px_stride,accum,w,h,i,j) \
79 for (int theta = 0; theta < 3; ++theta) { \
80 const float *src_ptr = angles[theta]; \
81 const float *flt_ptr = flt_angles[theta]; \
83 sum += flt_ptr[src_px_stride + j - 1]; \
84 sum += flt_ptr[src_px_stride + j]; \
85 sum += flt_ptr[src_px_stride + j + 1]; \
86 sum += flt_ptr[j - 1]; \
87 sum += FLOAT_ONE_BY_15 * fabsf(src_ptr[j]); \
88 sum += flt_ptr[j + 1]; \
89 sum += flt_ptr[src_px_stride + j - 1]; \
90 sum += flt_ptr[src_px_stride + j]; \
91 sum += flt_ptr[src_px_stride + j + 1]; \
97#define ADM_CM_THRESH_S_H_M_1_0(angles,flt_angles,src_px_stride,accum,w,h,i,j) \
100 for (int theta = 0; theta < 3; ++theta) { \
101 const float *src_ptr = angles[theta]; \
102 const float *flt_ptr = flt_angles[theta]; \
104 src_ptr += (src_px_stride * (h - 2)); \
105 flt_ptr += (src_px_stride * (h - 2)); \
109 src_ptr += src_px_stride; \
110 flt_ptr += src_px_stride; \
112 sum += FLOAT_ONE_BY_15 * fabsf(src_ptr[0]); \
122#define ADM_CM_THRESH_S_H_M_1_W_M_1(angles,flt_angles,src_px_stride,accum,w,h,i,j) \
125 for (int theta = 0; theta < 3; ++theta) { \
126 const float *src_ptr = angles[theta]; \
127 const float *flt_ptr = flt_angles[theta]; \
129 src_ptr += (src_px_stride * (h - 2)); \
130 flt_ptr += (src_px_stride * (h - 2)); \
131 sum += flt_ptr[w - 2]; \
132 sum += flt_ptr[w - 1]; \
133 sum += flt_ptr[w - 1]; \
134 src_ptr += src_px_stride; \
135 flt_ptr += src_px_stride; \
136 sum += flt_ptr[w - 2]; \
137 sum += FLOAT_ONE_BY_15 * fabsf(src_ptr[w - 1]); \
138 sum += flt_ptr[w - 1]; \
139 sum += flt_ptr[w - 2]; \
140 sum += flt_ptr[w - 1]; \
141 sum += flt_ptr[w - 1]; \
147#define ADM_CM_THRESH_S_H_M_1_J(angles,flt_angles,src_px_stride,accum,w,h,i,j) \
150 for (int theta = 0; theta < 3; ++theta) { \
151 const float *src_ptr = angles[theta]; \
152 const float *flt_ptr = flt_angles[theta]; \
154 src_ptr += (src_px_stride * (h - 2)); \
155 flt_ptr += (src_px_stride * (h - 2)); \
156 sum += flt_ptr[j - 1];\
158 sum += flt_ptr[j + 1]; \
159 src_ptr += src_px_stride; \
160 flt_ptr += src_px_stride; \
161 sum += flt_ptr[j - 1]; \
162 sum += FLOAT_ONE_BY_15 * fabsf(src_ptr[j]); \
163 sum += flt_ptr[j + 1]; \
164 sum += flt_ptr[j - 1]; \
166 sum += flt_ptr[j + 1]; \
172#define ADM_CM_THRESH_S_I_J(angles,flt_angles,src_px_stride,accum,w,h,i,j) \
175 for (int theta = 0; theta < 3; ++theta) { \
176 const float *src_ptr = angles[theta]; \
177 const float *flt_ptr = flt_angles[theta]; \
179 src_ptr += (src_px_stride * (i - 1)); \
180 flt_ptr += (src_px_stride * (i - 1)); \
181 sum += flt_ptr[j - 1]; \
183 sum += flt_ptr[j + 1]; \
184 src_ptr += src_px_stride; \
185 flt_ptr += src_px_stride; \
186 sum += flt_ptr[j - 1]; \
187 sum += FLOAT_ONE_BY_15 * fabsf(src_ptr[j]); \
188 sum += flt_ptr[j + 1]; \
189 src_ptr += src_px_stride; \
190 flt_ptr += src_px_stride; \
191 sum += flt_ptr[j - 1]; \
193 sum += flt_ptr[j + 1]; \
199#define ADM_CM_THRESH_S_I_0(angles,flt_angles,src_px_stride,accum,w,h,i,j) \
202 for (int theta = 0; theta < 3; ++theta) { \
203 const float *src_ptr = angles[theta]; \
204 const float *flt_ptr = flt_angles[theta]; \
206 src_ptr += (src_px_stride * (i - 1)); \
207 flt_ptr += (src_px_stride * (i - 1)); \
211 src_ptr += src_px_stride; \
212 flt_ptr += src_px_stride; \
214 sum += FLOAT_ONE_BY_15 * fabsf(src_ptr[0]); \
216 src_ptr += src_px_stride; \
217 flt_ptr += src_px_stride; \
226#define ADM_CM_THRESH_S_I_W_M_1(angles,flt_angles,src_px_stride,accum,w,h,i,j) \
229 for (int theta = 0; theta < 3; ++theta) { \
230 const float *src_ptr = angles[theta]; \
231 const float *flt_ptr = flt_angles[theta]; \
233 src_ptr += (src_px_stride * (i-1)); \
234 flt_ptr += (src_px_stride * (i - 1)); \
235 sum += flt_ptr[w - 2]; \
236 sum += flt_ptr[w - 1]; \
237 sum += flt_ptr[w - 1]; \
238 src_ptr += src_px_stride; \
239 flt_ptr += src_px_stride; \
240 sum += flt_ptr[w - 2]; \
241 sum += FLOAT_ONE_BY_15 * fabsf(src_ptr[w - 1]); \
242 sum += flt_ptr[w - 1]; \
243 src_ptr += src_px_stride; \
244 flt_ptr += src_px_stride; \
245 sum += flt_ptr[w - 2]; \
246 sum += flt_ptr[w - 1]; \
247 sum += flt_ptr[w - 1]; \
266float adm_sum_cube_s(
const float *x,
int w,
int h,
int stride,
double border_factor,
double adm_p_norm);
268void adm_decouple_s(
const adm_dwt_band_t_s *ref,
const adm_dwt_band_t_s *dis,
const adm_dwt_band_t_s *r,
const adm_dwt_band_t_s *a,
int w,
int h,
int ref_stride,
int dis_stride,
int r_stride,
int a_stride,
double border_factor,
double adm_enhn_gain_limit);
270void adm_csf_s(
const adm_dwt_band_t_s *src,
const adm_dwt_band_t_s *dst,
const adm_dwt_band_t_s *flt,
int orig_h,
int scale,
int w,
int h,
int src_stride,
int dst_stride,
double border_factor,
double adm_norm_view_dist,
int adm_ref_display_height,
int adm_csf_mode,
double luminance_level,
double adm_csf_scale,
double adm_csf_diag_scale,
double adm_f1s0,
double adm_f1s1,
double adm_f1s2,
double adm_f1s3,
double adm_f2s0,
double adm_f2s1,
double adm_f2s2,
double adm_f2s3);
274float adm_csf_den_scale_s(
const adm_dwt_band_t_s *src,
int orig_h,
int scale,
int w,
int h,
int src_stride,
double border_factor,
double adm_norm_view_dist,
int adm_ref_display_height,
int adm_csf_mode,
double luminance_level,
double adm_csf_scale,
double adm_csf_diag_scale,
double adm_noise_weight,
double adm_p_norm,
double adm_f1s0,
double adm_f1s1,
double adm_f1s2,
double adm_f1s3,
double adm_f2s0,
double adm_f2s1,
double adm_f2s2,
double adm_f2s3);
276float adm_cm_s(
const adm_dwt_band_t_s *src,
const adm_dwt_band_t_s *dst,
const adm_dwt_band_t_s *csf_a,
int w,
int h,
int src_stride,
int dst_stride,
int csf_a_stride,
double border_factor,
int scale,
double adm_norm_view_dist,
int adm_ref_display_height,
int adm_csf_mode,
double luminance_level,
double adm_csf_scale,
double adm_csf_diag_scale,
double adm_noise_weight,
int adm_bypass_cm,
double adm_p_norm,
double adm_f1s0,
double adm_f1s1,
double adm_f1s2,
double adm_f1s3,
double adm_f2s0,
double adm_f2s1,
double adm_f2s2,
double adm_f2s3);
309 { .a = 0.495, .k = 0.466, .f0 = 0.401, .g = { 1.501, 1.0, 0.534, 1.0} },
310 { .a = 1.633, .k = 0.353, .f0 = 0.209, .g = { 1.520, 1.0, 0.502, 1.0} },
311 { .a = 0.944, .k = 0.521, .f0 = 0.404, .g = { 1.868, 1.0, 0.516, 1.0} }
323static const float dwt_7_9_basis_function_amplitudes[6][4] = {
324 { 0.62171, 0.67234, 0.72709, 0.67234 },
325 { 0.34537, 0.41317, 0.49428, 0.41317 },
326 { 0.18004, 0.22727, 0.28688, 0.22727 },
327 { 0.091401, 0.11792, 0.15214, 0.11792 },
328 { 0.045943, 0.059758, 0.077727, 0.059758 },
329 { 0.023013, 0.030018, 0.039156, 0.030018 }
336static FORCE_INLINE
float dwt_quant_step(
const struct dwt_model_params *params,
337 int lambda,
int theta,
double adm_norm_view_dist,
int adm_ref_display_height)
340 float r = adm_norm_view_dist * adm_ref_display_height *
M_PI / 180.0;
343 float temp = log10(pow(2.0,lambda+1)*params->
f0*params->
g[theta]/r);
344 float Q = 2.0*params->
a*pow(10.0,params->
k*temp*temp)/dwt_7_9_basis_function_amplitudes[lambda][theta];
Definition adm_tools.h:259
double * band_a
Definition adm_tools.h:260
double * band_h
Definition adm_tools.h:262
double * band_v
Definition adm_tools.h:261
double * band_d
Definition adm_tools.h:263
Definition adm_tools.h:252
float * band_v
Definition adm_tools.h:254
float * band_a
Definition adm_tools.h:253
float * band_h
Definition adm_tools.h:255
float * band_d
Definition adm_tools.h:256
Definition adm_tools.h:300
float g[4]
Definition adm_tools.h:304
float f0
Definition adm_tools.h:303
float a
Definition adm_tools.h:301
float k
Definition adm_tools.h:302