emotion: minor cleanup.
[profile/ivi/emotion.git] / src / modules / gstreamer / emotion_convert.c
1 #include "emotion_gstreamer.h"
2
3 static inline void
4 _evas_video_bgrx_step(unsigned char *evas_data, const unsigned char *gst_data,
5                       unsigned int w, unsigned int h __UNUSED__, unsigned int output_height, unsigned int step)
6 {
7    unsigned int x;
8    unsigned int y;
9
10    for (y = 0; y < output_height; ++y)
11      {
12         for (x = 0; x < w; x++)
13           {
14              evas_data[0] = gst_data[0];
15              evas_data[1] = gst_data[1];
16              evas_data[2] = gst_data[2];
17              evas_data[3] = 255;
18              gst_data += step;
19              evas_data += 4;
20           }
21      }
22 }
23
24 static void
25 _evas_video_bgr(unsigned char *evas_data, const unsigned char *gst_data, unsigned int w, unsigned int h, unsigned int output_height)
26 {
27    _evas_video_bgrx_step(evas_data, gst_data, w, h, output_height, 3);
28 }
29
30 static void
31 _evas_video_bgrx(unsigned char *evas_data, const unsigned char *gst_data, unsigned int w, unsigned int h, unsigned int output_height)
32 {
33    _evas_video_bgrx_step(evas_data, gst_data, w, h, output_height, 4);
34 }
35
36 static void
37 _evas_video_bgra(unsigned char *evas_data, const unsigned char *gst_data, unsigned int w, unsigned int h __UNUSED__, unsigned int output_height)
38 {
39    unsigned int x;
40    unsigned int y;
41
42    for (y = 0; y < output_height; ++y)
43      {
44         unsigned char alpha;
45
46         for (x = 0; x < w; ++x)
47           {
48              alpha = gst_data[3];
49              evas_data[0] = (gst_data[0] * alpha) / 255;
50              evas_data[1] = (gst_data[1] * alpha) / 255;
51              evas_data[2] = (gst_data[2] * alpha) / 255;
52              evas_data[3] = alpha;
53              gst_data += 4;
54              evas_data += 4;
55           }
56      }
57 }
58
59 static void
60 _evas_video_i420(unsigned char *evas_data, const unsigned char *gst_data, unsigned int w, unsigned int h __UNUSED__, unsigned int output_height)
61 {
62    const unsigned char **rows;
63    unsigned int i, j;
64    unsigned int rh;
65
66    rh = output_height;
67
68    rows = (const unsigned char **)evas_data;
69
70    for (i = 0; i < rh; i++)
71      rows[i] = &gst_data[i * w];
72
73    for (j = 0; j < (rh / 2); j++, i++)
74      rows[i] = &gst_data[h * w + j * (w / 2)];
75
76    for (j = 0; j < (rh / 2); j++, i++)
77      rows[i] = &gst_data[h * w + rh * (w / 4) + j * (w / 2)];
78 }
79
80 static void
81 _evas_video_yv12(unsigned char *evas_data, const unsigned char *gst_data, unsigned int w, unsigned int h __UNUSED__, unsigned int output_height)
82 {
83    const unsigned char **rows;
84    unsigned int i, j;
85    unsigned int rh;
86
87    rh = output_height;
88
89    rows = (const unsigned char **)evas_data;
90
91    for (i = 0; i < rh; i++)
92      rows[i] = &gst_data[i * w];
93
94    for (j = 0; j < (rh / 2); j++, i++)
95      rows[i] = &gst_data[h * w + rh * (w / 4) + j * (w / 2)];
96
97    for (j = 0; j < (rh / 2); j++, i++)
98      rows[i] = &gst_data[h * w + j * (w / 2)];
99 }
100
101 static void
102 _evas_video_yuy2(unsigned char *evas_data, const unsigned char *gst_data, unsigned int w, unsigned int h __UNUSED__, unsigned int output_height)
103 {
104    const unsigned char **rows;
105    unsigned int i;
106
107    rows = (const unsigned char **)evas_data;
108
109    for (i = 0; i < output_height; i++)
110      rows[i] = &gst_data[i * w * 2];
111 }
112
113 static void
114 _evas_video_nv12(unsigned char *evas_data, const unsigned char *gst_data, unsigned int w, unsigned int h __UNUSED__, unsigned int output_height)
115 {
116    const unsigned char **rows;
117    unsigned int i, j;
118    unsigned int rh;
119
120    rh = output_height;
121
122    rows = (const unsigned char **)evas_data;
123
124    for (i = 0; i < rh; i++)
125      rows[i] = &gst_data[i * w];
126
127    for (j = 0; j < (rh / 2); j++, i++)
128      rows[i] = &gst_data[rh * w + j * w];
129 }
130
131 static void
132 _evas_video_mt12(unsigned char *evas_data, const unsigned char *gst_data, unsigned int w, unsigned int h, unsigned int output_height __UNUSED__)
133 {
134    const unsigned char **rows;
135    unsigned int i;
136    unsigned int j;
137
138    rows = (const unsigned char **)evas_data;
139
140    for (i = 0; i < (h / 32) / 2; i++)
141      rows[i] = &gst_data[i * w * 2 * 32];
142
143    if ((h / 32) % 2)
144      {
145         rows[i] = &gst_data[i * w * 2 * 32];
146         i++;
147      }
148
149    for (j = 0; j < ((h / 2) / 32) / 2; ++j, ++i)
150      rows[i] = &gst_data[h * w + j * (w / 2) * 2 * 16];
151 }
152
153 void
154 _evas_video_st12_multiplane(unsigned char *evas_data, const unsigned char *gst_data, unsigned int w, unsigned int h, unsigned int output_height __UNUSED__)
155 {
156    const GstMultiPlaneImageBuffer *mp_buf = (const GstMultiPlaneImageBuffer *) gst_data;
157    const unsigned char **rows;
158    unsigned int i;
159    unsigned int j;
160
161    rows = (const unsigned char **)evas_data;
162
163    for (i = 0; i < (h / 32) / 2; i++)
164      rows[i] = mp_buf->uaddr[0] + i * w * 2 * 32;
165    if ((h / 32) % 2)
166      {
167         rows[i] = mp_buf->uaddr[0] + i * w * 2 * 32;
168         i++;
169      }
170
171    for (j = 0; j < ((h / 2) / 16) / 2; j++, i++)
172      {
173        rows[i] = mp_buf->uaddr[1] + j * w * 2 * 16 * 2;
174      }
175    if (((h / 2) / 16) % 2)
176      rows[i] = mp_buf->uaddr[1] + j * w * 2 * 16 * 2;
177 }
178
179 void
180 _evas_video_st12(unsigned char *evas_data, const unsigned char *gst_data, unsigned int w __UNUSED__, unsigned int h, unsigned int output_height __UNUSED__)
181 {
182    const SCMN_IMGB *imgb = (const SCMN_IMGB *) gst_data;
183    const unsigned char **rows;
184    unsigned int i, j;
185
186    rows = (const unsigned char **)evas_data;
187
188    for (i = 0; i < (h / 32) / 2; i++)
189      rows[i] = imgb->uaddr[0] + i * imgb->stride[0] * 2 * 32;
190    if ((h / 32) % 2)
191      {
192         rows[i] = imgb->uaddr[0] + i * imgb->stride[0] * 2 * 32;
193         i++;
194      }
195
196    for (j = 0; j < (unsigned int) imgb->elevation[1] / 32 / 2; j++, i++)
197      rows[i] = imgb->uaddr[1] + j * imgb->stride[1] * 32 * 2;
198    if ((imgb->elevation[1] / 32) % 2)
199      rows[i++] = imgb->uaddr[1] + j * imgb->stride[1] * 32 * 2;
200 }
201
202 const ColorSpace_FourCC_Convertion colorspace_fourcc_convertion[] = {
203   { "I420", GST_MAKE_FOURCC('I', '4', '2', '0'), EVAS_COLORSPACE_YCBCR422P601_PL, _evas_video_i420, EINA_TRUE },
204   { "YV12", GST_MAKE_FOURCC('Y', 'V', '1', '2'), EVAS_COLORSPACE_YCBCR422P601_PL, _evas_video_yv12, EINA_TRUE },
205   { "YUY2", GST_MAKE_FOURCC('Y', 'U', 'Y', '2'), EVAS_COLORSPACE_YCBCR422601_PL, _evas_video_yuy2, EINA_FALSE },
206   { "NV12", GST_MAKE_FOURCC('N', 'V', '1', '2'), EVAS_COLORSPACE_YCBCR420NV12601_PL, _evas_video_nv12, EINA_TRUE },
207   { "TM12", GST_MAKE_FOURCC('T', 'M', '1', '2'), EVAS_COLORSPACE_YCBCR420TM12601_PL, _evas_video_mt12, EINA_TRUE },
208   { NULL, 0, 0, NULL, 0 }
209 };
210
211 const ColorSpace_Format_Convertion colorspace_format_convertion[] = {
212   { "BGR", GST_VIDEO_FORMAT_BGR, EVAS_COLORSPACE_ARGB8888, _evas_video_bgr },
213   { "BGRx", GST_VIDEO_FORMAT_BGRx, EVAS_COLORSPACE_ARGB8888, _evas_video_bgrx },
214   { "BGRA", GST_VIDEO_FORMAT_BGRA, EVAS_COLORSPACE_ARGB8888, _evas_video_bgra },
215   { NULL, 0, 0, NULL }
216 };