videoscale: refactor using more Orc code
authorDavid Schleef <ds@schleef.org>
Mon, 14 Jun 2010 22:42:09 +0000 (15:42 -0700)
committerDavid Schleef <ds@schleef.org>
Tue, 14 Sep 2010 19:33:21 +0000 (12:33 -0700)
Convert downsampling to Orc.  Convert horizontal linear scaling
to Orc.  Combine horizontal and vertical scaling into one pass.

gst/videoscale/gstvideoscaleorc-dist.c
gst/videoscale/gstvideoscaleorc-dist.h
gst/videoscale/gstvideoscaleorc.orc
gst/videoscale/vs_image.c
gst/videoscale/vs_scanline.c

index 1ff1dbe..f5b4d08 100644 (file)
@@ -68,11 +68,28 @@ typedef union
 #endif
 
 void orc_merge_linear_u8 (orc_uint8 * d1, const orc_uint8 * s1,
-    const orc_uint8 * s2, int p1, int p2, int n);
+    const orc_uint8 * s2, int p1, int n);
 void orc_merge_linear_u16 (orc_uint16 * d1, const orc_uint16 * s1,
     const orc_uint16 * s2, int p1, int p2, int n);
 void orc_splat_u16 (orc_uint16 * d1, int p1, int n);
 void orc_splat_u32 (orc_uint32 * d1, int p1, int n);
+void orc_downsample_u8 (guint8 * d1, const guint8 * s1, int n);
+void orc_downsample_u16 (guint16 * d1, const guint16 * s1, int n);
+void gst_videoscale_orc_downsample_u32 (guint8 * d1, const guint8 * s1, int n);
+void gst_videoscale_orc_downsample_yuyv (guint8 * d1, const guint8 * s1, int n);
+void gst_videoscale_orc_resample_nearest_u8 (guint8 * d1, const guint8 * s1,
+    int p1, int p2, int n);
+void gst_videoscale_orc_resample_bilinear_u8 (guint8 * d1, const guint8 * s1,
+    int p1, int p2, int n);
+void gst_videoscale_orc_resample_nearest_u32 (guint8 * d1, const guint8 * s1,
+    int p1, int p2, int n);
+void gst_videoscale_orc_resample_bilinear_u32 (guint8 * d1, const guint8 * s1,
+    int p1, int p2, int n);
+void gst_videoscale_orc_resample_merge_bilinear_u32 (guint8 * d1, guint8 * d2,
+    const guint8 * s1, const guint8 * s2, int p1, int p2, int p3, int n);
+void gst_videoscale_orc_merge_bicubic_u8 (guint8 * d1, const guint8 * s1,
+    const guint8 * s2, const guint8 * s3, const guint8 * s4, int p1, int p2,
+    int p3, int p4, int n);
 
 void gst_videoscale_orc_init (void);
 
@@ -123,54 +140,57 @@ void gst_videoscale_orc_init (void);
 #ifdef DISABLE_ORC
 void
 orc_merge_linear_u8 (orc_uint8 * d1, const orc_uint8 * s1, const orc_uint8 * s2,
-    int p1, int p2, int n)
+    int p1, int n)
 {
   int i;
   orc_int8 *ORC_RESTRICT ptr0;
   const orc_int8 *ORC_RESTRICT ptr4;
   const orc_int8 *ORC_RESTRICT ptr5;
-  orc_int8 var34;
-  orc_int8 var35;
   orc_int8 var36;
   orc_int8 var37;
   orc_union16 var38;
-  orc_int8 var39;
-  orc_union16 var40;
-  orc_union16 var41;
+  orc_union16 var39;
+  orc_int8 var40;
+  orc_int8 var41;
   orc_union16 var42;
   orc_union16 var43;
   orc_union16 var44;
+  orc_union16 var45;
+  orc_union16 var46;
+  orc_int8 var47;
 
   ptr0 = (orc_int8 *) d1;
   ptr4 = (orc_int8 *) s1;
   ptr5 = (orc_int8 *) s2;
 
-  /* 1: loadpb */
-  var35 = p1;
-  /* 4: loadpb */
-  var37 = p2;
-  /* 7: loadpw */
-  var38.i = 0x00000080;         /* 128 or 6.32404e-322f */
+  /* 6: loadpw */
+  var38.i = p1;
+  /* 8: loadpw */
+  var39.i = 0x00000080;         /* 128 or 6.32404e-322f */
 
   for (i = 0; i < n; i++) {
     /* 0: loadb */
-    var34 = ptr4[i];
-    /* 2: mulubw */
-    var40.i = (orc_uint8) var34 *(orc_uint8) var35;
+    var41 = ptr4[i];
+    /* 1: loadb */
+    var36 = ptr4[i];
+    /* 2: convubw */
+    var42.i = (orc_uint8) var36;
     /* 3: loadb */
-    var36 = ptr5[i];
-    /* 5: mulubw */
-    var41.i = (orc_uint8) var36 *(orc_uint8) var37;
-    /* 6: addw */
-    var42.i = var40.i + var41.i;
-    /* 8: addw */
-    var43.i = var42.i + var38.i;
-    /* 9: shruw */
-    var44.i = ((orc_uint16) var43.i) >> 8;
-    /* 10: convwb */
-    var39 = var44.i;
-    /* 11: storeb */
-    ptr0[i] = var39;
+    var37 = ptr5[i];
+    /* 4: convubw */
+    var43.i = (orc_uint8) var37;
+    /* 5: subw */
+    var44.i = var43.i - var42.i;
+    /* 7: mullw */
+    var45.i = (var44.i * var38.i) & 0xffff;
+    /* 9: addw */
+    var46.i = var45.i + var39.i;
+    /* 10: convhwb */
+    var47 = ((orc_uint16) var46.i) >> 8;
+    /* 11: addb */
+    var40 = var47 + var41;
+    /* 12: storeb */
+    ptr0[i] = var40;
   }
 
 }
@@ -184,48 +204,51 @@ _backup_orc_merge_linear_u8 (OrcExecutor * ORC_RESTRICT ex)
   orc_int8 *ORC_RESTRICT ptr0;
   const orc_int8 *ORC_RESTRICT ptr4;
   const orc_int8 *ORC_RESTRICT ptr5;
-  orc_int8 var34;
-  orc_int8 var35;
   orc_int8 var36;
   orc_int8 var37;
   orc_union16 var38;
-  orc_int8 var39;
-  orc_union16 var40;
-  orc_union16 var41;
+  orc_union16 var39;
+  orc_int8 var40;
+  orc_int8 var41;
   orc_union16 var42;
   orc_union16 var43;
   orc_union16 var44;
+  orc_union16 var45;
+  orc_union16 var46;
+  orc_int8 var47;
 
   ptr0 = (orc_int8 *) ex->arrays[0];
   ptr4 = (orc_int8 *) ex->arrays[4];
   ptr5 = (orc_int8 *) ex->arrays[5];
 
-  /* 1: loadpb */
-  var35 = ex->params[24];
-  /* 4: loadpb */
-  var37 = ex->params[25];
-  /* 7: loadpw */
-  var38.i = 0x00000080;         /* 128 or 6.32404e-322f */
+  /* 6: loadpw */
+  var38.i = ex->params[24];
+  /* 8: loadpw */
+  var39.i = 0x00000080;         /* 128 or 6.32404e-322f */
 
   for (i = 0; i < n; i++) {
     /* 0: loadb */
-    var34 = ptr4[i];
-    /* 2: mulubw */
-    var40.i = (orc_uint8) var34 *(orc_uint8) var35;
+    var41 = ptr4[i];
+    /* 1: loadb */
+    var36 = ptr4[i];
+    /* 2: convubw */
+    var42.i = (orc_uint8) var36;
     /* 3: loadb */
-    var36 = ptr5[i];
-    /* 5: mulubw */
-    var41.i = (orc_uint8) var36 *(orc_uint8) var37;
-    /* 6: addw */
-    var42.i = var40.i + var41.i;
-    /* 8: addw */
-    var43.i = var42.i + var38.i;
-    /* 9: shruw */
-    var44.i = ((orc_uint16) var43.i) >> 8;
-    /* 10: convwb */
-    var39 = var44.i;
-    /* 11: storeb */
-    ptr0[i] = var39;
+    var37 = ptr5[i];
+    /* 4: convubw */
+    var43.i = (orc_uint8) var37;
+    /* 5: subw */
+    var44.i = var43.i - var42.i;
+    /* 7: mullw */
+    var45.i = (var44.i * var38.i) & 0xffff;
+    /* 9: addw */
+    var46.i = var45.i + var39.i;
+    /* 10: convhwb */
+    var47 = ((orc_uint16) var46.i) >> 8;
+    /* 11: addb */
+    var40 = var47 + var41;
+    /* 12: storeb */
+    ptr0[i] = var40;
   }
 
 }
