efl
213 строк · 7.2 Кб
1#ifdef HAVE_CONFIG_H
2# include "config.h"
3#endif
4
5#include "emotion_gstreamer.h"
6
7static inline void
8_evas_video_bgrx_step(unsigned char *evas_data, const unsigned char *gst_data,
9unsigned int w, unsigned int h EINA_UNUSED,
10unsigned int output_height, unsigned int step)
11{
12unsigned int x, y;
13
14for (y = 0; y < output_height; ++y)
15{
16for (x = 0; x < w; x++)
17{
18evas_data[0] = gst_data[0];
19evas_data[1] = gst_data[1];
20evas_data[2] = gst_data[2];
21evas_data[3] = 255;
22gst_data += step;
23evas_data += 4;
24}
25}
26}
27
28static void
29_evas_video_bgr(unsigned char *evas_data, const unsigned char *gst_data,
30unsigned int w, unsigned int h, unsigned int output_height,
31Emotion_Convert_Info *info EINA_UNUSED)
32{
33// XXX: need to check offset and stride that gst provide and what they
34// mean with a non-planar format like bgra
35_evas_video_bgrx_step(evas_data, gst_data, w, h, output_height, 3);
36}
37
38static void
39_evas_video_bgrx(unsigned char *evas_data, const unsigned char *gst_data,
40unsigned int w, unsigned int h, unsigned int output_height,
41Emotion_Convert_Info *info EINA_UNUSED)
42{
43// XXX: need to check offset and stride that gst provide and what they
44// mean with a non-planar format like bgra
45_evas_video_bgrx_step(evas_data, gst_data, w, h, output_height, 4);
46}
47
48static void
49_evas_video_bgra(unsigned char *evas_data, const unsigned char *gst_data,
50unsigned int w, unsigned int h EINA_UNUSED,
51unsigned int output_height,
52Emotion_Convert_Info *info EINA_UNUSED)
53{
54unsigned int x, y;
55
56// XXX: need to check offset and stride that gst provide and what they
57// mean with a non-planar format like bgra
58for (y = 0; y < output_height; ++y)
59{
60unsigned char alpha;
61
62for (x = 0; x < w; ++x)
63{
64alpha = gst_data[3];
65evas_data[0] = (gst_data[0] * alpha) / 255;
66evas_data[1] = (gst_data[1] * alpha) / 255;
67evas_data[2] = (gst_data[2] * alpha) / 255;
68evas_data[3] = alpha;
69gst_data += 4;
70evas_data += 4;
71}
72}
73}
74
75static void
76_evas_video_i420(unsigned char *evas_data,
77const unsigned char *gst_data EINA_UNUSED,
78unsigned int w EINA_UNUSED, unsigned int h EINA_UNUSED,
79unsigned int output_height,
80Emotion_Convert_Info *info)
81{
82const unsigned char **rows, *ptr;
83unsigned int i, j, jump, rh;
84
85if (info->bpp[0] != 1) ERR("Plane 0 bpp != 1");
86if (info->bpp[1] != 1) ERR("Plane 1 bpp != 1");
87if (info->bpp[2] != 1) ERR("Plane 2 bpp != 1");
88
89rh = output_height;
90rows = (const unsigned char **)evas_data;
91
92ptr = info->plane_ptr[0];
93jump = info->stride[0];
94for (i = 0; i < rh; i++, ptr += jump) rows[i] = ptr;
95
96ptr = info->plane_ptr[1];
97jump = info->stride[1];
98for (j = 0; j < (rh / 2); j++, i++, ptr += jump) rows[i] = ptr;
99
100ptr = info->plane_ptr[2];
101jump = info->stride[2];
102for (j = 0; j < (rh / 2); j++, i++, ptr += jump) rows[i] = ptr;
103}
104
105static void
106_evas_video_yv12(unsigned char *evas_data,
107const unsigned char *gst_data EINA_UNUSED,
108unsigned int w EINA_UNUSED, unsigned int h EINA_UNUSED,
109unsigned int output_height,
110Emotion_Convert_Info *info)
111{
112const unsigned char **rows, *ptr;
113unsigned int i, j, jump, rh;
114
115if (info->bpp[0] != 1) ERR("Plane 0 bpp != 1");
116if (info->bpp[1] != 1) ERR("Plane 1 bpp != 1");
117if (info->bpp[2] != 1) ERR("Plane 2 bpp != 1");
118
119rh = output_height;
120rows = (const unsigned char **)evas_data;
121
122ptr = info->plane_ptr[0];
123jump = info->stride[0];
124for (i = 0; i < rh; i++, ptr += jump) rows[i] = ptr;
125
126ptr = info->plane_ptr[1];
127jump = info->stride[1];
128for (j = 0; j < (rh / 2); j++, i++, ptr += jump) rows[i] = ptr;
129
130ptr = info->plane_ptr[2];
131jump = info->stride[2];
132for (j = 0; j < (rh / 2); j++, i++, ptr += jump) rows[i] = ptr;
133}
134
135static void
136_evas_video_yuy2(unsigned char *evas_data, const unsigned char *gst_data,
137unsigned int w, unsigned int h EINA_UNUSED,
138unsigned int output_height,
139Emotion_Convert_Info *info EINA_UNUSED)
140{
141const unsigned char **rows;
142unsigned int i, stride;
143
144// XXX: need to check offset and stride that gst provide and what they
145// mean with a non-planar format like yuy2
146rows = (const unsigned char **)evas_data;
147
148stride = GST_ROUND_UP_4(w * 2);
149
150for (i = 0; i < output_height; i++) rows[i] = &gst_data[i * stride];
151}
152
153static void
154_evas_video_nv12(unsigned char *evas_data,
155const unsigned char *gst_data EINA_UNUSED,
156unsigned int w EINA_UNUSED, unsigned int h EINA_UNUSED,
157unsigned int output_height, Emotion_Convert_Info *info)
158{
159const unsigned char **rows, *ptr;
160unsigned int i, j, jump, rh;
161
162if (info->bpp[0] != 1) ERR("Plane 0 bpp != 1");
163// XXX: not sure this should be 1 but 2 bytes per pixel... no?
164//if (info->bpp[1] != 1) ERR("Plane 1 bpp != 1");
165
166rh = output_height;
167rows = (const unsigned char **)evas_data;
168
169ptr = info->plane_ptr[0];
170jump = info->stride[0];
171for (i = 0; i < rh; i++, ptr += jump) rows[i] = ptr;
172
173ptr = info->plane_ptr[1];
174jump = info->stride[1];
175for (j = 0; j < (rh / 2); j++, i++, ptr += jump) rows[i] = ptr;
176}
177
178const ColorSpace_Format_Convertion colorspace_format_convertion[] = {
179{ "I420-709", GST_VIDEO_FORMAT_I420, GST_VIDEO_COLOR_MATRIX_BT709,
180EVAS_COLORSPACE_YCBCR422P709_PL, _evas_video_i420, EINA_TRUE },
181{ "I420", GST_VIDEO_FORMAT_I420, GST_VIDEO_COLOR_MATRIX_BT601,
182EVAS_COLORSPACE_YCBCR422P601_PL, _evas_video_i420, EINA_TRUE },
183
184{ "YV12-709", GST_VIDEO_FORMAT_YV12, GST_VIDEO_COLOR_MATRIX_BT709,
185EVAS_COLORSPACE_YCBCR422P709_PL, _evas_video_yv12, EINA_TRUE },
186{ "YV12", GST_VIDEO_FORMAT_YV12, GST_VIDEO_COLOR_MATRIX_BT601,
187EVAS_COLORSPACE_YCBCR422P601_PL, _evas_video_yv12, EINA_TRUE },
188
189{ "YUY2", GST_VIDEO_FORMAT_YUY2, GST_VIDEO_COLOR_MATRIX_BT601,
190EVAS_COLORSPACE_YCBCR422601_PL, _evas_video_yuy2, EINA_FALSE },
191{ "NV12", GST_VIDEO_FORMAT_NV12, GST_VIDEO_COLOR_MATRIX_BT601,
192EVAS_COLORSPACE_YCBCR420NV12601_PL, _evas_video_nv12, EINA_TRUE },
193// XXX:
194// XXX: need to add nv12 709 colorspace support to evas itself.
195// XXX: this makes gst streams work when they are nv12 709 but maybe
196// XXX: will display in slightly off color.. but in the end this needs
197// XXX: fixing to display correctly.
198// XXX:
199{ "NV12-709", GST_VIDEO_FORMAT_NV12, GST_VIDEO_COLOR_MATRIX_BT709,
200EVAS_COLORSPACE_YCBCR420NV12601_PL, _evas_video_nv12, EINA_TRUE },
201// XXX:
202// XXX:
203// XXX:
204
205{ "BGR", GST_VIDEO_FORMAT_BGR, GST_VIDEO_COLOR_MATRIX_UNKNOWN,
206EVAS_COLORSPACE_ARGB8888, _evas_video_bgr, EINA_FALSE },
207{ "BGRx", GST_VIDEO_FORMAT_BGRx, GST_VIDEO_COLOR_MATRIX_UNKNOWN,
208EVAS_COLORSPACE_ARGB8888, _evas_video_bgrx, EINA_FALSE },
209{ "BGRA", GST_VIDEO_FORMAT_BGRA, GST_VIDEO_COLOR_MATRIX_UNKNOWN,
210EVAS_COLORSPACE_ARGB8888, _evas_video_bgra, EINA_FALSE },
211
212{ NULL, 0, 0, 0, NULL, 0 }
213};
214
215