+#define CREATE_ARGB_ARGB_FUNCTIONS(name, name2, A, R, G, B, A2, R2, G2, B2) \
+static void \
+gst_alpha_set_##name##_##name2 (const guint8 * src, guint8 * dest, gint width, \
+ gint height, GstAlpha * alpha) \
+{ \
+ gint s_alpha = CLAMP ((gint) (alpha->alpha * 256), 0, 256); \
+ gint i, j; \
+ \
+ for (i = 0; i < height; i++) { \
+ for (j = 0; j < width; j++) { \
+ dest[A2] = (src[A] * s_alpha) >> 8; \
+ \
+ dest[R2] = src[R]; \
+ dest[G2] = src[G]; \
+ dest[B2] = src[B]; \
+ \
+ dest += 4; \
+ src += 4; \
+ } \
+ } \
+} \
+\
+static void \
+gst_alpha_chroma_key_##name##_##name2 (const guint8 * src, guint8 * dest, gint width, \
+ gint height, GstAlpha * alpha) \
+{ \
+ gint i, j; \
+ gint a, y, u, v; \
+ gint r, g, b; \
+ gint smin, smax; \
+ gint pa = CLAMP ((gint) (alpha->alpha * 256), 0, 256); \
+ gint8 cb = alpha->cb, cr = alpha->cr; \
+ gint8 kg = alpha->kg; \
+ guint8 accept_angle_tg = alpha->accept_angle_tg; \
+ guint8 accept_angle_ctg = alpha->accept_angle_ctg; \
+ guint8 one_over_kc = alpha->one_over_kc; \
+ guint8 kfgy_scale = alpha->kfgy_scale; \
+ guint noise_level2 = alpha->noise_level2; \
+ gint matrix[12], matrix2[12]; \
+ \
+ smin = 128 - alpha->black_sensitivity; \
+ smax = 128 + alpha->white_sensitivity; \
+ \
+ memcpy (matrix, \
+ cog_rgb_to_ycbcr_matrix_8bit_sdtv, \
+ 12 * sizeof (gint)); \
+ memcpy (matrix2, \
+ cog_ycbcr_to_rgb_matrix_8bit_sdtv, \
+ 12 * sizeof (gint)); \
+ \
+ for (i = 0; i < height; i++) { \
+ for (j = 0; j < width; j++) { \
+ a = (src[A] * pa) >> 8; \
+ r = src[R]; \
+ g = src[G]; \
+ b = src[B]; \
+ \
+ y = APPLY_MATRIX (matrix, 0, r, g, b); \
+ u = APPLY_MATRIX (matrix, 1, r, g, b) - 128; \
+ v = APPLY_MATRIX (matrix, 2, r, g, b) - 128; \
+ \
+ a = chroma_keying_yuv (a, &y, 1, &u, &v, cr, cb, \
+ smin, smax, accept_angle_tg, accept_angle_ctg, \
+ one_over_kc, kfgy_scale, kg, noise_level2); \
+ \
+ u += 128; \
+ v += 128; \
+ \
+ r = APPLY_MATRIX (matrix2, 0, y, u, v); \
+ g = APPLY_MATRIX (matrix2, 1, y, u, v); \
+ b = APPLY_MATRIX (matrix2, 2, y, u, v); \
+ \
+ dest[A2] = a; \
+ dest[R2] = CLAMP (r, 0, 255); \
+ dest[G2] = CLAMP (g, 0, 255); \
+ dest[B2] = CLAMP (b, 0, 255); \
+ \
+ src += 4; \
+ dest += 4; \
+ } \
+ } \
+}