~ubuntu-branches/ubuntu/trusty/gavl/trusty

« back to all changes in this revision

Viewing changes to gavl/scale.c

  • Committer: Bazaar Package Importer
  • Author(s): Romain Beauxis
  • Date: 2009-01-17 20:38:33 UTC
  • mfrom: (1.1.3 upstream) (4.1.1 squeeze)
  • Revision ID: james.westby@ubuntu.com-20090117203833-t8fq1e1jdquyelmy
Tags: 1.1.0-2
Fixed debian/copyright 

Show diffs side-by-side

added added

removed removed

Lines of Context:
72
72
  }
73
73
 
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)
76
78
  {
 
79
  gavl_video_scale_table_t * scale_table;
 
80
 
 
81
  memset(tab, 0, sizeof(*tab));
 
82
  /* Only nearest is faster for x && y */
 
83
  if(tab_h && tab_v)
 
84
    {
 
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);
 
88
    return;
 
89
    }
 
90
  
 
91
  scale_table = (tab_h ? tab_h : tab_v);
 
92
 
 
93
  if(scale_table->factors_per_pixel < 1)
 
94
    return;
 
95
  
77
96
  /* Get scale functions */
78
 
  switch(opt->scale_mode)
 
97
  switch(scale_table->factors_per_pixel)
79
98
    {
80
 
    case GAVL_SCALE_AUTO:
81
 
      break;
82
 
    case GAVL_SCALE_NEAREST:
83
 
      if((opt->quality > 0) || (opt->accel_flags & GAVL_ACCEL_C))
84
 
        gavl_init_scale_funcs_nearest_c(tab);
85
 
      break;
86
 
    case GAVL_SCALE_BILINEAR:
87
 
      if((opt->quality > 0) || (opt->accel_flags & GAVL_ACCEL_C))
88
 
        gavl_init_scale_funcs_bilinear_c(tab);
 
99
    case 1:
 
100
      gavl_init_scale_funcs_nearest_c(tab, src_advance, dst_advance);
 
101
      break;
 
102
    case 2:
 
103
      if((opt->quality > 0) || (opt->accel_flags & GAVL_ACCEL_C))
 
104
        {
 
105
        if(scale_table->do_clip)
 
106
          gavl_init_scale_funcs_bilinear_c(tab);
 
107
        else
 
108
          {
 
109
          gavl_init_scale_funcs_bilinear_noclip_c(tab);
 
110
          if(scale_table->normalized)
 
111
            gavl_init_scale_funcs_bilinear_fast_c(tab);
 
112
          }
 
113
        }
89
114
#ifdef HAVE_MMX
90
115
      if((opt->quality < 3) && (opt->accel_flags & GAVL_ACCEL_MMX))
91
116
        {
113
138
        }
114
139
#endif
115
140
      break;
116
 
    case GAVL_SCALE_QUADRATIC:
 
141
    case 3:
117
142
      if((opt->quality > 0) || (opt->accel_flags & GAVL_ACCEL_C))
118
 
        gavl_init_scale_funcs_quadratic_c(tab);
 
143
        {
 
144
        if(scale_table->do_clip)
 
145
          gavl_init_scale_funcs_quadratic_c(tab);
 
146
        else
 
147
          gavl_init_scale_funcs_quadratic_noclip_c(tab);
 
148
        }
119
149
#ifdef HAVE_MMX
120
150
      if((opt->quality < 3) && (opt->accel_flags & GAVL_ACCEL_MMX))
121
151
        {
143
173
        }
144
174
#endif
145
175
      break;
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);
149
 
#ifdef HAVE_MMX
150
 
      if((opt->quality < 3) && (opt->accel_flags & GAVL_ACCEL_MMX))
151
 
        {
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);
154
 
        }
155
 
      if((opt->quality < 3) && (opt->accel_flags & GAVL_ACCEL_MMXEXT))
156
 
        {
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);
159
 
        }
160
 
#endif
161
 
#ifdef HAVE_SSE
162
 
      if(opt->accel_flags & GAVL_ACCEL_SSE)
163
 
        {
164
 
        gavl_init_scale_funcs_bicubic_y_noclip_sse(tab, src_advance, dst_advance);
165
 
        gavl_init_scale_funcs_bicubic_x_noclip_sse(tab);
166
 
        }
167
 
#endif
168
 
#ifdef HAVE_SSE2
169
 
      if((opt->quality < 3) && (opt->accel_flags & GAVL_ACCEL_SSE2))
170
 
        {
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);
173
 
        }
174
 
#endif
175
 
#ifdef HAVE_SSE3
176
 
      if(opt->accel_flags & GAVL_ACCEL_SSE3)
177
 
        {
178
 
        gavl_init_scale_funcs_bicubic_x_noclip_sse3(tab);
179
 
        }
