1
/*****************************************************************
2
* gavl - a general purpose audio/video processing library
4
* Copyright (c) 2001 - 2008 Members of the Gmerlin project
5
* gmerlin-general@lists.sourceforge.net
6
* http://gmerlin.sourceforge.net
8
* This program is free software: you can redistribute it and/or modify
9
* it under the terms of the GNU General Public License as published by
10
* the Free Software Foundation, either version 2 of the License, or
11
* (at your option) any later version.
13
* This program is distributed in the hope that it will be useful,
14
* but WITHOUT ANY WARRANTY; without even the implied warranty of
15
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16
* GNU General Public License for more details.
18
* You should have received a copy of the GNU General Public License
19
* along with this program. If not, see <http://www.gnu.org/licenses/>.
20
* *****************************************************************/
23
#include <attributes.h>
26
#include <gavl/gavl.h>
33
static const mmx_t min_13 = { .uw = { 0x0000, 0x0000, 0x0000, 0x0000 } };
34
static const mmx_t max_13 = { .uw = { 0x1FFF, 0x1FFF, 0x1FFF, 0x1FFF } };
38
#define MOVQ_R2M(reg,mem) movntq_r2m(reg, mem)
40
#define MOVQ_R2M(reg,mem) movq_r2m(reg, mem)
45
#define DUMP_MM(name, reg) MOVQ_R2M(reg, mm_tmp);\
46
fprintf(stderr, "%s: %016llx\n", name, mm_tmp.q);
49
static const mmx_t factor_mask = { 0x000000000000FFFFLL };
63
//#define LOAD_FACTOR_1
64
//#define LOAD_FACTOR_4
67
#define LOAD_FACTOR_1_4 \
68
movd_m2r(*factors, mm2); \
70
pshufw_r2r(mm2,mm7,0x00)
72
#define LOAD_FACTOR_1_4_NOCLIP \
73
movd_m2r(*factors, mm2); \
75
pshufw_r2r(mm2,mm7,0x00)
78
#define LOAD_FACTOR_1_4 \
79
movd_m2r(*factors, mm2); \
88
#define LOAD_FACTOR_1_4_NOCLIP \
89
movd_m2r(*factors, mm2); \
98
#define RECLIP(a,idx) \
99
if(a < ctx->min_values_h[idx]) a = ctx->min_values_h[idx]; \
100
if(a > ctx->max_values_h[idx]) a = ctx->max_values_h[idx]
102
/* scale_uint8_x_1_x_bicubic_mmx */
106
/* scale_uint8_x_1_x_bilinear_mmx */
108
static void scale_uint8_x_1_x_bilinear_mmx(gavl_video_scale_context_t * ctx)
111
uint8_t * src, * dst, *src_start;
127
src_start = ctx->src + ctx->scanline * ctx->src_stride;
132
imax = ctx->dst_size / 4;
136
for(i = 0; i < imax; i++)
140
src = src_start + ctx->table_h.pixels[index].index;
142
tmp_mm.uw[1] = *(src+1);
144
src = src_start + ctx->table_h.pixels[index+1].index;
146
tmp_mm.uw[3] = *(src+1);
148
movq_m2r(tmp_mm, mm0);
150
movq_m2r(ctx->table_h.pixels[index].factor_i[0], mm1);
151
movq_m2r(ctx->table_h.pixels[index+1].factor_i[0], mm7);
153
packssdw_r2r(mm7, mm1);
154
pmaddwd_r2r(mm0, mm1);
159
src = src_start + ctx->table_h.pixels[index].index;
161
tmp_mm.uw[1] = *(src+1);
163
src = src_start + ctx->table_h.pixels[index+1].index;
165
tmp_mm.uw[3] = *(src+1);
167
movq_m2r(tmp_mm, mm0);
169
movq_m2r(ctx->table_h.pixels[index].factor_i[0], mm3);
170
movq_m2r(ctx->table_h.pixels[index+1].factor_i[0], mm7);
171
packssdw_r2r(mm7, mm3);
172
pmaddwd_r2r(mm0, mm3);
176
packssdw_r2r(mm3, mm1);
180
packuswb_r2r(mm6, mm1);
183
// *dst = tmp_mm.ub[0];
184
// *(dst+1) = tmp_mm.ub[4];
189
imax = ctx->dst_size % 4;
190
// imax = ctx->dst_size;
192
for(i = 0; i < imax; i++)
194
src = (src_start + ctx->table_h.pixels[index].index);
195
*dst = (ctx->table_h.pixels[index].factor_i[0] * *src +
196
ctx->table_h.pixels[index].factor_i[1] * *(src+1)) >> 14;
204
static void scale_uint8_x_1_x_bicubic_mmx(gavl_video_scale_context_t * ctx)
207
uint8_t * src, * dst, *src_start;
212
// fprintf(stderr, "scale_uint8_x_1_x_bicubic_mmx\n");
214
src_start = ctx->src + ctx->scanline * ctx->src_stride;
218
for(i = 0; i < ctx->dst_size; i++)
220
src = src_start + ctx->table_h.pixels[i].index;
221
factors = ctx->table_h.pixels[i].factor_i;
223
movd_m2r(*(src), mm0);
224
punpcklbw_r2r(mm6, mm0);
225
// DUMP_MM("mm0", mm0);
227
movq_m2r(*factors, mm2);
228
movq_m2r(*(factors+2), mm3);
229
packssdw_r2r(mm3, mm2);
231
pmaddwd_r2r(mm2, mm0);
232
MOVQ_R2M(mm0, tmp_mm);
233
tmp = tmp_mm.d[0] + tmp_mm.d[1];
235
RECLIP(tmp, ctx->plane);
241
static void scale_uint16_x_1_x_bicubic_mmx(gavl_video_scale_context_t * ctx)
245
uint8_t * src, *src_start;
250
// fprintf(stderr, "scale_uint8_x_1_x_bicubic_mmx\n");
252
src_start = ctx->src + ctx->scanline * ctx->src_stride;
255
dst = (uint16_t*)ctx->dst;
256
for(i = 0; i < ctx->dst_size; i++)
258
src = src_start + 2*ctx->table_h.pixels[i].index;
259
factors = ctx->table_h.pixels[i].factor_i;
261
movq_m2r(*(src), mm0);
263
// DUMP_MM("mm0", mm0);
265
movq_m2r(*factors, mm2);
266
movq_m2r(*(factors+2), mm3);
267
packssdw_r2r(mm3, mm2);
269
pmaddwd_r2r(mm2, mm0);
270
MOVQ_R2M(mm0, tmp_mm);
271
tmp = tmp_mm.d[0] + tmp_mm.d[1];
273
RECLIP(tmp, ctx->plane);
279
static void scale_uint16_x_1_x_bicubic_noclip_mmx(gavl_video_scale_context_t * ctx)
283
uint8_t * src, *src_start;
288
// fprintf(stderr, "scale_uint8_x_1_x_bicubic_mmx\n");
290
src_start = ctx->src + ctx->scanline * ctx->src_stride;
293
dst = (uint16_t*)ctx->dst;
294
for(i = 0; i < ctx->dst_size; i++)
296
src = src_start + 2*ctx->table_h.pixels[i].index;
297
factors = ctx->table_h.pixels[i].factor_i;
299
movq_m2r(*(src), mm0);
301
// DUMP_MM("mm0", mm0);
303
movq_m2r(*factors, mm2);
304
movq_m2r(*(factors+2), mm3);
305
packssdw_r2r(mm3, mm2);
307
pmaddwd_r2r(mm2, mm0);
308
MOVQ_R2M(mm0, tmp_mm);
309
tmp = tmp_mm.d[0] + tmp_mm.d[1];
316
/* scale_uint8_x_1_x_bicubic_noclip_mmx */
319
scale_uint8_x_1_x_bicubic_noclip_mmx(gavl_video_scale_context_t * ctx)
322
uint8_t * src, * dst, *src_start;
326
// fprintf(stderr, "scale_uint8_x_1_x_bicubic_noclip_mmx\n");
327
src_start = ctx->src + ctx->scanline * ctx->src_stride;
331
for(i = 0; i < ctx->dst_size; i++)
333
src = src_start + ctx->table_h.pixels[i].index;
334
factors = ctx->table_h.pixels[i].factor_i;
336
movd_m2r(*(src), mm0);
337
punpcklbw_r2r(mm6, mm0);
339
movq_m2r(*factors, mm2);
340
movq_m2r(*(factors+2), mm3);
341
packssdw_r2r(mm3, mm2);
343
pmaddwd_r2r(mm2, mm0);
345
MOVQ_R2M(mm0, tmp_mm);
346
*(dst++) = tmp_mm.d[0] + tmp_mm.d[1];
353
/* scale_uint8_x_4_x_bicubic_mmx */
355
static void scale_uint8_x_4_x_bicubic_mmx(gavl_video_scale_context_t * ctx)
358
uint8_t * src, * dst, *src_start;
374
// fprintf(stderr, "scale_uint8_x_1_x_bicubic_noclip_mmx\n");
375
src_start = ctx->src + ctx->scanline * ctx->src_stride;
378
movq_m2r(factor_mask, mm1);
380
for(i = 0; i < ctx->dst_size; i++)
382
src = src_start + 4*ctx->table_h.pixels[i].index;
383
factors = ctx->table_h.pixels[i].factor_i;
386
movd_m2r(*(src), mm0);
387
punpcklbw_r2r(mm6, mm0);
392
pmulhw_r2r(mm7, mm0);
394
// DUMP_MM("mm3_1", mm3);
399
movd_m2r(*(src), mm0);
400
punpcklbw_r2r(mm6, mm0);
405
pmulhw_r2r(mm7, mm0);
407
// DUMP_MM("mm3_2", mm3);
412
movd_m2r(*(src), mm0);
413
punpcklbw_r2r(mm6, mm0);
418
pmulhw_r2r(mm7, mm0);
420
// DUMP_MM("mm3_3", mm3);
425
movd_m2r(*(src), mm0);
426
punpcklbw_r2r(mm6, mm0);
431
pmulhw_r2r(mm7, mm0);
437
packuswb_r2r(mm6, mm3);
446
static void scale_uint16_x_4_x_bicubic_mmx(gavl_video_scale_context_t * ctx)
449
uint8_t * src, * dst, *src_start;
465
// fprintf(stderr, "scale_uint8_x_1_x_bicubic_noclip_mmx\n");
466
src_start = ctx->src + ctx->scanline * ctx->src_stride;
469
movq_m2r(factor_mask, mm1);
471
for(i = 0; i < ctx->dst_size; i++)
473
src = src_start + 8*ctx->table_h.pixels[i].index;
474
factors = ctx->table_h.pixels[i].factor_i;
477
movq_m2r(*(src), mm0);
478
// punpcklbw_r2r(mm6, mm0);
483
pmulhw_r2r(mm7, mm0);
485
// DUMP_MM("mm3_1", mm3);
490
movq_m2r(*(src), mm0);
491
// punpcklbw_r2r(mm6, mm0);
496
pmulhw_r2r(mm7, mm0);
498
// DUMP_MM("mm3_2", mm3);
503
movq_m2r(*(src), mm0);
504
// punpcklbw_r2r(mm6, mm0);
509
pmulhw_r2r(mm7, mm0);
511
// DUMP_MM("mm3_3", mm3);
516
movq_m2r(*(src), mm0);
517
// punpcklbw_r2r(mm6, mm0);
522
pmulhw_r2r(mm7, mm0);
527
pminsw_m2r(max_13, mm3);
528
pmaxsw_m2r(min_13, mm3);
531
// packuswb_r2r(mm6, mm3);
541
static void scale_uint16_x_4_x_bicubic_noclip_mmx(gavl_video_scale_context_t * ctx)
544
uint8_t * src, * dst, *src_start;
560
// fprintf(stderr, "scale_uint8_x_1_x_bicubic_noclip_mmx\n");
561
src_start = ctx->src + ctx->scanline * ctx->src_stride;
564
movq_m2r(factor_mask, mm1);
566
for(i = 0; i < ctx->dst_size; i++)
568
src = src_start + 8*ctx->table_h.pixels[i].index;
569
factors = ctx->table_h.pixels[i].factor_i;
572
movq_m2r(*(src), mm0);
573
// punpcklbw_r2r(mm6, mm0);
576
LOAD_FACTOR_1_4_NOCLIP;
578
pmulhw_r2r(mm7, mm0);
580
// DUMP_MM("mm3_1", mm3);
585
movq_m2r(*(src), mm0);
586
// punpcklbw_r2r(mm6, mm0);
589
LOAD_FACTOR_1_4_NOCLIP;
591
pmulhw_r2r(mm7, mm0);
593
// DUMP_MM("mm3_2", mm3);
598
movq_m2r(*(src), mm0);
599
// punpcklbw_r2r(mm6, mm0);
602
LOAD_FACTOR_1_4_NOCLIP;
604
pmulhw_r2r(mm7, mm0);
606
// DUMP_MM("mm3_3", mm3);
611
movq_m2r(*(src), mm0);
612
// punpcklbw_r2r(mm6, mm0);
615
LOAD_FACTOR_1_4_NOCLIP;
617
pmulhw_r2r(mm7, mm0);
623
// packuswb_r2r(mm6, mm3);
632
static void scale_uint16_x_4_x_quadratic_mmx(gavl_video_scale_context_t * ctx)
635
uint8_t * src, * dst, *src_start;
651
// fprintf(stderr, "scale_uint8_x_1_x_bicubic_noclip_mmx\n");
652
src_start = ctx->src + ctx->scanline * ctx->src_stride;
655
movq_m2r(factor_mask, mm1);
657
for(i = 0; i < ctx->dst_size; i++)
659
src = src_start + 8*ctx->table_h.pixels[i].index;
660
factors = ctx->table_h.pixels[i].factor_i;
663
movq_m2r(*(src), mm0);
664
// punpcklbw_r2r(mm6, mm0);
667
LOAD_FACTOR_1_4_NOCLIP;
669
pmulhw_r2r(mm7, mm0);
671
// DUMP_MM("mm3_1", mm3);
676
movq_m2r(*(src), mm0);
677
// punpcklbw_r2r(mm6, mm0);
680
LOAD_FACTOR_1_4_NOCLIP;
682
pmulhw_r2r(mm7, mm0);
684
// DUMP_MM("mm3_2", mm3);
689
movq_m2r(*(src), mm0);
690
// punpcklbw_r2r(mm6, mm0);
693
LOAD_FACTOR_1_4_NOCLIP;
695
pmulhw_r2r(mm7, mm0);
697
// DUMP_MM("mm3_3", mm3);
701
// packuswb_r2r(mm6, mm3);
711
/* scale_uint8_x_4_x_bicubic_mmx */
713
static void scale_uint8_x_4_x_quadratic_mmx(gavl_video_scale_context_t * ctx)
716
uint8_t * src, * dst, *src_start;
732
// fprintf(stderr, "scale_uint8_x_1_x_bicubic_noclip_mmx\n");
733
src_start = ctx->src + ctx->scanline * ctx->src_stride;
736
movq_m2r(factor_mask, mm1);
738
for(i = 0; i < ctx->dst_size; i++)
740
src = src_start + 4*ctx->table_h.pixels[i].index;
741
factors = ctx->table_h.pixels[i].factor_i;
744
movd_m2r(*(src), mm0);
745
punpcklbw_r2r(mm6, mm0);
748
LOAD_FACTOR_1_4_NOCLIP;
750
pmulhw_r2r(mm7, mm0);
752
// DUMP_MM("mm3_1", mm3);
757
movd_m2r(*(src), mm0);
758
punpcklbw_r2r(mm6, mm0);
761
LOAD_FACTOR_1_4_NOCLIP;
763
pmulhw_r2r(mm7, mm0);
765
// DUMP_MM("mm3_2", mm3);
770
movd_m2r(*(src), mm0);
771
punpcklbw_r2r(mm6, mm0);
774
LOAD_FACTOR_1_4_NOCLIP;
776
pmulhw_r2r(mm7, mm0);
778
// DUMP_MM("mm3_3", mm3);
783
packuswb_r2r(mm6, mm3);
792
/* scale_uint8_x_1_x_generic_mmx */
794
static void scale_uint8_x_1_x_generic_mmx(gavl_video_scale_context_t * ctx)
797
uint8_t * src, * dst, *src_start;
802
src_start = ctx->src + ctx->scanline * ctx->src_stride;
806
for(i = 0; i < ctx->dst_size; i++)
808
src = src_start + ctx->table_h.pixels[i].index;
809
factors = ctx->table_h.pixels[i].factor_i;
811
jmax = ctx->table_h.factors_per_pixel / 4;
816
for(j = 0; j < jmax; j++)
819
movd_m2r(*(src), mm0);
820
punpcklbw_r2r(mm6, mm0);
821
// DUMP_MM("mm0", mm0);
823
movq_m2r(*factors, mm2);
824
movq_m2r(*(factors+2), mm3);
825
packssdw_r2r(mm3, mm2);
827
pmaddwd_r2r(mm2, mm0);
833
MOVQ_R2M(mm4, tmp_mm);
834
tmp = tmp_mm.d[0] + tmp_mm.d[1];
837
jmax = ctx->table_h.factors_per_pixel % 4;
839
jmax = ctx->table_h.factors_per_pixel;
841
for(j = 0; j < jmax; j++)
843
tmp += *factors * *src;
849
// if(tmp > (255 << 14)) tmp = 255 << 14;
850
// if(tmp < 0) tmp = 0;
852
RECLIP(tmp, ctx->plane);
859
static void scale_uint16_x_1_x_generic_mmx(gavl_video_scale_context_t * ctx)
862
uint16_t * src, * dst;
868
src_start = ctx->src + ctx->scanline * ctx->src_stride;
871
dst = (uint16_t*)ctx->dst;
872
for(i = 0; i < ctx->dst_size; i++)
874
src = (uint16_t*)(src_start + 2*ctx->table_h.pixels[i].index);
875
factors = ctx->table_h.pixels[i].factor_i;
877
jmax = ctx->table_h.factors_per_pixel / 4;
882
for(j = 0; j < jmax; j++)
885
movq_m2r(*(src), mm0);
887
// DUMP_MM("mm0", mm0);
889
movq_m2r(*factors, mm2);
890
movq_m2r(*(factors+2), mm3);
891
packssdw_r2r(mm3, mm2);
893
pmaddwd_r2r(mm2, mm0);
899
MOVQ_R2M(mm4, tmp_mm);
900
tmp = tmp_mm.d[0] + tmp_mm.d[1];
903
jmax = ctx->table_h.factors_per_pixel % 4;
905
jmax = ctx->table_h.factors_per_pixel;
907
for(j = 0; j < jmax; j++)
909
tmp += *factors * ((*src)>>1);
915
// if(tmp > (255 << 14)) tmp = 255 << 14;
916
// if(tmp < 0) tmp = 0;
918
RECLIP(tmp, ctx->plane);
928
/* scale_uint8_x_4_x_generic_mmx */
930
static void scale_uint8_x_4_x_generic_mmx(gavl_video_scale_context_t * ctx)
933
uint8_t * src, * dst, *src_start;
949
src_start = ctx->src + ctx->scanline * ctx->src_stride;
952
movq_m2r(factor_mask, mm1);
954
for(i = 0; i < ctx->dst_size; i++)
956
src = src_start + 4*ctx->table_h.pixels[i].index;
957
factors = ctx->table_h.pixels[i].factor_i;
960
for(j = 0; j < ctx->table_h.factors_per_pixel; j++)
963
movd_m2r(*(src), mm0);
964
punpcklbw_r2r(mm6, mm0);
969
pmulhw_r2r(mm7, mm0);
971
// DUMP_MM("mm3_2", mm3);
978
packuswb_r2r(mm6, mm3);
988
static void scale_uint16_x_4_x_generic_mmx(gavl_video_scale_context_t * ctx)
991
uint8_t * src, * dst, *src_start;
1007
src_start = ctx->src + ctx->scanline * ctx->src_stride;
1010
movq_m2r(factor_mask, mm1);
1012
for(i = 0; i < ctx->dst_size; i++)
1014
src = src_start + 8*ctx->table_h.pixels[i].index;
1015
factors = ctx->table_h.pixels[i].factor_i;
1018
for(j = 0; j < ctx->table_h.factors_per_pixel; j++)
1021
movq_m2r(*(src), mm0);
1026
pmulhw_r2r(mm7, mm0);
1027
paddw_r2r(mm0, mm3);
1028
// DUMP_MM("mm3_2", mm3);
1032
pminsw_m2r(max_13, mm3);
1033
pmaxsw_m2r(min_13, mm3);
1036
MOVQ_R2M(mm3, *dst);
1047
/* scale_uint8_x_4_x_bilinear_mmx */
1049
static void scale_uint8_x_4_x_bilinear_mmx(gavl_video_scale_context_t * ctx)
1052
uint8_t * src, * dst, *src_start;
1068
// fprintf(stderr, "scale_uint8_x_4_x_bilinear_mmx\n");
1070
src_start = ctx->src + ctx->scanline * ctx->src_stride;
1073
movq_m2r(factor_mask, mm1);
1075
for(i = 0; i < ctx->dst_size; i++)
1077
src = src_start + 4*ctx->table_h.pixels[i].index;
1078
factors = ctx->table_h.pixels[i].factor_i;
1081
movd_m2r(*(src), mm0);
1082
punpcklbw_r2r(mm6, mm0);
1083
psllw_i2r(6, mm0); /* 14 bit */
1085
movd_m2r(*(src+4), mm5);
1086
punpcklbw_r2r(mm6, mm5);
1087
psllw_i2r(6, mm5); /* 14 bit */
1090
LOAD_FACTOR_1_4_NOCLIP; /* 14 bit */
1092
psubsw_r2r(mm5, mm0); /* s1(mm0) - s2(mm5) -> mm0 (14 bit) */
1093
pmulhw_r2r(mm7, mm0); /* factor * (s2 - s1) -> mm0 (12 bit) */
1095
psllw_i2r(2, mm0); /* (14 bit) */
1097
paddsw_r2r(mm5, mm0);/* (15 bit) */
1099
psraw_i2r(6, mm0);/* (8 bit) */
1100
packuswb_r2r(mm6, mm0);
1101
movd_r2m(mm0, *dst);
1110
void gavl_init_scale_funcs_bicubic_x_mmxext(gavl_scale_funcs_t * tab,
1111
int src_advance, int dst_advance)
1113
void gavl_init_scale_funcs_bicubic_x_mmx(gavl_scale_funcs_t * tab,
1114
int src_advance, int dst_advance)
1117
if((src_advance == 1) && (dst_advance == 1))
1120
tab->funcs_x.scale_uint8_x_1_noadvance = scale_uint8_x_1_x_bicubic_mmx;
1121
tab->funcs_x.bits_uint8_noadvance = 14;
1124
else if((src_advance == 2) && (dst_advance == 2))
1127
tab->funcs_x.scale_uint16_x_1 = scale_uint16_x_1_x_bicubic_mmx;
1128
tab->funcs_x.bits_uint16 = 14;
1131
else if((src_advance == 4) && (dst_advance == 4))
1133
tab->funcs_x.scale_uint8_x_3 = scale_uint8_x_4_x_bicubic_mmx;
1134
tab->funcs_x.scale_uint8_x_4 = scale_uint8_x_4_x_bicubic_mmx;
1135
tab->funcs_x.bits_uint8_noadvance = 14;
1137
else if((src_advance == 8) && (dst_advance == 8))
1140
tab->funcs_x.scale_uint16_x_4 = scale_uint16_x_4_x_bicubic_mmx;
1141
tab->funcs_x.bits_uint16 = 14;
1147
void gavl_init_scale_funcs_bicubic_noclip_x_mmxext(gavl_scale_funcs_t * tab,
1148
int src_advance, int dst_advance)
1150
void gavl_init_scale_funcs_bicubic_noclip_x_mmx(gavl_scale_funcs_t * tab,
1151
int src_advance, int dst_advance)
1154
if((src_advance == 1) && (dst_advance == 1))
1157
tab->funcs_x.scale_uint8_x_1_noadvance = scale_uint8_x_1_x_bicubic_noclip_mmx;
1158
tab->funcs_x.bits_uint8_noadvance = 14;
1161
else if((src_advance == 2) && (dst_advance == 2))
1164
tab->funcs_x.scale_uint16_x_1 = scale_uint16_x_1_x_bicubic_noclip_mmx;
1165
tab->funcs_x.bits_uint16 = 14;
1169
else if((src_advance == 4) && (dst_advance == 4))
1171
tab->funcs_x.scale_uint8_x_3 = scale_uint8_x_4_x_bicubic_mmx;
1172
tab->funcs_x.scale_uint8_x_4 = scale_uint8_x_4_x_bicubic_mmx;
1173
tab->funcs_x.bits_uint8_noadvance = 14;
1176
else if((src_advance == 8) && (dst_advance == 8))
1178
tab->funcs_x.scale_uint16_x_4 = scale_uint16_x_4_x_bicubic_noclip_mmx;
1179
tab->funcs_x.bits_uint16 = 14;
1185
void gavl_init_scale_funcs_quadratic_x_mmxext(gavl_scale_funcs_t * tab,
1186
int src_advance, int dst_advance)
1188
void gavl_init_scale_funcs_quadratic_x_mmx(gavl_scale_funcs_t * tab,
1189
int src_advance, int dst_advance)
1192
if((src_advance == 4) && (dst_advance == 4))
1194
tab->funcs_x.scale_uint8_x_3 = scale_uint8_x_4_x_quadratic_mmx;
1195
tab->funcs_x.scale_uint8_x_4 = scale_uint8_x_4_x_quadratic_mmx;
1196
tab->funcs_x.bits_uint8_noadvance = 14;
1198
else if((src_advance == 8) && (dst_advance == 8))
1201
tab->funcs_x.scale_uint16_x_4 = scale_uint16_x_4_x_quadratic_mmx;
1202
tab->funcs_x.bits_uint16 = 14;
1208
void gavl_init_scale_funcs_generic_x_mmxext(gavl_scale_funcs_t * tab,
1209
int src_advance, int dst_advance)
1211
void gavl_init_scale_funcs_generic_x_mmx(gavl_scale_funcs_t * tab,
1212
int src_advance, int dst_advance)
1215
if((src_advance == 1) && (dst_advance == 1))
1218
tab->funcs_x.scale_uint8_x_1_noadvance = scale_uint8_x_1_x_generic_mmx;
1219
tab->funcs_x.bits_uint8_noadvance = 14;
1222
if((src_advance == 2) && (dst_advance == 2))
1225
tab->funcs_x.scale_uint16_x_1 = scale_uint16_x_1_x_generic_mmx;
1226
tab->funcs_x.bits_uint16 = 14;
1229
else if((src_advance == 4) && (dst_advance == 4))
1231
tab->funcs_x.scale_uint8_x_3 = scale_uint8_x_4_x_generic_mmx;
1232
tab->funcs_x.scale_uint8_x_4 = scale_uint8_x_4_x_generic_mmx;
1233
tab->funcs_x.bits_uint8_noadvance = 14;
1235
else if((src_advance == 8) && (dst_advance == 8))
1238
tab->funcs_x.scale_uint16_x_4 = scale_uint16_x_4_x_generic_mmx;
1239
tab->funcs_x.bits_uint16 = 14;
1245
void gavl_init_scale_funcs_bilinear_x_mmxext(gavl_scale_funcs_t * tab,
1246
int src_advance, int dst_advance)
1248
void gavl_init_scale_funcs_bilinear_x_mmx(gavl_scale_funcs_t * tab,
1249
int src_advance, int dst_advance)
1252
if((src_advance == 1) && (dst_advance == 1))
1255
tab->funcs_x.scale_uint8_x_1_noadvance = scale_uint8_x_1_x_bilinear_mmx;
1256
tab->funcs_x.bits_uint8_noadvance = 14;
1259
else if((src_advance == 4) && (dst_advance == 4))
1261
tab->funcs_x.scale_uint8_x_3 = scale_uint8_x_4_x_bilinear_mmx;
1262
tab->funcs_x.scale_uint8_x_4 = scale_uint8_x_4_x_bilinear_mmx;
1263
tab->funcs_x.bits_uint8_noadvance = 14;