74
74
void gavl_init_scale_funcs(gavl_scale_funcs_t * tab, gavl_video_options_t * opt,
75
int src_advance, int dst_advance)
75
int src_advance, int dst_advance,
76
gavl_video_scale_table_t * tab_h,
77
gavl_video_scale_table_t * tab_v)
79
gavl_video_scale_table_t * scale_table;
81
memset(tab, 0, sizeof(*tab));
82
/* Only nearest is faster for x && y */
85
if((tab_h->factors_per_pixel == 1) &&
86
(tab_v->factors_per_pixel == 1))
87
gavl_init_scale_funcs_nearest_c(tab, src_advance, dst_advance);
91
scale_table = (tab_h ? tab_h : tab_v);
93
if(scale_table->factors_per_pixel < 1)
77
96
/* Get scale functions */
78
switch(opt->scale_mode)
97
switch(scale_table->factors_per_pixel)
82
case GAVL_SCALE_NEAREST:
83
if((opt->quality > 0) || (opt->accel_flags & GAVL_ACCEL_C))
84
gavl_init_scale_funcs_nearest_c(tab);
86
case GAVL_SCALE_BILINEAR:
87
if((opt->quality > 0) || (opt->accel_flags & GAVL_ACCEL_C))
88
gavl_init_scale_funcs_bilinear_c(tab);
100
gavl_init_scale_funcs_nearest_c(tab, src_advance, dst_advance);
103
if((opt->quality > 0) || (opt->accel_flags & GAVL_ACCEL_C))
105
if(scale_table->do_clip)
106
gavl_init_scale_funcs_bilinear_c(tab);
109
gavl_init_scale_funcs_bilinear_noclip_c(tab);
110
if(scale_table->normalized)
111
gavl_init_scale_funcs_bilinear_fast_c(tab);
90
115
if((opt->quality < 3) && (opt->accel_flags & GAVL_ACCEL_MMX))
146
case GAVL_SCALE_CUBIC_BSPLINE:
147
if((opt->quality > 0) || (opt->accel_flags & GAVL_ACCEL_C))
148
gavl_init_scale_funcs_bicubic_noclip_c(tab);
150
if((opt->quality < 3) && (opt->accel_flags & GAVL_ACCEL_MMX))
152
gavl_init_scale_funcs_bicubic_y_mmx(tab, src_advance, dst_advance);
153
gavl_init_scale_funcs_bicubic_noclip_x_mmx(tab, src_advance, dst_advance);
155
if((opt->quality < 3) && (opt->accel_flags & GAVL_ACCEL_MMXEXT))
157
gavl_init_scale_funcs_bicubic_y_mmxext(tab, src_advance, dst_advance);
158
gavl_init_scale_funcs_bicubic_noclip_x_mmxext(tab, src_advance, dst_advance);
162
if(opt->accel_flags & GAVL_ACCEL_SSE)
164
gavl_init_scale_funcs_bicubic_y_noclip_sse(tab, src_advance, dst_advance);
165
gavl_init_scale_funcs_bicubic_x_noclip_sse(tab);
169
if((opt->quality < 3) && (opt->accel_flags & GAVL_ACCEL_SSE2))
171
gavl_init_scale_funcs_bicubic_y_noclip_sse2(tab, src_advance, dst_advance);
172
// gavl_init_scale_funcs_bicubic_x_sse2(tab, src_advance, dst_advance);
176
if(opt->accel_flags & GAVL_ACCEL_SSE3)
178
gavl_init_scale_funcs_bicubic_x_noclip_sse3(tab);
182
case GAVL_SCALE_CUBIC_MITCHELL:
183
case GAVL_SCALE_CUBIC_CATMULL:
184
if((opt->quality > 0) || (opt->accel_flags & GAVL_ACCEL_C))
185
gavl_init_scale_funcs_bicubic_c(tab);
187
if((opt->quality < 3) && (opt->accel_flags & GAVL_ACCEL_MMX))
189
gavl_init_scale_funcs_bicubic_y_mmx(tab, src_advance, dst_advance);
190
gavl_init_scale_funcs_bicubic_x_mmx(tab, src_advance, dst_advance);
192
if((opt->quality < 3) && (opt->accel_flags & GAVL_ACCEL_MMXEXT))
194
gavl_init_scale_funcs_bicubic_y_mmxext(tab, src_advance, dst_advance);
195
gavl_init_scale_funcs_bicubic_x_mmxext(tab, src_advance, dst_advance);
199
if(opt->accel_flags & GAVL_ACCEL_SSE)
201
gavl_init_scale_funcs_bicubic_y_sse(tab, src_advance, dst_advance);
202
gavl_init_scale_funcs_bicubic_x_sse(tab);
206
if((opt->quality < 3) && (opt->accel_flags & GAVL_ACCEL_SSE2))
208
gavl_init_scale_funcs_bicubic_y_sse2(tab, src_advance, dst_advance);
209
// gavl_init_scale_funcs_bicubic_x_sse2(tab, src_advance, dst_advance);
213
if(opt->accel_flags & GAVL_ACCEL_SSE3)
215
gavl_init_scale_funcs_bicubic_x_sse3(tab);
219
case GAVL_SCALE_SINC_LANCZOS:
220
case GAVL_SCALE_NONE:
177
if(!scale_table->do_clip)
179
if((opt->quality > 0) || (opt->accel_flags & GAVL_ACCEL_C))
180
gavl_init_scale_funcs_bicubic_noclip_c(tab);
182
if((opt->quality < 3) && (opt->accel_flags & GAVL_ACCEL_MMX))
184
gavl_init_scale_funcs_bicubic_y_mmx(tab, src_advance, dst_advance);
185
gavl_init_scale_funcs_bicubic_noclip_x_mmx(tab, src_advance, dst_advance);
187
if((opt->quality < 3) && (opt->accel_flags & GAVL_ACCEL_MMXEXT))
189
gavl_init_scale_funcs_bicubic_y_mmxext(tab, src_advance, dst_advance);
190
gavl_init_scale_funcs_bicubic_noclip_x_mmxext(tab, src_advance, dst_advance);
194
if(opt->accel_flags & GAVL_ACCEL_SSE)
196
gavl_init_scale_funcs_bicubic_y_noclip_sse(tab, src_advance, dst_advance);
197
gavl_init_scale_funcs_bicubic_x_noclip_sse(tab);
201
if((opt->quality < 3) && (opt->accel_flags & GAVL_ACCEL_SSE2))
203
gavl_init_scale_funcs_bicubic_y_noclip_sse2(tab, src_advance, dst_advance);
204
// gavl_init_scale_funcs_bicubic_x_sse2(tab, src_advance, dst_advance);
208
if(opt->accel_flags & GAVL_ACCEL_SSE3)
210
gavl_init_scale_funcs_bicubic_x_noclip_sse3(tab);
216
if((opt->quality > 0) || (opt->accel_flags & GAVL_ACCEL_C))
217
gavl_init_scale_funcs_bicubic_c(tab);
219
if((opt->quality < 3) && (opt->accel_flags & GAVL_ACCEL_MMX))
221
gavl_init_scale_funcs_bicubic_y_mmx(tab, src_advance, dst_advance);
222
gavl_init_scale_funcs_bicubic_x_mmx(tab, src_advance, dst_advance);
224
if((opt->quality < 3) && (opt->accel_flags & GAVL_ACCEL_MMXEXT))
226
gavl_init_scale_funcs_bicubic_y_mmxext(tab, src_advance, dst_advance);
227
gavl_init_scale_funcs_bicubic_x_mmxext(tab, src_advance, dst_advance);
231
if(opt->accel_flags & GAVL_ACCEL_SSE)
233
gavl_init_scale_funcs_bicubic_y_sse(tab, src_advance, dst_advance);
234
gavl_init_scale_funcs_bicubic_x_sse(tab);
238
if((opt->quality < 3) && (opt->accel_flags & GAVL_ACCEL_SSE2))
240
gavl_init_scale_funcs_bicubic_y_sse2(tab, src_advance, dst_advance);
241
// gavl_init_scale_funcs_bicubic_x_sse2(tab, src_advance, dst_advance);
245
if(opt->accel_flags & GAVL_ACCEL_SSE3)
247
gavl_init_scale_funcs_bicubic_x_sse3(tab);
221
253
if((opt->quality > 0) || (opt->accel_flags & GAVL_ACCEL_C))
222
254
gavl_init_scale_funcs_generic_c(tab);