efl

Форк
0
/
emotion_convert.c 
213 строк · 7.2 Кб
1
#ifdef HAVE_CONFIG_H
2
# include "config.h"
3
#endif
4

5
#include "emotion_gstreamer.h"
6

7
static inline void
8
_evas_video_bgrx_step(unsigned char *evas_data, const unsigned char *gst_data,
9
                      unsigned int w, unsigned int h EINA_UNUSED,
10
                      unsigned int output_height, unsigned int step)
11
{
12
   unsigned int x, y;
13

14
   for (y = 0; y < output_height; ++y)
15
     {
16
        for (x = 0; x < w; x++)
17
          {
18
             evas_data[0] = gst_data[0];
19
             evas_data[1] = gst_data[1];
20
             evas_data[2] = gst_data[2];
21
             evas_data[3] = 255;
22
             gst_data += step;
23
             evas_data += 4;
24
          }
25
     }
26
}
27

28
static void
29
_evas_video_bgr(unsigned char *evas_data, const unsigned char *gst_data,
30
                unsigned int w, unsigned int h, unsigned int output_height,
31
                Emotion_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

38
static void
39
_evas_video_bgrx(unsigned char *evas_data, const unsigned char *gst_data,
40
                 unsigned int w, unsigned int h, unsigned int output_height,
41
                 Emotion_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

48
static void
49
_evas_video_bgra(unsigned char *evas_data, const unsigned char *gst_data,
50
                 unsigned int w, unsigned int h EINA_UNUSED,
51
                 unsigned int output_height,
52
                 Emotion_Convert_Info *info EINA_UNUSED)
53
{
54
   unsigned 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
58
   for (y = 0; y < output_height; ++y)
59
     {
60
        unsigned char alpha;
61

62
        for (x = 0; x < w; ++x)
63
          {
64
             alpha = gst_data[3];
65
             evas_data[0] = (gst_data[0] * alpha) / 255;
66
             evas_data[1] = (gst_data[1] * alpha) / 255;
67
             evas_data[2] = (gst_data[2] * alpha) / 255;
68
             evas_data[3] = alpha;
69
             gst_data += 4;
70
             evas_data += 4;
71
          }
72
     }
73
}
74

75
static void
76
_evas_video_i420(unsigned char *evas_data,
77
                 const unsigned char *gst_data EINA_UNUSED,
78
                 unsigned int w EINA_UNUSED, unsigned int h EINA_UNUSED,
79
                 unsigned int output_height,
80
                 Emotion_Convert_Info *info)
81
{
82
   const unsigned char **rows, *ptr;
83
   unsigned int i, j, jump, rh;
84

85
   if (info->bpp[0] != 1) ERR("Plane 0 bpp != 1");
86
   if (info->bpp[1] != 1) ERR("Plane 1 bpp != 1");
87
   if (info->bpp[2] != 1) ERR("Plane 2 bpp != 1");
88

89
   rh = output_height;
90
   rows = (const unsigned char **)evas_data;
91

92
   ptr = info->plane_ptr[0];
93
   jump = info->stride[0];
94
   for (i = 0; i < rh; i++, ptr += jump) rows[i] = ptr;
95

96
   ptr = info->plane_ptr[1];
97
   jump = info->stride[1];
98
   for (j = 0; j < (rh / 2); j++, i++, ptr += jump) rows[i] = ptr;
99

100
   ptr = info->plane_ptr[2];
101
   jump = info->stride[2];
102
   for (j = 0; j < (rh / 2); j++, i++, ptr += jump) rows[i] = ptr;
103
}
104

105
static void
106
_evas_video_yv12(unsigned char *evas_data,
107
                 const unsigned char *gst_data EINA_UNUSED,
108
                 unsigned int w EINA_UNUSED, unsigned int h EINA_UNUSED,
109
                 unsigned int output_height,
110
                 Emotion_Convert_Info *info)
111
{
112
   const unsigned char **rows, *ptr;
113
   unsigned int i, j, jump, rh;
114

115
   if (info->bpp[0] != 1) ERR("Plane 0 bpp != 1");
116
   if (info->bpp[1] != 1) ERR("Plane 1 bpp != 1");
117
   if (info->bpp[2] != 1) ERR("Plane 2 bpp != 1");
118

119
   rh = output_height;
120
   rows = (const unsigned char **)evas_data;
121

122
   ptr = info->plane_ptr[0];
123
   jump = info->stride[0];
124
   for (i = 0; i < rh; i++, ptr += jump) rows[i] = ptr;
125

126
   ptr = info->plane_ptr[1];
127
   jump = info->stride[1];
128
   for (j = 0; j < (rh / 2); j++, i++, ptr += jump) rows[i] = ptr;
129

130
   ptr = info->plane_ptr[2];
131
   jump = info->stride[2];
132
   for (j = 0; j < (rh / 2); j++, i++, ptr += jump) rows[i] = ptr;
133
}
134

135
static void
136
_evas_video_yuy2(unsigned char *evas_data, const unsigned char *gst_data,
137
                 unsigned int w, unsigned int h EINA_UNUSED,
138
                 unsigned int output_height,
139
                 Emotion_Convert_Info *info EINA_UNUSED)
140
{
141
   const unsigned char **rows;
142
   unsigned 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
146
   rows = (const unsigned char **)evas_data;
147

148
   stride = GST_ROUND_UP_4(w * 2);
149

150
   for (i = 0; i < output_height; i++) rows[i] = &gst_data[i * stride];
151
}
152

153
static void
154
_evas_video_nv12(unsigned char *evas_data,
155
                 const unsigned char *gst_data EINA_UNUSED,
156
                 unsigned int w EINA_UNUSED, unsigned int h EINA_UNUSED,
157
                 unsigned int output_height, Emotion_Convert_Info *info)
158
{
159
   const unsigned char **rows, *ptr;
160
   unsigned int i, j, jump, rh;
161

162
   if (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

166
   rh = output_height;
167
   rows = (const unsigned char **)evas_data;
168

169
   ptr = info->plane_ptr[0];
170
   jump = info->stride[0];
171
   for (i = 0; i < rh; i++, ptr += jump) rows[i] = ptr;
172

173
   ptr = info->plane_ptr[1];
174
   jump = info->stride[1];
175
   for (j = 0; j < (rh / 2); j++, i++, ptr += jump) rows[i] = ptr;
176
}
177

178
const ColorSpace_Format_Convertion colorspace_format_convertion[] = {
179
  { "I420-709", GST_VIDEO_FORMAT_I420, GST_VIDEO_COLOR_MATRIX_BT709,
180
     EVAS_COLORSPACE_YCBCR422P709_PL, _evas_video_i420, EINA_TRUE },
181
  { "I420", GST_VIDEO_FORMAT_I420, GST_VIDEO_COLOR_MATRIX_BT601,
182
     EVAS_COLORSPACE_YCBCR422P601_PL, _evas_video_i420, EINA_TRUE },
183

184
  { "YV12-709", GST_VIDEO_FORMAT_YV12, GST_VIDEO_COLOR_MATRIX_BT709,
185
     EVAS_COLORSPACE_YCBCR422P709_PL, _evas_video_yv12, EINA_TRUE },
186
  { "YV12", GST_VIDEO_FORMAT_YV12, GST_VIDEO_COLOR_MATRIX_BT601,
187
     EVAS_COLORSPACE_YCBCR422P601_PL, _evas_video_yv12, EINA_TRUE },
188

189
  { "YUY2", GST_VIDEO_FORMAT_YUY2, GST_VIDEO_COLOR_MATRIX_BT601,
190
     EVAS_COLORSPACE_YCBCR422601_PL, _evas_video_yuy2, EINA_FALSE },
191
  { "NV12", GST_VIDEO_FORMAT_NV12, GST_VIDEO_COLOR_MATRIX_BT601,
192
     EVAS_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,
200
     EVAS_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,
206
     EVAS_COLORSPACE_ARGB8888, _evas_video_bgr, EINA_FALSE },
207
  { "BGRx", GST_VIDEO_FORMAT_BGRx, GST_VIDEO_COLOR_MATRIX_UNKNOWN,
208
     EVAS_COLORSPACE_ARGB8888, _evas_video_bgrx, EINA_FALSE },
209
  { "BGRA", GST_VIDEO_FORMAT_BGRA, GST_VIDEO_COLOR_MATRIX_UNKNOWN,
210
     EVAS_COLORSPACE_ARGB8888, _evas_video_bgra, EINA_FALSE },
211

212
  { NULL, 0, 0, 0, NULL, 0 }
213
};
214

215

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.