Go to the documentation of this file.
24 #define FILTER(src, stride) \
25 ((21*((src)[ 0*stride] + (src)[1*stride]) \
26 -7*((src)[-1*stride] + (src)[2*stride]) \
27 +3*((src)[-2*stride] + (src)[3*stride]) \
28 -1*((src)[-3*stride] + (src)[4*stride]) + 16) >> 5)
35 for (y = 0; y <
height; y++) {
36 for (x = -3; x <
width+5; x++)
39 for (x = 0; x <
width; x++)
42 for (x = 0; x <
width; x++)
52 #define PIXOP_BILINEAR(PFX, OP, WIDTH) \
53 static void ff_ ## PFX ## _dirac_pixels ## WIDTH ## _bilinear_c(uint8_t *dst, const uint8_t *src[5], int stride, int h) \
56 const uint8_t *s0 = src[0]; \
57 const uint8_t *s1 = src[1]; \
58 const uint8_t *s2 = src[2]; \
59 const uint8_t *s3 = src[3]; \
60 const uint8_t *w = src[4]; \
63 for (x = 0; x < WIDTH; x++) { \
64 OP(dst[x], (s0[x]*w[0] + s1[x]*w[1] + s2[x]*w[2] + s3[x]*w[3] + 8) >> 4); \
75 #define OP_PUT(dst, val) (dst) = (val)
76 #define OP_AVG(dst, val) (dst) = (((dst) + (val) + 1)>>1)
85 #define op_scale1(x) block[x] = av_clip_uint8( (block[x]*weight + (1<<(log2_denom-1))) >> log2_denom)
86 #define op_scale2(x) dst[x] = av_clip_uint8( (src[x]*weights + dst[x]*weightd + (1<<(log2_denom-1))) >> log2_denom)
88 #define DIRAC_WEIGHT(W) \
89 static void weight_dirac_pixels ## W ## _c(uint8_t *block, int stride, int log2_denom, \
90 int weight, int h) { \
93 for (x = 0; x < W; x++) { \
100 static void biweight_dirac_pixels ## W ## _c(uint8_t *dst, const uint8_t *src, int stride, int log2_denom, \
101 int weightd, int weights, int h) { \
104 for (x = 0; x < W; x++) { \
117 #define ADD_OBMC(xblen) \
118 static void add_obmc ## xblen ## _c(uint16_t *dst, const uint8_t *src, int stride, \
119 const uint8_t *obmc_weight, int yblen) \
123 for (x = 0; x < xblen; x += 2) { \
124 dst[x ] += src[x ] * obmc_weight[x ]; \
125 dst[x+1] += src[x+1] * obmc_weight[x+1]; \
140 int16_t *
src = (int16_t *)_src;
141 for (y = 0; y <
height; y++) {
142 for (x = 0; x <
width; x+=4) {
149 src += src_stride >> 1;
153 #define PUT_SIGNED_RECT_CLAMPED(PX) \
154 static void put_signed_rect_clamped_ ## PX ## bit_c(uint8_t *_dst, int dst_stride, const uint8_t *_src, \
155 int src_stride, int width, int height) \
158 uint16_t *dst = (uint16_t *)_dst; \
159 int32_t *src = (int32_t *)_src; \
160 for (y = 0; y < height; y++) { \
161 for (x = 0; x < width; x+=4) { \
162 dst[x ] = av_clip_uintp2(src[x ] + (1U << (PX - 1)), PX); \
163 dst[x+1] = av_clip_uintp2(src[x+1] + (1U << (PX - 1)), PX); \
164 dst[x+2] = av_clip_uintp2(src[x+2] + (1U << (PX - 1)), PX); \
165 dst[x+3] = av_clip_uintp2(src[x+3] + (1U << (PX - 1)), PX); \
167 dst += dst_stride >> 1; \
168 src += src_stride >> 2; \
176 const int16_t *idwt,
int idwt_stride,
181 for (y = 0; y <
height; y++) {
182 for (x = 0; x <
width; x+=2) {
192 #define DEQUANT_SUBBAND(PX) \
193 static void dequant_subband_ ## PX ## _c(uint8_t *src, uint8_t *dst, ptrdiff_t stride, \
194 const int qf, const int qs, int tot_v, int tot_h) \
197 for (y = 0; y < tot_v; y++) { \
198 PX c, *src_r = (PX *)src, *dst_r = (PX *)dst; \
199 for (i = 0; i < tot_h; i++) { \
201 if (c < 0) c = -((-(unsigned)c*qf + qs) >> 2); \
202 else if(c > 0) c = (( (unsigned)c*qf + qs) >> 2); \
205 src += tot_h << (sizeof(PX) >> 1); \
213 #define PIXFUNC(PFX, WIDTH) \
214 c->PFX ## _dirac_pixels_tab[WIDTH>>4][0] = ff_ ## PFX ## _dirac_pixels ## WIDTH ## _c; \
215 c->PFX ## _dirac_pixels_tab[WIDTH>>4][1] = ff_ ## PFX ## _dirac_pixels ## WIDTH ## _l2_c; \
216 c->PFX ## _dirac_pixels_tab[WIDTH>>4][2] = ff_ ## PFX ## _dirac_pixels ## WIDTH ## _l4_c; \
217 c->PFX ## _dirac_pixels_tab[WIDTH>>4][3] = ff_ ## PFX ## _dirac_pixels ## WIDTH ## _bilinear_c
224 c->put_signed_rect_clamped[1] = put_signed_rect_clamped_10bit_c;
225 c->put_signed_rect_clamped[2] = put_signed_rect_clamped_12bit_c;
227 c->add_dirac_obmc[0] = add_obmc8_c;
228 c->add_dirac_obmc[1] = add_obmc16_c;
229 c->add_dirac_obmc[2] = add_obmc32_c;
231 c->weight_dirac_pixels_tab[0] = weight_dirac_pixels8_c;
232 c->weight_dirac_pixels_tab[1] = weight_dirac_pixels16_c;
233 c->weight_dirac_pixels_tab[2] = weight_dirac_pixels32_c;
234 c->biweight_dirac_pixels_tab[0] = biweight_dirac_pixels8_c;
235 c->biweight_dirac_pixels_tab[1] = biweight_dirac_pixels16_c;
236 c->biweight_dirac_pixels_tab[2] = biweight_dirac_pixels32_c;
238 c->dequant_subband[0] =
c->dequant_subband[2] = dequant_subband_int16_t_c;
239 c->dequant_subband[1] =
c->dequant_subband[3] = dequant_subband_int32_t_c;
static void put_signed_rect_clamped_8bit_c(uint8_t *dst, int dst_stride, const uint8_t *_src, int src_stride, int width, int height)
#define PUT_SIGNED_RECT_CLAMPED(PX)
#define PIXFUNC(PFX, WIDTH)
static void dirac_hpel_filter(uint8_t *dsth, uint8_t *dstv, uint8_t *dstc, const uint8_t *src, int stride, int width, int height)
Undefined Behavior In the C some operations are like signed integer dereferencing freed accessing outside allocated Undefined Behavior must not occur in a C it is not safe even if the output of undefined operations is unused The unsafety may seem nit picking but Optimizing compilers have in fact optimized code on the assumption that no undefined Behavior occurs Optimizing code based on wrong assumptions can and has in some cases lead to effects beyond the output of computations The signed integer overflow problem in speed critical code Code which is highly optimized and works with signed integers sometimes has the problem that often the output of the computation does not c
#define FILTER(src, stride)
#define PIXOP_BILINEAR(PFX, OP, WIDTH)
#define DEQUANT_SUBBAND(PX)
void ff_diracdsp_init_x86(DiracDSPContext *c)
static void add_rect_clamped_c(uint8_t *dst, const uint16_t *src, int stride, const int16_t *idwt, int idwt_stride, int width, int height)
av_cold void ff_diracdsp_init(DiracDSPContext *c)