180
 
#endif
181
 
      break;
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);
186
 
#ifdef HAVE_MMX
187
 
      if((opt->quality < 3) && (opt->accel_flags & GAVL_ACCEL_MMX))
188
 
        {
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);
191
 
        }
192
 
      if((opt->quality < 3) && (opt->accel_flags & GAVL_ACCEL_MMXEXT))
193
 
        {
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);
196
 
        }
197
 
#endif
198
 
#ifdef HAVE_SSE
199
 
      if(opt->accel_flags & GAVL_ACCEL_SSE)
200
 
        {
201
 
        gavl_init_scale_funcs_bicubic_y_sse(tab, src_advance, dst_advance);
202
 
        gavl_init_scale_funcs_bicubic_x_sse(tab);
203
 
        }
204
 
#endif
205
 
#ifdef HAVE_SSE2
206
 
      if((opt->quality < 3) && (opt->accel_flags & GAVL_ACCEL_SSE2))
207
 
        {
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);
210
 
        }
211
 
#endif
212
 
#ifdef HAVE_SSE3
213
 
      if(opt->accel_flags & GAVL_ACCEL_SSE3)
214
 
        {
215
 
        gavl_init_scale_funcs_bicubic_x_sse3(tab);
216
 
        }
217
 
#endif
218
 
      break;
219
 
    case GAVL_SCALE_SINC_LANCZOS:
220
 
    case GAVL_SCALE_NONE:
 
176
    case 4:
 
177
      if(!scale_table->do_clip)
 
178
        {
 
179
        if((opt->quality > 0) || (opt->accel_flags & GAVL_ACCEL_C))
 
180
          gavl_init_scale_funcs_bicubic_noclip_c(tab);
 
181
#ifdef HAVE_MMX
 
182
        if((opt->quality < 3) && (opt->accel_flags & GAVL_ACCEL_MMX))
 
183
          {
 
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);
 
186
          }
 
187
        if((opt->quality < 3) && (opt->accel_flags & GAVL_ACCEL_MMXEXT))
 
188
          {
 
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);
 
191
          }
 
192
#endif
 
193
#ifdef HAVE_SSE
 
194
        if(opt->accel_flags & GAVL_ACCEL_SSE)
 
195
          {
 
196
          gavl_init_scale_funcs_bicubic_y_noclip_sse(tab, src_advance, dst_advance);
 
197
          gavl_init_scale_funcs_bicubic_x_noclip_sse(tab);
 
198
          }
 
199
#endif
 
200
#ifdef HAVE_SSE2
 
201
        if((opt->quality < 3) && (opt->accel_flags & GAVL_ACCEL_SSE2))
 
202
          {
 
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);
 
205
          }
 
206
#endif
 
207
#ifdef HAVE_SSE3
 
208
        if(opt->accel_flags & GAVL_ACCEL_SSE3)
 
209
          {
 
210
          gavl_init_scale_funcs_bicubic_x_noclip_sse3(tab);
 
211
          }
 
212
#endif
 
213
        }
 
214
      else
 
215
        {
 
216
        if((opt->quality > 0) || (opt->accel_flags & GAVL_ACCEL_C))
 
217
          gavl_init_scale_funcs_bicubic_c(tab);
 
218
#ifdef HAVE_MMX
 
219
        if((opt->quality < 3) && (opt->accel_flags & GAVL_ACCEL_MMX))
 
220
          {
 
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);
 
223
          }
 
224
        if((opt->quality < 3) && (opt->accel_flags & GAVL_ACCEL_MMXEXT))
 
225
          {
 
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);
 
228
          }
 
229
#endif
 
230
#ifdef HAVE_SSE
 
231
        if(opt->accel_flags & GAVL_ACCEL_SSE)
 
232
          {
 
233
          gavl_init_scale_funcs_bicubic_y_sse(tab, src_advance, dst_advance);
 
234
          gavl_init_scale_funcs_bicubic_x_sse(tab);
 
235
          }
 
236
#endif
 
237
#ifdef HAVE_SSE2
 
238
        if((opt->quality < 3) && (opt->accel_flags & GAVL_ACCEL_SSE2))
 
239
          {
 
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);
 
242
          }
 
243
#endif
 
244
#ifdef HAVE_SSE3
 
245
        if(opt->accel_flags & GAVL_ACCEL_SSE3)
 
246
          {
 
247
          gavl_init_scale_funcs_bicubic_x_sse3(tab);
 
248
          }
 
249
#endif
 
250
        }
 
251
      break;
 
252
    default:
221
253
      if((opt->quality > 0) || (opt->accel_flags & GAVL_ACCEL_C))
222
254
        gavl_init_scale_funcs_generic_c(tab);
223
255
#ifdef HAVE_MMX