23
25
#include <mlib_types.h>
24
26
#include <mlib_status.h>
25
27
#include <mlib_sys.h>
28
#include <mlib_algebra.h>
26
29
#include <mlib_video.h>
29
/* copy block, width 16 pixel, height 8/16 */
33
static void get_pixels_mlib(DCTELEM *restrict block, const uint8_t *pixels, int line_size)
38
mlib_VectorConvert_S16_U8_Mod((mlib_s16 *)block, (mlib_u8 *)pixels, 8);
45
static void diff_pixels_mlib(DCTELEM *restrict block, const uint8_t *s1, const uint8_t *s2, int line_size)
50
mlib_VectorSub_S16_U8_Mod((mlib_s16 *)block, (mlib_u8 *)s1, (mlib_u8 *)s2, 8);
58
static void add_pixels_clamped_mlib(const DCTELEM *block, uint8_t *pixels, int line_size)
60
mlib_VideoAddBlock_U8_S16(pixels, (mlib_s16 *)block, line_size);
63
/* put block, width 16 pixel, height 8/16 */
31
65
static void put_pixels16_mlib (uint8_t * dest, const uint8_t * ref,
32
int stride, int height)
66
int stride, int height)
34
assert(height == 16 || height == 8);
36
mlib_VideoCopyRef_U8_U8_16x16(dest, (uint8_t *)ref, stride);
38
mlib_VideoCopyRef_U8_U8_16x8 (dest, (uint8_t *)ref, stride);
70
mlib_VideoCopyRef_U8_U8_16x8(dest, (uint8_t *)ref, stride);
74
mlib_VideoCopyRef_U8_U8_16x16(dest, (uint8_t *)ref, stride);
41
82
static void put_pixels16_x2_mlib (uint8_t * dest, const uint8_t * ref,
42
int stride, int height)
83
int stride, int height)
44
assert(height == 16 || height == 8);
46
mlib_VideoInterpX_U8_U8_16x16(dest, (uint8_t *)ref, stride, stride);
48
mlib_VideoInterpX_U8_U8_16x8 (dest, (uint8_t *)ref, stride, stride);
87
mlib_VideoInterpX_U8_U8_16x8(dest, (uint8_t *)ref, stride, stride);
91
mlib_VideoInterpX_U8_U8_16x16(dest, (uint8_t *)ref, stride, stride);
51
99
static void put_pixels16_y2_mlib (uint8_t * dest, const uint8_t * ref,
52
int stride, int height)
100
int stride, int height)
54
assert(height == 16 || height == 8);
56
mlib_VideoInterpY_U8_U8_16x16(dest, (uint8_t *)ref, stride, stride);
58
mlib_VideoInterpY_U8_U8_16x8 (dest, (uint8_t *)ref, stride, stride);
104
mlib_VideoInterpY_U8_U8_16x8(dest, (uint8_t *)ref, stride, stride);
108
mlib_VideoInterpY_U8_U8_16x16(dest, (uint8_t *)ref, stride, stride);
61
116
static void put_pixels16_xy2_mlib(uint8_t * dest, const uint8_t * ref,
62
int stride, int height)
117
int stride, int height)
64
assert(height == 16 || height == 8);
66
mlib_VideoInterpXY_U8_U8_16x16(dest, (uint8_t *)ref, stride, stride);
68
mlib_VideoInterpXY_U8_U8_16x8 (dest, (uint8_t *)ref, stride, stride);
121
mlib_VideoInterpXY_U8_U8_16x8(dest, (uint8_t *)ref, stride, stride);
125
mlib_VideoInterpXY_U8_U8_16x16(dest, (uint8_t *)ref, stride, stride);
72
/* copy block, width 8 pixel, height 8/16 */
133
/* put block, width 8 pixel, height 4/8/16 */
74
135
static void put_pixels8_mlib (uint8_t * dest, const uint8_t * ref,
75
int stride, int height)
136
int stride, int height)
77
assert(height == 16 || height == 8);
79
mlib_VideoCopyRef_U8_U8_8x16(dest, (uint8_t *)ref, stride);
81
mlib_VideoCopyRef_U8_U8_8x8 (dest, (uint8_t *)ref, stride);
140
mlib_VideoCopyRef_U8_U8_8x4(dest, (uint8_t *)ref, stride);
144
mlib_VideoCopyRef_U8_U8_8x8(dest, (uint8_t *)ref, stride);
148
mlib_VideoCopyRef_U8_U8_8x16(dest, (uint8_t *)ref, stride);
84
156
static void put_pixels8_x2_mlib (uint8_t * dest, const uint8_t * ref,
85
int stride, int height)
157
int stride, int height)
87
assert(height == 16 || height == 8);
89
mlib_VideoInterpX_U8_U8_8x16(dest, (uint8_t *)ref, stride, stride);
91
mlib_VideoInterpX_U8_U8_8x8 (dest, (uint8_t *)ref, stride, stride);
161
mlib_VideoInterpX_U8_U8_8x4(dest, (uint8_t *)ref, stride, stride);
165
mlib_VideoInterpX_U8_U8_8x8(dest, (uint8_t *)ref, stride, stride);
169
mlib_VideoInterpX_U8_U8_8x16(dest, (uint8_t *)ref, stride, stride);
94
177
static void put_pixels8_y2_mlib (uint8_t * dest, const uint8_t * ref,
95
int stride, int height)
178
int stride, int height)
97
assert(height == 16 || height == 8);
99
mlib_VideoInterpY_U8_U8_8x16(dest, (uint8_t *)ref, stride, stride);
101
mlib_VideoInterpY_U8_U8_8x8 (dest, (uint8_t *)ref, stride, stride);
182
mlib_VideoInterpY_U8_U8_8x4(dest, (uint8_t *)ref, stride, stride);
186
mlib_VideoInterpY_U8_U8_8x8(dest, (uint8_t *)ref, stride, stride);
190
mlib_VideoInterpY_U8_U8_8x16(dest, (uint8_t *)ref, stride, stride);
104
198
static void put_pixels8_xy2_mlib(uint8_t * dest, const uint8_t * ref,
105
int stride, int height)
199
int stride, int height)
107
assert(height == 16 || height == 8);
109
mlib_VideoInterpXY_U8_U8_8x16(dest, (uint8_t *)ref, stride, stride);
111
mlib_VideoInterpXY_U8_U8_8x8 (dest, (uint8_t *)ref, stride, stride);
203
mlib_VideoInterpXY_U8_U8_8x4(dest, (uint8_t *)ref, stride, stride);
207
mlib_VideoInterpXY_U8_U8_8x8(dest, (uint8_t *)ref, stride, stride);
211
mlib_VideoInterpXY_U8_U8_8x16(dest, (uint8_t *)ref, stride, stride);
115
/* average/merge dest+source block, width 16 pixel, height 8/16 */
219
/* average block, width 16 pixel, height 8/16 */
117
221
static void avg_pixels16_mlib (uint8_t * dest, const uint8_t * ref,
118
int stride, int height)
222
int stride, int height)
120
assert(height == 16 || height == 8);
122
mlib_VideoCopyRefAve_U8_U8_16x16(dest, (uint8_t *)ref, stride);
124
mlib_VideoCopyRefAve_U8_U8_16x8 (dest, (uint8_t *)ref, stride);
226
mlib_VideoCopyRefAve_U8_U8_16x8(dest, (uint8_t *)ref, stride);
230
mlib_VideoCopyRefAve_U8_U8_16x16(dest, (uint8_t *)ref, stride);
127
238
static void avg_pixels16_x2_mlib (uint8_t * dest, const uint8_t * ref,
128
int stride, int height)
239
int stride, int height)
130
assert(height == 16 || height == 8);
132
mlib_VideoInterpAveX_U8_U8_16x16(dest, (uint8_t *)ref, stride, stride);
134
mlib_VideoInterpAveX_U8_U8_16x8 (dest, (uint8_t *)ref, stride, stride);
243
mlib_VideoInterpAveX_U8_U8_16x8(dest, (uint8_t *)ref, stride, stride);
247
mlib_VideoInterpAveX_U8_U8_16x16(dest, (uint8_t *)ref, stride, stride);
137
255
static void avg_pixels16_y2_mlib (uint8_t * dest, const uint8_t * ref,
138
int stride, int height)
140
assert(height == 16 || height == 8);
142
mlib_VideoInterpAveY_U8_U8_16x16(dest, (uint8_t *)ref, stride, stride);
144
mlib_VideoInterpAveY_U8_U8_16x8 (dest, (uint8_t *)ref, stride, stride);
147
static void avg_pixels16_xy2_mlib (uint8_t * dest, const uint8_t * ref,
148
int stride, int height)
150
assert(height == 16 || height == 8);
152
mlib_VideoInterpAveXY_U8_U8_16x16(dest, (uint8_t *)ref, stride, stride);
154
mlib_VideoInterpAveXY_U8_U8_16x8 (dest, (uint8_t *)ref, stride, stride);
158
/* average/merge dest+source block, width 8 pixel, height 8/16 */
256
int stride, int height)
260
mlib_VideoInterpAveY_U8_U8_16x8(dest, (uint8_t *)ref, stride, stride);
264
mlib_VideoInterpAveY_U8_U8_16x16(dest, (uint8_t *)ref, stride, stride);
272
static void avg_pixels16_xy2_mlib(uint8_t * dest, const uint8_t * ref,
273
int stride, int height)
277
mlib_VideoInterpAveXY_U8_U8_16x8(dest, (uint8_t *)ref, stride, stride);
281
mlib_VideoInterpAveXY_U8_U8_16x16(dest, (uint8_t *)ref, stride, stride);
289
/* average block, width 8 pixel, height 4/8/16 */
160
291
static void avg_pixels8_mlib (uint8_t * dest, const uint8_t * ref,
161
int stride, int height)
292
int stride, int height)
163
assert(height == 16 || height == 8);
165
mlib_VideoCopyRefAve_U8_U8_8x16(dest, (uint8_t *)ref, stride);
167
mlib_VideoCopyRefAve_U8_U8_8x8 (dest, (uint8_t *)ref, stride);
296
mlib_VideoCopyRefAve_U8_U8_8x4(dest, (uint8_t *)ref, stride);
300
mlib_VideoCopyRefAve_U8_U8_8x8(dest, (uint8_t *)ref, stride);
304
mlib_VideoCopyRefAve_U8_U8_8x16(dest, (uint8_t *)ref, stride);
170
312
static void avg_pixels8_x2_mlib (uint8_t * dest, const uint8_t * ref,
171
int stride, int height)
313
int stride, int height)
173
assert(height == 16 || height == 8);
175
mlib_VideoInterpAveX_U8_U8_8x16(dest, (uint8_t *)ref, stride, stride);
177
mlib_VideoInterpAveX_U8_U8_8x8 (dest, (uint8_t *)ref, stride, stride);
317
mlib_VideoInterpAveX_U8_U8_8x4(dest, (uint8_t *)ref, stride, stride);
321
mlib_VideoInterpAveX_U8_U8_8x8(dest, (uint8_t *)ref, stride, stride);
325
mlib_VideoInterpAveX_U8_U8_8x16(dest, (uint8_t *)ref, stride, stride);
180
333
static void avg_pixels8_y2_mlib (uint8_t * dest, const uint8_t * ref,
181
int stride, int height)
183
assert(height == 16 || height == 8);
185
mlib_VideoInterpAveY_U8_U8_8x16(dest, (uint8_t *)ref, stride, stride);
187
mlib_VideoInterpAveY_U8_U8_8x8 (dest, (uint8_t *)ref, stride, stride);
190
static void avg_pixels8_xy2_mlib (uint8_t * dest, const uint8_t * ref,
191
int stride, int height)
193
assert(height == 16 || height == 8);
195
mlib_VideoInterpAveXY_U8_U8_8x16(dest, (uint8_t *)ref, stride, stride);
197
mlib_VideoInterpAveXY_U8_U8_8x8 (dest, (uint8_t *)ref, stride, stride);
201
static void (*put_pixels_clamped)(const DCTELEM *block, uint8_t *pixels, int line_size);
204
static void add_pixels_clamped_mlib(const DCTELEM *block, uint8_t *pixels, int line_size)
206
mlib_VideoAddBlock_U8_S16(pixels, (mlib_s16 *)block, line_size);
210
/* XXX: those functions should be suppressed ASAP when all IDCTs are
334
int stride, int height)
338
mlib_VideoInterpAveY_U8_U8_8x4(dest, (uint8_t *)ref, stride, stride);
342
mlib_VideoInterpAveY_U8_U8_8x8(dest, (uint8_t *)ref, stride, stride);
346
mlib_VideoInterpAveY_U8_U8_8x16(dest, (uint8_t *)ref, stride, stride);
354
static void avg_pixels8_xy2_mlib(uint8_t * dest, const uint8_t * ref,
355
int stride, int height)
359
mlib_VideoInterpAveXY_U8_U8_8x4(dest, (uint8_t *)ref, stride, stride);
363
mlib_VideoInterpAveXY_U8_U8_8x8(dest, (uint8_t *)ref, stride, stride);
367
mlib_VideoInterpAveXY_U8_U8_8x16(dest, (uint8_t *)ref, stride, stride);
375
/* swap byte order of a buffer */
377
static void bswap_buf_mlib(uint32_t *dst, uint32_t *src, int w)
379
mlib_VectorReverseByteOrder_U32_U32(dst, src, w);
382
/* transformations */
212
384
static void ff_idct_put_mlib(uint8_t *dest, int line_size, DCTELEM *data)
387
uint8_t *cm = ff_cropTbl + MAX_NEG_CROP;
214
389
mlib_VideoIDCT8x8_S16_S16 (data, data);
215
put_pixels_clamped(data, dest, line_size);
392
dest[0] = cm[data[0]];
393
dest[1] = cm[data[1]];
394
dest[2] = cm[data[2]];
395
dest[3] = cm[data[3]];
396
dest[4] = cm[data[4]];
397
dest[5] = cm[data[5]];
398
dest[6] = cm[data[6]];
399
dest[7] = cm[data[7]];
218
406
static void ff_idct_add_mlib(uint8_t *dest, int line_size, DCTELEM *data)