deinterlace: support filter in getcaps
[platform/upstream/gst-plugins-good.git] / gst / deinterlace / tvtime-dist.c
1
2 /* autogenerated from tvtime.orc */
3
4 #ifdef HAVE_CONFIG_H
5 #include "config.h"
6 #endif
7 #include <glib.h>
8
9 #ifndef _ORC_INTEGER_TYPEDEFS_
10 #define _ORC_INTEGER_TYPEDEFS_
11 #if defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L
12 #include <stdint.h>
13 typedef int8_t orc_int8;
14 typedef int16_t orc_int16;
15 typedef int32_t orc_int32;
16 typedef int64_t orc_int64;
17 typedef uint8_t orc_uint8;
18 typedef uint16_t orc_uint16;
19 typedef uint32_t orc_uint32;
20 typedef uint64_t orc_uint64;
21 #define ORC_UINT64_C(x) UINT64_C(x)
22 #elif defined(_MSC_VER)
23 typedef signed __int8 orc_int8;
24 typedef signed __int16 orc_int16;
25 typedef signed __int32 orc_int32;
26 typedef signed __int64 orc_int64;
27 typedef unsigned __int8 orc_uint8;
28 typedef unsigned __int16 orc_uint16;
29 typedef unsigned __int32 orc_uint32;
30 typedef unsigned __int64 orc_uint64;
31 #define ORC_UINT64_C(x) (x##Ui64)
32 #define inline __inline
33 #else
34 #include <limits.h>
35 typedef signed char orc_int8;
36 typedef short orc_int16;
37 typedef int orc_int32;
38 typedef unsigned char orc_uint8;
39 typedef unsigned short orc_uint16;
40 typedef unsigned int orc_uint32;
41 #if INT_MAX == LONG_MAX
42 typedef long long orc_int64;
43 typedef unsigned long long orc_uint64;
44 #define ORC_UINT64_C(x) (x##ULL)
45 #else
46 typedef long orc_int64;
47 typedef unsigned long orc_uint64;
48 #define ORC_UINT64_C(x) (x##UL)
49 #endif
50 #endif
51 typedef union
52 {
53   orc_int16 i;
54   orc_int8 x2[2];
55 } orc_union16;
56 typedef union
57 {
58   orc_int32 i;
59   float f;
60   orc_int16 x2[2];
61   orc_int8 x4[4];
62 } orc_union32;
63 typedef union
64 {
65   orc_int64 i;
66   double f;
67   orc_int32 x2[2];
68   float x2f[2];
69   orc_int16 x4[4];
70 } orc_union64;
71 #endif
72 #ifndef ORC_RESTRICT
73 #if defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L
74 #define ORC_RESTRICT restrict
75 #elif defined(__GNUC__) && __GNUC__ >= 4
76 #define ORC_RESTRICT __restrict__
77 #else
78 #define ORC_RESTRICT
79 #endif
80 #endif
81
82 #ifndef DISABLE_ORC
83 #include <orc/orc.h>
84 #endif
85 void deinterlace_line_vfir (guint8 * ORC_RESTRICT d1,
86     const guint8 * ORC_RESTRICT s1, const guint8 * ORC_RESTRICT s2,
87     const guint8 * ORC_RESTRICT s3, const guint8 * ORC_RESTRICT s4,
88     const guint8 * ORC_RESTRICT s5, int n);
89 void deinterlace_line_linear (guint8 * ORC_RESTRICT d1,
90     const guint8 * ORC_RESTRICT s1, const guint8 * ORC_RESTRICT s2, int n);
91 void deinterlace_line_linear_blend (guint8 * ORC_RESTRICT d1,
92     const guint8 * ORC_RESTRICT s1, const guint8 * ORC_RESTRICT s2,
93     const guint8 * ORC_RESTRICT s3, int n);
94 void deinterlace_line_greedy (orc_uint8 * ORC_RESTRICT d1,
95     const orc_uint8 * ORC_RESTRICT s1, const orc_uint8 * ORC_RESTRICT s2,
96     const orc_uint8 * ORC_RESTRICT s3, const orc_uint8 * ORC_RESTRICT s4,
97     int p1, int n);
98
99
100 /* begin Orc C target preamble */
101 #define ORC_CLAMP(x,a,b) ((x)<(a) ? (a) : ((x)>(b) ? (b) : (x)))
102 #define ORC_ABS(a) ((a)<0 ? -(a) : (a))
103 #define ORC_MIN(a,b) ((a)<(b) ? (a) : (b))
104 #define ORC_MAX(a,b) ((a)>(b) ? (a) : (b))
105 #define ORC_SB_MAX 127
106 #define ORC_SB_MIN (-1-ORC_SB_MAX)
107 #define ORC_UB_MAX 255
108 #define ORC_UB_MIN 0
109 #define ORC_SW_MAX 32767
110 #define ORC_SW_MIN (-1-ORC_SW_MAX)
111 #define ORC_UW_MAX 65535
112 #define ORC_UW_MIN 0
113 #define ORC_SL_MAX 2147483647
114 #define ORC_SL_MIN (-1-ORC_SL_MAX)
115 #define ORC_UL_MAX 4294967295U
116 #define ORC_UL_MIN 0
117 #define ORC_CLAMP_SB(x) ORC_CLAMP(x,ORC_SB_MIN,ORC_SB_MAX)
118 #define ORC_CLAMP_UB(x) ORC_CLAMP(x,ORC_UB_MIN,ORC_UB_MAX)
119 #define ORC_CLAMP_SW(x) ORC_CLAMP(x,ORC_SW_MIN,ORC_SW_MAX)
120 #define ORC_CLAMP_UW(x) ORC_CLAMP(x,ORC_UW_MIN,ORC_UW_MAX)
121 #define ORC_CLAMP_SL(x) ORC_CLAMP(x,ORC_SL_MIN,ORC_SL_MAX)
122 #define ORC_CLAMP_UL(x) ORC_CLAMP(x,ORC_UL_MIN,ORC_UL_MAX)
123 #define ORC_SWAP_W(x) ((((x)&0xff)<<8) | (((x)&0xff00)>>8))
124 #define ORC_SWAP_L(x) ((((x)&0xff)<<24) | (((x)&0xff00)<<8) | (((x)&0xff0000)>>8) | (((x)&0xff000000)>>24))
125 #define ORC_SWAP_Q(x) ((((x)&ORC_UINT64_C(0xff))<<56) | (((x)&ORC_UINT64_C(0xff00))<<40) | (((x)&ORC_UINT64_C(0xff0000))<<24) | (((x)&ORC_UINT64_C(0xff000000))<<8) | (((x)&ORC_UINT64_C(0xff00000000))>>8) | (((x)&ORC_UINT64_C(0xff0000000000))>>24) | (((x)&ORC_UINT64_C(0xff000000000000))>>40) | (((x)&ORC_UINT64_C(0xff00000000000000))>>56))
126 #define ORC_PTR_OFFSET(ptr,offset) ((void *)(((unsigned char *)(ptr)) + (offset)))
127 #define ORC_DENORMAL(x) ((x) & ((((x)&0x7f800000) == 0) ? 0xff800000 : 0xffffffff))
128 #define ORC_ISNAN(x) ((((x)&0x7f800000) == 0x7f800000) && (((x)&0x007fffff) != 0))
129 #define ORC_DENORMAL_DOUBLE(x) ((x) & ((((x)&ORC_UINT64_C(0x7ff0000000000000)) == 0) ? ORC_UINT64_C(0xfff0000000000000) : ORC_UINT64_C(0xffffffffffffffff)))
130 #define ORC_ISNAN_DOUBLE(x) ((((x)&ORC_UINT64_C(0x7ff0000000000000)) == ORC_UINT64_C(0x7ff0000000000000)) && (((x)&ORC_UINT64_C(0x000fffffffffffff)) != 0))
131 #ifndef ORC_RESTRICT
132 #if defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L
133 #define ORC_RESTRICT restrict
134 #elif defined(__GNUC__) && __GNUC__ >= 4
135 #define ORC_RESTRICT __restrict__
136 #else
137 #define ORC_RESTRICT
138 #endif
139 #endif
140 /* end Orc C target preamble */
141
142
143
144 /* deinterlace_line_vfir */
145 #ifdef DISABLE_ORC
146 void
147 deinterlace_line_vfir (guint8 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1,
148     const guint8 * ORC_RESTRICT s2, const guint8 * ORC_RESTRICT s3,
149     const guint8 * ORC_RESTRICT s4, const guint8 * ORC_RESTRICT s5, int n)
150 {
151   int i;
152   orc_int8 *ORC_RESTRICT ptr0;
153   const orc_int8 *ORC_RESTRICT ptr4;
154   const orc_int8 *ORC_RESTRICT ptr5;
155   const orc_int8 *ORC_RESTRICT ptr6;
156   const orc_int8 *ORC_RESTRICT ptr7;
157   const orc_int8 *ORC_RESTRICT ptr8;
158   orc_int8 var35;
159   orc_int8 var36;
160   orc_int8 var37;
161   orc_int8 var38;
162   orc_int8 var39;
163   orc_union16 var40;
164   orc_int8 var41;
165   orc_union16 var42;
166   orc_union16 var43;
167   orc_union16 var44;
168   orc_union16 var45;
169   orc_union16 var46;
170   orc_union16 var47;
171   orc_union16 var48;
172   orc_union16 var49;
173   orc_union16 var50;
174   orc_union16 var51;
175   orc_union16 var52;
176   orc_union16 var53;
177   orc_union16 var54;
178
179   ptr0 = (orc_int8 *) d1;
180   ptr4 = (orc_int8 *) s1;
181   ptr5 = (orc_int8 *) s2;
182   ptr6 = (orc_int8 *) s3;
183   ptr7 = (orc_int8 *) s4;
184   ptr8 = (orc_int8 *) s5;
185
186   /* 16: loadpw */
187   var40.i = (int) 0x00000004;   /* 4 or 1.97626e-323f */
188
189   for (i = 0; i < n; i++) {
190     /* 0: loadb */
191     var35 = ptr4[i];
192     /* 1: convubw */
193     var42.i = (orc_uint8) var35;
194     /* 2: loadb */
195     var36 = ptr8[i];
196     /* 3: convubw */
197     var43.i = (orc_uint8) var36;
198     /* 4: addw */
199     var44.i = var42.i + var43.i;
200     /* 5: loadb */
201     var37 = ptr5[i];
202     /* 6: convubw */
203     var45.i = (orc_uint8) var37;
204     /* 7: loadb */
205     var38 = ptr7[i];
206     /* 8: convubw */
207     var46.i = (orc_uint8) var38;
208     /* 9: addw */
209     var47.i = var45.i + var46.i;
210     /* 10: shlw */
211     var48.i = var47.i << 2;
212     /* 11: loadb */
213     var39 = ptr6[i];
214     /* 12: convubw */
215     var49.i = (orc_uint8) var39;
216     /* 13: shlw */
217     var50.i = var49.i << 1;
218     /* 14: subw */
219     var51.i = var48.i - var44.i;
220     /* 15: addw */
221     var52.i = var51.i + var50.i;
222     /* 17: addw */
223     var53.i = var52.i + var40.i;
224     /* 18: shrsw */
225     var54.i = var53.i >> 3;
226     /* 19: convsuswb */
227     var41 = ORC_CLAMP_UB (var54.i);
228     /* 20: storeb */
229     ptr0[i] = var41;
230   }
231
232 }
233
234 #else
235 static void
236 _backup_deinterlace_line_vfir (OrcExecutor * ORC_RESTRICT ex)
237 {
238   int i;
239   int n = ex->n;
240   orc_int8 *ORC_RESTRICT ptr0;
241   const orc_int8 *ORC_RESTRICT ptr4;
242   const orc_int8 *ORC_RESTRICT ptr5;
243   const orc_int8 *ORC_RESTRICT ptr6;
244   const orc_int8 *ORC_RESTRICT ptr7;
245   const orc_int8 *ORC_RESTRICT ptr8;
246   orc_int8 var35;
247   orc_int8 var36;
248   orc_int8 var37;
249   orc_int8 var38;
250   orc_int8 var39;
251   orc_union16 var40;
252   orc_int8 var41;
253   orc_union16 var42;
254   orc_union16 var43;
255   orc_union16 var44;
256   orc_union16 var45;
257   orc_union16 var46;
258   orc_union16 var47;
259   orc_union16 var48;
260   orc_union16 var49;
261   orc_union16 var50;
262   orc_union16 var51;
263   orc_union16 var52;
264   orc_union16 var53;
265   orc_union16 var54;
266
267   ptr0 = (orc_int8 *) ex->arrays[0];
268   ptr4 = (orc_int8 *) ex->arrays[4];
269   ptr5 = (orc_int8 *) ex->arrays[5];
270   ptr6 = (orc_int8 *) ex->arrays[6];
271   ptr7 = (orc_int8 *) ex->arrays[7];
272   ptr8 = (orc_int8 *) ex->arrays[8];
273
274   /* 16: loadpw */
275   var40.i = (int) 0x00000004;   /* 4 or 1.97626e-323f */
276
277   for (i = 0; i < n; i++) {
278     /* 0: loadb */
279     var35 = ptr4[i];
280     /* 1: convubw */
281     var42.i = (orc_uint8) var35;
282     /* 2: loadb */
283     var36 = ptr8[i];
284     /* 3: convubw */
285     var43.i = (orc_uint8) var36;
286     /* 4: addw */
287     var44.i = var42.i + var43.i;
288     /* 5: loadb */
289     var37 = ptr5[i];
290     /* 6: convubw */
291     var45.i = (orc_uint8) var37;
292     /* 7: loadb */
293     var38 = ptr7[i];
294     /* 8: convubw */
295     var46.i = (orc_uint8) var38;
296     /* 9: addw */
297     var47.i = var45.i + var46.i;
298     /* 10: shlw */
299     var48.i = var47.i << 2;
300     /* 11: loadb */
301     var39 = ptr6[i];
302     /* 12: convubw */
303     var49.i = (orc_uint8) var39;
304     /* 13: shlw */
305     var50.i = var49.i << 1;
306     /* 14: subw */
307     var51.i = var48.i - var44.i;
308     /* 15: addw */
309     var52.i = var51.i + var50.i;
310     /* 17: addw */
311     var53.i = var52.i + var40.i;
312     /* 18: shrsw */
313     var54.i = var53.i >> 3;
314     /* 19: convsuswb */
315     var41 = ORC_CLAMP_UB (var54.i);
316     /* 20: storeb */
317     ptr0[i] = var41;
318   }
319
320 }
321
322 void
323 deinterlace_line_vfir (guint8 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1,
324     const guint8 * ORC_RESTRICT s2, const guint8 * ORC_RESTRICT s3,
325     const guint8 * ORC_RESTRICT s4, const guint8 * ORC_RESTRICT s5, int n)
326 {
327   OrcExecutor _ex, *ex = &_ex;
328   static volatile int p_inited = 0;
329   static OrcCode *c = 0;
330   void (*func) (OrcExecutor *);
331
332   if (!p_inited) {
333     orc_once_mutex_lock ();
334     if (!p_inited) {
335       OrcProgram *p;
336
337       p = orc_program_new ();
338       orc_program_set_name (p, "deinterlace_line_vfir");
339       orc_program_set_backup_function (p, _backup_deinterlace_line_vfir);
340       orc_program_add_destination (p, 1, "d1");
341       orc_program_add_source (p, 1, "s1");
342       orc_program_add_source (p, 1, "s2");
343       orc_program_add_source (p, 1, "s3");
344       orc_program_add_source (p, 1, "s4");
345       orc_program_add_source (p, 1, "s5");
346       orc_program_add_constant (p, 4, 0x00000002, "c1");
347       orc_program_add_constant (p, 4, 0x00000001, "c2");
348       orc_program_add_constant (p, 4, 0x00000004, "c3");
349       orc_program_add_constant (p, 4, 0x00000003, "c4");
350       orc_program_add_temporary (p, 2, "t1");
351       orc_program_add_temporary (p, 2, "t2");
352       orc_program_add_temporary (p, 2, "t3");
353
354       orc_program_append_2 (p, "convubw", 0, ORC_VAR_T1, ORC_VAR_S1, ORC_VAR_D1,
355           ORC_VAR_D1);
356       orc_program_append_2 (p, "convubw", 0, ORC_VAR_T2, ORC_VAR_S5, ORC_VAR_D1,
357           ORC_VAR_D1);
358       orc_program_append_2 (p, "addw", 0, ORC_VAR_T1, ORC_VAR_T1, ORC_VAR_T2,
359           ORC_VAR_D1);
360       orc_program_append_2 (p, "convubw", 0, ORC_VAR_T2, ORC_VAR_S2, ORC_VAR_D1,
361           ORC_VAR_D1);
362       orc_program_append_2 (p, "convubw", 0, ORC_VAR_T3, ORC_VAR_S4, ORC_VAR_D1,
363           ORC_VAR_D1);
364       orc_program_append_2 (p, "addw", 0, ORC_VAR_T2, ORC_VAR_T2, ORC_VAR_T3,
365           ORC_VAR_D1);
366       orc_program_append_2 (p, "shlw", 0, ORC_VAR_T2, ORC_VAR_T2, ORC_VAR_C1,
367           ORC_VAR_D1);
368       orc_program_append_2 (p, "convubw", 0, ORC_VAR_T3, ORC_VAR_S3, ORC_VAR_D1,
369           ORC_VAR_D1);
370       orc_program_append_2 (p, "shlw", 0, ORC_VAR_T3, ORC_VAR_T3, ORC_VAR_C2,
371           ORC_VAR_D1);
372       orc_program_append_2 (p, "subw", 0, ORC_VAR_T2, ORC_VAR_T2, ORC_VAR_T1,
373           ORC_VAR_D1);
374       orc_program_append_2 (p, "addw", 0, ORC_VAR_T2, ORC_VAR_T2, ORC_VAR_T3,
375           ORC_VAR_D1);
376       orc_program_append_2 (p, "addw", 0, ORC_VAR_T2, ORC_VAR_T2, ORC_VAR_C3,
377           ORC_VAR_D1);
378       orc_program_append_2 (p, "shrsw", 0, ORC_VAR_T2, ORC_VAR_T2, ORC_VAR_C4,
379           ORC_VAR_D1);
380       orc_program_append_2 (p, "convsuswb", 0, ORC_VAR_D1, ORC_VAR_T2,
381           ORC_VAR_D1, ORC_VAR_D1);
382
383       orc_program_compile (p);
384       c = orc_program_take_code (p);
385       orc_program_free (p);
386     }
387     p_inited = TRUE;
388     orc_once_mutex_unlock ();
389   }
390   ex->arrays[ORC_VAR_A2] = c;
391   ex->program = 0;
392
393   ex->n = n;
394   ex->arrays[ORC_VAR_D1] = d1;
395   ex->arrays[ORC_VAR_S1] = (void *) s1;
396   ex->arrays[ORC_VAR_S2] = (void *) s2;
397   ex->arrays[ORC_VAR_S3] = (void *) s3;
398   ex->arrays[ORC_VAR_S4] = (void *) s4;
399   ex->arrays[ORC_VAR_S5] = (void *) s5;
400
401   func = c->exec;
402   func (ex);
403 }
404 #endif
405
406
407 /* deinterlace_line_linear */
408 #ifdef DISABLE_ORC
409 void
410 deinterlace_line_linear (guint8 * ORC_RESTRICT d1,
411     const guint8 * ORC_RESTRICT s1, const guint8 * ORC_RESTRICT s2, int n)
412 {
413   int i;
414   orc_int8 *ORC_RESTRICT ptr0;
415   const orc_int8 *ORC_RESTRICT ptr4;
416   const orc_int8 *ORC_RESTRICT ptr5;
417   orc_int8 var32;
418   orc_int8 var33;
419   orc_int8 var34;
420
421   ptr0 = (orc_int8 *) d1;
422   ptr4 = (orc_int8 *) s1;
423   ptr5 = (orc_int8 *) s2;
424
425
426   for (i = 0; i < n; i++) {
427     /* 0: loadb */
428     var32 = ptr4[i];
429     /* 1: loadb */
430     var33 = ptr5[i];
431     /* 2: avgub */
432     var34 = ((orc_uint8) var32 + (orc_uint8) var33 + 1) >> 1;
433     /* 3: storeb */
434     ptr0[i] = var34;
435   }
436
437 }
438
439 #else
440 static void
441 _backup_deinterlace_line_linear (OrcExecutor * ORC_RESTRICT ex)
442 {
443   int i;
444   int n = ex->n;
445   orc_int8 *ORC_RESTRICT ptr0;
446   const orc_int8 *ORC_RESTRICT ptr4;
447   const orc_int8 *ORC_RESTRICT ptr5;
448   orc_int8 var32;
449   orc_int8 var33;
450   orc_int8 var34;
451
452   ptr0 = (orc_int8 *) ex->arrays[0];
453   ptr4 = (orc_int8 *) ex->arrays[4];
454   ptr5 = (orc_int8 *) ex->arrays[5];
455
456
457   for (i = 0; i < n; i++) {
458     /* 0: loadb */
459     var32 = ptr4[i];
460     /* 1: loadb */
461     var33 = ptr5[i];
462     /* 2: avgub */
463     var34 = ((orc_uint8) var32 + (orc_uint8) var33 + 1) >> 1;
464     /* 3: storeb */
465     ptr0[i] = var34;
466   }
467
468 }
469
470 void
471 deinterlace_line_linear (guint8 * ORC_RESTRICT d1,
472     const guint8 * ORC_RESTRICT s1, const guint8 * ORC_RESTRICT s2, int n)
473 {
474   OrcExecutor _ex, *ex = &_ex;
475   static volatile int p_inited = 0;
476   static OrcCode *c = 0;
477   void (*func) (OrcExecutor *);
478
479   if (!p_inited) {
480     orc_once_mutex_lock ();
481     if (!p_inited) {
482       OrcProgram *p;
483
484       p = orc_program_new ();
485       orc_program_set_name (p, "deinterlace_line_linear");
486       orc_program_set_backup_function (p, _backup_deinterlace_line_linear);
487       orc_program_add_destination (p, 1, "d1");
488       orc_program_add_source (p, 1, "s1");
489       orc_program_add_source (p, 1, "s2");
490
491       orc_program_append_2 (p, "avgub", 0, ORC_VAR_D1, ORC_VAR_S1, ORC_VAR_S2,
492           ORC_VAR_D1);
493
494       orc_program_compile (p);
495       c = orc_program_take_code (p);
496       orc_program_free (p);
497     }
498     p_inited = TRUE;
499     orc_once_mutex_unlock ();
500   }
501   ex->arrays[ORC_VAR_A2] = c;
502   ex->program = 0;
503
504   ex->n = n;
505   ex->arrays[ORC_VAR_D1] = d1;
506   ex->arrays[ORC_VAR_S1] = (void *) s1;
507   ex->arrays[ORC_VAR_S2] = (void *) s2;
508
509   func = c->exec;
510   func (ex);
511 }
512 #endif
513
514
515 /* deinterlace_line_linear_blend */
516 #ifdef DISABLE_ORC
517 void
518 deinterlace_line_linear_blend (guint8 * ORC_RESTRICT d1,
519     const guint8 * ORC_RESTRICT s1, const guint8 * ORC_RESTRICT s2,
520     const guint8 * ORC_RESTRICT s3, int n)
521 {
522   int i;
523   orc_int8 *ORC_RESTRICT ptr0;
524   const orc_int8 *ORC_RESTRICT ptr4;
525   const orc_int8 *ORC_RESTRICT ptr5;
526   const orc_int8 *ORC_RESTRICT ptr6;
527   orc_int8 var35;
528   orc_int8 var36;
529   orc_int8 var37;
530   orc_union16 var38;
531   orc_int8 var39;
532   orc_union16 var40;
533   orc_union16 var41;
534   orc_union16 var42;
535   orc_union16 var43;
536   orc_union16 var44;
537   orc_union16 var45;
538   orc_union16 var46;
539   orc_union16 var47;
540
541   ptr0 = (orc_int8 *) d1;
542   ptr4 = (orc_int8 *) s1;
543   ptr5 = (orc_int8 *) s2;
544   ptr6 = (orc_int8 *) s3;
545
546   /* 9: loadpw */
547   var38.i = (int) 0x00000002;   /* 2 or 9.88131e-324f */
548
549   for (i = 0; i < n; i++) {
550     /* 0: loadb */
551     var35 = ptr4[i];
552     /* 1: convubw */
553     var40.i = (orc_uint8) var35;
554     /* 2: loadb */
555     var36 = ptr5[i];
556     /* 3: convubw */
557     var41.i = (orc_uint8) var36;
558     /* 4: loadb */
559     var37 = ptr6[i];
560     /* 5: convubw */
561     var42.i = (orc_uint8) var37;
562     /* 6: addw */
563     var43.i = var40.i + var41.i;
564     /* 7: addw */
565     var44.i = var42.i + var42.i;
566     /* 8: addw */
567     var45.i = var43.i + var44.i;
568     /* 10: addw */
569     var46.i = var45.i + var38.i;
570     /* 11: shrsw */
571     var47.i = var46.i >> 2;
572     /* 12: convsuswb */
573     var39 = ORC_CLAMP_UB (var47.i);
574     /* 13: storeb */
575     ptr0[i] = var39;
576   }
577
578 }
579
580 #else
581 static void
582 _backup_deinterlace_line_linear_blend (OrcExecutor * ORC_RESTRICT ex)
583 {
584   int i;
585   int n = ex->n;
586   orc_int8 *ORC_RESTRICT ptr0;
587   const orc_int8 *ORC_RESTRICT ptr4;
588   const orc_int8 *ORC_RESTRICT ptr5;
589   const orc_int8 *ORC_RESTRICT ptr6;
590   orc_int8 var35;
591   orc_int8 var36;
592   orc_int8 var37;
593   orc_union16 var38;
594   orc_int8 var39;
595   orc_union16 var40;
596   orc_union16 var41;
597   orc_union16 var42;
598   orc_union16 var43;
599   orc_union16 var44;
600   orc_union16 var45;
601   orc_union16 var46;
602   orc_union16 var47;
603
604   ptr0 = (orc_int8 *) ex->arrays[0];
605   ptr4 = (orc_int8 *) ex->arrays[4];
606   ptr5 = (orc_int8 *) ex->arrays[5];
607   ptr6 = (orc_int8 *) ex->arrays[6];
608
609   /* 9: loadpw */
610   var38.i = (int) 0x00000002;   /* 2 or 9.88131e-324f */
611
612   for (i = 0; i < n; i++) {
613     /* 0: loadb */
614     var35 = ptr4[i];
615     /* 1: convubw */
616     var40.i = (orc_uint8) var35;
617     /* 2: loadb */
618     var36 = ptr5[i];
619     /* 3: convubw */
620     var41.i = (orc_uint8) var36;
621     /* 4: loadb */
622     var37 = ptr6[i];
623     /* 5: convubw */
624     var42.i = (orc_uint8) var37;
625     /* 6: addw */
626     var43.i = var40.i + var41.i;
627     /* 7: addw */
628     var44.i = var42.i + var42.i;
629     /* 8: addw */
630     var45.i = var43.i + var44.i;
631     /* 10: addw */
632     var46.i = var45.i + var38.i;
633     /* 11: shrsw */
634     var47.i = var46.i >> 2;
635     /* 12: convsuswb */
636     var39 = ORC_CLAMP_UB (var47.i);
637     /* 13: storeb */
638     ptr0[i] = var39;
639   }
640
641 }
642
643 void
644 deinterlace_line_linear_blend (guint8 * ORC_RESTRICT d1,
645     const guint8 * ORC_RESTRICT s1, const guint8 * ORC_RESTRICT s2,
646     const guint8 * ORC_RESTRICT s3, int n)
647 {
648   OrcExecutor _ex, *ex = &_ex;
649   static volatile int p_inited = 0;
650   static OrcCode *c = 0;
651   void (*func) (OrcExecutor *);
652
653   if (!p_inited) {
654     orc_once_mutex_lock ();
655     if (!p_inited) {
656       OrcProgram *p;
657
658       p = orc_program_new ();
659       orc_program_set_name (p, "deinterlace_line_linear_blend");
660       orc_program_set_backup_function (p,
661           _backup_deinterlace_line_linear_blend);
662       orc_program_add_destination (p, 1, "d1");
663       orc_program_add_source (p, 1, "s1");
664       orc_program_add_source (p, 1, "s2");
665       orc_program_add_source (p, 1, "s3");
666       orc_program_add_constant (p, 4, 0x00000002, "c1");
667       orc_program_add_temporary (p, 2, "t1");
668       orc_program_add_temporary (p, 2, "t2");
669       orc_program_add_temporary (p, 2, "t3");
670
671       orc_program_append_2 (p, "convubw", 0, ORC_VAR_T1, ORC_VAR_S1, ORC_VAR_D1,
672           ORC_VAR_D1);
673       orc_program_append_2 (p, "convubw", 0, ORC_VAR_T2, ORC_VAR_S2, ORC_VAR_D1,
674           ORC_VAR_D1);
675       orc_program_append_2 (p, "convubw", 0, ORC_VAR_T3, ORC_VAR_S3, ORC_VAR_D1,
676           ORC_VAR_D1);
677       orc_program_append_2 (p, "addw", 0, ORC_VAR_T1, ORC_VAR_T1, ORC_VAR_T2,
678           ORC_VAR_D1);
679       orc_program_append_2 (p, "addw", 0, ORC_VAR_T3, ORC_VAR_T3, ORC_VAR_T3,
680           ORC_VAR_D1);
681       orc_program_append_2 (p, "addw", 0, ORC_VAR_T1, ORC_VAR_T1, ORC_VAR_T3,
682           ORC_VAR_D1);
683       orc_program_append_2 (p, "addw", 0, ORC_VAR_T1, ORC_VAR_T1, ORC_VAR_C1,
684           ORC_VAR_D1);
685       orc_program_append_2 (p, "shrsw", 0, ORC_VAR_T1, ORC_VAR_T1, ORC_VAR_C1,
686           ORC_VAR_D1);
687       orc_program_append_2 (p, "convsuswb", 0, ORC_VAR_D1, ORC_VAR_T1,
688           ORC_VAR_D1, ORC_VAR_D1);
689
690       orc_program_compile (p);
691       c = orc_program_take_code (p);
692       orc_program_free (p);
693     }
694     p_inited = TRUE;
695     orc_once_mutex_unlock ();
696   }
697   ex->arrays[ORC_VAR_A2] = c;
698   ex->program = 0;
699
700   ex->n = n;
701   ex->arrays[ORC_VAR_D1] = d1;
702   ex->arrays[ORC_VAR_S1] = (void *) s1;
703   ex->arrays[ORC_VAR_S2] = (void *) s2;
704   ex->arrays[ORC_VAR_S3] = (void *) s3;
705
706   func = c->exec;
707   func (ex);
708 }
709 #endif
710
711
712 /* deinterlace_line_greedy */
713 #ifdef DISABLE_ORC
714 void
715 deinterlace_line_greedy (orc_uint8 * ORC_RESTRICT d1,
716     const orc_uint8 * ORC_RESTRICT s1, const orc_uint8 * ORC_RESTRICT s2,
717     const orc_uint8 * ORC_RESTRICT s3, const orc_uint8 * ORC_RESTRICT s4,
718     int p1, int n)
719 {
720   int i;
721   orc_int8 *ORC_RESTRICT ptr0;
722   const orc_int8 *ORC_RESTRICT ptr4;
723   const orc_int8 *ORC_RESTRICT ptr5;
724   const orc_int8 *ORC_RESTRICT ptr6;
725   const orc_int8 *ORC_RESTRICT ptr7;
726   orc_int8 var44;
727   orc_int8 var45;
728   orc_int8 var46;
729   orc_int8 var47;
730   orc_int8 var48;
731   orc_int8 var49;
732   orc_int8 var50;
733   orc_int8 var51;
734   orc_int8 var52;
735   orc_int8 var53;
736   orc_int8 var54;
737   orc_int8 var55;
738   orc_int8 var56;
739   orc_int8 var57;
740   orc_int8 var58;
741   orc_int8 var59;
742   orc_int8 var60;
743   orc_int8 var61;
744   orc_int8 var62;
745   orc_int8 var63;
746   orc_int8 var64;
747   orc_int8 var65;
748   orc_int8 var66;
749   orc_int8 var67;
750   orc_int8 var68;
751   orc_int8 var69;
752   orc_int8 var70;
753
754   ptr0 = (orc_int8 *) d1;
755   ptr4 = (orc_int8 *) s1;
756   ptr5 = (orc_int8 *) s2;
757   ptr6 = (orc_int8 *) s3;
758   ptr7 = (orc_int8 *) s4;
759
760   /* 11: loadpb */
761   var44 = (int) 0x00000080;     /* 128 or 6.32404e-322f */
762   /* 13: loadpb */
763   var45 = (int) 0x00000080;     /* 128 or 6.32404e-322f */
764   /* 21: loadpb */
765   var46 = p1;
766   /* 23: loadpb */
767   var47 = p1;
768
769   for (i = 0; i < n; i++) {
770     /* 0: loadb */
771     var49 = ptr4[i];
772     /* 1: loadb */
773     var50 = ptr7[i];
774     /* 2: loadb */
775     var51 = ptr6[i];
776     /* 3: loadb */
777     var52 = ptr5[i];
778     /* 4: avgub */
779     var53 = ((orc_uint8) var52 + (orc_uint8) var51 + 1) >> 1;
780     /* 5: maxub */
781     var54 = ORC_MAX ((orc_uint8) var49, (orc_uint8) var53);
782     /* 6: minub */
783     var55 = ORC_MIN ((orc_uint8) var49, (orc_uint8) var53);
784     /* 7: subb */
785     var56 = var54 - var55;
786     /* 8: maxub */
787     var57 = ORC_MAX ((orc_uint8) var50, (orc_uint8) var53);
788     /* 9: minub */
789     var58 = ORC_MIN ((orc_uint8) var50, (orc_uint8) var53);
790     /* 10: subb */
791     var59 = var57 - var58;
792     /* 12: xorb */
793     var60 = var56 ^ var44;
794     /* 14: xorb */
795     var61 = var59 ^ var45;
796     /* 15: cmpgtsb */
797     var62 = (var60 > var61) ? (~0) : 0;
798     /* 16: andb */
799     var63 = var50 & var62;
800     /* 17: andnb */
801     var64 = (~var62) & var49;
802     /* 18: orb */
803     var65 = var63 | var64;
804     /* 19: maxub */
805     var66 = ORC_MAX ((orc_uint8) var52, (orc_uint8) var51);
806     /* 20: minub */
807     var67 = ORC_MIN ((orc_uint8) var52, (orc_uint8) var51);
808     /* 22: addusb */
809     var68 = ORC_CLAMP_UB ((orc_uint8) var66 + (orc_uint8) var46);
810     /* 24: subusb */
811     var69 = ORC_CLAMP_UB ((orc_uint8) var67 - (orc_uint8) var47);
812     /* 25: minub */
813     var70 = ORC_MIN ((orc_uint8) var65, (orc_uint8) var68);
814     /* 26: maxub */
815     var48 = ORC_MAX ((orc_uint8) var70, (orc_uint8) var69);
816     /* 27: storeb */
817     ptr0[i] = var48;
818   }
819
820 }
821
822 #else
823 static void
824 _backup_deinterlace_line_greedy (OrcExecutor * ORC_RESTRICT ex)
825 {
826   int i;
827   int n = ex->n;
828   orc_int8 *ORC_RESTRICT ptr0;
829   const orc_int8 *ORC_RESTRICT ptr4;
830   const orc_int8 *ORC_RESTRICT ptr5;
831   const orc_int8 *ORC_RESTRICT ptr6;
832   const orc_int8 *ORC_RESTRICT ptr7;
833   orc_int8 var44;
834   orc_int8 var45;
835   orc_int8 var46;
836   orc_int8 var47;
837   orc_int8 var48;
838   orc_int8 var49;
839   orc_int8 var50;
840   orc_int8 var51;
841   orc_int8 var52;
842   orc_int8 var53;
843   orc_int8 var54;
844   orc_int8 var55;
845   orc_int8 var56;
846   orc_int8 var57;
847   orc_int8 var58;
848   orc_int8 var59;
849   orc_int8 var60;
850   orc_int8 var61;
851   orc_int8 var62;
852   orc_int8 var63;
853   orc_int8 var64;
854   orc_int8 var65;
855   orc_int8 var66;
856   orc_int8 var67;
857   orc_int8 var68;
858   orc_int8 var69;
859   orc_int8 var70;
860
861   ptr0 = (orc_int8 *) ex->arrays[0];
862   ptr4 = (orc_int8 *) ex->arrays[4];
863   ptr5 = (orc_int8 *) ex->arrays[5];
864   ptr6 = (orc_int8 *) ex->arrays[6];
865   ptr7 = (orc_int8 *) ex->arrays[7];
866
867   /* 11: loadpb */
868   var44 = (int) 0x00000080;     /* 128 or 6.32404e-322f */
869   /* 13: loadpb */
870   var45 = (int) 0x00000080;     /* 128 or 6.32404e-322f */
871   /* 21: loadpb */
872   var46 = ex->params[24];
873   /* 23: loadpb */
874   var47 = ex->params[24];
875
876   for (i = 0; i < n; i++) {
877     /* 0: loadb */
878     var49 = ptr4[i];
879     /* 1: loadb */
880     var50 = ptr7[i];
881     /* 2: loadb */
882     var51 = ptr6[i];
883     /* 3: loadb */
884     var52 = ptr5[i];
885     /* 4: avgub */
886     var53 = ((orc_uint8) var52 + (orc_uint8) var51 + 1) >> 1;
887     /* 5: maxub */
888     var54 = ORC_MAX ((orc_uint8) var49, (orc_uint8) var53);
889     /* 6: minub */
890     var55 = ORC_MIN ((orc_uint8) var49, (orc_uint8) var53);
891     /* 7: subb */
892     var56 = var54 - var55;
893     /* 8: maxub */
894     var57 = ORC_MAX ((orc_uint8) var50, (orc_uint8) var53);
895     /* 9: minub */
896     var58 = ORC_MIN ((orc_uint8) var50, (orc_uint8) var53);
897     /* 10: subb */
898     var59 = var57 - var58;
899     /* 12: xorb */
900     var60 = var56 ^ var44;
901     /* 14: xorb */
902     var61 = var59 ^ var45;
903     /* 15: cmpgtsb */
904     var62 = (var60 > var61) ? (~0) : 0;
905     /* 16: andb */
906     var63 = var50 & var62;
907     /* 17: andnb */
908     var64 = (~var62) & var49;
909     /* 18: orb */
910     var65 = var63 | var64;
911     /* 19: maxub */
912     var66 = ORC_MAX ((orc_uint8) var52, (orc_uint8) var51);
913     /* 20: minub */
914     var67 = ORC_MIN ((orc_uint8) var52, (orc_uint8) var51);
915     /* 22: addusb */
916     var68 = ORC_CLAMP_UB ((orc_uint8) var66 + (orc_uint8) var46);
917     /* 24: subusb */
918     var69 = ORC_CLAMP_UB ((orc_uint8) var67 - (orc_uint8) var47);
919     /* 25: minub */
920     var70 = ORC_MIN ((orc_uint8) var65, (orc_uint8) var68);
921     /* 26: maxub */
922     var48 = ORC_MAX ((orc_uint8) var70, (orc_uint8) var69);
923     /* 27: storeb */
924     ptr0[i] = var48;
925   }
926
927 }
928
929 void
930 deinterlace_line_greedy (orc_uint8 * ORC_RESTRICT d1,
931     const orc_uint8 * ORC_RESTRICT s1, const orc_uint8 * ORC_RESTRICT s2,
932     const orc_uint8 * ORC_RESTRICT s3, const orc_uint8 * ORC_RESTRICT s4,
933     int p1, int n)
934 {
935   OrcExecutor _ex, *ex = &_ex;
936   static volatile int p_inited = 0;
937   static OrcCode *c = 0;
938   void (*func) (OrcExecutor *);
939
940   if (!p_inited) {
941     orc_once_mutex_lock ();
942     if (!p_inited) {
943       OrcProgram *p;
944
945       p = orc_program_new ();
946       orc_program_set_name (p, "deinterlace_line_greedy");
947       orc_program_set_backup_function (p, _backup_deinterlace_line_greedy);
948       orc_program_add_destination (p, 1, "d1");
949       orc_program_add_source (p, 1, "s1");
950       orc_program_add_source (p, 1, "s2");
951       orc_program_add_source (p, 1, "s3");
952       orc_program_add_source (p, 1, "s4");
953       orc_program_add_constant (p, 4, 0x00000080, "c1");
954       orc_program_add_parameter (p, 1, "p1");
955       orc_program_add_temporary (p, 1, "t1");
956       orc_program_add_temporary (p, 1, "t2");
957       orc_program_add_temporary (p, 1, "t3");
958       orc_program_add_temporary (p, 1, "t4");
959       orc_program_add_temporary (p, 1, "t5");
960       orc_program_add_temporary (p, 1, "t6");
961       orc_program_add_temporary (p, 1, "t7");
962       orc_program_add_temporary (p, 1, "t8");
963       orc_program_add_temporary (p, 1, "t9");
964       orc_program_add_temporary (p, 1, "t10");
965       orc_program_add_temporary (p, 1, "t11");
966       orc_program_add_temporary (p, 1, "t12");
967
968       orc_program_append_2 (p, "loadb", 0, ORC_VAR_T1, ORC_VAR_S1, ORC_VAR_D1,
969           ORC_VAR_D1);
970       orc_program_append_2 (p, "loadb", 0, ORC_VAR_T2, ORC_VAR_S4, ORC_VAR_D1,
971           ORC_VAR_D1);
972       orc_program_append_2 (p, "loadb", 0, ORC_VAR_T3, ORC_VAR_S3, ORC_VAR_D1,
973           ORC_VAR_D1);
974       orc_program_append_2 (p, "loadb", 0, ORC_VAR_T4, ORC_VAR_S2, ORC_VAR_D1,
975           ORC_VAR_D1);
976       orc_program_append_2 (p, "avgub", 0, ORC_VAR_T5, ORC_VAR_T4, ORC_VAR_T3,
977           ORC_VAR_D1);
978       orc_program_append_2 (p, "maxub", 0, ORC_VAR_T8, ORC_VAR_T1, ORC_VAR_T5,
979           ORC_VAR_D1);
980       orc_program_append_2 (p, "minub", 0, ORC_VAR_T9, ORC_VAR_T1, ORC_VAR_T5,
981           ORC_VAR_D1);
982       orc_program_append_2 (p, "subb", 0, ORC_VAR_T6, ORC_VAR_T8, ORC_VAR_T9,
983           ORC_VAR_D1);
984       orc_program_append_2 (p, "maxub", 0, ORC_VAR_T8, ORC_VAR_T2, ORC_VAR_T5,
985           ORC_VAR_D1);
986       orc_program_append_2 (p, "minub", 0, ORC_VAR_T9, ORC_VAR_T2, ORC_VAR_T5,
987           ORC_VAR_D1);
988       orc_program_append_2 (p, "subb", 0, ORC_VAR_T7, ORC_VAR_T8, ORC_VAR_T9,
989           ORC_VAR_D1);
990       orc_program_append_2 (p, "xorb", 0, ORC_VAR_T6, ORC_VAR_T6, ORC_VAR_C1,
991           ORC_VAR_D1);
992       orc_program_append_2 (p, "xorb", 0, ORC_VAR_T7, ORC_VAR_T7, ORC_VAR_C1,
993           ORC_VAR_D1);
994       orc_program_append_2 (p, "cmpgtsb", 0, ORC_VAR_T9, ORC_VAR_T6, ORC_VAR_T7,
995           ORC_VAR_D1);
996       orc_program_append_2 (p, "andb", 0, ORC_VAR_T8, ORC_VAR_T2, ORC_VAR_T9,
997           ORC_VAR_D1);
998       orc_program_append_2 (p, "andnb", 0, ORC_VAR_T9, ORC_VAR_T9, ORC_VAR_T1,
999           ORC_VAR_D1);
1000       orc_program_append_2 (p, "orb", 0, ORC_VAR_T10, ORC_VAR_T8, ORC_VAR_T9,
1001           ORC_VAR_D1);
1002       orc_program_append_2 (p, "maxub", 0, ORC_VAR_T12, ORC_VAR_T4, ORC_VAR_T3,
1003           ORC_VAR_D1);
1004       orc_program_append_2 (p, "minub", 0, ORC_VAR_T11, ORC_VAR_T4, ORC_VAR_T3,
1005           ORC_VAR_D1);
1006       orc_program_append_2 (p, "addusb", 0, ORC_VAR_T12, ORC_VAR_T12,
1007           ORC_VAR_P1, ORC_VAR_D1);
1008       orc_program_append_2 (p, "subusb", 0, ORC_VAR_T11, ORC_VAR_T11,
1009           ORC_VAR_P1, ORC_VAR_D1);
1010       orc_program_append_2 (p, "minub", 0, ORC_VAR_T10, ORC_VAR_T10,
1011           ORC_VAR_T12, ORC_VAR_D1);
1012       orc_program_append_2 (p, "maxub", 0, ORC_VAR_D1, ORC_VAR_T10, ORC_VAR_T11,
1013           ORC_VAR_D1);
1014
1015       orc_program_compile (p);
1016       c = orc_program_take_code (p);
1017       orc_program_free (p);
1018     }
1019     p_inited = TRUE;
1020     orc_once_mutex_unlock ();
1021   }
1022   ex->arrays[ORC_VAR_A2] = c;
1023   ex->program = 0;
1024
1025   ex->n = n;
1026   ex->arrays[ORC_VAR_D1] = d1;
1027   ex->arrays[ORC_VAR_S1] = (void *) s1;
1028   ex->arrays[ORC_VAR_S2] = (void *) s2;
1029   ex->arrays[ORC_VAR_S3] = (void *) s3;
1030   ex->arrays[ORC_VAR_S4] = (void *) s4;
1031   ex->params[ORC_VAR_P1] = p1;
1032
1033   func = c->exec;
1034   func (ex);
1035 }
1036 #endif