upload tizen1.0 source
[framework/multimedia/gst-plugins-good0.10.git] / gst / alpha / gstalphacolor.c
1 /* GStreamer
2  * Copyright (C) <1999> Erik Walthinsen <omega@cse.ogi.edu>
3  *
4  * This library is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU Library General Public
6  * License as published by the Free Software Foundation; either
7  * version 2 of the License, or (at your option) any later version.
8  *
9  * This library is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12  * Library General Public License for more details.
13  *
14  * You should have received a copy of the GNU Library General Public
15  * License along with this library; if not, write to the
16  * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
17  * Boston, MA 02111-1307, USA.
18  */
19
20 /**
21  * SECTION:element-alphacolor
22  *
23  * The alphacolor element does memory-efficient (in-place) colourspace
24  * conversion from RGBA to AYUV or AYUV to RGBA while preserving the
25  * alpha channel.
26  *
27  * Sample pipeline:
28  * |[
29  * gst-launch videotestsrc ! "video/x-raw-yuv,format=(fourcc)AYUV" ! \
30  *   alphacolor ! "video/x-raw-rgb" ! ffmpegcolorspace ! autovideosink
31  * ]|
32  */
33
34 #ifdef HAVE_CONFIG_H
35 #include "config.h"
36 #endif
37
38 #include "gstalphacolor.h"
39
40 #include <gst/gst.h>
41 #include <gst/video/video.h>
42
43 #include <string.h>
44
45 GST_DEBUG_CATEGORY_STATIC (alpha_color_debug);
46 #define GST_CAT_DEFAULT alpha_color_debug
47
48 /* elementfactory information */
49 static GstStaticPadTemplate sink_template = GST_STATIC_PAD_TEMPLATE ("sink",
50     GST_PAD_SINK,
51     GST_PAD_ALWAYS,
52     GST_STATIC_CAPS (GST_VIDEO_CAPS_RGBA ";" GST_VIDEO_CAPS_BGRA ";"
53         GST_VIDEO_CAPS_ARGB ";" GST_VIDEO_CAPS_ABGR ";"
54         GST_VIDEO_CAPS_YUV ("AYUV"))
55     );
56
57 static GstStaticPadTemplate src_template = GST_STATIC_PAD_TEMPLATE ("src",
58     GST_PAD_SRC,
59     GST_PAD_ALWAYS,
60     GST_STATIC_CAPS (GST_VIDEO_CAPS_RGBA ";" GST_VIDEO_CAPS_BGRA ";"
61         GST_VIDEO_CAPS_ARGB ";" GST_VIDEO_CAPS_ABGR ";"
62         GST_VIDEO_CAPS_YUV ("AYUV"))
63     );
64
65 GST_BOILERPLATE (GstAlphaColor, gst_alpha_color, GstVideoFilter,
66     GST_TYPE_VIDEO_FILTER);
67
68 static GstCaps *gst_alpha_color_transform_caps (GstBaseTransform * btrans,
69     GstPadDirection direction, GstCaps * caps);
70 static gboolean gst_alpha_color_set_caps (GstBaseTransform * btrans,
71     GstCaps * incaps, GstCaps * outcaps);
72 static GstFlowReturn gst_alpha_color_transform_ip (GstBaseTransform * btrans,
73     GstBuffer * inbuf);
74
75 static void
76 gst_alpha_color_base_init (gpointer g_class)
77 {
78   GstElementClass *element_class = GST_ELEMENT_CLASS (g_class);
79
80   gst_element_class_set_details_simple (element_class, "Alpha color filter",
81       "Filter/Converter/Video",
82       "ARGB from/to AYUV colorspace conversion preserving the alpha channel",
83       "Wim Taymans <wim@fluendo.com>");
84
85   gst_element_class_add_pad_template (element_class,
86       gst_static_pad_template_get (&sink_template));
87   gst_element_class_add_pad_template (element_class,
88       gst_static_pad_template_get (&src_template));
89 }
90
91 static void
92 gst_alpha_color_class_init (GstAlphaColorClass * klass)
93 {
94   GstBaseTransformClass *gstbasetransform_class =
95       (GstBaseTransformClass *) klass;
96
97   gstbasetransform_class->transform_caps =
98       GST_DEBUG_FUNCPTR (gst_alpha_color_transform_caps);
99   gstbasetransform_class->set_caps =
100       GST_DEBUG_FUNCPTR (gst_alpha_color_set_caps);
101   gstbasetransform_class->transform_ip =
102       GST_DEBUG_FUNCPTR (gst_alpha_color_transform_ip);
103
104   GST_DEBUG_CATEGORY_INIT (alpha_color_debug, "alphacolor", 0,
105       "ARGB<->AYUV colorspace conversion preserving the alpha channels");
106 }
107
108 static void
109 gst_alpha_color_init (GstAlphaColor * alpha, GstAlphaColorClass * g_class)
110 {
111   GstBaseTransform *btrans = GST_BASE_TRANSFORM (alpha);
112
113   btrans->always_in_place = TRUE;
114 }
115
116 static GstCaps *
117 gst_alpha_color_transform_caps (GstBaseTransform * btrans,
118     GstPadDirection direction, GstCaps * caps)
119 {
120   const GstCaps *tmpl_caps = NULL;
121   GstCaps *result = NULL, *local_caps = NULL;
122   guint i;
123
124   local_caps = gst_caps_new_empty ();
125
126   for (i = 0; i < gst_caps_get_size (caps); i++) {
127     GstStructure *structure =
128         gst_structure_copy (gst_caps_get_structure (caps, i));
129
130     /* Remove any specific parameter from the structure */
131     gst_structure_remove_field (structure, "format");
132     gst_structure_remove_field (structure, "endianness");
133     gst_structure_remove_field (structure, "depth");
134     gst_structure_remove_field (structure, "bpp");
135     gst_structure_remove_field (structure, "red_mask");
136     gst_structure_remove_field (structure, "green_mask");
137     gst_structure_remove_field (structure, "blue_mask");
138     gst_structure_remove_field (structure, "alpha_mask");
139     gst_structure_remove_field (structure, "color-matrix");
140     gst_structure_remove_field (structure, "chroma-site");
141
142     gst_structure_set_name (structure, "video/x-raw-rgb");
143     gst_caps_append_structure (local_caps, gst_structure_copy (structure));
144     gst_structure_set_name (structure, "video/x-raw-yuv");
145     gst_caps_append_structure (local_caps, structure);
146   }
147
148   /* Get the appropriate template */
149   if (direction == GST_PAD_SINK) {
150     tmpl_caps = gst_static_pad_template_get_caps (&src_template);
151   } else if (direction == GST_PAD_SRC) {
152     tmpl_caps = gst_static_pad_template_get_caps (&sink_template);
153   }
154
155   /* Intersect with our template caps */
156   result = gst_caps_intersect (local_caps, tmpl_caps);
157
158   gst_caps_unref (local_caps);
159   gst_caps_do_simplify (result);
160
161   GST_LOG_OBJECT (btrans, "transformed %" GST_PTR_FORMAT " to %" GST_PTR_FORMAT,
162       caps, result);
163
164   return result;
165 }
166
167 /* Generated by -bad/ext/cog/generate_tables */
168 static const int cog_ycbcr_to_rgb_matrix_8bit_hdtv[] = {
169   298, 0, 459, -63514,
170   298, -55, -136, 19681,
171   298, 541, 0, -73988,
172 };
173
174 static const int cog_ycbcr_to_rgb_matrix_8bit_sdtv[] = {
175   298, 0, 409, -57068,
176   298, -100, -208, 34707,
177   298, 516, 0, -70870,
178 };
179
180 static const gint cog_rgb_to_ycbcr_matrix_8bit_hdtv[] = {
181   47, 157, 16, 4096,
182   -26, -87, 112, 32768,
183   112, -102, -10, 32768,
184 };
185
186 static const gint cog_rgb_to_ycbcr_matrix_8bit_sdtv[] = {
187   66, 129, 25, 4096,
188   -38, -74, 112, 32768,
189   112, -94, -18, 32768,
190 };
191
192 static const gint cog_ycbcr_sdtv_to_ycbcr_hdtv_matrix_8bit[] = {
193   256, -30, -53, 10600,
194   0, 261, 29, -4367,
195   0, 19, 262, -3289,
196 };
197
198 static const gint cog_ycbcr_hdtv_to_ycbcr_sdtv_matrix_8bit[] = {
199   256, 25, 49, -9536,
200   0, 253, -28, 3958,
201   0, -19, 252, 2918,
202 };
203
204 #define DEFINE_ARGB_AYUV_FUNCTIONS(name, A, R, G, B) \
205 static void \
206 transform_##name##_ayuv (guint8 * data, gint size, const gint *matrix) \
207 { \
208   gint y, u, v; \
209   gint yc[4]; \
210   gint uc[4]; \
211   gint vc[4]; \
212   \
213   memcpy (yc, matrix, 4 * sizeof (gint)); \
214   memcpy (uc, matrix + 4, 4 * sizeof (gint)); \
215   memcpy (vc, matrix + 8, 4 * sizeof (gint)); \
216   \
217   while (size > 0) { \
218     y = (data[R] * yc[0] + data[G] * yc[1] + data[B] * yc[2] + yc[3]) >> 8; \
219     u = (data[R] * uc[0] + data[G] * uc[1] + data[B] * uc[2] + uc[3]) >> 8; \
220     v = (data[R] * vc[0] + data[G] * vc[1] + data[B] * vc[2] + vc[3]) >> 8; \
221     \
222     data[0] = data[A]; \
223     data[1] = y; \
224     data[2] = u; \
225     data[3] = v; \
226     \
227     data += 4; \
228     size -= 4; \
229   } \
230 } \
231 \
232 static void \
233 transform_ayuv_##name (guint8 * data, gint size, const gint *matrix) \
234 { \
235   gint r, g, b; \
236   gint rc[4]; \
237   gint gc[4]; \
238   gint bc[4]; \
239   \
240   memcpy (rc, matrix, 4 * sizeof (gint)); \
241   memcpy (gc, matrix + 4, 4 * sizeof (gint)); \
242   memcpy (bc, matrix + 8, 4 * sizeof (gint)); \
243   \
244   while (size > 0) { \
245     r = (data[1] * rc[0] + data[2] * rc[1] + data[3] * rc[2] + rc[3]) >> 8; \
246     g = (data[1] * gc[0] + data[2] * gc[1] + data[3] * gc[2] + gc[3]) >> 8; \
247     b = (data[1] * bc[0] + data[2] * bc[1] + data[3] * bc[2] + bc[3]) >> 8; \
248     \
249     data[A] = data[0]; \
250     data[R] = CLAMP (r, 0, 255); \
251     data[G] = CLAMP (g, 0, 255); \
252     data[B] = CLAMP (b, 0, 255); \
253     \
254     data += 4; \
255     size -= 4; \
256   } \
257 }
258
259 DEFINE_ARGB_AYUV_FUNCTIONS (rgba, 3, 0, 1, 2);
260 DEFINE_ARGB_AYUV_FUNCTIONS (bgra, 3, 2, 1, 0);
261 DEFINE_ARGB_AYUV_FUNCTIONS (argb, 0, 1, 2, 3);
262 DEFINE_ARGB_AYUV_FUNCTIONS (abgr, 0, 3, 2, 1);
263
264 static void
265 transform_ayuv_ayuv (guint8 * data, gint size, const gint * matrix)
266 {
267   gint y, u, v;
268   gint yc[4];
269   gint uc[4];
270   gint vc[4];
271
272   if (matrix == NULL)
273     return;
274
275   memcpy (yc, matrix, 4 * sizeof (gint));
276   memcpy (uc, matrix + 4, 4 * sizeof (gint));
277   memcpy (vc, matrix + 8, 4 * sizeof (gint));
278
279   while (size > 0) {
280     y = (data[1] * yc[0] + data[2] * yc[1] + data[3] * yc[2] + yc[3]) >> 8;
281     u = (data[1] * uc[0] + data[2] * uc[1] + data[3] * uc[2] + uc[3]) >> 8;
282     v = (data[1] * vc[0] + data[2] * vc[1] + data[3] * vc[2] + vc[3]) >> 8;
283
284     data[0] = data[0];
285     data[1] = y;
286     data[2] = u;
287     data[3] = v;
288
289     data += 4;
290     size -= 4;
291   }
292 }
293
294 static void
295 transform_argb_bgra (guint8 * data, gint size, const gint * matrix)
296 {
297   gint r, g, b;
298
299   while (size > 0) {
300     r = data[1];
301     g = data[2];
302     b = data[3];
303
304     data[3] = data[0];
305     data[0] = b;
306     data[1] = g;
307     data[2] = r;
308
309     data += 4;
310     size -= 4;
311   }
312 }
313
314 #define transform_abgr_rgba transform_argb_bgra
315
316 static void
317 transform_argb_abgr (guint8 * data, gint size, const gint * matrix)
318 {
319   gint r, g, b;
320
321   while (size > 0) {
322     r = data[1];
323     g = data[2];
324     b = data[3];
325
326     /* data[0] = data[0]; */
327     data[1] = b;
328     data[2] = g;
329     data[3] = r;
330
331     data += 4;
332     size -= 4;
333   }
334 }
335
336 #define transform_abgr_argb transform_argb_abgr
337
338 static void
339 transform_rgba_bgra (guint8 * data, gint size, const gint * matrix)
340 {
341   gint r, g, b;
342
343   while (size > 0) {
344     r = data[0];
345     g = data[1];
346     b = data[2];
347
348     /* data[3] = data[3] */ ;
349     data[0] = b;
350     data[1] = g;
351     data[2] = r;
352
353     data += 4;
354     size -= 4;
355   }
356 }
357
358 #define transform_bgra_rgba transform_rgba_bgra
359
360 static void
361 transform_argb_rgba (guint8 * data, gint size, const gint * matrix)
362 {
363   gint r, g, b;
364
365   while (size > 0) {
366     r = data[1];
367     g = data[2];
368     b = data[3];
369
370     data[3] = data[0];
371     data[0] = r;
372     data[1] = g;
373     data[2] = b;
374
375     data += 4;
376     size -= 4;
377   }
378 }
379
380 #define transform_abgr_bgra transform_argb_rgba
381
382 static void
383 transform_bgra_argb (guint8 * data, gint size, const gint * matrix)
384 {
385   gint r, g, b;
386
387   while (size > 0) {
388     r = data[2];
389     g = data[1];
390     b = data[0];
391
392     data[0] = data[3];
393     data[1] = r;
394     data[2] = g;
395     data[3] = b;
396
397     data += 4;
398     size -= 4;
399   }
400 }
401
402 #define transform_rgba_abgr transform_bgra_argb
403
404 static void
405 transform_rgba_argb (guint8 * data, gint size, const gint * matrix)
406 {
407   gint r, g, b;
408
409   while (size > 0) {
410     r = data[0];
411     g = data[1];
412     b = data[2];
413
414     data[0] = data[3];
415     data[1] = r;
416     data[2] = g;
417     data[3] = b;
418
419     data += 4;
420     size -= 4;
421   }
422 }
423
424 #define transform_bgra_abgr transform_rgba_argb
425
426 static gboolean
427 gst_alpha_color_set_caps (GstBaseTransform * btrans, GstCaps * incaps,
428     GstCaps * outcaps)
429 {
430   GstAlphaColor *alpha = GST_ALPHA_COLOR (btrans);
431   gboolean ret;
432   gint w, h;
433   gint w2, h2;
434   GstVideoFormat in_format, out_format;
435   const gchar *matrix;
436   gboolean in_sdtv, out_sdtv;
437
438   alpha->process = NULL;
439   alpha->matrix = NULL;
440
441   ret = gst_video_format_parse_caps (incaps, &in_format, &w, &h);
442   ret &= gst_video_format_parse_caps (outcaps, &out_format, &w2, &h2);
443
444   if (!ret || w != w2 || h != h2) {
445     GST_DEBUG_OBJECT (alpha, "incomplete or invalid caps!");
446     return FALSE;
447   }
448
449   matrix = gst_video_parse_caps_color_matrix (incaps);
450   in_sdtv = matrix ? g_str_equal (matrix, "sdtv") : TRUE;
451   matrix = gst_video_parse_caps_color_matrix (outcaps);
452   out_sdtv = matrix ? g_str_equal (matrix, "sdtv") : TRUE;
453
454   alpha->in_format = in_format;
455   alpha->out_format = out_format;
456   alpha->width = w;
457   alpha->height = h;
458
459   switch (alpha->in_format) {
460     case GST_VIDEO_FORMAT_ARGB:
461       switch (alpha->out_format) {
462         case GST_VIDEO_FORMAT_ARGB:
463           alpha->process = NULL;
464           alpha->matrix = NULL;
465           break;
466         case GST_VIDEO_FORMAT_BGRA:
467           alpha->process = transform_argb_bgra;
468           alpha->matrix = NULL;
469           break;
470         case GST_VIDEO_FORMAT_ABGR:
471           alpha->process = transform_argb_abgr;
472           alpha->matrix = NULL;
473           break;
474         case GST_VIDEO_FORMAT_RGBA:
475           alpha->process = transform_argb_rgba;
476           alpha->matrix = NULL;
477           break;
478         case GST_VIDEO_FORMAT_AYUV:
479           alpha->process = transform_argb_ayuv;
480           alpha->matrix =
481               out_sdtv ? cog_rgb_to_ycbcr_matrix_8bit_sdtv :
482               cog_rgb_to_ycbcr_matrix_8bit_hdtv;
483           break;
484         default:
485           alpha->process = NULL;
486           alpha->matrix = NULL;
487           break;
488       }
489       break;
490     case GST_VIDEO_FORMAT_BGRA:
491       switch (alpha->out_format) {
492         case GST_VIDEO_FORMAT_BGRA:
493           alpha->process = NULL;
494           alpha->matrix = NULL;
495           break;
496         case GST_VIDEO_FORMAT_ARGB:
497           alpha->process = transform_bgra_argb;
498           alpha->matrix = NULL;
499           break;
500         case GST_VIDEO_FORMAT_ABGR:
501           alpha->process = transform_bgra_abgr;
502           alpha->matrix = NULL;
503           break;
504         case GST_VIDEO_FORMAT_RGBA:
505           alpha->process = transform_bgra_rgba;
506           alpha->matrix = NULL;
507           break;
508         case GST_VIDEO_FORMAT_AYUV:
509           alpha->process = transform_bgra_ayuv;
510           alpha->matrix =
511               out_sdtv ? cog_rgb_to_ycbcr_matrix_8bit_sdtv :
512               cog_rgb_to_ycbcr_matrix_8bit_hdtv;
513           break;
514         default:
515           alpha->process = NULL;
516           alpha->matrix = NULL;
517           break;
518       }
519       break;
520     case GST_VIDEO_FORMAT_ABGR:
521       switch (alpha->out_format) {
522         case GST_VIDEO_FORMAT_ABGR:
523           alpha->process = NULL;
524           alpha->matrix = NULL;
525           break;
526         case GST_VIDEO_FORMAT_RGBA:
527           alpha->process = transform_abgr_rgba;
528           alpha->matrix = NULL;
529           break;
530         case GST_VIDEO_FORMAT_ARGB:
531           alpha->process = transform_abgr_argb;
532           alpha->matrix = NULL;
533           break;
534         case GST_VIDEO_FORMAT_BGRA:
535           alpha->process = transform_abgr_bgra;
536           alpha->matrix = NULL;
537           break;
538         case GST_VIDEO_FORMAT_AYUV:
539           alpha->process = transform_abgr_ayuv;
540           alpha->matrix =
541               out_sdtv ? cog_rgb_to_ycbcr_matrix_8bit_sdtv :
542               cog_rgb_to_ycbcr_matrix_8bit_hdtv;
543           break;
544         default:
545           alpha->process = NULL;
546           alpha->matrix = NULL;
547           break;
548       }
549       break;
550     case GST_VIDEO_FORMAT_RGBA:
551       switch (alpha->out_format) {
552         case GST_VIDEO_FORMAT_RGBA:
553           alpha->process = NULL;
554           alpha->matrix = NULL;
555           break;
556         case GST_VIDEO_FORMAT_ARGB:
557           alpha->process = transform_rgba_argb;
558           alpha->matrix = NULL;
559           break;
560         case GST_VIDEO_FORMAT_ABGR:
561           alpha->process = transform_rgba_abgr;
562           alpha->matrix = NULL;
563           break;
564         case GST_VIDEO_FORMAT_BGRA:
565           alpha->process = transform_rgba_bgra;
566           alpha->matrix = NULL;
567           break;
568         case GST_VIDEO_FORMAT_AYUV:
569           alpha->process = transform_rgba_ayuv;
570           alpha->matrix =
571               out_sdtv ? cog_rgb_to_ycbcr_matrix_8bit_sdtv :
572               cog_rgb_to_ycbcr_matrix_8bit_hdtv;
573           break;
574         default:
575           alpha->process = NULL;
576           alpha->matrix = NULL;
577           break;
578       }
579       break;
580     case GST_VIDEO_FORMAT_AYUV:
581       switch (alpha->out_format) {
582         case GST_VIDEO_FORMAT_AYUV:
583           if (in_sdtv == out_sdtv) {
584             alpha->process = transform_ayuv_ayuv;
585             alpha->matrix = NULL;
586           } else {
587             alpha->process = transform_ayuv_ayuv;
588             alpha->matrix =
589                 out_sdtv ? cog_ycbcr_hdtv_to_ycbcr_sdtv_matrix_8bit :
590                 cog_ycbcr_sdtv_to_ycbcr_hdtv_matrix_8bit;
591           }
592           break;
593         case GST_VIDEO_FORMAT_ARGB:
594           alpha->process = transform_ayuv_argb;
595           alpha->matrix =
596               in_sdtv ? cog_ycbcr_to_rgb_matrix_8bit_sdtv :
597               cog_ycbcr_to_rgb_matrix_8bit_hdtv;
598           break;
599         case GST_VIDEO_FORMAT_BGRA:
600           alpha->process = transform_ayuv_bgra;
601           alpha->matrix =
602               in_sdtv ? cog_ycbcr_to_rgb_matrix_8bit_sdtv :
603               cog_ycbcr_to_rgb_matrix_8bit_hdtv;
604           break;
605         case GST_VIDEO_FORMAT_ABGR:
606           alpha->process = transform_ayuv_abgr;
607           alpha->matrix =
608               in_sdtv ? cog_ycbcr_to_rgb_matrix_8bit_sdtv :
609               cog_ycbcr_to_rgb_matrix_8bit_hdtv;
610           break;
611         case GST_VIDEO_FORMAT_RGBA:
612           alpha->process = transform_ayuv_rgba;
613           alpha->matrix =
614               in_sdtv ? cog_ycbcr_to_rgb_matrix_8bit_sdtv :
615               cog_ycbcr_to_rgb_matrix_8bit_hdtv;
616           break;
617         default:
618           alpha->process = NULL;
619           alpha->matrix = NULL;
620           break;
621       }
622       break;
623     default:
624       alpha->process = NULL;
625       alpha->matrix = NULL;
626       break;
627   }
628
629   if (in_format == out_format && in_sdtv == out_sdtv)
630     gst_base_transform_set_passthrough (btrans, TRUE);
631   else if (!alpha->process)
632     return FALSE;
633
634   return TRUE;
635 }
636
637 static GstFlowReturn
638 gst_alpha_color_transform_ip (GstBaseTransform * btrans, GstBuffer * inbuf)
639 {
640   GstAlphaColor *alpha = GST_ALPHA_COLOR (btrans);
641
642   if (G_UNLIKELY (GST_BUFFER_SIZE (inbuf) != 4 * alpha->width * alpha->height)) {
643     GST_ERROR_OBJECT (alpha, "Invalid buffer size (was %u, expected %u)",
644         GST_BUFFER_SIZE (inbuf), alpha->width * alpha->height);
645     return GST_FLOW_ERROR;
646   }
647
648   if (gst_base_transform_is_passthrough (btrans))
649     return GST_FLOW_OK;
650
651   if (G_UNLIKELY (!alpha->process)) {
652     GST_ERROR_OBJECT (alpha, "Not negotiated yet");
653     return GST_FLOW_NOT_NEGOTIATED;
654   }
655
656   /* Transform in place */
657   alpha->process (GST_BUFFER_DATA (inbuf), GST_BUFFER_SIZE (inbuf),
658       alpha->matrix);
659
660   return GST_FLOW_OK;
661 }
662
663 static gboolean
664 plugin_init (GstPlugin * plugin)
665 {
666   return gst_element_register (plugin, "alphacolor", GST_RANK_NONE,
667       GST_TYPE_ALPHA_COLOR);
668 }
669
670 GST_PLUGIN_DEFINE (GST_VERSION_MAJOR,
671     GST_VERSION_MINOR,
672     "alphacolor",
673     "RGBA from/to AYUV colorspace conversion preserving the alpha channel",
674     plugin_init, VERSION, GST_LICENSE, GST_PACKAGE_NAME, GST_PACKAGE_ORIGIN)