@@ -233,7 +256,7 @@ _backup_orc_merge_linear_u8 (OrcExecutor * ORC_RESTRICT ex)
 static OrcProgram *_orc_program_orc_merge_linear_u8;
 void
 orc_merge_linear_u8 (orc_uint8 * d1, const orc_uint8 * s1, const orc_uint8 * s2,
-    int p1, int p2, int n)
+    int p1, int n)
 {
   OrcExecutor _ex, *ex = &_ex;
   OrcProgram *p = _orc_program_orc_merge_linear_u8;
@@ -246,7 +269,6 @@ orc_merge_linear_u8 (orc_uint8 * d1, const orc_uint8 * s1, const orc_uint8 * s2,
   ex->arrays[ORC_VAR_S1] = (void *) s1;
   ex->arrays[ORC_VAR_S2] = (void *) s2;
   ex->params[ORC_VAR_P1] = p1;
-  ex->params[ORC_VAR_P2] = p2;
 
   func = p->code_exec;
   func (ex);
@@ -513,112 +535,1516 @@ orc_splat_u32 (orc_uint32 * d1, int p1, int n)
 #endif
 
 
+/* orc_downsample_u8 */
+#ifdef DISABLE_ORC
 void
-gst_videoscale_orc_init (void)
+orc_downsample_u8 (guint8 * d1, const guint8 * s1, int n)
 {
-#ifndef DISABLE_ORC
-  {
-    /* orc_merge_linear_u8 */
-    OrcProgram *p;
-    OrcCompileResult result;
+  int i;
+  orc_int8 *ORC_RESTRICT ptr0;
+  const orc_union16 *ORC_RESTRICT ptr4;
+  orc_union16 var34;
+  orc_int8 var35;
+  orc_int8 var36;
+  orc_int8 var37;
 
-    p = orc_program_new ();
-    orc_program_set_name (p, "orc_merge_linear_u8");
-    orc_program_set_backup_function (p, _backup_orc_merge_linear_u8);
-    orc_program_add_destination (p, 1, "d1");
-    orc_program_add_source (p, 1, "s1");
-    orc_program_add_source (p, 1, "s2");
-    orc_program_add_constant (p, 4, 0x00000080, "c1");
-    orc_program_add_constant (p, 4, 0x00000008, "c2");
-    orc_program_add_parameter (p, 1, "p1");
-    orc_program_add_parameter (p, 1, "p2");
-    orc_program_add_temporary (p, 2, "t1");
-    orc_program_add_temporary (p, 2, "t2");
+  ptr0 = (orc_int8 *) d1;
+  ptr4 = (orc_union16 *) s1;
 
-    orc_program_append_2 (p, "mulubw", 0, ORC_VAR_T1, ORC_VAR_S1, ORC_VAR_P1,
-        ORC_VAR_D1);
-    orc_program_append_2 (p, "mulubw", 0, ORC_VAR_T2, ORC_VAR_S2, ORC_VAR_P2,
-        ORC_VAR_D1);
-    orc_program_append_2 (p, "addw", 0, ORC_VAR_T1, ORC_VAR_T1, ORC_VAR_T2,
-        ORC_VAR_D1);
-    orc_program_append_2 (p, "addw", 0, ORC_VAR_T1, ORC_VAR_T1, ORC_VAR_C1,
-        ORC_VAR_D1);
-    orc_program_append_2 (p, "shruw", 0, ORC_VAR_T1, ORC_VAR_T1, ORC_VAR_C2,
-        ORC_VAR_D1);
-    orc_program_append_2 (p, "convwb", 0, ORC_VAR_D1, ORC_VAR_T1, ORC_VAR_D1,
-        ORC_VAR_D1);
 
-    result = orc_program_compile (p);
+  for (i = 0; i < n; i++) {
+    /* 0: loadw */
+    var34 = ptr4[i];
+    /* 1: splitwb */
+    var36 = (var34.i >> 8) & 0xff;
+    var37 = var34.i & 0xff;
+    /* 2: avgub */
+    var35 = ((orc_uint8) var36 + (orc_uint8) var37 + 1) >> 1;
+    /* 3: storeb */
+    ptr0[i] = var35;
+  }
 
-    _orc_program_orc_merge_linear_u8 = p;
+}
+
+#else
+static void
+_backup_orc_downsample_u8 (OrcExecutor * ORC_RESTRICT ex)
+{
+  int i;
+  int n = ex->n;
+  orc_int8 *ORC_RESTRICT ptr0;
+  const orc_union16 *ORC_RESTRICT ptr4;
+  orc_union16 var34;
+  orc_int8 var35;
+  orc_int8 var36;
+  orc_int8 var37;
+
+  ptr0 = (orc_int8 *) ex->arrays[0];
+  ptr4 = (orc_union16 *) ex->arrays[4];
+
+
+  for (i = 0; i < n; i++) {
+    /* 0: loadw */
+    var34 = ptr4[i];
+    /* 1: splitwb */
+    var36 = (var34.i >> 8) & 0xff;
+    var37 = var34.i & 0xff;
+    /* 2: avgub */
+    var35 = ((orc_uint8) var36 + (orc_uint8) var37 + 1) >> 1;
+    /* 3: storeb */
+    ptr0[i] = var35;
   }
-  {
-    /* orc_merge_linear_u16 */
-    OrcProgram *p;
-    OrcCompileResult result;
 
-    p = orc_program_new ();
-    orc_program_set_name (p, "orc_merge_linear_u16");
-    orc_program_set_backup_function (p, _backup_orc_merge_linear_u16);
-    orc_program_add_destination (p, 2, "d1");
-    orc_program_add_source (p, 2, "s1");
-    orc_program_add_source (p, 2, "s2");
-    orc_program_add_constant (p, 4, 0x00000010, "c1");
-    orc_program_add_parameter (p, 2, "p1");
-    orc_program_add_parameter (p, 2, "p2");
-    orc_program_add_temporary (p, 4, "t1");
-    orc_program_add_temporary (p, 4, "t2");
+}
 
-    orc_program_append_2 (p, "muluwl", 0, ORC_VAR_T1, ORC_VAR_S1, ORC_VAR_P1,
-        ORC_VAR_D1);
-    orc_program_append_2 (p, "muluwl", 0, ORC_VAR_T2, ORC_VAR_S2, ORC_VAR_P2,
-        ORC_VAR_D1);
-    orc_program_append_2 (p, "addl", 0, ORC_VAR_T1, ORC_VAR_T1, ORC_VAR_T2,
-        ORC_VAR_D1);
-    orc_program_append_2 (p, "shrul", 0, ORC_VAR_T1, ORC_VAR_T1, ORC_VAR_C1,
-        ORC_VAR_D1);
-    orc_program_append_2 (p, "convlw", 0, ORC_VAR_D1, ORC_VAR_T1, ORC_VAR_D1,
-        ORC_VAR_D1);
+static OrcProgram *_orc_program_orc_downsample_u8;
+void
+orc_downsample_u8 (guint8 * d1, const guint8 * s1, int n)
+{
+  OrcExecutor _ex, *ex = &_ex;
+  OrcProgram *p = _orc_program_orc_downsample_u8;
+  void (*func) (OrcExecutor *);
 
-    result = orc_program_compile (p);
+  ex->program = p;
 
-    _orc_program_orc_merge_linear_u16 = p;
+  ex->n = n;
+  ex->arrays[ORC_VAR_D1] = d1;
+  ex->arrays[ORC_VAR_S1] = (void *) s1;
+
+  func = p->code_exec;
+  func (ex);
+}
+#endif
+
+
+/* orc_downsample_u16 */
+#ifdef DISABLE_ORC
+void
+orc_downsample_u16 (guint16 * d1, const guint16 * s1, int n)
+{
+  int i;
+  orc_union16 *ORC_RESTRICT ptr0;
+  const orc_union32 *ORC_RESTRICT ptr4;
+  orc_union32 var34;
+  orc_union16 var35;
+  orc_union16 var36;
+  orc_union16 var37;
+
+  ptr0 = (orc_union16 *) d1;
+  ptr4 = (orc_union32 *) s1;
+
+
+  for (i = 0; i < n; i++) {
+    /* 0: loadl */
+    var34 = ptr4[i];
+    /* 1: splitlw */
+    var36.i = (var34.i >> 16) & 0xffff;
+    var37.i = var34.i & 0xffff;
+    /* 2: avguw */
+    var35.i = ((orc_uint16) var36.i + (orc_uint16) var37.i + 1) >> 1;
+    /* 3: storew */
+    ptr0[i] = var35;
   }
-  {
-    /* orc_splat_u16 */
-    OrcProgram *p;
-    OrcCompileResult result;
 
-    p = orc_program_new ();
-    orc_program_set_name (p, "orc_splat_u16");
-    orc_program_set_backup_function (p, _backup_orc_splat_u16);
-    orc_program_add_destination (p, 2, "d1");
-    orc_program_add_parameter (p, 2, "p1");
+}
 
-    orc_program_append_2 (p, "copyw", 0, ORC_VAR_D1, ORC_VAR_P1, ORC_VAR_D1,
-        ORC_VAR_D1);
+#else
+static void
+_backup_orc_downsample_u16 (OrcExecutor * ORC_RESTRICT ex)
+{
+  int i;
+  int n = ex->n;
+  orc_union16 *ORC_RESTRICT ptr0;
+  const orc_union32 *ORC_RESTRICT ptr4;
+  orc_union32 var34;
+  orc_union16 var35;
+  orc_union16 var36;
+  orc_union16 var37;
 
-    result = orc_program_compile (p);
+  ptr0 = (orc_union16 *) ex->arrays[0];
+  ptr4 = (orc_union32 *) ex->arrays[4];
 
-    _orc_program_orc_splat_u16 = p;
+
+  for (i = 0; i < n; i++) {
+    /* 0: loadl */
+    var34 = ptr4[i];
+    /* 1: splitlw */
+    var36.i = (var34.i >> 16) & 0xffff;
+    var37.i = var34.i & 0xffff;
+    /* 2: avguw */
+    var35.i = ((orc_uint16) var36.i + (orc_uint16) var37.i + 1) >> 1;
+    /* 3: storew */
+    ptr0[i] = var35;
   }
-  {
-    /* orc_splat_u32 */
-    OrcProgram *p;
-    OrcCompileResult result;
 
-    p = orc_program_new ();
-    orc_program_set_name (p, "orc_splat_u32");
-    orc_program_set_backup_function (p, _backup_orc_splat_u32);
-    orc_program_add_destination (p, 4, "d1");
-    orc_program_add_parameter (p, 4, "p1");
+}
 
-    orc_program_append_2 (p, "copyl", 0, ORC_VAR_D1, ORC_VAR_P1, ORC_VAR_D1,
-        ORC_VAR_D1);
+static OrcProgram *_orc_program_orc_downsample_u16;
+void
+orc_downsample_u16 (guint16 * d1, const guint16 * s1, int n)
+{
+  OrcExecutor _ex, *ex = &_ex;
+  OrcProgram *p = _orc_program_orc_downsample_u16;
+  void (*func) (OrcExecutor *);
 
-    result = orc_program_compile (p);
+  ex->program = p;
 
-    _orc_program_orc_splat_u32 = p;
+  ex->n = n;
+  ex->arrays[ORC_VAR_D1] = d1;
+  ex->arrays[ORC_VAR_S1] = (void *) s1;
+
+  func = p->code_exec;
+  func (ex);
+}
+#endif
+
+
+/* gst_videoscale_orc_downsample_u32 */
+#ifdef DISABLE_ORC
+void
+gst_videoscale_orc_downsample_u32 (guint8 * d1, const guint8 * s1, int n)
+{
+  int i;
+  orc_union32 *ORC_RESTRICT ptr0;
+  const orc_union64 *ORC_RESTRICT ptr4;
+  orc_union64 var34;
+  orc_union32 var35;
+  orc_union32 var36;
+  orc_union32 var37;
+
+  ptr0 = (orc_union32 *) d1;
+  ptr4 = (orc_union64 *) s1;
+
+
+  for (i = 0; i < n; i++) {
+    /* 0: loadq */
+    var34 = ptr4[i];
+    /* 1: splitql */
+    var36.i = (var34.i >> 32) & 0xffffffff;
+    var37.i = var34.i & 0xffffffff;
+    /* 2: avgub */
+    var35.x4[0] = ((orc_uint8) var36.x4[0] + (orc_uint8) var37.x4[0] + 1) >> 1;
+    var35.x4[1] = ((orc_uint8) var36.x4[1] + (orc_uint8) var37.x4[1] + 1) >> 1;
+    var35.x4[2] = ((orc_uint8) var36.x4[2] + (orc_uint8) var37.x4[2] + 1) >> 1;
+    var35.x4[3] = ((orc_uint8) var36.x4[3] + (orc_uint8) var37.x4[3] + 1) >> 1;
+    /* 3: storel */
+    ptr0[i] = var35;
+  }
+
+}
+
+#else
+static void
+_backup_gst_videoscale_orc_downsample_u32 (OrcExecutor * ORC_RESTRICT ex)
+{
+  int i;
+  int n = ex->n;
+  orc_union32 *ORC_RESTRICT ptr0;
+  const orc_union64 *ORC_RESTRICT ptr4;
+  orc_union64 var34;
+  orc_union32 var35;
+  orc_union32 var36;
+  orc_union32 var37;
+
+  ptr0 = (orc_union32 *) ex->arrays[0];
+  ptr4 = (orc_union64 *) ex->arrays[4];
+
+
+  for (i = 0; i < n; i++) {
+    /* 0: loadq */
+    var34 = ptr4[i];
+    /* 1: splitql */
+    var36.i = (var34.i >> 32) & 0xffffffff;
+    var37.i = var34.i & 0xffffffff;
+    /* 2: avgub */
+    var35.x4[0] = ((orc_uint8) var36.x4[0] + (orc_uint8) var37.x4[0] + 1) >> 1;
+    var35.x4[1] = ((orc_uint8) var36.x4[1] + (orc_uint8) var37.x4[1] + 1) >> 1;
+    var35.x4[2] = ((orc_uint8) var36.x4[2] + (orc_uint8) var37.x4[2] + 1) >> 1;
+    var35.x4[3] = ((orc_uint8) var36.x4[3] + (orc_uint8) var37.x4[3] + 1) >> 1;
+    /* 3: storel */
+    ptr0[i] = var35;
+  }
+
+}
+
+static OrcProgram *_orc_program_gst_videoscale_orc_downsample_u32;
+void
+gst_videoscale_orc_downsample_u32 (guint8 * d1, const guint8 * s1, int n)
+{
+  OrcExecutor _ex, *ex = &_ex;
+  OrcProgram *p = _orc_program_gst_videoscale_orc_downsample_u32;
+  void (*func) (OrcExecutor *);
+
+  ex->program = p;
+
+  ex->n = n;
+  ex->arrays[ORC_VAR_D1] = d1;
+  ex->arrays[ORC_VAR_S1] = (void *) s1;
+
+  func = p->code_exec;
+  func (ex);
+}
+#endif
+
+
+/* gst_videoscale_orc_downsample_yuyv */
+#ifdef DISABLE_ORC
+void
+gst_videoscale_orc_downsample_yuyv (guint8 * d1, const guint8 * s1, int n)
+{
+  int i;
+  orc_union32 *ORC_RESTRICT ptr0;
+  const orc_union64 *ORC_RESTRICT ptr4;
+  orc_union64 var38;
+  orc_union32 var39;
+  orc_union32 var40;
+  orc_union32 var41;
+  orc_union16 var42;
+  orc_union16 var43;
+  orc_union16 var44;
+  orc_union16 var45;
+  orc_union16 var46;
+  orc_union16 var47;
+
+  ptr0 = (orc_union32 *) d1;
+  ptr4 = (orc_union64 *) s1;
+
+
+  for (i = 0; i < n; i++) {
+    /* 0: loadq */
+    var38 = ptr4[i];
+    /* 1: splitwb */
+    var40.x4[0] = (var38.x4[0] >> 8) & 0xff;
+    var41.x4[0] = var38.x4[0] & 0xff;
+    var40.x4[1] = (var38.x4[1] >> 8) & 0xff;
+    var41.x4[1] = var38.x4[1] & 0xff;
+    var40.x4[2] = (var38.x4[2] >> 8) & 0xff;
+    var41.x4[2] = var38.x4[2] & 0xff;
+    var40.x4[3] = (var38.x4[3] >> 8) & 0xff;
+    var41.x4[3] = var38.x4[3] & 0xff;
+    /* 2: splitwb */
+    var42.x2[0] = (var40.x2[0] >> 8) & 0xff;
+    var43.x2[0] = var40.x2[0] & 0xff;
+    var42.x2[1] = (var40.x2[1] >> 8) & 0xff;
+    var43.x2[1] = var40.x2[1] & 0xff;
+    /* 3: avgub */
+    var44.x2[0] = ((orc_uint8) var42.x2[0] + (orc_uint8) var43.x2[0] + 1) >> 1;
+    var44.x2[1] = ((orc_uint8) var42.x2[1] + (orc_uint8) var43.x2[1] + 1) >> 1;
+    /* 4: splitlw */
+    var45.i = (var41.i >> 16) & 0xffff;
+    var46.i = var41.i & 0xffff;
+    /* 5: avgub */
+    var47.x2[0] = ((orc_uint8) var45.x2[0] + (orc_uint8) var46.x2[0] + 1) >> 1;
+    var47.x2[1] = ((orc_uint8) var45.x2[1] + (orc_uint8) var46.x2[1] + 1) >> 1;
+    /* 6: mergebw */
+    var39.x2[0] = ((orc_uint8) var44.x2[0]) | ((orc_uint8) var47.x2[0] << 8);
+    var39.x2[1] = ((orc_uint8) var44.x2[1]) | ((orc_uint8) var47.x2[1] << 8);
+    /* 7: storel */
+    ptr0[i] = var39;
+  }
+
+}
+
+#else
+static void
+_backup_gst_videoscale_orc_downsample_yuyv (OrcExecutor * ORC_RESTRICT ex)
+{
+  int i;
+  int n = ex->n;
+  orc_union32 *ORC_RESTRICT ptr0;
+  const orc_union64 *ORC_RESTRICT ptr4;
+  orc_union64 var38;
+  orc_union32 var39;
+  orc_union32 var40;
+  orc_union32 var41;
+  orc_union16 var42;
+  orc_union16 var43;
+  orc_union16 var44;
+  orc_union16 var45;
+  orc_union16 var46;
+  orc_union16 var47;
+
+  ptr0 = (orc_union32 *) ex->arrays[0];
+  ptr4 = (orc_union64 *) ex->arrays[4];
+
+
+  for (i = 0; i < n; i++) {
+    /* 0: loadq */
+    var38 = ptr4[i];
+    /* 1: splitwb */
+    var40.x4[0] = (var38.x4[0] >> 8) & 0xff;
+    var41.x4[0] = var38.x4[0] & 0xff;
+    var40.x4[1] = (var38.x4[1] >> 8) & 0xff;
+    var41.x4[1] = var38.x4[1] & 0xff;
+    var40.x4[2] = (var38.x4[2] >> 8) & 0xff;
+    var41.x4[2] = var38.x4[2] & 0xff;
+    var40.x4[3] = (var38.x4[3] >> 8) & 0xff;
+    var41.x4[3] = var38.x4[3] & 0xff;
+    /* 2: splitwb */
+    var42.x2[0] = (var40.x2[0] >> 8) & 0xff;
+    var43.x2[0] = var40.x2[0] & 0xff;
+    var42.x2[1] = (var40.x2[1] >> 8) & 0xff;
+    var43.x2[1] = var40.x2[1] & 0xff;
+    /* 3: avgub */
+    var44.x2[0] = ((orc_uint8) var42.x2[0] + (orc_uint8) var43.x2[0] + 1) >> 1;
+    var44.x2[1] = ((orc_uint8) var42.x2[1] + (orc_uint8) var43.x2[1] + 1) >> 1;
+    /* 4: splitlw */
+    var45.i = (var41.i >> 16) & 0xffff;
+    var46.i = var41.i & 0xffff;
+    /* 5: avgub */
+    var47.x2[0] = ((orc_uint8) var45.x2[0] + (orc_uint8) var46.x2[0] + 1) >> 1;
+    var47.x2[1] = ((orc_uint8) var45.x2[1] + (orc_uint8) var46.x2[1] + 1) >> 1;
+    /* 6: mergebw */
+    var39.x2[0] = ((orc_uint8) var44.x2[0]) | ((orc_uint8) var47.x2[0] << 8);
+    var39.x2[1] = ((orc_uint8) var44.x2[1]) | ((orc_uint8) var47.x2[1] << 8);
+    /* 7: storel */
+    ptr0[i] = var39;
+  }
+
+}
+
+static OrcProgram *_orc_program_gst_videoscale_orc_downsample_yuyv;
+void
+gst_videoscale_orc_downsample_yuyv (guint8 * d1, const guint8 * s1, int n)
+{
+  OrcExecutor _ex, *ex = &_ex;
+  OrcProgram *p = _orc_program_gst_videoscale_orc_downsample_yuyv;
+  void (*func) (OrcExecutor *);
+
+  ex->program = p;
+
+  ex->n = n;
+  ex->arrays[ORC_VAR_D1] = d1;
+  ex->arrays[ORC_VAR_S1] = (void *) s1;
+
+  func = p->code_exec;
+  func (ex);
+}
+#endif
+
+
+/* gst_videoscale_orc_resample_nearest_u8 */
+#ifdef DISABLE_ORC
+void
+gst_videoscale_orc_resample_nearest_u8 (guint8 * d1, const guint8 * s1, int p1,
+    int p2, int n)
+{
+  int i;
+  orc_int8 *ORC_RESTRICT ptr0;
+  const orc_int8 *ORC_RESTRICT ptr4;
+  orc_int8 var32;
+
+  ptr0 = (orc_int8 *) d1;
+  ptr4 = (orc_int8 *) s1;
+
+
+  for (i = 0; i < n; i++) {
+    /* 0: ldresnearb */
+    var32 = ptr4[(p1 + i * p2) >> 16];
+    /* 1: storeb */
+    ptr0[i] = var32;
+  }
+
+}
+
+#else
+static void
+_backup_gst_videoscale_orc_resample_nearest_u8 (OrcExecutor * ORC_RESTRICT ex)
+{
+  int i;
+  int n = ex->n;
+  orc_int8 *ORC_RESTRICT ptr0;
+  const orc_int8 *ORC_RESTRICT ptr4;
+  orc_int8 var32;
+
+  ptr0 = (orc_int8 *) ex->arrays[0];
+  ptr4 = (orc_int8 *) ex->arrays[4];
+
+
+  for (i = 0; i < n; i++) {
+    /* 0: ldresnearb */
+    var32 = ptr4[(ex->params[24] + i * ex->params[25]) >> 16];
+    /* 1: storeb */
+    ptr0[i] = var32;
+  }
+
+}
+
+static OrcProgram *_orc_program_gst_videoscale_orc_resample_nearest_u8;
+void
+gst_videoscale_orc_resample_nearest_u8 (guint8 * d1, const guint8 * s1, int p1,
+    int p2, int n)
+{
+  OrcExecutor _ex, *ex = &_ex;
+  OrcProgram *p = _orc_program_gst_videoscale_orc_resample_nearest_u8;
+  void (*func) (OrcExecutor *);
+
+  ex->program = p;
+
+  ex->n = n;
+  ex->arrays[ORC_VAR_D1] = d1;
+  ex->arrays[ORC_VAR_S1] = (void *) s1;
+  ex->params[ORC_VAR_P1] = p1;
+  ex->params[ORC_VAR_P2] = p2;
+
+  func = p->code_exec;
+  func (ex);
+}
+#endif
+
+
+/* gst_videoscale_orc_resample_bilinear_u8 */
+#ifdef DISABLE_ORC
+void
+gst_videoscale_orc_resample_bilinear_u8 (guint8 * d1, const guint8 * s1, int p1,
+    int p2, int n)
+{
+  int i;
+  orc_int8 *ORC_RESTRICT ptr0;
+  const orc_int8 *ORC_RESTRICT ptr4;
+  orc_int8 var32;
+
+  ptr0 = (orc_int8 *) d1;
+  ptr4 = (orc_int8 *) s1;
+
+
+  for (i = 0; i < n; i++) {
+    /* 0: ldreslinb */
+    {
+      int tmp = p1 + i * p2;
+      var32 =
+          ((orc_uint8) ptr4[tmp >> 16] * (256 - ((tmp >> 8) & 0xff)) +
+          (orc_uint8) ptr4[(tmp >> 16) + 1] * ((tmp >> 8) & 0xff)) >> 8;
+    }
+    /* 1: storeb */
+    ptr0[i] = var32;
+  }
+
+}
+
+#else
+static void
+_backup_gst_videoscale_orc_resample_bilinear_u8 (OrcExecutor * ORC_RESTRICT ex)
+{
+  int i;
+  int n = ex->n;
+  orc_int8 *ORC_RESTRICT ptr0;
+  const orc_int8 *ORC_RESTRICT ptr4;
+  orc_int8 var32;
+
+  ptr0 = (orc_int8 *) ex->arrays[0];
+  ptr4 = (orc_int8 *) ex->arrays[4];
+
+
+  for (i = 0; i < n; i++) {
+    /* 0: ldreslinb */
+    {
+      int tmp = ex->params[24] + i * ex->params[25];
+      var32 =
+          ((orc_uint8) ptr4[tmp >> 16] * (256 - ((tmp >> 8) & 0xff)) +
+          (orc_uint8) ptr4[(tmp >> 16) + 1] * ((tmp >> 8) & 0xff)) >> 8;
+    }
+    /* 1: storeb */
+    ptr0[i] = var32;
+  }
+
+}
+
+static OrcProgram *_orc_program_gst_videoscale_orc_resample_bilinear_u8;
+void
+gst_videoscale_orc_resample_bilinear_u8 (guint8 * d1, const guint8 * s1, int p1,
+    int p2, int n)
+{
+  OrcExecutor _ex, *ex = &_ex;
+  OrcProgram *p = _orc_program_gst_videoscale_orc_resample_bilinear_u8;
+  void (*func) (OrcExecutor *);
+
+  ex->program = p;
+
+  ex->n = n;
+  ex->arrays[ORC_VAR_D1] = d1;
+  ex->arrays[ORC_VAR_S1] = (void *) s1;
+  ex->params[ORC_VAR_P1] = p1;
+  ex->params[ORC_VAR_P2] = p2;
+
+  func = p->code_exec;
+  func (ex);
+}
+#endif
+
+
+/* gst_videoscale_orc_resample_nearest_u32 */
+#ifdef DISABLE_ORC
+void
+gst_videoscale_orc_resample_nearest_u32 (guint8 * d1, const guint8 * s1, int p1,
+    int p2, int n)
+{
+  int i;
+  orc_union32 *ORC_RESTRICT ptr0;
+  const orc_union32 *ORC_RESTRICT ptr4;
+  orc_union32 var32;
+
+  ptr0 = (orc_union32 *) d1;
+  ptr4 = (orc_union32 *) s1;
+
+
+  for (i = 0; i < n; i++) {
+    /* 0: ldresnearl */
+    var32 = ptr4[(p1 + i * p2) >> 16];
+    /* 1: storel */
+    ptr0[i] = var32;
+  }
+
+}
+
+#else
+static void
+_backup_gst_videoscale_orc_resample_nearest_u32 (OrcExecutor * ORC_RESTRICT ex)
+{
+  int i;
+  int n = ex->n;
+  orc_union32 *ORC_RESTRICT ptr0;
+  const orc_union32 *ORC_RESTRICT ptr4;
+  orc_union32 var32;
+
+  ptr0 = (orc_union32 *) ex->arrays[0];
+  ptr4 = (orc_union32 *) ex->arrays[4];
+
+
+  for (i = 0; i < n; i++) {
+    /* 0: ldresnearl */
+    var32 = ptr4[(ex->params[24] + i * ex->params[25]) >> 16];
+    /* 1: storel */
+    ptr0[i] = var32;
+  }
+
+}
+
+static OrcProgram *_orc_program_gst_videoscale_orc_resample_nearest_u32;
+void
+gst_videoscale_orc_resample_nearest_u32 (guint8 * d1, const guint8 * s1, int p1,
+    int p2, int n)
+{
+  OrcExecutor _ex, *ex = &_ex;
+  OrcProgram *p = _orc_program_gst_videoscale_orc_resample_nearest_u32;
+  void (*func) (OrcExecutor *);
+
+  ex->program = p;
+
+  ex->n = n;
+  ex->arrays[ORC_VAR_D1] = d1;
+  ex->arrays[ORC_VAR_S1] = (void *) s1;
+  ex->params[ORC_VAR_P1] = p1;
+  ex->params[ORC_VAR_P2] = p2;
+
+  func = p->code_exec;
+  func (ex);
+}
+#endif
+
+
+/* gst_videoscale_orc_resample_bilinear_u32 */
+#ifdef DISABLE_ORC
+void
+gst_videoscale_orc_resample_bilinear_u32 (guint8 * d1, const guint8 * s1,
+    int p1, int p2, int n)
+{
+  int i;
+  orc_union32 *ORC_RESTRICT ptr0;
+  const orc_union32 *ORC_RESTRICT ptr4;
+  orc_union32 var32;
+
+  ptr0 = (orc_union32 *) d1;
+  ptr4 = (orc_union32 *) s1;
+
+
+  for (i = 0; i < n; i++) {
+    /* 0: ldreslinl */
+    {
+      int tmp = p1 + i * p2;
+      orc_union32 a = ptr4[tmp >> 16];
+      orc_union32 b = ptr4[(tmp >> 16) + 1];
+      var32.x4[0] =
+          ((orc_uint8) a.x4[0] * (256 - ((tmp >> 8) & 0xff)) +
+          (orc_uint8) b.x4[0] * ((tmp >> 8) & 0xff)) >> 8;
+      var32.x4[1] =
+          ((orc_uint8) a.x4[1] * (256 - ((tmp >> 8) & 0xff)) +
+          (orc_uint8) b.x4[1] * ((tmp >> 8) & 0xff)) >> 8;
+      var32.x4[2] =
+          ((orc_uint8) a.x4[2] * (256 - ((tmp >> 8) & 0xff)) +
+          (orc_uint8) b.x4[2] * ((tmp >> 8) & 0xff)) >> 8;
+      var32.x4[3] =
+          ((orc_uint8) a.x4[3] * (256 - ((tmp >> 8) & 0xff)) +
+          (orc_uint8) b.x4[3] * ((tmp >> 8) & 0xff)) >> 8;
+    }
+    /* 1: storel */
+    ptr0[i] = var32;
+  }
+
+}
+
+#else
+static void
+_backup_gst_videoscale_orc_resample_bilinear_u32 (OrcExecutor * ORC_RESTRICT ex)
+{
+  int i;
+  int n = ex->n;
+  orc_union32 *ORC_RESTRICT ptr0;
+  const orc_union32 *ORC_RESTRICT ptr4;
+  orc_union32 var32;
+
+  ptr0 = (orc_union32 *) ex->arrays[0];
+  ptr4 = (orc_union32 *) ex->arrays[4];
+
+
+  for (i = 0; i < n; i++) {
+    /* 0: ldreslinl */
+    {
+      int tmp = ex->params[24] + i * ex->params[25];
+      orc_union32 a = ptr4[tmp >> 16];
+      orc_union32 b = ptr4[(tmp >> 16) + 1];
+      var32.x4[0] =
+          ((orc_uint8) a.x4[0] * (256 - ((tmp >> 8) & 0xff)) +
+          (orc_uint8) b.x4[0] * ((tmp >> 8) & 0xff)) >> 8;
+      var32.x4[1] =
+          ((orc_uint8) a.x4[1] * (256 - ((tmp >> 8) & 0xff)) +
+          (orc_uint8) b.x4[1] * ((tmp >> 8) & 0xff)) >> 8;
+      var32.x4[2] =
+          ((orc_uint8) a.x4[2] * (256 - ((tmp >> 8) & 0xff)) +
+          (orc_uint8) b.x4[2] * ((tmp >> 8) & 0xff)) >> 8;
+      var32.x4[3] =
+          ((orc_uint8) a.x4[3] * (256 - ((tmp >> 8) & 0xff)) +
+          (orc_uint8) b.x4[3] * ((tmp >> 8) & 0xff)) >> 8;
+    }
+    /* 1: storel */
+    ptr0[i] = var32;
+  }
+
+}
+
+static OrcProgram *_orc_program_gst_videoscale_orc_resample_bilinear_u32;
+void
+gst_videoscale_orc_resample_bilinear_u32 (guint8 * d1, const guint8 * s1,
+    int p1, int p2, int n)
+{
+  OrcExecutor _ex, *ex = &_ex;
+  OrcProgram *p = _orc_program_gst_videoscale_orc_resample_bilinear_u32;
+  void (*func) (OrcExecutor *);
+
+  ex->program = p;
+
+  ex->n = n;
+  ex->arrays[ORC_VAR_D1] = d1;
+  ex->arrays[ORC_VAR_S1] = (void *) s1;
+  ex->params[ORC_VAR_P1] = p1;
+  ex->params[ORC_VAR_P2] = p2;
+
+  func = p->code_exec;
+  func (ex);
+}
+#endif
+
+
+/* gst_videoscale_orc_resample_merge_bilinear_u32 */
+#ifdef DISABLE_ORC
+void
+gst_videoscale_orc_resample_merge_bilinear_u32 (guint8 * d1, guint8 * d2,
+    const guint8 * s1, const guint8 * s2, int p1, int p2, int p3, int n)
+{
+  int i;
+  orc_union32 *ORC_RESTRICT ptr0;
+  orc_union32 *ORC_RESTRICT ptr1;
+  const orc_union32 *ORC_RESTRICT ptr4;
+  const orc_union32 *ORC_RESTRICT ptr5;
+  orc_union64 var37;
+  orc_union32 var38;
+  orc_union32 var39;
+  orc_union32 var40;
+  orc_union64 var41;
+  orc_union64 var42;
+  orc_union64 var43;
+  orc_union64 var44;
+  orc_union32 var45;
+
+  ptr0 = (orc_union32 *) d1;
+  ptr1 = (orc_union32 *) d2;
+  ptr4 = (orc_union32 *) s1;
+  ptr5 = (orc_union32 *) s2;
+
+  /* 6: loadpw */
+  var37.x4[0] = p1;
+  var37.x4[1] = p1;
+  var37.x4[2] = p1;
+  var37.x4[3] = p1;
+
+  for (i = 0; i < n; i++) {
+    /* 0: ldreslinl */
+    {
+      int tmp = p2 + i * p3;
+      orc_union32 a = ptr5[tmp >> 16];
+      orc_union32 b = ptr5[(tmp >> 16) + 1];
+      var39.x4[0] =
+          ((orc_uint8) a.x4[0] * (256 - ((tmp >> 8) & 0xff)) +
+          (orc_uint8) b.x4[0] * ((tmp >> 8) & 0xff)) >> 8;
+      var39.x4[1] =
+          ((orc_uint8) a.x4[1] * (256 - ((tmp >> 8) & 0xff)) +
+          (orc_uint8) b.x4[1] * ((tmp >> 8) & 0xff)) >> 8;
+      var39.x4[2] =
+          ((orc_uint8) a.x4[2] * (256 - ((tmp >> 8) & 0xff)) +
+          (orc_uint8) b.x4[2] * ((tmp >> 8) & 0xff)) >> 8;
+      var39.x4[3] =
+          ((orc_uint8) a.x4[3] * (256 - ((tmp >> 8) & 0xff)) +
+          (orc_uint8) b.x4[3] * ((tmp >> 8) & 0xff)) >> 8;
+    }
+    /* 1: storel */
+    ptr1[i] = var39;
+    /* 2: loadb */
+    var40 = ptr4[i];
+    var40 = ptr4[i];
+    var40 = ptr4[i];
+    var40 = ptr4[i];
+    /* 3: convubw */
+    var41.x4[0] = (orc_uint8) var40.x4[0];
+    var41.x4[1] = (orc_uint8) var40.x4[1];
+    var41.x4[2] = (orc_uint8) var40.x4[2];
+    var41.x4[3] = (orc_uint8) var40.x4[3];
+    /* 4: convubw */
+    var42.x4[0] = (orc_uint8) var39.x4[0];
+    var42.x4[1] = (orc_uint8) var39.x4[1];
+    var42.x4[2] = (orc_uint8) var39.x4[2];
+    var42.x4[3] = (orc_uint8) var39.x4[3];
+    /* 5: subw */
+    var43.x4[0] = var42.x4[0] - var41.x4[0];
+    var43.x4[1] = var42.x4[1] - var41.x4[1];
+    var43.x4[2] = var42.x4[2] - var41.x4[2];
+    var43.x4[3] = var42.x4[3] - var41.x4[3];
+    /* 7: mullw */
+    var44.x4[0] = (var43.x4[0] * var37.x4[0]) & 0xffff;
+    var44.x4[1] = (var43.x4[1] * var37.x4[1]) & 0xffff;
+    var44.x4[2] = (var43.x4[2] * var37.x4[2]) & 0xffff;
+    var44.x4[3] = (var43.x4[3] * var37.x4[3]) & 0xffff;
+    /* 8: convhwb */
+    var45.x4[0] = ((orc_uint16) var44.x4[0]) >> 8;
+    var45.x4[1] = ((orc_uint16) var44.x4[1]) >> 8;
+    var45.x4[2] = ((orc_uint16) var44.x4[2]) >> 8;
+    var45.x4[3] = ((orc_uint16) var44.x4[3]) >> 8;
+    /* 9: addb */
+    var38.x4[0] = var45.x4[0] + var40.x4[0];
+    var38.x4[1] = var45.x4[1] + var40.x4[1];
+    var38.x4[2] = var45.x4[2] + var40.x4[2];
+    var38.x4[3] = var45.x4[3] + var40.x4[3];
+    /* 10: storel */
+    ptr0[i] = var38;
+  }
+
+}
+
+#else
+static void
+_backup_gst_videoscale_orc_resample_merge_bilinear_u32 (OrcExecutor *
+    ORC_RESTRICT ex)
+{
+  int i;
+  int n = ex->n;
+  orc_union32 *ORC_RESTRICT ptr0;
+  orc_union32 *ORC_RESTRICT ptr1;
+  const orc_union32 *ORC_RESTRICT ptr4;
+  const orc_union32 *ORC_RESTRICT ptr5;
+  orc_union64 var37;
+  orc_union32 var38;
+  orc_union32 var39;
+  orc_union32 var40;
+  orc_union64 var41;
+  orc_union64 var42;
+  orc_union64 var43;
+  orc_union64 var44;
+  orc_union32 var45;
+
+  ptr0 = (orc_union32 *) ex->arrays[0];
+  ptr1 = (orc_union32 *) ex->arrays[1];
+  ptr4 = (orc_union32 *) ex->arrays[4];
+  ptr5 = (orc_union32 *) ex->arrays[5];
+
+  /* 6: loadpw */
+  var37.x4[0] = ex->params[24];
+  var37.x4[1] = ex->params[24];
+  var37.x4[2] = ex->params[24];
+  var37.x4[3] = ex->params[24];
+
+  for (i = 0; i < n; i++) {
+    /* 0: ldreslinl */
+    {
+      int tmp = ex->params[25] + i * ex->params[26];
+      orc_union32 a = ptr5[tmp >> 16];
+      orc_union32 b = ptr5[(tmp >> 16) + 1];
+      var39.x4[0] =
+          ((orc_uint8) a.x4[0] * (256 - ((tmp >> 8) & 0xff)) +
+          (orc_uint8) b.x4[0] * ((tmp >> 8) & 0xff)) >> 8;
+      var39.x4[1] =
+          ((orc_uint8) a.x4[1] * (256 - ((tmp >> 8) & 0xff)) +
+          (orc_uint8) b.x4[1] * ((tmp >> 8) & 0xff)) >> 8;
+      var39.x4[2] =
+          ((orc_uint8) a.x4[2] * (256 - ((tmp >> 8) & 0xff)) +
+          (orc_uint8) b.x4[2] * ((tmp >> 8) & 0xff)) >> 8;
+      var39.x4[3] =
+          ((orc_uint8) a.x4[3] * (256 - ((tmp >> 8) & 0xff)) +
+          (orc_uint8) b.x4[3] * ((tmp >> 8) & 0xff)) >> 8;
+    }
+    /* 1: storel */
+    ptr1[i] = var39;
+    /* 2: loadb */
+    var40 = ptr4[i];
+    var40 = ptr4[i];
+    var40 = ptr4[i];
+    var40 = ptr4[i];
+    /* 3: convubw */
+    var41.x4[0] = (orc_uint8) var40.x4[0];
+    var41.x4[1] = (orc_uint8) var40.x4[1];
+    var41.x4[2] = (orc_uint8) var40.x4[2];
+    var41.x4[3] = (orc_uint8) var40.x4[3];
+    /* 4: convubw */
+    var42.x4[0] = (orc_uint8) var39.x4[0];
+    var42.x4[1] = (orc_uint8) var39.x4[1];
+    var42.x4[2] = (orc_uint8) var39.x4[2];
+    var42.x4[3] = (orc_uint8) var39.x4[3];
+    /* 5: subw */
+    var43.x4[0] = var42.x4[0] - var41.x4[0];
+    var43.x4[1] = var42.x4[1] - var41.x4[1];
+    var43.x4[2] = var42.x4[2] - var41.x4[2];
+    var43.x4[3] = var42.x4[3] - var41.x4[3];
+    /* 7: mullw */
+    var44.x4[0] = (var43.x4[0] * var37.x4[0]) & 0xffff;
+    var44.x4[1] = (var43.x4[1] * var37.x4[1]) & 0xffff;
+    var44.x4[2] = (var43.x4[2] * var37.x4[2]) & 0xffff;
+    var44.x4[3] = (var43.x4[3] * var37.x4[3]) & 0xffff;
+    /* 8: convhwb */
+    var45.x4[0] = ((orc_uint16) var44.x4[0]) >> 8;
+    var45.x4[1] = ((orc_uint16) var44.x4[1]) >> 8;
+    var45.x4[2] = ((orc_uint16) var44.x4[2]) >> 8;
+    var45.x4[3] = ((orc_uint16) var44.x4[3]) >> 8;
+    /* 9: addb */
+    var38.x4[0] = var45.x4[0] + var40.x4[0];
+    var38.x4[1] = var45.x4[1] + var40.x4[1];
+    var38.x4[2] = var45.x4[2] + var40.x4[2];
+    var38.x4[3] = var45.x4[3] + var40.x4[3];
+    /* 10: storel */
+    ptr0[i] = var38;
+  }
+
+}
+
+static OrcProgram *_orc_program_gst_videoscale_orc_resample_merge_bilinear_u32;
+void
+gst_videoscale_orc_resample_merge_bilinear_u32 (guint8 * d1, guint8 * d2,
+    const guint8 * s1, const guint8 * s2, int p1, int p2, int p3, int n)
+{
+  OrcExecutor _ex, *ex = &_ex;
+  OrcProgram *p = _orc_program_gst_videoscale_orc_resample_merge_bilinear_u32;
+  void (*func) (OrcExecutor *);
+
+  ex->program = p;
+
+  ex->n = n;
+  ex->arrays[ORC_VAR_D1] = d1;
+  ex->arrays[ORC_VAR_D2] = d2;
+  ex->arrays[ORC_VAR_S1] = (void *) s1;
+  ex->arrays[ORC_VAR_S2] = (void *) s2;
+  ex->params[ORC_VAR_P1] = p1;
+  ex->params[ORC_VAR_P2] = p2;
+  ex->params[ORC_VAR_P3] = p3;
+
+  func = p->code_exec;
+  func (ex);
+}
+#endif
+
+
+/* gst_videoscale_orc_merge_bicubic_u8 */
+#ifdef DISABLE_ORC
+void
+gst_videoscale_orc_merge_bicubic_u8 (guint8 * d1, const guint8 * s1,
+    const guint8 * s2, const guint8 * s3, const guint8 * s4, int p1, int p2,
+    int p3, int p4, int n)
+{
+  int i;
+  orc_int8 *ORC_RESTRICT ptr0;
+  const orc_int8 *ORC_RESTRICT ptr4;
+  const orc_int8 *ORC_RESTRICT ptr5;
+  const orc_int8 *ORC_RESTRICT ptr6;
+  const orc_int8 *ORC_RESTRICT ptr7;
+  orc_int8 var34;
+  orc_int8 var35;
+  orc_int8 var36;
+  orc_int8 var37;
+  orc_int8 var38;
+  orc_int8 var39;
+  orc_int8 var40;
+  orc_int8 var41;
+  orc_union16 var42;
+  orc_int8 var43;
+  orc_union16 var44;
+  orc_union16 var45;
+  orc_union16 var46;
+  orc_union16 var47;
+  orc_union16 var48;
+  orc_union16 var49;
+  orc_union16 var50;
+  orc_union16 var51;
+  orc_union16 var52;
+
+  ptr0 = (orc_int8 *) d1;
+  ptr4 = (orc_int8 *) s1;
+  ptr5 = (orc_int8 *) s2;
+  ptr6 = (orc_int8 *) s3;
+  ptr7 = (orc_int8 *) s4;
+
+  /* 1: loadpb */
+  var35 = p2;
+  /* 4: loadpb */
+  var37 = p3;
+  /* 8: loadpb */
+  var39 = p1;
+  /* 12: loadpb */
+  var41 = p4;
+  /* 15: loadpw */
+  var42.i = 0x00000020;         /* 32 or 1.58101e-322f */
+
+  for (i = 0; i < n; i++) {
+    /* 0: loadb */
+    var34 = ptr5[i];
+    /* 2: mulubw */
+    var44.i = (orc_uint8) var34 *(orc_uint8) var35;
+    /* 3: loadb */
+    var36 = ptr6[i];
+    /* 5: mulubw */
+    var45.i = (orc_uint8) var36 *(orc_uint8) var37;
+    /* 6: addw */
+    var46.i = var44.i + var45.i;
+    /* 7: loadb */
+    var38 = ptr4[i];
+    /* 9: mulubw */
+    var47.i = (orc_uint8) var38 *(orc_uint8) var39;
+    /* 10: subw */
+    var48.i = var46.i - var47.i;
+    /* 11: loadb */
+    var40 = ptr7[i];
+    /* 13: mulubw */
+    var49.i = (orc_uint8) var40 *(orc_uint8) var41;
+    /* 14: subw */
+    var50.i = var48.i - var49.i;
+    /* 16: addw */
+    var51.i = var50.i + var42.i;
+    /* 17: shrsw */
+    var52.i = var51.i >> 6;
+    /* 18: convsuswb */
+    var43 = ORC_CLAMP_UB (var52.i);
+    /* 19: storeb */
+    ptr0[i] = var43;
+  }
+
+}
+
+#else
+static void
+_backup_gst_videoscale_orc_merge_bicubic_u8 (OrcExecutor * ORC_RESTRICT ex)
+{
+  int i;
+  int n = ex->n;
+  orc_int8 *ORC_RESTRICT ptr0;
+  const orc_int8 *ORC_RESTRICT ptr4;
+  const orc_int8 *ORC_RESTRICT ptr5;
+  const orc_int8 *ORC_RESTRICT ptr6;
+  const orc_int8 *ORC_RESTRICT ptr7;
+  orc_int8 var34;
+  orc_int8 var35;
+  orc_int8 var36;
+  orc_int8 var37;
+  orc_int8 var38;
+  orc_int8 var39;
+  orc_int8 var40;
+  orc_int8 var41;
+  orc_union16 var42;
+  orc_int8 var43;
+  orc_union16 var44;
+  orc_union16 var45;
+  orc_union16 var46;
+  orc_union16 var47;
+  orc_union16 var48;
+  orc_union16 var49;
+  orc_union16 var50;
+  orc_union16 var51;
+  orc_union16 var52;
+
+  ptr0 = (orc_int8 *) ex->arrays[0];
+  ptr4 = (orc_int8 *) ex->arrays[4];
+  ptr5 = (orc_int8 *) ex->arrays[5];
+  ptr6 = (orc_int8 *) ex->arrays[6];
+  ptr7 = (orc_int8 *) ex->arrays[7];
+
+  /* 1: loadpb */
+  var35 = ex->params[25];
+  /* 4: loadpb */
+  var37 = ex->params[26];
+  /* 8: loadpb */
+  var39 = ex->params[24];
+  /* 12: loadpb */
+  var41 = ex->params[27];
+  /* 15: loadpw */
+  var42.i = 0x00000020;         /* 32 or 1.58101e-322f */
+
+  for (i = 0; i < n; i++) {
+    /* 0: loadb */
+    var34 = ptr5[i];
+    /* 2: mulubw */
+    var44.i = (orc_uint8) var34 *(orc_uint8) var35;
+    /* 3: loadb */
+    var36 = ptr6[i];
+    /* 5: mulubw */
+    var45.i = (orc_uint8) var36 *(orc_uint8) var37;
+    /* 6: addw */
+    var46.i = var44.i + var45.i;
+    /* 7: loadb */
+    var38 = ptr4[i];
+    /* 9: mulubw */
+    var47.i = (orc_uint8) var38 *(orc_uint8) var39;
+    /* 10: subw */
+    var48.i = var46.i - var47.i;
+    /* 11: loadb */
+    var40 = ptr7[i];
+    /* 13: mulubw */
+    var49.i = (orc_uint8) var40 *(orc_uint8) var41;
+    /* 14: subw */
+    var50.i = var48.i - var49.i;
+    /* 16: addw */
+    var51.i = var50.i + var42.i;
+    /* 17: shrsw */
+    var52.i = var51.i >> 6;
+    /* 18: convsuswb */
+    var43 = ORC_CLAMP_UB (var52.i);
+    /* 19: storeb */
+    ptr0[i] = var43;
+  }
+
+}
+
+static OrcProgram *_orc_program_gst_videoscale_orc_merge_bicubic_u8;
+void
+gst_videoscale_orc_merge_bicubic_u8 (guint8 * d1, const guint8 * s1,
+    const guint8 * s2, const guint8 * s3, const guint8 * s4, int p1, int p2,
+    int p3, int p4, int n)
+{
+  OrcExecutor _ex, *ex = &_ex;
+  OrcProgram *p = _orc_program_gst_videoscale_orc_merge_bicubic_u8;
+  void (*func) (OrcExecutor *);
+
+  ex->program = p;
+
+  ex->n = n;
+  ex->arrays[ORC_VAR_D1] = d1;
+  ex->arrays[ORC_VAR_S1] = (void *) s1;
+  ex->arrays[ORC_VAR_S2] = (void *) s2;
+  ex->arrays[ORC_VAR_S3] = (void *) s3;
+  ex->arrays[ORC_VAR_S4] = (void *) s4;
+  ex->params[ORC_VAR_P1] = p1;
+  ex->params[ORC_VAR_P2] = p2;
+  ex->params[ORC_VAR_P3] = p3;
+  ex->params[ORC_VAR_P4] = p4;
+
+  func = p->code_exec;
+  func (ex);
+}
+#endif
+
+
+void
+gst_videoscale_orc_init (void)
+{
+#ifndef DISABLE_ORC
+  {
+    /* orc_merge_linear_u8 */
+    OrcProgram *p;
+    OrcCompileResult result;
+
+    p = orc_program_new ();
+    orc_program_set_name (p, "orc_merge_linear_u8");
+    orc_program_set_backup_function (p, _backup_orc_merge_linear_u8);
+    orc_program_add_destination (p, 1, "d1");
+    orc_program_add_source (p, 1, "s1");
+    orc_program_add_source (p, 1, "s2");
+    orc_program_add_constant (p, 4, 0x00000080, "c1");
+    orc_program_add_parameter (p, 1, "p1");
+    orc_program_add_temporary (p, 2, "t1");
+    orc_program_add_temporary (p, 2, "t2");
+    orc_program_add_temporary (p, 1, "t3");
+    orc_program_add_temporary (p, 1, "t4");
+
+    orc_program_append_2 (p, "loadb", 0, ORC_VAR_T3, ORC_VAR_S1, ORC_VAR_D1,
+        ORC_VAR_D1);
+    orc_program_append_2 (p, "convubw", 0, ORC_VAR_T1, ORC_VAR_S1, ORC_VAR_D1,
+        ORC_VAR_D1);
+    orc_program_append_2 (p, "convubw", 0, ORC_VAR_T2, ORC_VAR_S2, ORC_VAR_D1,
+        ORC_VAR_D1);
+    orc_program_append_2 (p, "subw", 0, ORC_VAR_T2, ORC_VAR_T2, ORC_VAR_T1,
+        ORC_VAR_D1);
+    orc_program_append_2 (p, "mullw", 0, ORC_VAR_T2, ORC_VAR_T2, ORC_VAR_P1,
+        ORC_VAR_D1);
+    orc_program_append_2 (p, "addw", 0, ORC_VAR_T2, ORC_VAR_T2, ORC_VAR_C1,
+        ORC_VAR_D1);
+    orc_program_append_2 (p, "convhwb", 0, ORC_VAR_T4, ORC_VAR_T2, ORC_VAR_D1,
+        ORC_VAR_D1);
+    orc_program_append_2 (p, "addb", 0, ORC_VAR_D1, ORC_VAR_T4, ORC_VAR_T3,
+        ORC_VAR_D1);
+
+    result = orc_program_compile (p);
+
+    _orc_program_orc_merge_linear_u8 = p;
+  }
+  {
+    /* orc_merge_linear_u16 */
+    OrcProgram *p;
+    OrcCompileResult result;
+
+    p = orc_program_new ();
+    orc_program_set_name (p, "orc_merge_linear_u16");
+    orc_program_set_backup_function (p, _backup_orc_merge_linear_u16);
+    orc_program_add_destination (p, 2, "d1");
+    orc_program_add_source (p, 2, "s1");
+    orc_program_add_source (p, 2, "s2");
+    orc_program_add_constant (p, 4, 0x00000010, "c1");
+    orc_program_add_parameter (p, 2, "p1");
+    orc_program_add_parameter (p, 2, "p2");
+    orc_program_add_temporary (p, 4, "t1");
+    orc_program_add_temporary (p, 4, "t2");
+
+    orc_program_append_2 (p, "muluwl", 0, ORC_VAR_T1, ORC_VAR_S1, ORC_VAR_P1,
+        ORC_VAR_D1);
+    orc_program_append_2 (p, "muluwl", 0, ORC_VAR_T2, ORC_VAR_S2, ORC_VAR_P2,
+        ORC_VAR_D1);
+    orc_program_append_2 (p, "addl", 0, ORC_VAR_T1, ORC_VAR_T1, ORC_VAR_T2,
+        ORC_VAR_D1);
+    orc_program_append_2 (p, "shrul", 0, ORC_VAR_T1, ORC_VAR_T1, ORC_VAR_C1,
+        ORC_VAR_D1);
+    orc_program_append_2 (p, "convlw", 0, ORC_VAR_D1, ORC_VAR_T1, ORC_VAR_D1,
+        ORC_VAR_D1);
+
+    result = orc_program_compile (p);
+
+    _orc_program_orc_merge_linear_u16 = p;
+  }
+  {
+    /* orc_splat_u16 */
+    OrcProgram *p;
+    OrcCompileResult result;
+
+    p = orc_program_new ();
+    orc_program_set_name (p, "orc_splat_u16");
+    orc_program_set_backup_function (p, _backup_orc_splat_u16);
+    orc_program_add_destination (p, 2, "d1");
+    orc_program_add_parameter (p, 2, "p1");
+
+    orc_program_append_2 (p, "copyw", 0, ORC_VAR_D1, ORC_VAR_P1, ORC_VAR_D1,
+        ORC_VAR_D1);
+
+    result = orc_program_compile (p);
+
+    _orc_program_orc_splat_u16 = p;
+  }
+  {
+    /* orc_splat_u32 */
+    OrcProgram *p;
+    OrcCompileResult result;
+
+    p = orc_program_new ();
+    orc_program_set_name (p, "orc_splat_u32");
+    orc_program_set_backup_function (p, _backup_orc_splat_u32);
+    orc_program_add_destination (p, 4, "d1");
+    orc_program_add_parameter (p, 4, "p1");
+
+    orc_program_append_2 (p, "copyl", 0, ORC_VAR_D1, ORC_VAR_P1, ORC_VAR_D1,
+        ORC_VAR_D1);
+
+    result = orc_program_compile (p);
+
+    _orc_program_orc_splat_u32 = p;
+  }
+  {
+    /* orc_downsample_u8 */
+    OrcProgram *p;
+    OrcCompileResult result;
+
+    p = orc_program_new ();
+    orc_program_set_name (p, "orc_downsample_u8");
+    orc_program_set_backup_function (p, _backup_orc_downsample_u8);
+    orc_program_add_destination (p, 1, "d1");
+    orc_program_add_source (p, 2, "s1");
+    orc_program_add_temporary (p, 1, "t1");
+    orc_program_add_temporary (p, 1, "t2");
+
+    orc_program_append_2 (p, "splitwb", 0, ORC_VAR_T1, ORC_VAR_T2, ORC_VAR_S1,
+        ORC_VAR_D1);
+    orc_program_append_2 (p, "avgub", 0, ORC_VAR_D1, ORC_VAR_T1, ORC_VAR_T2,
+        ORC_VAR_D1);
+
+    result = orc_program_compile (p);
+
+    _orc_program_orc_downsample_u8 = p;
+  }
+  {
+    /* orc_downsample_u16 */
+    OrcProgram *p;
+    OrcCompileResult result;
+
+    p = orc_program_new ();
+    orc_program_set_name (p, "orc_downsample_u16");
+    orc_program_set_backup_function (p, _backup_orc_downsample_u16);
+    orc_program_add_destination (p, 2, "d1");
+    orc_program_add_source (p, 4, "s1");
+    orc_program_add_temporary (p, 2, "t1");
+    orc_program_add_temporary (p, 2, "t2");
+
+    orc_program_append_2 (p, "splitlw", 0, ORC_VAR_T1, ORC_VAR_T2, ORC_VAR_S1,
+        ORC_VAR_D1);
+    orc_program_append_2 (p, "avguw", 0, ORC_VAR_D1, ORC_VAR_T1, ORC_VAR_T2,
+        ORC_VAR_D1);
+
+    result = orc_program_compile (p);
+
+    _orc_program_orc_downsample_u16 = p;
+  }
+  {
+    /* gst_videoscale_orc_downsample_u32 */
+    OrcProgram *p;
+    OrcCompileResult result;
+
+    p = orc_program_new ();
+    orc_program_set_name (p, "gst_videoscale_orc_downsample_u32");
+    orc_program_set_backup_function (p,
+        _backup_gst_videoscale_orc_downsample_u32);
+    orc_program_add_destination (p, 4, "d1");
+    orc_program_add_source (p, 8, "s1");
+    orc_program_add_temporary (p, 4, "t1");
+    orc_program_add_temporary (p, 4, "t2");
+
+    orc_program_append_2 (p, "splitql", 0, ORC_VAR_T1, ORC_VAR_T2, ORC_VAR_S1,
+        ORC_VAR_D1);
+    orc_program_append_2 (p, "avgub", 2, ORC_VAR_D1, ORC_VAR_T1, ORC_VAR_T2,
+        ORC_VAR_D1);
+
+    result = orc_program_compile (p);
+
+    _orc_program_gst_videoscale_orc_downsample_u32 = p;
+  }
+  {
+    /* gst_videoscale_orc_downsample_yuyv */
+    OrcProgram *p;
+    OrcCompileResult result;
+
+    p = orc_program_new ();
+    orc_program_set_name (p, "gst_videoscale_orc_downsample_yuyv");
+    orc_program_set_backup_function (p,
+        _backup_gst_videoscale_orc_downsample_yuyv);
+    orc_program_add_destination (p, 4, "d1");
+    orc_program_add_source (p, 8, "s1");
+    orc_program_add_temporary (p, 4, "t1");
+    orc_program_add_temporary (p, 4, "t2");
+    orc_program_add_temporary (p, 2, "t3");
+    orc_program_add_temporary (p, 2, "t4");
+    orc_program_add_temporary (p, 2, "t5");
+    orc_program_add_temporary (p, 2, "t6");
+
+    orc_program_append_2 (p, "splitwb", 2, ORC_VAR_T1, ORC_VAR_T2, ORC_VAR_S1,
+        ORC_VAR_D1);
+    orc_program_append_2 (p, "splitwb", 1, ORC_VAR_T3, ORC_VAR_T4, ORC_VAR_T1,
+        ORC_VAR_D1);
+    orc_program_append_2 (p, "avgub", 1, ORC_VAR_T5, ORC_VAR_T3, ORC_VAR_T4,
+        ORC_VAR_D1);
+    orc_program_append_2 (p, "splitlw", 0, ORC_VAR_T3, ORC_VAR_T4, ORC_VAR_T2,
+        ORC_VAR_D1);
+    orc_program_append_2 (p, "avgub", 1, ORC_VAR_T6, ORC_VAR_T3, ORC_VAR_T4,
+        ORC_VAR_D1);
+    orc_program_append_2 (p, "mergebw", 1, ORC_VAR_D1, ORC_VAR_T5, ORC_VAR_T6,
+        ORC_VAR_D1);
+
+    result = orc_program_compile (p);
+
+    _orc_program_gst_videoscale_orc_downsample_yuyv = p;
+  }
+  {
+    /* gst_videoscale_orc_resample_nearest_u8 */
+    OrcProgram *p;
+    OrcCompileResult result;
+
+    p = orc_program_new ();
+    orc_program_set_name (p, "gst_videoscale_orc_resample_nearest_u8");
+    orc_program_set_backup_function (p,
+        _backup_gst_videoscale_orc_resample_nearest_u8);
+    orc_program_add_destination (p, 1, "d1");
+    orc_program_add_source (p, 1, "s1");
+    orc_program_add_parameter (p, 4, "p1");
+    orc_program_add_parameter (p, 4, "p2");
+
+    orc_program_append_2 (p, "ldresnearb", 0, ORC_VAR_D1, ORC_VAR_S1,
+        ORC_VAR_P1, ORC_VAR_P2);
+
+    result = orc_program_compile (p);
+
+    _orc_program_gst_videoscale_orc_resample_nearest_u8 = p;
+  }
+  {
+    /* gst_videoscale_orc_resample_bilinear_u8 */
+    OrcProgram *p;
+    OrcCompileResult result;
+
+    p = orc_program_new ();
+    orc_program_set_name (p, "gst_videoscale_orc_resample_bilinear_u8");
+    orc_program_set_backup_function (p,
+        _backup_gst_videoscale_orc_resample_bilinear_u8);
+    orc_program_add_destination (p, 1, "d1");
+    orc_program_add_source (p, 1, "s1");
+    orc_program_add_parameter (p, 4, "p1");
+    orc_program_add_parameter (p, 4, "p2");
+
+    orc_program_append_2 (p, "ldreslinb", 0, ORC_VAR_D1, ORC_VAR_S1, ORC_VAR_P1,
+        ORC_VAR_P2);
+
+    result = orc_program_compile (p);
+
+    _orc_program_gst_videoscale_orc_resample_bilinear_u8 = p;
+  }
+  {
+    /* gst_videoscale_orc_resample_nearest_u32 */
+    OrcProgram *p;
+    OrcCompileResult result;
+
+    p = orc_program_new ();
+    orc_program_set_name (p, "gst_videoscale_orc_resample_nearest_u32");
+    orc_program_set_backup_function (p,
+        _backup_gst_videoscale_orc_resample_nearest_u32);
+    orc_program_add_destination (p, 4, "d1");
+    orc_program_add_source (p, 4, "s1");
+    orc_program_add_parameter (p, 4, "p1");
+    orc_program_add_parameter (p, 4, "p2");
+
+    orc_program_append_2 (p, "ldresnearl", 0, ORC_VAR_D1, ORC_VAR_S1,
+        ORC_VAR_P1, ORC_VAR_P2);
+
+    result = orc_program_compile (p);
+
+    _orc_program_gst_videoscale_orc_resample_nearest_u32 = p;
+  }
+  {
+    /* gst_videoscale_orc_resample_bilinear_u32 */
+    OrcProgram *p;
+    OrcCompileResult result;
+
+    p = orc_program_new ();
+    orc_program_set_name (p, "gst_videoscale_orc_resample_bilinear_u32");
+    orc_program_set_backup_function (p,
+        _backup_gst_videoscale_orc_resample_bilinear_u32);
+    orc_program_add_destination (p, 4, "d1");
+    orc_program_add_source (p, 4, "s1");
+    orc_program_add_parameter (p, 4, "p1");
+    orc_program_add_parameter (p, 4, "p2");
+
+    orc_program_append_2 (p, "ldreslinl", 0, ORC_VAR_D1, ORC_VAR_S1, ORC_VAR_P1,
+        ORC_VAR_P2);
+
+    result = orc_program_compile (p);
+
+    _orc_program_gst_videoscale_orc_resample_bilinear_u32 = p;
+  }
+  {
+    /* gst_videoscale_orc_resample_merge_bilinear_u32 */
+    OrcProgram *p;
+    OrcCompileResult result;
+
+    p = orc_program_new ();
+    orc_program_set_name (p, "gst_videoscale_orc_resample_merge_bilinear_u32");
+    orc_program_set_backup_function (p,
+        _backup_gst_videoscale_orc_resample_merge_bilinear_u32);
+    orc_program_add_destination (p, 4, "d1");
+    orc_program_add_destination (p, 4, "d2");
+    orc_program_add_source (p, 4, "s1");
+    orc_program_add_source (p, 4, "s2");
+    orc_program_add_parameter (p, 4, "p1");
+    orc_program_add_parameter (p, 4, "p2");
+    orc_program_add_parameter (p, 4, "p3");
+    orc_program_add_temporary (p, 4, "t1");
+    orc_program_add_temporary (p, 4, "t2");
+    orc_program_add_temporary (p, 4, "t3");
+    orc_program_add_temporary (p, 8, "t4");
+    orc_program_add_temporary (p, 8, "t5");
+
+    orc_program_append_2 (p, "ldreslinl", 0, ORC_VAR_T2, ORC_VAR_S2, ORC_VAR_P2,
+        ORC_VAR_P3);
+    orc_program_append_2 (p, "storel", 0, ORC_VAR_D2, ORC_VAR_T2, ORC_VAR_D1,
+        ORC_VAR_D1);
+    orc_program_append_2 (p, "loadb", 2, ORC_VAR_T1, ORC_VAR_S1, ORC_VAR_D1,
+        ORC_VAR_D1);
+    orc_program_append_2 (p, "convubw", 2, ORC_VAR_T4, ORC_VAR_T1, ORC_VAR_D1,
+        ORC_VAR_D1);
+    orc_program_append_2 (p, "convubw", 2, ORC_VAR_T5, ORC_VAR_T2, ORC_VAR_D1,
+        ORC_VAR_D1);
+    orc_program_append_2 (p, "subw", 2, ORC_VAR_T5, ORC_VAR_T5, ORC_VAR_T4,
+        ORC_VAR_D1);
+    orc_program_append_2 (p, "mullw", 2, ORC_VAR_T5, ORC_VAR_T5, ORC_VAR_P1,
+        ORC_VAR_D1);
+    orc_program_append_2 (p, "convhwb", 2, ORC_VAR_T3, ORC_VAR_T5, ORC_VAR_D1,
+        ORC_VAR_D1);
+    orc_program_append_2 (p, "addb", 2, ORC_VAR_D1, ORC_VAR_T3, ORC_VAR_T1,
+        ORC_VAR_D1);
+
+    result = orc_program_compile (p);
+
+    _orc_program_gst_videoscale_orc_resample_merge_bilinear_u32 = p;
+  }
+  {
+    /* gst_videoscale_orc_merge_bicubic_u8 */
+    OrcProgram *p;
+    OrcCompileResult result;
+
+    p = orc_program_new ();
+    orc_program_set_name (p, "gst_videoscale_orc_merge_bicubic_u8");
+    orc_program_set_backup_function (p,
+        _backup_gst_videoscale_orc_merge_bicubic_u8);
+    orc_program_add_destination (p, 1, "d1");
+    orc_program_add_source (p, 1, "s1");
+    orc_program_add_source (p, 1, "s2");
+    orc_program_add_source (p, 1, "s3");
+    orc_program_add_source (p, 1, "s4");
+    orc_program_add_constant (p, 4, 0x00000020, "c1");
+    orc_program_add_constant (p, 4, 0x00000006, "c2");
+    orc_program_add_parameter (p, 4, "p1");
+    orc_program_add_parameter (p, 4, "p2");
+    orc_program_add_parameter (p, 4, "p3");
+    orc_program_add_parameter (p, 4, "p4");
+    orc_program_add_temporary (p, 2, "t1");
+    orc_program_add_temporary (p, 2, "t2");
+
+    orc_program_append_2 (p, "mulubw", 0, ORC_VAR_T1, ORC_VAR_S2, ORC_VAR_P2,
+        ORC_VAR_D1);
+    orc_program_append_2 (p, "mulubw", 0, ORC_VAR_T2, ORC_VAR_S3, ORC_VAR_P3,
+        ORC_VAR_D1);
+    orc_program_append_2 (p, "addw", 0, ORC_VAR_T1, ORC_VAR_T1, ORC_VAR_T2,
+        ORC_VAR_D1);
+    orc_program_append_2 (p, "mulubw", 0, ORC_VAR_T2, ORC_VAR_S1, ORC_VAR_P1,
+        ORC_VAR_D1);
+    orc_program_append_2 (p, "subw", 0, ORC_VAR_T1, ORC_VAR_T1, ORC_VAR_T2,
+        ORC_VAR_D1);
+    orc_program_append_2 (p, "mulubw", 0, ORC_VAR_T2, ORC_VAR_S4, ORC_VAR_P4,
+        ORC_VAR_D1);
+    orc_program_append_2 (p, "subw", 0, ORC_VAR_T1, ORC_VAR_T1, ORC_VAR_T2,
+        ORC_VAR_D1);
+    orc_program_append_2 (p, "addw", 0, ORC_VAR_T1, ORC_VAR_T1, ORC_VAR_C1,
+        ORC_VAR_D1);
+    orc_program_append_2 (p, "shrsw", 0, ORC_VAR_T1, ORC_VAR_T1, ORC_VAR_C2,
+        ORC_VAR_D1);
+    orc_program_append_2 (p, "convsuswb", 0, ORC_VAR_D1, ORC_VAR_T1, ORC_VAR_D1,
+        ORC_VAR_D1);
+
+    result = orc_program_compile (p);
+
+    _orc_program_gst_videoscale_orc_merge_bicubic_u8 = p;
   }
 #endif
 }
index aa893d2..da44d54 100644 (file)
@@ -55,10 +55,20 @@ typedef union { orc_int16 i; orc_int8 x2[2]; } orc_union16;
 typedef union { orc_int32 i; float f; orc_int16 x2[2]; orc_int8 x4[4]; } orc_union32;
 typedef union { orc_int64 i; double f; orc_int32 x2[2]; orc_int16 x4[4]; } orc_union64;
 #endif
-void orc_merge_linear_u8 (orc_uint8 * d1, const orc_uint8 * s1, const orc_uint8 * s2, int p1, int p2, int n);
+void orc_merge_linear_u8 (orc_uint8 * d1, const orc_uint8 * s1, const orc_uint8 * s2, int p1, int n);
 void orc_merge_linear_u16 (orc_uint16 * d1, const orc_uint16 * s1, const orc_uint16 * s2, int p1, int p2, int n);
 void orc_splat_u16 (orc_uint16 * d1, int p1, int n);
 void orc_splat_u32 (orc_uint32 * d1, int p1, int n);
+void orc_downsample_u8 (guint8 * d1, const guint8 * s1, int n);
+void orc_downsample_u16 (guint16 * d1, const guint16 * s1, int n);
+void gst_videoscale_orc_downsample_u32 (guint8 * d1, const guint8 * s1, int n);
+void gst_videoscale_orc_downsample_yuyv (guint8 * d1, const guint8 * s1, int n);
+void gst_videoscale_orc_resample_nearest_u8 (guint8 * d1, const guint8 * s1, int p1, int p2, int n);
+void gst_videoscale_orc_resample_bilinear_u8 (guint8 * d1, const guint8 * s1, int p1, int p2, int n);
+void gst_videoscale_orc_resample_nearest_u32 (guint8 * d1, const guint8 * s1, int p1, int p2, int n);
+void gst_videoscale_orc_resample_bilinear_u32 (guint8 * d1, const guint8 * s1, int p1, int p2, int n);
+void gst_videoscale_orc_resample_merge_bilinear_u32 (guint8 * d1, guint8 * d2, const guint8 * s1, const guint8 * s2, int p1, int p2, int p3, int n);
+void gst_videoscale_orc_merge_bicubic_u8 (guint8 * d1, const guint8 * s1, const guint8 * s2, const guint8 * s3, const guint8 * s4, int p1, int p2, int p3, int p4, int n);
 
 #ifdef __cplusplus
 }
index 561f411..93d1353 100644 (file)
@@ -6,16 +6,21 @@
 .source 1 s1
 .source 1 s2
 .param 1 p1
-.param 1 p2
 .temp 2 t1
 .temp 2 t2
+.temp 1 a
+.temp 1 t
+
+loadb a, s1
+convubw t1, s1
+convubw t2, s2
+subw t2, t2, t1
+mullw t2, t2, p1
+addw t2, t2, 128
+convhwb t, t2
+addb d1, t, a
+
 
-mulubw t1, s1, p1
-mulubw t2, s2, p2
-addw t1, t1, t2
-addw t1, t1, 128
-shruw t1, t1, 8
-convwb d1, t1
 
 .function orc_merge_linear_u16
 .dest 2 d1
@@ -26,21 +31,162 @@ convwb d1, t1
 .temp 4 t1
 .temp 4 t2
 
+# This is slightly different thatn the u8 case, since muluwl
+# tends to be much faster than mulll
 muluwl t1, s1, p1
 muluwl t2, s2, p2
 addl t1, t1, t2
 shrul t1, t1, 16
 convlw d1, t1
 
+
 .function orc_splat_u16
 .dest 2 d1
 .param 2 p1
 
 copyw d1, p1
 
+
 .function orc_splat_u32
 .dest 4 d1
 .param 4 p1
 
 copyl d1, p1
 
+
+.function orc_downsample_u8
+.dest 1 d1 guint8
+.source 2 s1 guint8
+.temp 1 t1
+.temp 1 t2
+
+splitwb t1, t2, s1
+avgub d1, t1, t2
+
+
+.function orc_downsample_u16
+.dest 2 d1 guint16
+.source 4 s1 guint16
+.temp 2 t1
+.temp 2 t2
+
+splitlw t1, t2, s1
+avguw d1, t1, t2
+
+
+.function gst_videoscale_orc_downsample_u32
+.dest 4 d1 guint8
+.source 8 s1 guint8
+.temp 4 t1
+.temp 4 t2
+
+splitql t1, t2, s1
+x4 avgub d1, t1, t2
+
+
+.function gst_videoscale_orc_downsample_yuyv
+.dest 4 d1 guint8
+.source 8 s1 guint8
+.temp 4 yyyy
+.temp 4 uvuv
+.temp 2 t1
+.temp 2 t2
+.temp 2 yy
+.temp 2 uv
+
+x4 splitwb yyyy, uvuv, s1
+x2 splitwb t1, t2, yyyy
+x2 avgub yy, t1, t2
+splitlw t1, t2, uvuv
+x2 avgub uv, t1, t2
+x2 mergebw d1, yy, uv
+
+
+
+.function gst_videoscale_orc_resample_nearest_u8
+.dest 1 d1 guint8
+.source 1 s1 guint8
+.param 4 p1
+.param 4 p2
+
+ldresnearb d1, s1, p1, p2
+
+
+.function gst_videoscale_orc_resample_bilinear_u8
+.dest 1 d1 guint8
+.source 1 s1 guint8
+.param 4 p1
+.param 4 p2
+
+ldreslinb d1, s1, p1, p2
+
+
+.function gst_videoscale_orc_resample_nearest_u32
+.dest 4 d1 guint8
+.source 4 s1 guint8
+.param 4 p1
+.param 4 p2
+
+ldresnearl d1, s1, p1, p2
+
+
+.function gst_videoscale_orc_resample_bilinear_u32
+.dest 4 d1 guint8
+.source 4 s1 guint8
+.param 4 p1
+.param 4 p2
+
+ldreslinl d1, s1, p1, p2
+
+
+.function gst_videoscale_orc_resample_merge_bilinear_u32
+.dest 4 d1 guint8
+.dest 4 d2 guint8
+.source 4 s1 guint8
+.source 4 s2 guint8
+.temp 4 a
+.temp 4 b
+.temp 4 t
+.temp 8 t1
+.temp 8 t2
+.param 4 p1
+.param 4 p2
+.param 4 p3
+
+ldreslinl b, s2, p2, p3
+storel d2, b
+x4 loadb a, s1
+x4 convubw t1, a
+x4 convubw t2, b
+x4 subw t2, t2, t1
+x4 mullw t2, t2, p1
+x4 convhwb t, t2
+x4 addb d1, t, a
+
+
+
+.function gst_videoscale_orc_merge_bicubic_u8
+.dest 1 d1 guint8
+.source 1 s1 guint8
+.source 1 s2 guint8
+.source 1 s3 guint8
+.source 1 s4 guint8
+.param 4 p1
+.param 4 p2
+.param 4 p3
+.param 4 p4
+.temp 2 t1
+.temp 2 t2
+
+mulubw t1, s2, p2
+mulubw t2, s3, p3
+addw t1, t1, t2
+mulubw t2, s1, p1
+subw t1, t1, t2
+mulubw t2, s4, p4
+subw t1, t1, t2
+addw t1, t1, 32
+shrsw t1, t1, 6
+convsuswb d1, t1
+
+
index afbcf4c..1cc2211 100644 (file)
@@ -30,6 +30,9 @@
 #include "vs_scanline.h"
 #include "vs_image.h"
 
+#include "gstvideoscaleorc.h"
+#include <gst/gst.h>
+
 #define ROUND_UP_2(x)  (((x)+1)&~1)
 #define ROUND_UP_4(x)  (((x)+3)&~3)
 #define ROUND_UP_8(x)  (((x)+7)&~7)
@@ -43,7 +46,7 @@ vs_image_scale_nearest_RGBA (const VSImage * dest, const VSImage * src,
   int x_increment;
   int i;
   int j;
-  int xacc;
+  int prev_j;
 
   if (dest->height == 1)
     y_increment = 0;
@@ -57,14 +60,19 @@ vs_image_scale_nearest_RGBA (const VSImage * dest, const VSImage * src,
 
 
   acc = 0;
+  prev_j = -1;
   for (i = 0; i < dest->height; i++) {
     j = acc >> 16;
 
-    xacc = 0;
-    vs_scanline_resample_nearest_RGBA (dest->pixels + i * dest->stride,
-        src->pixels + j * src->stride, src->width, dest->width, &xacc,
-        x_increment);
+    if (j == prev_j) {
+      memcpy (dest->pixels + i * dest->stride,
+          dest->pixels + (i - 1) * dest->stride, dest->width * 4);
+    } else {
+      gst_videoscale_orc_resample_nearest_u32 (dest->pixels + i * dest->stride,
+          src->pixels + j * src->stride, 0, x_increment, dest->width);
+    }
 
+    prev_j = j;
     acc += y_increment;
   }
 }
@@ -76,15 +84,12 @@ vs_image_scale_linear_RGBA (const VSImage * dest, const VSImage * src,
   int acc;
   int y_increment;
   int x_increment;
-  uint8_t *tmp1;
-  uint8_t *tmp2;
   int y1;
   int y2;
   int i;
   int j;
   int x;
   int dest_size;
-  int xacc;
 
   if (dest->height == 1)
     y_increment = 0;
@@ -98,64 +103,34 @@ vs_image_scale_linear_RGBA (const VSImage * dest, const VSImage * src,
 
   dest_size = dest->width * 4;
 
-  tmp1 = tmpbuf;
-  tmp2 = tmpbuf + dest_size;
+#define LINE(x) ((tmpbuf) + (dest_size)*((x)&1))
 
   acc = 0;
-  xacc = 0;
   y2 = -1;
-  vs_scanline_resample_linear_RGBA (tmp1, src->pixels, src->width, dest->width,
-      &xacc, x_increment);
+  gst_videoscale_orc_resample_bilinear_u32 (LINE (0), src->pixels,
+      0, x_increment, dest->width);
   y1 = 0;
   for (i = 0; i < dest->height; i++) {
     j = acc >> 16;
     x = acc & 0xffff;
 
     if (x == 0) {
-      if (j == y1) {
-        memcpy (dest->pixels + i * dest->stride, tmp1, dest_size);
-      } else if (j == y2) {
-        memcpy (dest->pixels + i * dest->stride, tmp2, dest_size);
-      } else {
-        xacc = 0;
-        vs_scanline_resample_linear_RGBA (tmp1, src->pixels + j * src->stride,
-            src->width, dest->width, &xacc, x_increment);
-        y1 = j;
-        memcpy (dest->pixels + i * dest->stride, tmp1, dest_size);
-      }
+      memcpy (dest->pixels + i * dest->stride, LINE (j), dest_size);
     } else {
-      if (j == y1) {
-        if (j + 1 != y2) {
-          xacc = 0;
-          vs_scanline_resample_linear_RGBA (tmp2,
-              src->pixels + (j + 1) * src->stride, src->width, dest->width,
-              &xacc, x_increment);
-          y2 = j + 1;
-        }
-        vs_scanline_merge_linear_RGBA (dest->pixels + i * dest->stride,
-            tmp1, tmp2, dest->width, x);
-      } else if (j == y2) {
-        if (j + 1 != y1) {
-          xacc = 0;
-          vs_scanline_resample_linear_RGBA (tmp1,
-              src->pixels + (j + 1) * src->stride, src->width, dest->width,
-              &xacc, x_increment);
-          y1 = j + 1;
-        }
-        vs_scanline_merge_linear_RGBA (dest->pixels + i * dest->stride,
-            tmp2, tmp1, dest->width, x);
+      if (j > y1) {
+        gst_videoscale_orc_resample_bilinear_u32 (LINE (j),
+            src->pixels + j * src->stride, 0, x_increment, dest->width);
+        y1++;
+      }
+      if (j >= y1) {
+        gst_videoscale_orc_resample_merge_bilinear_u32 (dest->pixels +
+            i * dest->stride, LINE (j + 1), LINE (j),
+            src->pixels + (j + 1) * src->stride, (x >> 8), 0, x_increment,
+            dest->width);
+        y1++;
       } else {
-        xacc = 0;
-        vs_scanline_resample_linear_RGBA (tmp1, src->pixels + j * src->stride,
-            src->width, dest->width, &xacc, x_increment);
-        y1 = j;
-        xacc = 0;
-        vs_scanline_resample_linear_RGBA (tmp2,
-            src->pixels + (j + 1) * src->stride, src->width, dest->width, &xacc,
-            x_increment);
-        y2 = (j + 1);
-        vs_scanline_merge_linear_RGBA (dest->pixels + i * dest->stride,
-            tmp1, tmp2, dest->width, x);
+        orc_merge_linear_u8 (dest->pixels + i * dest->stride,
+            LINE (j), LINE (j + 1), (x >> 8), dest->width * 4);
       }
     }
 
@@ -563,7 +538,6 @@ vs_image_scale_nearest_Y (const VSImage * dest, const VSImage * src,
   int x_increment;
   int i;
   int j;
-  int xacc;
 
   if (dest->height == 1)
     y_increment = 0;
@@ -579,11 +553,8 @@ vs_image_scale_nearest_Y (const VSImage * dest, const VSImage * src,
   for (i = 0; i < dest->height; i++) {
     j = acc >> 16;
 
-    xacc = 0;
-    vs_scanline_resample_nearest_Y (dest->pixels + i * dest->stride,
-        src->pixels + j * src->stride, src->width, dest->width, &xacc,
-        x_increment);
-
+    gst_videoscale_orc_resample_nearest_u8 (dest->pixels + i * dest->stride,
+        src->pixels + j * src->stride, 0, x_increment, dest->width);
     acc += y_increment;
   }
 }
@@ -623,8 +594,8 @@ vs_image_scale_linear_Y (const VSImage * dest, const VSImage * src,
   acc = 0;
   xacc = 0;
   y2 = -1;
-  vs_scanline_resample_linear_Y (tmp1, src->pixels, src->width, dest->width,
-      &xacc, x_increment);
+  gst_videoscale_orc_resample_bilinear_u8 (tmp1, src->pixels,
+      0, x_increment, dest->width);
   y1 = 0;
   for (i = 0; i < dest->height; i++) {
     j = acc >> 16;
@@ -637,8 +608,8 @@ vs_image_scale_linear_Y (const VSImage * dest, const VSImage * src,
         memcpy (dest->pixels + i * dest->stride, tmp2, dest_size);
       } else {
         xacc = 0;
-        vs_scanline_resample_linear_Y (tmp1, src->pixels + j * src->stride,
-            src->width, dest->width, &xacc, x_increment);
+        gst_videoscale_orc_resample_bilinear_u8 (tmp1,
+            src->pixels + j * src->stride, 0, x_increment, dest->width);
         y1 = j;
         memcpy (dest->pixels + i * dest->stride, tmp1, dest_size);
       }
@@ -646,35 +617,42 @@ vs_image_scale_linear_Y (const VSImage * dest, const VSImage * src,
       if (j == y1) {
         if (j + 1 != y2) {
           xacc = 0;
-          vs_scanline_resample_linear_Y (tmp2,
-              src->pixels + (j + 1) * src->stride, src->width, dest->width,
-              &xacc, x_increment);
+          gst_videoscale_orc_resample_bilinear_u8 (tmp2,
+              src->pixels + (j + 1) * src->stride, 0, x_increment, dest->width);
           y2 = j + 1;
         }
-        vs_scanline_merge_linear_Y (dest->pixels + i * dest->stride,
-            tmp1, tmp2, dest->width, x);
+        if ((x >> 8) == 0) {
+          memcpy (dest->pixels + i * dest->stride, tmp1, dest->width);
+        } else {
+          orc_merge_linear_u8 (dest->pixels + i * dest->stride,
+              tmp1, tmp2, (x >> 8), dest->width);
+        }
       } else if (j == y2) {
         if (j + 1 != y1) {
           xacc = 0;
-          vs_scanline_resample_linear_Y (tmp1,
-              src->pixels + (j + 1) * src->stride, src->width, dest->width,
-              &xacc, x_increment);
+          gst_videoscale_orc_resample_bilinear_u8 (tmp1,
+              src->pixels + (j + 1) * src->stride, 0, x_increment, dest->width);
           y1 = j + 1;
         }
-        vs_scanline_merge_linear_Y (dest->pixels + i * dest->stride,
-            tmp2, tmp1, dest->width, x);
+        if ((x >> 8) == 0) {
+          memcpy (dest->pixels + i * dest->stride, tmp2, dest->width);
+        } else {
+          orc_merge_linear_u8 (dest->pixels + i * dest->stride,
+              tmp2, tmp1, (x >> 8), dest->width);
+        }
       } else {
-        xacc = 0;
-        vs_scanline_resample_linear_Y (tmp1, src->pixels + j * src->stride,
-            src->width, dest->width, &xacc, x_increment);
+        gst_videoscale_orc_resample_bilinear_u8 (tmp1,
+            src->pixels + j * src->stride, 0, x_increment, dest->width);
         y1 = j;
-        xacc = 0;
-        vs_scanline_resample_linear_Y (tmp2,
-            src->pixels + (j + 1) * src->stride, src->width, dest->width, &xacc,
-            x_increment);
+        gst_videoscale_orc_resample_bilinear_u8 (tmp2,
+            src->pixels + (j + 1) * src->stride, 0, x_increment, dest->width);
         y2 = (j + 1);
-        vs_scanline_merge_linear_Y (dest->pixels + i * dest->stride,
-            tmp1, tmp2, dest->width, x);
+        if ((x >> 8) == 0) {
+          memcpy (dest->pixels + i * dest->stride, tmp1, dest->width);
+        } else {
+          orc_merge_linear_u8 (dest->pixels + i * dest->stride,
+              tmp1, tmp2, (x >> 8), dest->width);
+        }
       }
     }
 
index 38bb44a..cfe02b6 100644 (file)
@@ -28,6 +28,7 @@
 #include "vs_scanline.h"
 
 #include "gstvideoscaleorc.h"
+#include <gst/gst.h>
 
 #include <string.h>
 
 void
 vs_scanline_downsample_Y (uint8_t * dest, uint8_t * src, int n)
 {
-  int i;
-
-  for (i = 0; i < n; i++) {
-    dest[i] = (src[i * 2] + src[i * 2 + 1]) / 2;
-  }
+  orc_downsample_u8 (dest, src, n);
 }
 
 void
 vs_scanline_resample_nearest_Y (uint8_t * dest, uint8_t * src, int src_width,
     int n, int *accumulator, int increment)
 {
-  int acc = *accumulator;
-  int i;
-  int j;
-  int x;
-
-  for (i = 0; i < n; i++) {
-    j = acc >> 16;
-    x = acc & 0xffff;
-    dest[i] = (x < 32768 || j + 1 >= src_width) ? src[j] : src[j + 1];
-
-    acc += increment;
-  }
+  gst_videoscale_orc_resample_nearest_u8 (dest, src,
+      *accumulator, increment, n);
 
-  *accumulator = acc;
+  *accumulator += n * increment;
 }
 
 #include <glib.h>
@@ -68,24 +55,10 @@ void
 vs_scanline_resample_linear_Y (uint8_t * dest, uint8_t * src, int src_width,
     int n, int *accumulator, int increment)
 {
-  int acc = *accumulator;
-  int i;
-  int j;
-  int x;
+  gst_videoscale_orc_resample_bilinear_u8 (dest, src,
+      *accumulator, increment, n);
 
-  for (i = 0; i < n; i++) {
-    j = acc >> 16;
-    x = acc & 0xffff;
-
-    if (j + 1 < src_width)
-      dest[i] = (src[j] * (65536 - x) + src[j + 1] * x) >> 16;
-    else
-      dest[i] = src[j];
-
-    acc += increment;
-  }
-
-  *accumulator = acc;
+  *accumulator += n * increment;
 }
 
 void
@@ -97,19 +70,14 @@ vs_scanline_merge_linear_Y (uint8_t * dest, uint8_t * src1, uint8_t * src2,
   if (value == 0) {
     memcpy (dest, src1, n);
   } else {
-    orc_merge_linear_u8 (dest, src1, src2, 256 - value, value, n);
+    orc_merge_linear_u8 (dest, src1, src2, value, n);
   }
 }
 
 void
 vs_scanline_downsample_Y16 (uint8_t * dest, uint8_t * src, int n)
 {
-  int i;
-  uint16_t *d = (uint16_t *) dest, *s = (uint16_t *) src;
-
-  for (i = 0; i < n; i++) {
-    d[i] = (s[i * 2] + s[i * 2 + 1]) / 2;
-  }
+  orc_downsample_u16 ((uint16_t *) dest, (uint16_t *) src, n);
 }
 
 void
@@ -178,80 +146,27 @@ vs_scanline_merge_linear_Y16 (uint8_t * dest, uint8_t * src1, uint8_t * src2,
 void
 vs_scanline_downsample_RGBA (uint8_t * dest, uint8_t * src, int n)
 {
-  int i;
-
-  for (i = 0; i < n; i++) {
-    dest[i * 4 + 0] = (src[i * 8 + 0] + src[i * 8 + 4]) / 2;
-    dest[i * 4 + 1] = (src[i * 8 + 1] + src[i * 8 + 5]) / 2;
-    dest[i * 4 + 2] = (src[i * 8 + 2] + src[i * 8 + 6]) / 2;
-    dest[i * 4 + 3] = (src[i * 8 + 3] + src[i * 8 + 7]) / 2;
-  }
+  gst_videoscale_orc_downsample_u32 (dest, src, n);
 }
 
 void
 vs_scanline_resample_nearest_RGBA (uint8_t * dest, uint8_t * src, int src_width,
     int n, int *accumulator, int increment)
 {
-  int acc = *accumulator;
-  int i;
-  int j;
-  int x;
+  gst_videoscale_orc_resample_nearest_u32 (dest, src,
+      *accumulator, increment, n);
 
-  for (i = 0; i < n; i++) {
-    j = acc >> 16;
-    x = acc & 0xffff;
-
-    if (j + 1 < src_width) {
-      dest[i * 4 + 0] = (x < 32768) ? src[j * 4 + 0] : src[j * 4 + 4];
-      dest[i * 4 + 1] = (x < 32768) ? src[j * 4 + 1] : src[j * 4 + 5];
-      dest[i * 4 + 2] = (x < 32768) ? src[j * 4 + 2] : src[j * 4 + 6];
-      dest[i * 4 + 3] = (x < 32768) ? src[j * 4 + 3] : src[j * 4 + 7];
-    } else {
-      dest[i * 4 + 0] = src[j * 4 + 0];
-      dest[i * 4 + 1] = src[j * 4 + 1];
-      dest[i * 4 + 2] = src[j * 4 + 2];
-      dest[i * 4 + 3] = src[j * 4 + 3];
-    }
-
-    acc += increment;
-  }
-
-  *accumulator = acc;
+  *accumulator += n * increment;
 }
 
 void
 vs_scanline_resample_linear_RGBA (uint8_t * dest, uint8_t * src, int src_width,
     int n, int *accumulator, int increment)
 {
-  int acc = *accumulator;
-  int i;
-  int j;
-  int x;
-
-  for (i = 0; i < n; i++) {
-    j = acc >> 16;
-    x = acc & 0xffff;
+  gst_videoscale_orc_resample_bilinear_u32 (dest, src,
+      *accumulator, increment, n);
 
-    if (j + 1 < src_width) {
-      dest[i * 4 + 0] =
-          (src[j * 4 + 0] * (65536 - x) + src[j * 4 + 4] * x) >> 16;
-      dest[i * 4 + 1] =
-          (src[j * 4 + 1] * (65536 - x) + src[j * 4 + 5] * x) >> 16;
-      dest[i * 4 + 2] =
-          (src[j * 4 + 2] * (65536 - x) + src[j * 4 + 6] * x) >> 16;
-      dest[i * 4 + 3] =
-          (src[j * 4 + 3] * (65536 - x) + src[j * 4 + 7] * x) >> 16;
-    } else {
-      dest[i * 4 + 0] = src[j * 4 + 0];
-      dest[i * 4 + 1] = src[j * 4 + 1];
-      dest[i * 4 + 2] = src[j * 4 + 2];
-      dest[i * 4 + 3] = src[j * 4 + 3];
-    }
-
-    acc += increment;
-  }
-
-  *accumulator = acc;
+  *accumulator += n * increment;
 }
 
 void
@@ -263,7 +178,7 @@ vs_scanline_merge_linear_RGBA (uint8_t * dest, uint8_t * src1, uint8_t * src2,
   if (value == 0) {
     memcpy (dest, src1, n * 4);
   } else {
-    orc_merge_linear_u8 (dest, src1, src2, 256 - value, value, n * 4);
+    orc_merge_linear_u8 (dest, src1, src2, value, n * 4);
   }
 }
 
@@ -348,7 +263,7 @@ vs_scanline_merge_linear_RGB (uint8_t * dest, uint8_t * src1, uint8_t * src2,
   if (value == 0) {
     memcpy (dest, src1, n * 3);
   } else {
-    orc_merge_linear_u8 (dest, src1, src2, 256 - value, value, n * 3);
+    orc_merge_linear_u8 (dest, src1, src2, value, n * 3);
   }
 }
 
@@ -361,14 +276,7 @@ vs_scanline_merge_linear_RGB (uint8_t * dest, uint8_t * src1, uint8_t * src2,
 void
 vs_scanline_downsample_YUYV (uint8_t * dest, uint8_t * src, int n)
 {
-  int i;
-
-  for (i = 0; i < n; i++) {
-    dest[i * 4 + 0] = (src[i * 8 + 0] + src[i * 8 + 2]) / 2;
-    dest[i * 4 + 1] = (src[i * 8 + 1] + src[i * 8 + 5]) / 2;
-    dest[i * 4 + 2] = (src[i * 8 + 4] + src[i * 8 + 6]) / 2;
-    dest[i * 4 + 3] = (src[i * 8 + 3] + src[i * 8 + 7]) / 2;
-  }
+  gst_videoscale_orc_downsample_yuyv (dest, src, n);
 }
 
 void
@@ -477,7 +385,7 @@ vs_scanline_merge_linear_YUYV (uint8_t * dest, uint8_t * src1, uint8_t * src2,
   if (value == 0) {
     memcpy (dest, src1, quads * 4);
   } else {
-    orc_merge_linear_u8 (dest, src1, src2, 256 - value, value, quads * 4);
+    orc_merge_linear_u8 (dest, src1, src2, value, quads * 4);
   }
 }
 
@@ -606,7 +514,7 @@ vs_scanline_merge_linear_UYVY (uint8_t * dest, uint8_t * src1,
   if (value == 0) {
     memcpy (dest, src1, quads * 4);
   } else {
-    orc_merge_linear_u8 (dest, src1, src2, 256 - value, value, quads * 4);
+    orc_merge_linear_u8 (dest, src1, src2, value, quads * 4);
   }
 }