1 |
commit: 1264d9379ac0b690f6948b4822cf0cdf81520bd8 |
2 |
Author: Daniel Diaz <ddiaz <AT> ti <DOT> com> |
3 |
AuthorDate: Fri Jan 28 21:47:50 2011 +0000 |
4 |
Commit: Raúl Porcel <armin76 <AT> gentoo <DOT> org> |
5 |
CommitDate: Tue Feb 22 23:16:57 2011 +0000 |
6 |
URL: http://git.overlays.gentoo.org/gitweb/?p=proj/pandaboard.git;a=commit;h=1264d937 |
7 |
|
8 |
Add ebuild for gst-plugins-good. |
9 |
|
10 |
This includes TI patches. |
11 |
|
12 |
Signed-off-by: Daniel Diaz <ddiaz <AT> ti.com> |
13 |
|
14 |
--- |
15 |
media-libs/gst-plugins-good/Manifest | 14 + |
16 |
...-v4l2-fix-handling-of-RGB32-BGR32-formats.patch | 53 ++ |
17 |
....10.27-0002-v4l2sink-Add-rotation-support.patch | 128 +++++ |
18 |
...t-0.10.27-0003-v4l2sink-Add-flip-property.patch | 187 +++++++ |
19 |
...2sink-Add-support-for-omap24xxvout-driver.patch | 59 ++ |
20 |
...v4l2sink-Add-support-for-omap_vout-driver.patch | 34 ++ |
21 |
...-0006-v4l2-increase-v4l2sink-element-rank.patch | 26 + |
22 |
...stQueryBuffers-to-get-buffer-requirements.patch | 97 ++++ |
23 |
.../gst-0.10.27-0008-add-rowstride-support.patch | 572 ++++++++++++++++++++ |
24 |
...27-0009-use-GstEventCrop-to-get-crop-info.patch | 119 ++++ |
25 |
.../files/gst-0.10.27-0010-v4l2-prefer-NV12.patch | 28 + |
26 |
...-v4l2sink-fix-issue-seen-with-autoconvert.patch | 49 ++ |
27 |
...sink-Disable-rotation-code-when-not-found.patch | 103 ++++ |
28 |
.../gst-plugins-good-0.10.27_p20110127.ebuild | 84 +++ |
29 |
14 files changed, 1553 insertions(+), 0 deletions(-) |
30 |
|
31 |
diff --git a/media-libs/gst-plugins-good/Manifest b/media-libs/gst-plugins-good/Manifest |
32 |
new file mode 100644 |
33 |
index 0000000..6f92a4e |
34 |
--- /dev/null |
35 |
+++ b/media-libs/gst-plugins-good/Manifest |
36 |
@@ -0,0 +1,14 @@ |
37 |
+AUX gst-0.10.27-0001-v4l2-fix-handling-of-RGB32-BGR32-formats.patch 1699 RMD160 ee58e52c89ed3ac10ece5f24b2607461f693abb3 SHA1 5f93921349aa383b9f9a70f1ce62128eda6d9411 SHA256 b99e9322ba836e6de4df144ff5a6454bb4175a84713a9610fce3ff83402f82d5 |
38 |
+AUX gst-0.10.27-0002-v4l2sink-Add-rotation-support.patch 4255 RMD160 fe2024baf7398c83cec0c0adfdd649733a967482 SHA1 483ec498ce795764475b7e486560ae43ac12737c SHA256 08595843b8fddb76661aaec9b3d84791edf72226dc323050ca94ed1aebc49949 |
39 |
+AUX gst-0.10.27-0003-v4l2sink-Add-flip-property.patch 5880 RMD160 1fc14e374dc56b52cc16d189c3b87e0508b323fb SHA1 8475701469ea33dc355a0a030dc20a5d9a2a0e2f SHA256 42864937012aaede7fbd0ebd78b06be6b6326f99a0770ec6ec6ac57426004445 |
40 |
+AUX gst-0.10.27-0004-v4l2sink-Add-support-for-omap24xxvout-driver.patch 2205 RMD160 da01e8eb31d528971113679984e51f9e7d7e0326 SHA1 07ad77fe137d8c4548320f582d3cc88928e943c2 SHA256 7cca5ec0adf3ac20c7a400bf209523c9135cadb9292cbd219b631d588a3800af |
41 |
+AUX gst-0.10.27-0005-v4l2sink-Add-support-for-omap_vout-driver.patch 1136 RMD160 2ba17fb3194790c60ab297a3cfbde4089575555d SHA1 f18af7103413df180b3eab08c4abe655d7a63ed3 SHA256 fa8486abf8bd9c12d2d29fe3077485e1ca77af9e39ef4a9b48a7d1ea696c2d85 |
42 |
+AUX gst-0.10.27-0006-v4l2-increase-v4l2sink-element-rank.patch 884 RMD160 5e18ee173f9749a46de9a146a4c6e0113f02281d SHA1 1bfab5660c9f5354eb6daed48a965824675bc07a SHA256 1cfcd14afba356fd6c6180b8f1018174e392d9cc9690870f5dd06918ef3454e5 |
43 |
+AUX gst-0.10.27-0007-use-GstQueryBuffers-to-get-buffer-requirements.patch 3392 RMD160 a7a197667a9fd0ca8d47125a8205f58f81e110cb SHA1 b650b0474355775a5bcb5b89090798e226786632 SHA256 5621c6c3c1a4a49c62faeffbe320e76a4c45d5ecf6c3ecb29adbe2eed25c64b4 |
44 |
+AUX gst-0.10.27-0008-add-rowstride-support.patch 20547 RMD160 cb4bf8074160cad277ba5754427a79cf42a139ed SHA1 60ac23640e799e558fce406e650ebe47b27645c4 SHA256 7ba17339344fe2f0b8e665cd1fd41e96c6543f2d38c4eeffbd071c6c2c21d407 |
45 |
+AUX gst-0.10.27-0009-use-GstEventCrop-to-get-crop-info.patch 4209 RMD160 7b827d6d1cb40f10bb25e0dedf8791884bd60bb5 SHA1 f1c47e70898c8480ce25e5ec6c90308c45cb77f7 SHA256 877141058a3662aa6c065003a048908eb5459206dd7d4cd68d46ba51bfd448a8 |
46 |
+AUX gst-0.10.27-0010-v4l2-prefer-NV12.patch 955 RMD160 1f8da679aa6562a8b7838a301dc98767f543ee12 SHA1 0fe801306c6dad176ef78f4269ecf99f6b270cb5 SHA256 2ddf29274b7f7d8b1ac1f2ed68c56485dddb000e82d12288e50b0acc12ffb0ec |
47 |
+AUX gst-0.10.27-0011-v4l2sink-fix-issue-seen-with-autoconvert.patch 1938 RMD160 edb01fb57a548a6a6af67f016eea16d47337d0e0 SHA1 c80bbe19a4f6ad44967d077e4ee109094b5061bd SHA256 ad26b737d21721882a6c0de9011ac30984450b4ba213dc5045e9dfff9d2180fc |
48 |
+AUX gst-0.10.27-0099-v4l2sink-Disable-rotation-code-when-not-found.patch 3484 RMD160 42b0d964871066c9203cdaf8aa79c4a08f8bef33 SHA1 2502fd3e41ecda556868785540d993e45872d7bc SHA256 a7981181b78cbbf2b717d2b09a177859a99f2a75f76f1c146549955d0bc300b9 |
49 |
+DIST gst-plugins-good-0.10.27.tar.bz2 3096221 RMD160 6486fca87a6394577ab1f0a4e94a19b1c3e2ca5e SHA1 49964ad3b8fbee9caa0b3fc437dd9169aafad79d SHA256 a9d801c3d42b456a6ebc0b95f68c44f153f756ec0fbd4877197c469cc67771fa |
50 |
+EBUILD gst-plugins-good-0.10.27_p20110127.ebuild 2912 RMD160 9b8e627d4d2383464f1090c97fc3dd68b9a2c4ba SHA1 f4392e673c6c878c505e2ab33072a54d1d9fd12f SHA256 203dfad6d89aaa3860810d0eefd6d518e0cbe91757542d28519e719e65a11327 |
51 |
|
52 |
diff --git a/media-libs/gst-plugins-good/files/gst-0.10.27-0001-v4l2-fix-handling-of-RGB32-BGR32-formats.patch b/media-libs/gst-plugins-good/files/gst-0.10.27-0001-v4l2-fix-handling-of-RGB32-BGR32-formats.patch |
53 |
new file mode 100644 |
54 |
index 0000000..f2d85ef |
55 |
--- /dev/null |
56 |
+++ b/media-libs/gst-plugins-good/files/gst-0.10.27-0001-v4l2-fix-handling-of-RGB32-BGR32-formats.patch |
57 |
@@ -0,0 +1,53 @@ |
58 |
+From 194aa8513c02fbfcabf04b45ff4c81bf8a94527f Mon Sep 17 00:00:00 2001 |
59 |
+From: Rob Clark <rob@××.com> |
60 |
+Date: Tue, 14 Sep 2010 07:42:50 -0500 |
61 |
+Subject: [PATCH 01/11] v4l2: fix handling of RGB32/BGR32 formats |
62 |
+ |
63 |
+bpp is 32, but depth is only 24.. |
64 |
+--- |
65 |
+ sys/v4l2/gstv4l2object.c | 12 +++++++----- |
66 |
+ 1 files changed, 7 insertions(+), 5 deletions(-) |
67 |
+ |
68 |
+diff --git a/sys/v4l2/gstv4l2object.c b/sys/v4l2/gstv4l2object.c |
69 |
+index 7e15489..f5672b5 100644 |
70 |
+--- a/sys/v4l2/gstv4l2object.c |
71 |
++++ b/sys/v4l2/gstv4l2object.c |
72 |
+@@ -1132,14 +1132,16 @@ gst_v4l2_object_v4l2fourcc_to_structure (guint32 fourcc) |
73 |
+ b_mask = 0xff0000; |
74 |
+ break; |
75 |
+ case V4L2_PIX_FMT_RGB32: |
76 |
+- bpp = depth = 32; |
77 |
++ depth = 24; |
78 |
++ bpp = 32; |
79 |
+ endianness = G_BIG_ENDIAN; |
80 |
+ r_mask = 0xff000000; |
81 |
+ g_mask = 0x00ff0000; |
82 |
+ b_mask = 0x0000ff00; |
83 |
+ break; |
84 |
+ case V4L2_PIX_FMT_BGR32: |
85 |
+- bpp = depth = 32; |
86 |
++ depth = 24; |
87 |
++ bpp = 32; |
88 |
+ endianness = G_BIG_ENDIAN; |
89 |
+ r_mask = 0x000000ff; |
90 |
+ g_mask = 0x0000ff00; |
91 |
+@@ -1404,13 +1406,13 @@ gst_v4l2_object_get_caps_info (GstV4l2Object * v4l2object, GstCaps * caps, |
92 |
+ #endif |
93 |
+ } |
94 |
+ } else if (!strcmp (mimetype, "video/x-raw-rgb")) { |
95 |
+- gint depth, endianness, r_mask; |
96 |
++ gint bpp, endianness, r_mask; |
97 |
+ |
98 |
+- gst_structure_get_int (structure, "depth", &depth); |
99 |
++ gst_structure_get_int (structure, "bpp", &bpp); |
100 |
+ gst_structure_get_int (structure, "endianness", &endianness); |
101 |
+ gst_structure_get_int (structure, "red_mask", &r_mask); |
102 |
+ |
103 |
+- switch (depth) { |
104 |
++ switch (bpp) { |
105 |
+ case 8: |
106 |
+ fourcc = V4L2_PIX_FMT_RGB332; |
107 |
+ break; |
108 |
+-- |
109 |
+1.7.1 |
110 |
+ |
111 |
|
112 |
diff --git a/media-libs/gst-plugins-good/files/gst-0.10.27-0002-v4l2sink-Add-rotation-support.patch b/media-libs/gst-plugins-good/files/gst-0.10.27-0002-v4l2sink-Add-rotation-support.patch |
113 |
new file mode 100644 |
114 |
index 0000000..11b777c |
115 |
--- /dev/null |
116 |
+++ b/media-libs/gst-plugins-good/files/gst-0.10.27-0002-v4l2sink-Add-rotation-support.patch |
117 |
@@ -0,0 +1,128 @@ |
118 |
+From d43a9444fc5f7655a8acd2978039667a04222ba0 Mon Sep 17 00:00:00 2001 |
119 |
+From: Kiran Nataraju <knataraju@××.com> |
120 |
+Date: Fri, 27 Aug 2010 09:00:57 +0200 |
121 |
+Subject: [PATCH 02/11] v4l2sink: Add rotation support. |
122 |
+ |
123 |
+Signed-off-by: Kiran Nataraju <knataraju@××.com> |
124 |
+Signed-off-by: Daniel Diaz <ddiaz@××.com> |
125 |
+--- |
126 |
+ sys/v4l2/gstv4l2sink.c | 34 ++++++++++++++++++++++++++++++++++ |
127 |
+ sys/v4l2/gstv4l2sink.h | 1 + |
128 |
+ 2 files changed, 35 insertions(+), 0 deletions(-) |
129 |
+ |
130 |
+diff --git a/sys/v4l2/gstv4l2sink.c b/sys/v4l2/gstv4l2sink.c |
131 |
+index aa6785c..5abf915 100644 |
132 |
+--- a/sys/v4l2/gstv4l2sink.c |
133 |
++++ b/sys/v4l2/gstv4l2sink.c |
134 |
+@@ -72,6 +72,10 @@ GST_DEBUG_CATEGORY (v4l2sink_debug); |
135 |
+ #define PROP_DEF_MIN_QUEUED_BUFS 1 |
136 |
+ #define DEFAULT_PROP_DEVICE "/dev/video1" |
137 |
+ |
138 |
++#define MIN_ROTATION_ANGLE 0 |
139 |
++#define MAX_ROTATION_ANGLE 360 |
140 |
++#define DEFAULT_ROTATION_ANGLE 0 |
141 |
++ |
142 |
+ enum |
143 |
+ { |
144 |
+ PROP_0, |
145 |
+@@ -86,6 +90,7 @@ enum |
146 |
+ PROP_CROP_LEFT, |
147 |
+ PROP_CROP_WIDTH, |
148 |
+ PROP_CROP_HEIGHT, |
149 |
++ PROP_ROTATION, |
150 |
+ }; |
151 |
+ |
152 |
+ |
153 |
+@@ -220,6 +225,7 @@ static GstFlowReturn gst_v4l2sink_buffer_alloc (GstBaseSink * bsink, |
154 |
+ guint64 offset, guint size, GstCaps * caps, GstBuffer ** buf); |
155 |
+ static GstFlowReturn gst_v4l2sink_show_frame (GstBaseSink * bsink, |
156 |
+ GstBuffer * buf); |
157 |
++static void gst_v4l2sink_set_rotation (GstV4l2Sink * v4l2sink); |
158 |
+ |
159 |
+ static void |
160 |
+ gst_v4l2sink_base_init (gpointer g_class) |
161 |
+@@ -306,6 +312,11 @@ gst_v4l2sink_class_init (GstV4l2SinkClass * klass) |
162 |
+ "The height of the video crop; default is equal to negotiated image height", |
163 |
+ 0, 0xffffffff, 0, G_PARAM_READWRITE)); |
164 |
+ |
165 |
++ g_object_class_install_property (gobject_class, PROP_ROTATION, |
166 |
++ g_param_spec_int ("rotation", "Rotation angle", |
167 |
++ "Rotation angle for the image", MIN_ROTATION_ANGLE, |
168 |
++ MAX_ROTATION_ANGLE, DEFAULT_ROTATION_ANGLE, G_PARAM_READWRITE)); |
169 |
++ |
170 |
+ basesink_class->get_caps = GST_DEBUG_FUNCPTR (gst_v4l2sink_get_caps); |
171 |
+ basesink_class->set_caps = GST_DEBUG_FUNCPTR (gst_v4l2sink_set_caps); |
172 |
+ basesink_class->buffer_alloc = GST_DEBUG_FUNCPTR (gst_v4l2sink_buffer_alloc); |
173 |
+@@ -336,6 +347,7 @@ gst_v4l2sink_init (GstV4l2Sink * v4l2sink, GstV4l2SinkClass * klass) |
174 |
+ v4l2sink->overlay_fields_set = 0; |
175 |
+ v4l2sink->crop_fields_set = 0; |
176 |
+ v4l2sink->state = 0; |
177 |
++ v4l2sink->rotation = 0; |
178 |
+ } |
179 |
+ |
180 |
+ |
181 |
+@@ -475,6 +487,20 @@ gst_v4l2sink_sync_crop_fields (GstV4l2Sink * v4l2sink) |
182 |
+ } |
183 |
+ } |
184 |
+ |
185 |
++static void |
186 |
++gst_v4l2sink_set_rotation (GstV4l2Sink * v4l2sink) |
187 |
++{ |
188 |
++ if (GST_V4L2_IS_OPEN (v4l2sink->v4l2object)) { |
189 |
++ struct v4l2_control control; |
190 |
++ gint fd = v4l2sink->v4l2object->video_fd; |
191 |
++ |
192 |
++ memset (&control, 0x00, sizeof (struct v4l2_control)); |
193 |
++ control.id = V4L2_CID_ROTATE; |
194 |
++ control.value = v4l2sink->rotation; |
195 |
++ g_return_if_fail (v4l2_ioctl (fd, VIDIOC_S_CTRL, &control) >= 0); |
196 |
++ } |
197 |
++} |
198 |
++ |
199 |
+ |
200 |
+ static void |
201 |
+ gst_v4l2sink_set_property (GObject * object, |
202 |
+@@ -531,6 +557,10 @@ gst_v4l2sink_set_property (GObject * object, |
203 |
+ v4l2sink->crop_fields_set |= RECT_HEIGHT_SET; |
204 |
+ gst_v4l2sink_sync_crop_fields (v4l2sink); |
205 |
+ break; |
206 |
++ case PROP_ROTATION: |
207 |
++ v4l2sink->rotation = g_value_get_int (value); |
208 |
++ gst_v4l2sink_set_rotation (v4l2sink); |
209 |
++ break; |
210 |
+ default: |
211 |
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); |
212 |
+ break; |
213 |
+@@ -578,6 +608,9 @@ gst_v4l2sink_get_property (GObject * object, |
214 |
+ case PROP_CROP_HEIGHT: |
215 |
+ g_value_set_uint (value, v4l2sink->crop.height); |
216 |
+ break; |
217 |
++ case PROP_ROTATION: |
218 |
++ g_value_set_int (value, v4l2sink->rotation); |
219 |
++ break; |
220 |
+ default: |
221 |
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); |
222 |
+ break; |
223 |
+@@ -600,6 +633,7 @@ gst_v4l2sink_change_state (GstElement * element, GstStateChange transition) |
224 |
+ /* open the device */ |
225 |
+ if (!gst_v4l2_object_start (v4l2sink->v4l2object)) |
226 |
+ return GST_STATE_CHANGE_FAILURE; |
227 |
++ gst_v4l2sink_set_rotation (v4l2sink); |
228 |
+ break; |
229 |
+ default: |
230 |
+ break; |
231 |
+diff --git a/sys/v4l2/gstv4l2sink.h b/sys/v4l2/gstv4l2sink.h |
232 |
+index 8fe8222..1239621 100644 |
233 |
+--- a/sys/v4l2/gstv4l2sink.h |
234 |
++++ b/sys/v4l2/gstv4l2sink.h |
235 |
+@@ -75,6 +75,7 @@ struct _GstV4l2Sink { |
236 |
+ guint8 overlay_fields_set, crop_fields_set; |
237 |
+ |
238 |
+ guint8 state; |
239 |
++ gint rotation; |
240 |
+ }; |
241 |
+ |
242 |
+ struct _GstV4l2SinkClass { |
243 |
+-- |
244 |
+1.7.1 |
245 |
+ |
246 |
|
247 |
diff --git a/media-libs/gst-plugins-good/files/gst-0.10.27-0003-v4l2sink-Add-flip-property.patch b/media-libs/gst-plugins-good/files/gst-0.10.27-0003-v4l2sink-Add-flip-property.patch |
248 |
new file mode 100644 |
249 |
index 0000000..9bdfa51 |
250 |
--- /dev/null |
251 |
+++ b/media-libs/gst-plugins-good/files/gst-0.10.27-0003-v4l2sink-Add-flip-property.patch |
252 |
@@ -0,0 +1,187 @@ |
253 |
+From 1381c64fd606d8ab7169eef52386139a4848c439 Mon Sep 17 00:00:00 2001 |
254 |
+From: Kiran Nataraju <knataraju@××.com> |
255 |
+Date: Tue, 21 Sep 2010 06:21:23 +0200 |
256 |
+Subject: [PATCH 03/11] v4l2sink: Add flip property. |
257 |
+MIME-Version: 1.0 |
258 |
+Content-Type: text/plain; charset=UTF-8 |
259 |
+Content-Transfer-Encoding: 8bit |
260 |
+ |
261 |
+Signed-off-by: Kiran Nataraju <knataraju@××.com> |
262 |
+Signed-off-by: Daniel Díaz <yosoy@××××××××××.org> |
263 |
+--- |
264 |
+ sys/v4l2/gstv4l2sink.c | 88 +++++++++++++++++++++++++++++++++++++++++++++-- |
265 |
+ sys/v4l2/gstv4l2sink.h | 1 + |
266 |
+ 2 files changed, 85 insertions(+), 4 deletions(-) |
267 |
+ |
268 |
+diff --git a/sys/v4l2/gstv4l2sink.c b/sys/v4l2/gstv4l2sink.c |
269 |
+index 5abf915..6163747 100644 |
270 |
+--- a/sys/v4l2/gstv4l2sink.c |
271 |
++++ b/sys/v4l2/gstv4l2sink.c |
272 |
+@@ -91,6 +91,7 @@ enum |
273 |
+ PROP_CROP_WIDTH, |
274 |
+ PROP_CROP_HEIGHT, |
275 |
+ PROP_ROTATION, |
276 |
++ PROP_FLIP, |
277 |
+ }; |
278 |
+ |
279 |
+ |
280 |
+@@ -129,6 +130,34 @@ gst_v4l2sink_iface_supported (GstImplementsInterface * iface, GType iface_type) |
281 |
+ return TRUE; |
282 |
+ } |
283 |
+ |
284 |
++/* |
285 |
++ * Flip state |
286 |
++ */ |
287 |
++enum |
288 |
++{ |
289 |
++ FLIP_NONE = 0, |
290 |
++ FLIP_HORIZONTAL = 1, |
291 |
++ FLIP_VERTICAL = 2, |
292 |
++}; |
293 |
++ |
294 |
++#define GST_TYPE_V4L2_FLIP (gst_v4l2_flip_get_type ()) |
295 |
++static GType |
296 |
++gst_v4l2_flip_get_type (void) |
297 |
++{ |
298 |
++ static GType type = 0; |
299 |
++ |
300 |
++ if (!type) { |
301 |
++ static GEnumValue vals[] = { |
302 |
++ {FLIP_NONE, "No Flip", "none"}, |
303 |
++ {FLIP_HORIZONTAL, "Horizontal Flip", "horiz"}, |
304 |
++ {FLIP_VERTICAL, "Vertical Flip", "vert"}, |
305 |
++ {0, NULL, NULL}, |
306 |
++ }; |
307 |
++ type = g_enum_register_static ("GstV4l2SinkFlip", vals); |
308 |
++ } |
309 |
++ return type; |
310 |
++} |
311 |
++ |
312 |
+ static void |
313 |
+ gst_v4l2sink_interface_init (GstImplementsInterfaceClass * klass) |
314 |
+ { |
315 |
+@@ -225,7 +254,7 @@ static GstFlowReturn gst_v4l2sink_buffer_alloc (GstBaseSink * bsink, |
316 |
+ guint64 offset, guint size, GstCaps * caps, GstBuffer ** buf); |
317 |
+ static GstFlowReturn gst_v4l2sink_show_frame (GstBaseSink * bsink, |
318 |
+ GstBuffer * buf); |
319 |
+-static void gst_v4l2sink_set_rotation (GstV4l2Sink * v4l2sink); |
320 |
++static void gst_v4l2sink_sync_rotation (GstV4l2Sink * v4l2sink); |
321 |
+ |
322 |
+ static void |
323 |
+ gst_v4l2sink_base_init (gpointer g_class) |
324 |
+@@ -317,6 +346,11 @@ gst_v4l2sink_class_init (GstV4l2SinkClass * klass) |
325 |
+ "Rotation angle for the image", MIN_ROTATION_ANGLE, |
326 |
+ MAX_ROTATION_ANGLE, DEFAULT_ROTATION_ANGLE, G_PARAM_READWRITE)); |
327 |
+ |
328 |
++ g_object_class_install_property (gobject_class, PROP_FLIP, |
329 |
++ g_param_spec_enum ("flip", "Flip State", |
330 |
++ "Flip horizontal/vertical", |
331 |
++ GST_TYPE_V4L2_FLIP, FLIP_NONE, G_PARAM_READWRITE)); |
332 |
++ |
333 |
+ basesink_class->get_caps = GST_DEBUG_FUNCPTR (gst_v4l2sink_get_caps); |
334 |
+ basesink_class->set_caps = GST_DEBUG_FUNCPTR (gst_v4l2sink_set_caps); |
335 |
+ basesink_class->buffer_alloc = GST_DEBUG_FUNCPTR (gst_v4l2sink_buffer_alloc); |
336 |
+@@ -348,8 +382,46 @@ gst_v4l2sink_init (GstV4l2Sink * v4l2sink, GstV4l2SinkClass * klass) |
337 |
+ v4l2sink->crop_fields_set = 0; |
338 |
+ v4l2sink->state = 0; |
339 |
+ v4l2sink->rotation = 0; |
340 |
++ v4l2sink->flip = FLIP_NONE; |
341 |
+ } |
342 |
+ |
343 |
++static void |
344 |
++gst_v4l2sink_sync_flip (GstV4l2Sink * v4l2sink) |
345 |
++{ |
346 |
++ if (GST_V4L2_IS_OPEN (v4l2sink->v4l2object)) { |
347 |
++ struct v4l2_control control; |
348 |
++ gint fd = v4l2sink->v4l2object->video_fd; |
349 |
++ |
350 |
++ memset (&control, 0x00, sizeof (struct v4l2_control)); |
351 |
++ |
352 |
++ switch (v4l2sink->flip) { |
353 |
++ case FLIP_VERTICAL: |
354 |
++ v4l2sink->rotation = 0; |
355 |
++ control.value = 1; |
356 |
++ break; |
357 |
++ case FLIP_HORIZONTAL: |
358 |
++ /* Horizontal Flip = Vertical Flip + 180 rotation */ |
359 |
++ v4l2sink->rotation = 180; |
360 |
++ control.value = 1; |
361 |
++ break; |
362 |
++ case FLIP_NONE: |
363 |
++ /* In the below switch case logic we need to handle FLIP_NONE |
364 |
++ * case since the v4l2 driver holds on to the last configured |
365 |
++ * flip value even after the device file is closed. |
366 |
++ */ |
367 |
++ control.value = 0; |
368 |
++ break; |
369 |
++ default: |
370 |
++ GST_WARNING_OBJECT (v4l2sink, "Invalid flip property"); |
371 |
++ control.value = 0; |
372 |
++ break; |
373 |
++ } |
374 |
++ |
375 |
++ gst_v4l2sink_sync_rotation (v4l2sink); |
376 |
++ control.id = V4L2_CID_VFLIP; |
377 |
++ g_return_if_fail (v4l2_ioctl (fd, VIDIOC_S_CTRL, &control) >= 0); |
378 |
++ } |
379 |
++} |
380 |
+ |
381 |
+ static void |
382 |
+ gst_v4l2sink_dispose (GObject * object) |
383 |
+@@ -488,7 +560,7 @@ gst_v4l2sink_sync_crop_fields (GstV4l2Sink * v4l2sink) |
384 |
+ } |
385 |
+ |
386 |
+ static void |
387 |
+-gst_v4l2sink_set_rotation (GstV4l2Sink * v4l2sink) |
388 |
++gst_v4l2sink_sync_rotation (GstV4l2Sink * v4l2sink) |
389 |
+ { |
390 |
+ if (GST_V4L2_IS_OPEN (v4l2sink->v4l2object)) { |
391 |
+ struct v4l2_control control; |
392 |
+@@ -559,7 +631,11 @@ gst_v4l2sink_set_property (GObject * object, |
393 |
+ break; |
394 |
+ case PROP_ROTATION: |
395 |
+ v4l2sink->rotation = g_value_get_int (value); |
396 |
+- gst_v4l2sink_set_rotation (v4l2sink); |
397 |
++ gst_v4l2sink_sync_rotation (v4l2sink); |
398 |
++ break; |
399 |
++ case PROP_FLIP: |
400 |
++ v4l2sink->flip = g_value_get_enum (value); |
401 |
++ gst_v4l2sink_sync_flip (v4l2sink); |
402 |
+ break; |
403 |
+ default: |
404 |
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); |
405 |
+@@ -611,6 +687,9 @@ gst_v4l2sink_get_property (GObject * object, |
406 |
+ case PROP_ROTATION: |
407 |
+ g_value_set_int (value, v4l2sink->rotation); |
408 |
+ break; |
409 |
++ case PROP_FLIP: |
410 |
++ g_value_set_enum (value, v4l2sink->flip); |
411 |
++ break; |
412 |
+ default: |
413 |
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); |
414 |
+ break; |
415 |
+@@ -633,7 +712,8 @@ gst_v4l2sink_change_state (GstElement * element, GstStateChange transition) |
416 |
+ /* open the device */ |
417 |
+ if (!gst_v4l2_object_start (v4l2sink->v4l2object)) |
418 |
+ return GST_STATE_CHANGE_FAILURE; |
419 |
+- gst_v4l2sink_set_rotation (v4l2sink); |
420 |
++ gst_v4l2sink_sync_rotation (v4l2sink); |
421 |
++ gst_v4l2sink_sync_flip (v4l2sink); |
422 |
+ break; |
423 |
+ default: |
424 |
+ break; |
425 |
+diff --git a/sys/v4l2/gstv4l2sink.h b/sys/v4l2/gstv4l2sink.h |
426 |
+index 1239621..907973a 100644 |
427 |
+--- a/sys/v4l2/gstv4l2sink.h |
428 |
++++ b/sys/v4l2/gstv4l2sink.h |
429 |
+@@ -76,6 +76,7 @@ struct _GstV4l2Sink { |
430 |
+ |
431 |
+ guint8 state; |
432 |
+ gint rotation; |
433 |
++ gint flip; |
434 |
+ }; |
435 |
+ |
436 |
+ struct _GstV4l2SinkClass { |
437 |
+-- |
438 |
+1.7.1 |
439 |
+ |
440 |
|
441 |
diff --git a/media-libs/gst-plugins-good/files/gst-0.10.27-0004-v4l2sink-Add-support-for-omap24xxvout-driver.patch b/media-libs/gst-plugins-good/files/gst-0.10.27-0004-v4l2sink-Add-support-for-omap24xxvout-driver.patch |
442 |
new file mode 100644 |
443 |
index 0000000..38601f8 |
444 |
--- /dev/null |
445 |
+++ b/media-libs/gst-plugins-good/files/gst-0.10.27-0004-v4l2sink-Add-support-for-omap24xxvout-driver.patch |
446 |
@@ -0,0 +1,59 @@ |
447 |
+From 39de525898eea073c1f2486b99b56ef25b6df289 Mon Sep 17 00:00:00 2001 |
448 |
+From: Rob Clark <rob@××.com> |
449 |
+Date: Sun, 4 Apr 2010 06:46:21 -0500 |
450 |
+Subject: [PATCH 04/11] v4l2sink: Add support for omap24xxvout driver |
451 |
+ |
452 |
+--- |
453 |
+ sys/v4l2/gstv4l2sink.c | 22 +++++++++++++++++++++- |
454 |
+ 1 files changed, 21 insertions(+), 1 deletions(-) |
455 |
+ |
456 |
+diff --git a/sys/v4l2/gstv4l2sink.c b/sys/v4l2/gstv4l2sink.c |
457 |
+index 6163747..4408428 100644 |
458 |
+--- a/sys/v4l2/gstv4l2sink.c |
459 |
++++ b/sys/v4l2/gstv4l2sink.c |
460 |
+@@ -888,6 +888,18 @@ gst_v4l2sink_buffer_alloc (GstBaseSink * bsink, guint64 offset, guint size, |
461 |
+ /* initialize the buffer pool if not initialized yet (first buffer): */ |
462 |
+ if (G_UNLIKELY (!v4l2sink->pool)) { |
463 |
+ |
464 |
++ gboolean no_pending_streamon = FALSE; |
465 |
++ char *driver = (char *) v4l2sink->v4l2object->vcap.driver; |
466 |
++ |
467 |
++ /* the omap24xxvout driver wants us to start streaming before we |
468 |
++ * queue the first buffer: |
469 |
++ */ |
470 |
++ if (!strcmp ("omap24xxvout", driver)) { |
471 |
++ GST_DEBUG_OBJECT (v4l2sink, |
472 |
++ "enabling no_pending_streamon hack for omap24xxvout driver"); |
473 |
++ no_pending_streamon = TRUE; |
474 |
++ } |
475 |
++ |
476 |
+ /* set_caps() might not be called yet.. so just to make sure: */ |
477 |
+ if (!gst_v4l2sink_set_caps (bsink, caps)) { |
478 |
+ return GST_FLOW_ERROR; |
479 |
+@@ -909,7 +921,14 @@ gst_v4l2sink_buffer_alloc (GstBaseSink * bsink, guint64 offset, guint size, |
480 |
+ gst_v4l2_xoverlay_prepare_xwindow_id (v4l2sink->v4l2object, TRUE); |
481 |
+ #endif |
482 |
+ |
483 |
+- v4l2sink->state = STATE_PENDING_STREAMON; |
484 |
++ if (no_pending_streamon) { |
485 |
++ if (!gst_v4l2_object_start_streaming (v4l2sink->v4l2object)) { |
486 |
++ return GST_FLOW_ERROR; |
487 |
++ } |
488 |
++ v4l2sink->state = STATE_STREAMING; |
489 |
++ } else { |
490 |
++ v4l2sink->state = STATE_PENDING_STREAMON; |
491 |
++ } |
492 |
+ |
493 |
+ GST_INFO_OBJECT (v4l2sink, "outputting buffers via mmap()"); |
494 |
+ |
495 |
+@@ -996,6 +1015,7 @@ gst_v4l2sink_show_frame (GstBaseSink * bsink, GstBuffer * buf) |
496 |
+ if (!gst_v4l2_buffer_pool_qbuf (v4l2sink->pool, GST_V4L2_BUFFER (buf))) { |
497 |
+ return GST_FLOW_ERROR; |
498 |
+ } |
499 |
++ |
500 |
+ if (v4l2sink->state == STATE_PENDING_STREAMON) { |
501 |
+ if (!gst_v4l2_object_start_streaming (v4l2sink->v4l2object)) { |
502 |
+ return GST_FLOW_ERROR; |
503 |
+-- |
504 |
+1.7.1 |
505 |
+ |
506 |
|
507 |
diff --git a/media-libs/gst-plugins-good/files/gst-0.10.27-0005-v4l2sink-Add-support-for-omap_vout-driver.patch b/media-libs/gst-plugins-good/files/gst-0.10.27-0005-v4l2sink-Add-support-for-omap_vout-driver.patch |
508 |
new file mode 100644 |
509 |
index 0000000..04b67bc |
510 |
--- /dev/null |
511 |
+++ b/media-libs/gst-plugins-good/files/gst-0.10.27-0005-v4l2sink-Add-support-for-omap_vout-driver.patch |
512 |
@@ -0,0 +1,34 @@ |
513 |
+From 1fabe36f40e872942c80041225bdbf41db561bea Mon Sep 17 00:00:00 2001 |
514 |
+From: Rob Clark <rob@××.com> |
515 |
+Date: Sun, 4 Apr 2010 06:47:55 -0500 |
516 |
+Subject: [PATCH 05/11] v4l2sink: Add support for omap_vout driver |
517 |
+ |
518 |
+--- |
519 |
+ sys/v4l2/gstv4l2sink.c | 11 +++++++++++ |
520 |
+ 1 files changed, 11 insertions(+), 0 deletions(-) |
521 |
+ |
522 |
+diff --git a/sys/v4l2/gstv4l2sink.c b/sys/v4l2/gstv4l2sink.c |
523 |
+index 4408428..66dda8e 100644 |
524 |
+--- a/sys/v4l2/gstv4l2sink.c |
525 |
++++ b/sys/v4l2/gstv4l2sink.c |
526 |
+@@ -900,6 +900,17 @@ gst_v4l2sink_buffer_alloc (GstBaseSink * bsink, guint64 offset, guint size, |
527 |
+ no_pending_streamon = TRUE; |
528 |
+ } |
529 |
+ |
530 |
++ /* workaround for bug in omap_vout driver, when we ask for more |
531 |
++ * than four buffers: |
532 |
++ */ |
533 |
++ if (!strcmp ("omap_vout", driver)) { |
534 |
++ if (v4l2sink->num_buffers > 4) { |
535 |
++ v4l2sink->num_buffers = 4; |
536 |
++ GST_DEBUG_OBJECT (v4l2sink, |
537 |
++ "limiting to 4 buffers to work-around omap_vout driver bug"); |
538 |
++ } |
539 |
++ } |
540 |
++ |
541 |
+ /* set_caps() might not be called yet.. so just to make sure: */ |
542 |
+ if (!gst_v4l2sink_set_caps (bsink, caps)) { |
543 |
+ return GST_FLOW_ERROR; |
544 |
+-- |
545 |
+1.7.1 |
546 |
+ |
547 |
|
548 |
diff --git a/media-libs/gst-plugins-good/files/gst-0.10.27-0006-v4l2-increase-v4l2sink-element-rank.patch b/media-libs/gst-plugins-good/files/gst-0.10.27-0006-v4l2-increase-v4l2sink-element-rank.patch |
549 |
new file mode 100644 |
550 |
index 0000000..8f5a21c |
551 |
--- /dev/null |
552 |
+++ b/media-libs/gst-plugins-good/files/gst-0.10.27-0006-v4l2-increase-v4l2sink-element-rank.patch |
553 |
@@ -0,0 +1,26 @@ |
554 |
+From 14d6f0fac0875981c418ac6577d23eafb5ff3f01 Mon Sep 17 00:00:00 2001 |
555 |
+From: Rob Clark <rob@××.com> |
556 |
+Date: Wed, 14 Apr 2010 03:29:20 -0500 |
557 |
+Subject: [PATCH 06/11] v4l2: increase v4l2sink element rank |
558 |
+ |
559 |
+Increase rank so that it is autoplugged. |
560 |
+--- |
561 |
+ sys/v4l2/gstv4l2.c | 2 +- |
562 |
+ 1 files changed, 1 insertions(+), 1 deletions(-) |
563 |
+ |
564 |
+diff --git a/sys/v4l2/gstv4l2.c b/sys/v4l2/gstv4l2.c |
565 |
+index 4a7056f..cba4157 100644 |
566 |
+--- a/sys/v4l2/gstv4l2.c |
567 |
++++ b/sys/v4l2/gstv4l2.c |
568 |
+@@ -55,7 +55,7 @@ plugin_init (GstPlugin * plugin) |
569 |
+ if (!gst_element_register (plugin, "v4l2src", GST_RANK_PRIMARY, |
570 |
+ GST_TYPE_V4L2SRC) || |
571 |
+ #ifdef HAVE_EXPERIMENTAL |
572 |
+- !gst_element_register (plugin, "v4l2sink", GST_RANK_NONE, |
573 |
++ !gst_element_register (plugin, "v4l2sink", GST_RANK_PRIMARY, |
574 |
+ GST_TYPE_V4L2SINK) || |
575 |
+ #endif |
576 |
+ /* !gst_element_register (plugin, "v4l2jpegsrc", */ |
577 |
+-- |
578 |
+1.7.1 |
579 |
+ |
580 |
|
581 |
diff --git a/media-libs/gst-plugins-good/files/gst-0.10.27-0007-use-GstQueryBuffers-to-get-buffer-requirements.patch b/media-libs/gst-plugins-good/files/gst-0.10.27-0007-use-GstQueryBuffers-to-get-buffer-requirements.patch |
582 |
new file mode 100644 |
583 |
index 0000000..345f9df |
584 |
--- /dev/null |
585 |
+++ b/media-libs/gst-plugins-good/files/gst-0.10.27-0007-use-GstQueryBuffers-to-get-buffer-requirements.patch |
586 |
@@ -0,0 +1,97 @@ |
587 |
+From 15c17ea368079fd5de19868af6d9ffad1cb09f3a Mon Sep 17 00:00:00 2001 |
588 |
+From: Rob Clark <rob@××.com> |
589 |
+Date: Wed, 19 May 2010 17:33:46 -0500 |
590 |
+Subject: [PATCH 07/11] use GstQueryBuffers to get buffer requirements |
591 |
+ |
592 |
+--- |
593 |
+ sys/v4l2/gstv4l2sink.c | 40 ++++++++++++++++++++++++++++++++++++++++ |
594 |
+ sys/v4l2/gstv4l2sink.h | 1 + |
595 |
+ 2 files changed, 41 insertions(+), 0 deletions(-) |
596 |
+ |
597 |
+diff --git a/sys/v4l2/gstv4l2sink.c b/sys/v4l2/gstv4l2sink.c |
598 |
+index 66dda8e..12323f7 100644 |
599 |
+--- a/sys/v4l2/gstv4l2sink.c |
600 |
++++ b/sys/v4l2/gstv4l2sink.c |
601 |
+@@ -373,6 +373,7 @@ gst_v4l2sink_init (GstV4l2Sink * v4l2sink, GstV4l2SinkClass * klass) |
602 |
+ |
603 |
+ /* number of buffers requested */ |
604 |
+ v4l2sink->num_buffers = PROP_DEF_QUEUE_SIZE; |
605 |
++ v4l2sink->num_buffers_can_change = TRUE; |
606 |
+ v4l2sink->min_queued_bufs = PROP_DEF_MIN_QUEUED_BUFS; |
607 |
+ |
608 |
+ v4l2sink->probed_caps = NULL; |
609 |
+@@ -808,6 +809,7 @@ static gboolean |
610 |
+ gst_v4l2sink_set_caps (GstBaseSink * bsink, GstCaps * caps) |
611 |
+ { |
612 |
+ GstV4l2Sink *v4l2sink = GST_V4L2SINK (bsink); |
613 |
++ GstQuery *query; |
614 |
+ gint w = 0, h = 0; |
615 |
+ gboolean interlaced; |
616 |
+ struct v4l2_fmtdesc *format; |
617 |
+@@ -855,6 +857,39 @@ gst_v4l2sink_set_caps (GstBaseSink * bsink, GstCaps * caps) |
618 |
+ return FALSE; |
619 |
+ } |
620 |
+ |
621 |
++ /* query to find if anyone upstream using these buffers has any |
622 |
++ * minimum requirements: |
623 |
++ */ |
624 |
++ query = gst_query_new_buffers (caps); |
625 |
++ if (gst_element_query (GST_ELEMENT (v4l2sink), query)) { |
626 |
++ gint min_buffers, min_width, min_height; |
627 |
++ |
628 |
++ gst_query_parse_buffers_count (query, &min_buffers); |
629 |
++ |
630 |
++ /* XXX need to account for some buffers used by queue, etc.. probably |
631 |
++ * queue should handle query, pass on to sink pad, and then add some |
632 |
++ * number of buffers to the min, so this value is dynamic depending |
633 |
++ * on the pipeline? |
634 |
++ */ |
635 |
++ if (min_buffers != -1) { |
636 |
++ min_buffers += 3 + v4l2sink->min_queued_bufs; |
637 |
++ } |
638 |
++ |
639 |
++ if (min_buffers > v4l2sink->num_buffers) { |
640 |
++ v4l2sink->num_buffers_can_change = FALSE; |
641 |
++ v4l2sink->num_buffers = min_buffers; |
642 |
++ } |
643 |
++ |
644 |
++ gst_query_parse_buffers_dimensions (query, &min_width, &min_height); |
645 |
++ if (min_width > w) { |
646 |
++ w = min_width; |
647 |
++ } |
648 |
++ if (min_height > h) { |
649 |
++ h = min_height; |
650 |
++ } |
651 |
++ } |
652 |
++ gst_query_unref (query); |
653 |
++ |
654 |
+ if (!gst_v4l2_object_set_format (v4l2sink->v4l2object, format->pixelformat, |
655 |
+ w, h, interlaced)) { |
656 |
+ /* error already posted */ |
657 |
+@@ -944,6 +979,11 @@ gst_v4l2sink_buffer_alloc (GstBaseSink * bsink, guint64 offset, guint size, |
658 |
+ GST_INFO_OBJECT (v4l2sink, "outputting buffers via mmap()"); |
659 |
+ |
660 |
+ if (v4l2sink->num_buffers != v4l2sink->pool->buffer_count) { |
661 |
++ if (!v4l2sink->num_buffers_can_change) { |
662 |
++ GST_WARNING_OBJECT (v4l2sink, |
663 |
++ "I can't handle a differing number of buffers!!!!"); |
664 |
++ return GST_FLOW_ERROR; |
665 |
++ } |
666 |
+ v4l2sink->num_buffers = v4l2sink->pool->buffer_count; |
667 |
+ g_object_notify (G_OBJECT (v4l2sink), "queue-size"); |
668 |
+ } |
669 |
+diff --git a/sys/v4l2/gstv4l2sink.h b/sys/v4l2/gstv4l2sink.h |
670 |
+index 907973a..7649fa1 100644 |
671 |
+--- a/sys/v4l2/gstv4l2sink.h |
672 |
++++ b/sys/v4l2/gstv4l2sink.h |
673 |
+@@ -58,6 +58,7 @@ struct _GstV4l2Sink { |
674 |
+ GstCaps *current_caps; /* the current negotiated caps */ |
675 |
+ GstV4l2BufferPool *pool; |
676 |
+ guint32 num_buffers; |
677 |
++ gboolean num_buffers_can_change; |
678 |
+ guint32 min_queued_bufs; |
679 |
+ |
680 |
+ gint video_width, video_height; /* original (unscaled) video w/h */ |
681 |
+-- |
682 |
+1.7.1 |
683 |
+ |
684 |
|
685 |
diff --git a/media-libs/gst-plugins-good/files/gst-0.10.27-0008-add-rowstride-support.patch b/media-libs/gst-plugins-good/files/gst-0.10.27-0008-add-rowstride-support.patch |
686 |
new file mode 100644 |
687 |
index 0000000..f4ff893 |
688 |
--- /dev/null |
689 |
+++ b/media-libs/gst-plugins-good/files/gst-0.10.27-0008-add-rowstride-support.patch |
690 |
@@ -0,0 +1,572 @@ |
691 |
+From a86d0326df31103c2ee38ee1e0c62802a758ef13 Mon Sep 17 00:00:00 2001 |
692 |
+From: Rob Clark <rob@××.com> |
693 |
+Date: Fri, 21 May 2010 15:21:32 -0500 |
694 |
+Subject: [PATCH 08/11] add rowstride support |
695 |
+ |
696 |
+--- |
697 |
+ sys/v4l2/gstv4l2object.c | 141 +++++++++++++++++++++++++++++++++++++--------- |
698 |
+ sys/v4l2/gstv4l2object.h | 6 +- |
699 |
+ sys/v4l2/gstv4l2sink.c | 61 +++++++++++++------- |
700 |
+ sys/v4l2/gstv4l2src.c | 28 +++++---- |
701 |
+ 4 files changed, 174 insertions(+), 62 deletions(-) |
702 |
+ |
703 |
+diff --git a/sys/v4l2/gstv4l2object.c b/sys/v4l2/gstv4l2object.c |
704 |
+index f5672b5..5e34456 100644 |
705 |
+--- a/sys/v4l2/gstv4l2object.c |
706 |
++++ b/sys/v4l2/gstv4l2object.c |
707 |
+@@ -1064,16 +1064,23 @@ gst_v4l2_object_get_format_list (GstV4l2Object * v4l2object) |
708 |
+ return v4l2object->formats; |
709 |
+ } |
710 |
+ |
711 |
+- |
712 |
+-GstStructure * |
713 |
+-gst_v4l2_object_v4l2fourcc_to_structure (guint32 fourcc) |
714 |
++/* |
715 |
++ * gst_v4l2_object_v4l2fourcc_to_structures: |
716 |
++ * @fourcc: requested format |
717 |
++ * @structures: an array of at least MAX_STRUCTS_PER_FOURCC to return the |
718 |
++ * results in |
719 |
++ * |
720 |
++ * Returns the number of structures returned via structures |
721 |
++ */ |
722 |
++gint |
723 |
++gst_v4l2_object_v4l2fourcc_to_structures (guint32 fourcc, |
724 |
++ GstStructure ** structures) |
725 |
+ { |
726 |
+- GstStructure *structure = NULL; |
727 |
+- |
728 |
++ gint count = 0; |
729 |
+ switch (fourcc) { |
730 |
+ case V4L2_PIX_FMT_MJPEG: /* Motion-JPEG */ |
731 |
+ case V4L2_PIX_FMT_JPEG: /* JFIF JPEG */ |
732 |
+- structure = gst_structure_new ("image/jpeg", NULL); |
733 |
++ structures[count++] = gst_structure_new ("image/jpeg", NULL); |
734 |
+ break; |
735 |
+ case V4L2_PIX_FMT_RGB332: |
736 |
+ case V4L2_PIX_FMT_RGB555: |
737 |
+@@ -1151,17 +1158,25 @@ gst_v4l2_object_v4l2fourcc_to_structure (guint32 fourcc) |
738 |
+ g_assert_not_reached (); |
739 |
+ break; |
740 |
+ } |
741 |
+- structure = gst_structure_new ("video/x-raw-rgb", |
742 |
++ structures[count++] = gst_structure_new ("video/x-raw-rgb", |
743 |
+ "bpp", G_TYPE_INT, bpp, |
744 |
+ "depth", G_TYPE_INT, depth, |
745 |
+ "red_mask", G_TYPE_INT, r_mask, |
746 |
+ "green_mask", G_TYPE_INT, g_mask, |
747 |
+ "blue_mask", G_TYPE_INT, b_mask, |
748 |
+ "endianness", G_TYPE_INT, endianness, NULL); |
749 |
++ structures[count++] = gst_structure_new ("video/x-raw-rgb-strided", |
750 |
++ "bpp", G_TYPE_INT, bpp, |
751 |
++ "depth", G_TYPE_INT, depth, |
752 |
++ "red_mask", G_TYPE_INT, r_mask, |
753 |
++ "green_mask", G_TYPE_INT, g_mask, |
754 |
++ "blue_mask", G_TYPE_INT, b_mask, |
755 |
++ "endianness", G_TYPE_INT, endianness, |
756 |
++ "rowstride", GST_TYPE_INT_RANGE, 1, G_MAXINT, NULL); |
757 |
+ break; |
758 |
+ } |
759 |
+ case V4L2_PIX_FMT_GREY: /* 8 Greyscale */ |
760 |
+- structure = gst_structure_new ("video/x-raw-gray", |
761 |
++ structures[count++] = gst_structure_new ("video/x-raw-gray", |
762 |
+ "bpp", G_TYPE_INT, 8, NULL); |
763 |
+ break; |
764 |
+ case V4L2_PIX_FMT_YYUV: /* 16 YUV 4:2:2 */ |
765 |
+@@ -1227,38 +1242,41 @@ gst_v4l2_object_v4l2fourcc_to_structure (guint32 fourcc) |
766 |
+ g_assert_not_reached (); |
767 |
+ break; |
768 |
+ } |
769 |
+- structure = gst_structure_new ("video/x-raw-yuv", |
770 |
++ structures[count++] = gst_structure_new ("video/x-raw-yuv", |
771 |
+ "format", GST_TYPE_FOURCC, fcc, NULL); |
772 |
++ structures[count++] = gst_structure_new ("video/x-raw-yuv-strided", |
773 |
++ "format", GST_TYPE_FOURCC, fcc, |
774 |
++ "rowstride", GST_TYPE_INT_RANGE, 1, G_MAXINT, NULL); |
775 |
+ break; |
776 |
+ } |
777 |
+ case V4L2_PIX_FMT_DV: |
778 |
+- structure = |
779 |
++ structures[count++] = |
780 |
+ gst_structure_new ("video/x-dv", "systemstream", G_TYPE_BOOLEAN, TRUE, |
781 |
+ NULL); |
782 |
+ break; |
783 |
+ case V4L2_PIX_FMT_MPEG: /* MPEG */ |
784 |
+- structure = gst_structure_new ("video/mpegts", NULL); |
785 |
++ structures[count++] = gst_structure_new ("video/mpegts", NULL); |
786 |
+ break; |
787 |
+ case V4L2_PIX_FMT_WNVA: /* Winnov hw compres */ |
788 |
+ break; |
789 |
+ #ifdef V4L2_PIX_FMT_SBGGR8 |
790 |
+ case V4L2_PIX_FMT_SBGGR8: |
791 |
+- structure = gst_structure_new ("video/x-raw-bayer", NULL); |
792 |
++ structures[count++] = gst_structure_new ("video/x-raw-bayer", NULL); |
793 |
+ break; |
794 |
+ #endif |
795 |
+ #ifdef V4L2_PIX_FMT_SN9C10X |
796 |
+ case V4L2_PIX_FMT_SN9C10X: |
797 |
+- structure = gst_structure_new ("video/x-sonix", NULL); |
798 |
++ structures[count++] = gst_structure_new ("video/x-sonix", NULL); |
799 |
+ break; |
800 |
+ #endif |
801 |
+ #ifdef V4L2_PIX_FMT_PWC1 |
802 |
+ case V4L2_PIX_FMT_PWC1: |
803 |
+- structure = gst_structure_new ("video/x-pwc1", NULL); |
804 |
++ structures[count++] = gst_structure_new ("video/x-pwc1", NULL); |
805 |
+ break; |
806 |
+ #endif |
807 |
+ #ifdef V4L2_PIX_FMT_PWC2 |
808 |
+ case V4L2_PIX_FMT_PWC2: |
809 |
+- structure = gst_structure_new ("video/x-pwc2", NULL); |
810 |
++ structures[count++] = gst_structure_new ("video/x-pwc2", NULL); |
811 |
+ break; |
812 |
+ #endif |
813 |
+ default: |
814 |
+@@ -1267,7 +1285,7 @@ gst_v4l2_object_v4l2fourcc_to_structure (guint32 fourcc) |
815 |
+ break; |
816 |
+ } |
817 |
+ |
818 |
+- return structure; |
819 |
++ return count; |
820 |
+ } |
821 |
+ |
822 |
+ |
823 |
+@@ -1278,22 +1296,23 @@ gst_v4l2_object_get_all_caps (void) |
824 |
+ static GstCaps *caps = NULL; |
825 |
+ |
826 |
+ if (caps == NULL) { |
827 |
+- GstStructure *structure; |
828 |
+- |
829 |
+ guint i; |
830 |
+ |
831 |
+ caps = gst_caps_new_empty (); |
832 |
+ for (i = 0; i < GST_V4L2_FORMAT_COUNT; i++) { |
833 |
+- structure = |
834 |
+- gst_v4l2_object_v4l2fourcc_to_structure (gst_v4l2_formats[i].format); |
835 |
+- if (structure) { |
836 |
++ GstStructure *structures[MAX_STRUCTS_PER_FOURCC]; |
837 |
++ gint count, j; |
838 |
++ count = |
839 |
++ gst_v4l2_object_v4l2fourcc_to_structures (gst_v4l2_formats[i].format, |
840 |
++ structures); |
841 |
++ for (j = 0; j < count; j++) { |
842 |
+ if (gst_v4l2_formats[i].dimensions) { |
843 |
+- gst_structure_set (structure, |
844 |
++ gst_structure_set (structures[j], |
845 |
+ "width", GST_TYPE_INT_RANGE, 1, GST_V4L2_MAX_SIZE, |
846 |
+ "height", GST_TYPE_INT_RANGE, 1, GST_V4L2_MAX_SIZE, |
847 |
+ "framerate", GST_TYPE_FRACTION_RANGE, 0, 1, 100, 1, NULL); |
848 |
+ } |
849 |
+- gst_caps_append_structure (caps, structure); |
850 |
++ gst_caps_append_structure (caps, structures[j]); |
851 |
+ } |
852 |
+ } |
853 |
+ } |
854 |
+@@ -1306,12 +1325,14 @@ gst_v4l2_object_get_all_caps (void) |
855 |
+ * @caps: given input caps |
856 |
+ * @format: location for the v4l format |
857 |
+ * @w/@h: location for width and height |
858 |
++ * @rs: required rowstride in bytes, or 0 if natural stride (based on format |
859 |
++ * and width) or not-applicable |
860 |
+ * @fps_n/@fps_d: location for framerate |
861 |
+ * @size: location for expected size of the frame or 0 if unknown |
862 |
+ */ |
863 |
+ gboolean |
864 |
+ gst_v4l2_object_get_caps_info (GstV4l2Object * v4l2object, GstCaps * caps, |
865 |
+- struct v4l2_fmtdesc ** format, gint * w, gint * h, |
866 |
++ struct v4l2_fmtdesc ** format, gint * w, gint * h, gint * rs, |
867 |
+ gboolean * interlaced, guint * fps_n, guint * fps_d, guint * size) |
868 |
+ { |
869 |
+ GstStructure *structure; |
870 |
+@@ -1319,10 +1340,12 @@ gst_v4l2_object_get_caps_info (GstV4l2Object * v4l2object, GstCaps * caps, |
871 |
+ guint32 fourcc; |
872 |
+ const gchar *mimetype; |
873 |
+ guint outsize; |
874 |
++ struct v4l2_format fmt = { 0, }; |
875 |
+ |
876 |
+ /* default unknown values */ |
877 |
+ fourcc = 0; |
878 |
+ outsize = 0; |
879 |
++ *rs = 0; |
880 |
+ |
881 |
+ structure = gst_caps_get_structure (caps, 0); |
882 |
+ |
883 |
+@@ -1351,61 +1374,73 @@ gst_v4l2_object_get_caps_info (GstV4l2Object * v4l2object, GstCaps * caps, |
884 |
+ *fps_n = gst_value_get_fraction_numerator (framerate); |
885 |
+ *fps_d = gst_value_get_fraction_denominator (framerate); |
886 |
+ |
887 |
+- if (!strcmp (mimetype, "video/x-raw-yuv")) { |
888 |
++ if (!strcmp (mimetype, "video/x-raw-yuv") || |
889 |
++ !strcmp (mimetype, "video/x-raw-yuv-strided")) { |
890 |
+ gst_structure_get_fourcc (structure, "format", &fourcc); |
891 |
+ |
892 |
+ switch (fourcc) { |
893 |
+ case GST_MAKE_FOURCC ('I', '4', '2', '0'): |
894 |
+ case GST_MAKE_FOURCC ('I', 'Y', 'U', 'V'): |
895 |
+ fourcc = V4L2_PIX_FMT_YUV420; |
896 |
++ *rs = GST_ROUND_UP_4 (*w); |
897 |
+ outsize = GST_ROUND_UP_4 (*w) * GST_ROUND_UP_2 (*h); |
898 |
+ outsize += 2 * ((GST_ROUND_UP_8 (*w) / 2) * (GST_ROUND_UP_2 (*h) / 2)); |
899 |
+ break; |
900 |
+ case GST_MAKE_FOURCC ('Y', 'U', 'Y', '2'): |
901 |
+ fourcc = V4L2_PIX_FMT_YUYV; |
902 |
++ *rs = GST_ROUND_UP_2 (*w) * 2; |
903 |
+ outsize = (GST_ROUND_UP_2 (*w) * 2) * *h; |
904 |
+ break; |
905 |
+ case GST_MAKE_FOURCC ('Y', '4', '1', 'P'): |
906 |
+ fourcc = V4L2_PIX_FMT_Y41P; |
907 |
++ *rs = GST_ROUND_UP_2 (*w) * 2; |
908 |
+ outsize = (GST_ROUND_UP_2 (*w) * 2) * *h; |
909 |
+ break; |
910 |
+ case GST_MAKE_FOURCC ('U', 'Y', 'V', 'Y'): |
911 |
+ fourcc = V4L2_PIX_FMT_UYVY; |
912 |
++ *rs = GST_ROUND_UP_2 (*w) * 2; |
913 |
+ outsize = (GST_ROUND_UP_2 (*w) * 2) * *h; |
914 |
+ break; |
915 |
+ case GST_MAKE_FOURCC ('Y', 'V', '1', '2'): |
916 |
+ fourcc = V4L2_PIX_FMT_YVU420; |
917 |
++ *rs = GST_ROUND_UP_4 (*w); |
918 |
+ outsize = GST_ROUND_UP_4 (*w) * GST_ROUND_UP_2 (*h); |
919 |
+ outsize += 2 * ((GST_ROUND_UP_8 (*w) / 2) * (GST_ROUND_UP_2 (*h) / 2)); |
920 |
+ break; |
921 |
+ case GST_MAKE_FOURCC ('Y', '4', '1', 'B'): |
922 |
+ fourcc = V4L2_PIX_FMT_YUV411P; |
923 |
++ *rs = GST_ROUND_UP_4 (*w); |
924 |
+ outsize = GST_ROUND_UP_4 (*w) * *h; |
925 |
+ outsize += 2 * ((GST_ROUND_UP_8 (*w) / 4) * *h); |
926 |
+ break; |
927 |
+ case GST_MAKE_FOURCC ('Y', '4', '2', 'B'): |
928 |
+ fourcc = V4L2_PIX_FMT_YUV422P; |
929 |
++ *rs = GST_ROUND_UP_4 (*w); |
930 |
+ outsize = GST_ROUND_UP_4 (*w) * *h; |
931 |
+ outsize += 2 * ((GST_ROUND_UP_8 (*w) / 2) * *h); |
932 |
+ break; |
933 |
+ case GST_MAKE_FOURCC ('N', 'V', '1', '2'): |
934 |
+ fourcc = V4L2_PIX_FMT_NV12; |
935 |
++ *rs = GST_ROUND_UP_4 (*w); |
936 |
+ outsize = GST_ROUND_UP_4 (*w) * GST_ROUND_UP_2 (*h); |
937 |
+ outsize += (GST_ROUND_UP_4 (*w) * *h) / 2; |
938 |
+ break; |
939 |
+ case GST_MAKE_FOURCC ('N', 'V', '2', '1'): |
940 |
+ fourcc = V4L2_PIX_FMT_NV21; |
941 |
++ *rs = GST_ROUND_UP_4 (*w); |
942 |
+ outsize = GST_ROUND_UP_4 (*w) * GST_ROUND_UP_2 (*h); |
943 |
+ outsize += (GST_ROUND_UP_4 (*w) * *h) / 2; |
944 |
+ break; |
945 |
+ #ifdef V4L2_PIX_FMT_YVYU |
946 |
+ case GST_MAKE_FOURCC ('Y', 'V', 'Y', 'U'): |
947 |
+ fourcc = V4L2_PIX_FMT_YVYU; |
948 |
++ *rs = GST_ROUND_UP_2 (*w) * 2; |
949 |
+ outsize = (GST_ROUND_UP_2 (*w) * 2) * *h; |
950 |
+ break; |
951 |
+ #endif |
952 |
+ } |
953 |
+- } else if (!strcmp (mimetype, "video/x-raw-rgb")) { |
954 |
++ } else if (!strcmp (mimetype, "video/x-raw-rgb") || |
955 |
++ !strcmp (mimetype, "video/x-raw-rgb-strided")) { |
956 |
+ gint bpp, endianness, r_mask; |
957 |
+ |
958 |
+ gst_structure_get_int (structure, "bpp", &bpp); |
959 |
+@@ -1415,20 +1450,25 @@ gst_v4l2_object_get_caps_info (GstV4l2Object * v4l2object, GstCaps * caps, |
960 |
+ switch (bpp) { |
961 |
+ case 8: |
962 |
+ fourcc = V4L2_PIX_FMT_RGB332; |
963 |
++ *rs = *w; |
964 |
+ break; |
965 |
+ case 15: |
966 |
+ fourcc = (endianness == G_LITTLE_ENDIAN) ? |
967 |
+ V4L2_PIX_FMT_RGB555 : V4L2_PIX_FMT_RGB555X; |
968 |
++ *rs = 2 * *w; |
969 |
+ break; |
970 |
+ case 16: |
971 |
+ fourcc = (endianness == G_LITTLE_ENDIAN) ? |
972 |
+ V4L2_PIX_FMT_RGB565 : V4L2_PIX_FMT_RGB565X; |
973 |
++ *rs = 2 * *w; |
974 |
+ break; |
975 |
+ case 24: |
976 |
+ fourcc = (r_mask == 0xFF) ? V4L2_PIX_FMT_BGR24 : V4L2_PIX_FMT_RGB24; |
977 |
++ *rs = 3 * *w; |
978 |
+ break; |
979 |
+ case 32: |
980 |
+ fourcc = (r_mask == 0xFF) ? V4L2_PIX_FMT_BGR32 : V4L2_PIX_FMT_RGB32; |
981 |
++ *rs = 4 * *w; |
982 |
+ break; |
983 |
+ } |
984 |
+ } else if (strcmp (mimetype, "video/x-dv") == 0) { |
985 |
+@@ -1458,6 +1498,25 @@ gst_v4l2_object_get_caps_info (GstV4l2Object * v4l2object, GstCaps * caps, |
986 |
+ if (fourcc == 0) |
987 |
+ return FALSE; |
988 |
+ |
989 |
++ /* check what stride the driver supports */ |
990 |
++ fmt.type = v4l2object->type; |
991 |
++ fmt.fmt.pix.width = *w; |
992 |
++ fmt.fmt.pix.height = *h; |
993 |
++ fmt.fmt.pix.pixelformat = fourcc; |
994 |
++ fmt.fmt.pix.field = V4L2_FIELD_ANY; |
995 |
++ fmt.fmt.pix.bytesperline = *rs; |
996 |
++ if (v4l2_ioctl (v4l2object->video_fd, VIDIOC_TRY_FMT, &fmt) >= 0) { |
997 |
++ if (fmt.fmt.pix.bytesperline == *rs) { |
998 |
++ *rs = 0; |
999 |
++ } else { |
1000 |
++ *rs = fmt.fmt.pix.bytesperline; |
1001 |
++ } |
1002 |
++ GST_INFO_OBJECT (v4l2object->element, "rowstride: %d", *rs); |
1003 |
++ } else { |
1004 |
++ GST_WARNING_OBJECT (v4l2object->element, |
1005 |
++ "VIDIOC_TRY_FMT should not fail.. driver problem?"); |
1006 |
++ } |
1007 |
++ |
1008 |
+ done: |
1009 |
+ *format = gst_v4l2_object_get_format_from_fourcc (v4l2object, fourcc); |
1010 |
+ *size = outsize; |
1011 |
+@@ -1465,6 +1524,36 @@ done: |
1012 |
+ return TRUE; |
1013 |
+ } |
1014 |
+ |
1015 |
++/* Update caps to reflect rowstride that has been requested by the |
1016 |
++ * driver |
1017 |
++ */ |
1018 |
++GstCaps * |
1019 |
++gst_v4l2_object_update_rowstride (GstV4l2Object * v4l2object, |
1020 |
++ GstCaps * caps, gint rs) |
1021 |
++{ |
1022 |
++ GstStructure *structure; |
1023 |
++ const gchar *mimetype; |
1024 |
++ |
1025 |
++ caps = gst_caps_make_writable (caps); |
1026 |
++ |
1027 |
++ structure = gst_caps_get_structure (caps, 0); |
1028 |
++ mimetype = gst_structure_get_name (structure); |
1029 |
++ |
1030 |
++ if (!strcmp (mimetype, "video/x-raw-yuv")) { |
1031 |
++ mimetype = "video/x-raw-yuv-strided"; |
1032 |
++ gst_structure_set_name (structure, mimetype); |
1033 |
++ } else if (!strcmp (mimetype, "video/x-raw-rgb")) { |
1034 |
++ mimetype = "video/x-raw-rgb-strided"; |
1035 |
++ gst_structure_set_name (structure, mimetype); |
1036 |
++ } |
1037 |
++ |
1038 |
++ if (!strcmp (mimetype, "video/x-raw-yuv-strided") || |
1039 |
++ !strcmp (mimetype, "video/x-raw-rgb-strided")) { |
1040 |
++ gst_structure_set (structure, "rowstride", G_TYPE_INT, rs, NULL); |
1041 |
++ } |
1042 |
++ |
1043 |
++ return caps; |
1044 |
++} |
1045 |
+ |
1046 |
+ static gboolean |
1047 |
+ gst_v4l2_object_get_nearest_size (GstV4l2Object * v4l2object, |
1048 |
+diff --git a/sys/v4l2/gstv4l2object.h b/sys/v4l2/gstv4l2object.h |
1049 |
+index a0dd41c..228e7c7 100644 |
1050 |
+--- a/sys/v4l2/gstv4l2object.h |
1051 |
++++ b/sys/v4l2/gstv4l2object.h |
1052 |
+@@ -179,15 +179,17 @@ GstCaps* gst_v4l2_object_probe_caps_for_format (GstV4l2Object *v4l2object, |
1053 |
+ const GstStructure * template); |
1054 |
+ |
1055 |
+ gboolean gst_v4l2_object_get_caps_info (GstV4l2Object *v4l2object, GstCaps *caps, |
1056 |
+- struct v4l2_fmtdesc **format, gint *w, gint *h, |
1057 |
++ struct v4l2_fmtdesc **format, gint *w, gint *h, gint *rs, |
1058 |
+ gboolean * interlaced, guint *fps_n, guint *fps_d, guint *size); |
1059 |
+ |
1060 |
++GstCaps * gst_v4l2_object_update_rowstride (GstV4l2Object * v4l2object, GstCaps * caps, gint rs); |
1061 |
+ |
1062 |
+ GSList* gst_v4l2_object_get_format_list (GstV4l2Object *v4l2object); |
1063 |
+ |
1064 |
+ GstCaps* gst_v4l2_object_get_all_caps (void); |
1065 |
+ |
1066 |
+-GstStructure* gst_v4l2_object_v4l2fourcc_to_structure (guint32 fourcc); |
1067 |
++#define MAX_STRUCTS_PER_FOURCC 2 |
1068 |
++gint gst_v4l2_object_v4l2fourcc_to_structures (guint32 fourcc, GstStructure ** structures); |
1069 |
+ |
1070 |
+ gboolean gst_v4l2_object_set_format (GstV4l2Object *v4l2object, guint32 pixelformat, guint32 width, guint32 height, gboolean interlaced); |
1071 |
+ |
1072 |
+diff --git a/sys/v4l2/gstv4l2sink.c b/sys/v4l2/gstv4l2sink.c |
1073 |
+index 12323f7..a1f78cf 100644 |
1074 |
+--- a/sys/v4l2/gstv4l2sink.c |
1075 |
++++ b/sys/v4l2/gstv4l2sink.c |
1076 |
+@@ -776,24 +776,23 @@ gst_v4l2sink_get_caps (GstBaseSink * bsink) |
1077 |
+ for (walk = v4l2sink->v4l2object->formats; walk; walk = walk->next) { |
1078 |
+ struct v4l2_fmtdesc *format; |
1079 |
+ |
1080 |
+- GstStructure *template; |
1081 |
++ GstStructure *templates[MAX_STRUCTS_PER_FOURCC]; |
1082 |
++ gint count, i; |
1083 |
+ |
1084 |
+ format = (struct v4l2_fmtdesc *) walk->data; |
1085 |
+ |
1086 |
+- template = gst_v4l2_object_v4l2fourcc_to_structure (format->pixelformat); |
1087 |
++ count = gst_v4l2_object_v4l2fourcc_to_structures (format->pixelformat, |
1088 |
++ templates); |
1089 |
+ |
1090 |
+- if (template) { |
1091 |
++ for (i = 0; i < count; i++) { |
1092 |
+ GstCaps *tmp; |
1093 |
+ |
1094 |
+- tmp = |
1095 |
+- gst_v4l2_object_probe_caps_for_format (v4l2sink->v4l2object, |
1096 |
+- format->pixelformat, template); |
1097 |
++ tmp = gst_v4l2_object_probe_caps_for_format (v4l2sink->v4l2object, |
1098 |
++ format->pixelformat, templates[i]); |
1099 |
+ if (tmp) |
1100 |
+ gst_caps_append (ret, tmp); |
1101 |
+ |
1102 |
+- gst_structure_free (template); |
1103 |
+- } else { |
1104 |
+- GST_DEBUG_OBJECT (v4l2sink, "unknown format %u", format->pixelformat); |
1105 |
++ gst_structure_free (templates[i]); |
1106 |
+ } |
1107 |
+ } |
1108 |
+ |
1109 |
+@@ -810,7 +809,7 @@ gst_v4l2sink_set_caps (GstBaseSink * bsink, GstCaps * caps) |
1110 |
+ { |
1111 |
+ GstV4l2Sink *v4l2sink = GST_V4L2SINK (bsink); |
1112 |
+ GstQuery *query; |
1113 |
+- gint w = 0, h = 0; |
1114 |
++ gint w = 0, h = 0, rs = 0; |
1115 |
+ gboolean interlaced; |
1116 |
+ struct v4l2_fmtdesc *format; |
1117 |
+ guint fps_n, fps_d; |
1118 |
+@@ -823,11 +822,36 @@ gst_v4l2sink_set_caps (GstBaseSink * bsink, GstCaps * caps) |
1119 |
+ return FALSE; |
1120 |
+ } |
1121 |
+ |
1122 |
++ /* we want our own v4l2 type of fourcc codes */ |
1123 |
++ if (!gst_v4l2_object_get_caps_info (v4l2sink->v4l2object, caps, |
1124 |
++ &format, &w, &h, &rs, &interlaced, &fps_n, &fps_d, &size)) { |
1125 |
++ GST_DEBUG_OBJECT (v4l2sink, "can't get capture format from caps %p", caps); |
1126 |
++ return FALSE; |
1127 |
++ } |
1128 |
++ |
1129 |
++ if (!format) { |
1130 |
++ GST_DEBUG_OBJECT (v4l2sink, "unrecognized caps!!"); |
1131 |
++ return FALSE; |
1132 |
++ } |
1133 |
++ |
1134 |
++ /* we need to make our own ref before we potentially update the |
1135 |
++ * caps, to avoid that we release a ref that is not owned by us |
1136 |
++ * when we make the caps writable |
1137 |
++ */ |
1138 |
++ caps = gst_caps_ref (caps); |
1139 |
++ |
1140 |
++ /* if necessary, update caps for rowstride */ |
1141 |
++ if (rs) { |
1142 |
++ caps = gst_v4l2_object_update_rowstride (v4l2sink->v4l2object, caps, rs); |
1143 |
++ GST_DEBUG_OBJECT (v4l2sink, "updated caps: %" GST_PTR_FORMAT, caps); |
1144 |
++ } |
1145 |
++ |
1146 |
+ if (v4l2sink->current_caps) { |
1147 |
+ GST_DEBUG_OBJECT (v4l2sink, "already have caps set.. are they equal?"); |
1148 |
+ LOG_CAPS (v4l2sink, v4l2sink->current_caps); |
1149 |
+ if (gst_caps_is_equal (v4l2sink->current_caps, caps)) { |
1150 |
+ GST_DEBUG_OBJECT (v4l2sink, "yes they are!"); |
1151 |
++ gst_caps_unref (caps); |
1152 |
+ return TRUE; |
1153 |
+ } |
1154 |
+ GST_DEBUG_OBJECT (v4l2sink, "no they aren't!"); |
1155 |
+@@ -842,18 +866,7 @@ gst_v4l2sink_set_caps (GstBaseSink * bsink, GstCaps * caps) |
1156 |
+ * |
1157 |
+ */ |
1158 |
+ GST_DEBUG_OBJECT (v4l2sink, "warning, changing caps not supported yet"); |
1159 |
+- return FALSE; |
1160 |
+- } |
1161 |
+- |
1162 |
+- /* we want our own v4l2 type of fourcc codes */ |
1163 |
+- if (!gst_v4l2_object_get_caps_info (v4l2sink->v4l2object, caps, |
1164 |
+- &format, &w, &h, &interlaced, &fps_n, &fps_d, &size)) { |
1165 |
+- GST_DEBUG_OBJECT (v4l2sink, "can't get capture format from caps %p", caps); |
1166 |
+- return FALSE; |
1167 |
+- } |
1168 |
+- |
1169 |
+- if (!format) { |
1170 |
+- GST_DEBUG_OBJECT (v4l2sink, "unrecognized caps!!"); |
1171 |
++ gst_caps_unref (caps); |
1172 |
+ return FALSE; |
1173 |
+ } |
1174 |
+ |
1175 |
+@@ -893,6 +906,7 @@ gst_v4l2sink_set_caps (GstBaseSink * bsink, GstCaps * caps) |
1176 |
+ if (!gst_v4l2_object_set_format (v4l2sink->v4l2object, format->pixelformat, |
1177 |
+ w, h, interlaced)) { |
1178 |
+ /* error already posted */ |
1179 |
++ gst_caps_unref (caps); |
1180 |
+ return FALSE; |
1181 |
+ } |
1182 |
+ |
1183 |
+@@ -951,6 +965,9 @@ gst_v4l2sink_buffer_alloc (GstBaseSink * bsink, guint64 offset, guint size, |
1184 |
+ return GST_FLOW_ERROR; |
1185 |
+ } |
1186 |
+ |
1187 |
++ /* caps may have changed in _set_caps() if we need rowstride */ |
1188 |
++ caps = v4l2sink->current_caps; |
1189 |
++ |
1190 |
+ GST_V4L2_CHECK_OPEN (v4l2sink->v4l2object); |
1191 |
+ |
1192 |
+ if (!(v4l2sink->pool = gst_v4l2_buffer_pool_new (GST_ELEMENT (v4l2sink), |
1193 |
+diff --git a/sys/v4l2/gstv4l2src.c b/sys/v4l2/gstv4l2src.c |
1194 |
+index 4a37d35..a9a7787 100644 |
1195 |
+--- a/sys/v4l2/gstv4l2src.c |
1196 |
++++ b/sys/v4l2/gstv4l2src.c |
1197 |
+@@ -581,24 +581,23 @@ gst_v4l2src_get_caps (GstBaseSrc * src) |
1198 |
+ for (walk = v4l2src->v4l2object->formats; walk; walk = walk->next) { |
1199 |
+ struct v4l2_fmtdesc *format; |
1200 |
+ |
1201 |
+- GstStructure *template; |
1202 |
++ GstStructure *templates[MAX_STRUCTS_PER_FOURCC]; |
1203 |
++ gint count, i; |
1204 |
+ |
1205 |
+ format = (struct v4l2_fmtdesc *) walk->data; |
1206 |
+ |
1207 |
+- template = gst_v4l2_object_v4l2fourcc_to_structure (format->pixelformat); |
1208 |
++ count = gst_v4l2_object_v4l2fourcc_to_structures (format->pixelformat, |
1209 |
++ templates); |
1210 |
+ |
1211 |
+- if (template) { |
1212 |
++ for (i = 0; i < count; i++) { |
1213 |
+ GstCaps *tmp; |
1214 |
+ |
1215 |
+- tmp = |
1216 |
+- gst_v4l2_object_probe_caps_for_format (v4l2src->v4l2object, |
1217 |
+- format->pixelformat, template); |
1218 |
++ tmp = gst_v4l2_object_probe_caps_for_format (v4l2src->v4l2object, |
1219 |
++ format->pixelformat, templates[i]); |
1220 |
+ if (tmp) |
1221 |
+ gst_caps_append (ret, tmp); |
1222 |
+ |
1223 |
+- gst_structure_free (template); |
1224 |
+- } else { |
1225 |
+- GST_DEBUG_OBJECT (v4l2src, "unknown format %u", format->pixelformat); |
1226 |
++ gst_structure_free (templates[i]); |
1227 |
+ } |
1228 |
+ } |
1229 |
+ |
1230 |
+@@ -613,7 +612,7 @@ static gboolean |
1231 |
+ gst_v4l2src_set_caps (GstBaseSrc * src, GstCaps * caps) |
1232 |
+ { |
1233 |
+ GstV4l2Src *v4l2src; |
1234 |
+- gint w = 0, h = 0; |
1235 |
++ gint w = 0, h = 0, rs = 0; |
1236 |
+ gboolean interlaced; |
1237 |
+ struct v4l2_fmtdesc *format; |
1238 |
+ guint fps_n, fps_d; |
1239 |
+@@ -635,13 +634,18 @@ gst_v4l2src_set_caps (GstBaseSrc * src, GstCaps * caps) |
1240 |
+ } |
1241 |
+ |
1242 |
+ /* we want our own v4l2 type of fourcc codes */ |
1243 |
+- if (!gst_v4l2_object_get_caps_info (v4l2src->v4l2object, caps, &format, &w, |
1244 |
+- &h, &interlaced, &fps_n, &fps_d, &size)) { |
1245 |
++ if (!gst_v4l2_object_get_caps_info (v4l2src->v4l2object, caps, &format, |
1246 |
++ &w, &h, &rs, &interlaced, &fps_n, &fps_d, &size)) { |
1247 |
+ GST_INFO_OBJECT (v4l2src, |
1248 |
+ "can't get capture format from caps %" GST_PTR_FORMAT, caps); |
1249 |
+ return FALSE; |
1250 |
+ } |
1251 |
+ |
1252 |
++ /* if necessary, update caps for rowstride */ |
1253 |
++ if (rs) { |
1254 |
++ caps = gst_v4l2_object_update_rowstride (v4l2src->v4l2object, caps, rs); |
1255 |
++ } |
1256 |
++ |
1257 |
+ GST_DEBUG_OBJECT (v4l2src, "trying to set_capture %dx%d at %d/%d fps, " |
1258 |
+ "format %s", w, h, fps_n, fps_d, format->description); |
1259 |
+ |
1260 |
+-- |
1261 |
+1.7.1 |
1262 |
+ |
1263 |
|
1264 |
diff --git a/media-libs/gst-plugins-good/files/gst-0.10.27-0009-use-GstEventCrop-to-get-crop-info.patch b/media-libs/gst-plugins-good/files/gst-0.10.27-0009-use-GstEventCrop-to-get-crop-info.patch |
1265 |
new file mode 100644 |
1266 |
index 0000000..c5d3197 |
1267 |
--- /dev/null |
1268 |
+++ b/media-libs/gst-plugins-good/files/gst-0.10.27-0009-use-GstEventCrop-to-get-crop-info.patch |
1269 |
@@ -0,0 +1,119 @@ |
1270 |
+From e7497b9f0c6c88b764d8f95e01197e2a2ea0dd95 Mon Sep 17 00:00:00 2001 |
1271 |
+From: Rob Clark <rob@××.com> |
1272 |
+Date: Tue, 25 May 2010 11:02:45 -0500 |
1273 |
+Subject: [PATCH 09/11] use GstEventCrop to get crop info |
1274 |
+ |
1275 |
+--- |
1276 |
+ sys/v4l2/gstv4l2sink.c | 63 +++++++++++++++++++++++++++++++++++++++++++++++- |
1277 |
+ 1 files changed, 62 insertions(+), 1 deletions(-) |
1278 |
+ |
1279 |
+diff --git a/sys/v4l2/gstv4l2sink.c b/sys/v4l2/gstv4l2sink.c |
1280 |
+index a1f78cf..feafe7a 100644 |
1281 |
+--- a/sys/v4l2/gstv4l2sink.c |
1282 |
++++ b/sys/v4l2/gstv4l2sink.c |
1283 |
+@@ -252,6 +252,7 @@ static GstCaps *gst_v4l2sink_get_caps (GstBaseSink * bsink); |
1284 |
+ static gboolean gst_v4l2sink_set_caps (GstBaseSink * bsink, GstCaps * caps); |
1285 |
+ static GstFlowReturn gst_v4l2sink_buffer_alloc (GstBaseSink * bsink, |
1286 |
+ guint64 offset, guint size, GstCaps * caps, GstBuffer ** buf); |
1287 |
++static gboolean gst_v4l2sink_event (GstBaseSink * bsink, GstEvent * event); |
1288 |
+ static GstFlowReturn gst_v4l2sink_show_frame (GstBaseSink * bsink, |
1289 |
+ GstBuffer * buf); |
1290 |
+ static void gst_v4l2sink_sync_rotation (GstV4l2Sink * v4l2sink); |
1291 |
+@@ -354,6 +355,7 @@ gst_v4l2sink_class_init (GstV4l2SinkClass * klass) |
1292 |
+ basesink_class->get_caps = GST_DEBUG_FUNCPTR (gst_v4l2sink_get_caps); |
1293 |
+ basesink_class->set_caps = GST_DEBUG_FUNCPTR (gst_v4l2sink_set_caps); |
1294 |
+ basesink_class->buffer_alloc = GST_DEBUG_FUNCPTR (gst_v4l2sink_buffer_alloc); |
1295 |
++ basesink_class->event = GST_DEBUG_FUNCPTR (gst_v4l2sink_event); |
1296 |
+ basesink_class->render = GST_DEBUG_FUNCPTR (gst_v4l2sink_show_frame); |
1297 |
+ } |
1298 |
+ |
1299 |
+@@ -895,11 +897,22 @@ gst_v4l2sink_set_caps (GstBaseSink * bsink, GstCaps * caps) |
1300 |
+ |
1301 |
+ gst_query_parse_buffers_dimensions (query, &min_width, &min_height); |
1302 |
+ if (min_width > w) { |
1303 |
++ v4l2sink->crop.width = w; |
1304 |
++ v4l2sink->crop_fields_set |= RECT_WIDTH_SET; |
1305 |
+ w = min_width; |
1306 |
+ } |
1307 |
+ if (min_height > h) { |
1308 |
++ v4l2sink->crop.height = h; |
1309 |
++ v4l2sink->crop_fields_set |= RECT_HEIGHT_SET; |
1310 |
+ h = min_height; |
1311 |
+ } |
1312 |
++ |
1313 |
++ /* clear top/left crop values.. otherwise by default display will try |
1314 |
++ * to center, rather than scale, the image if it is too big to fit on |
1315 |
++ * display |
1316 |
++ */ |
1317 |
++ v4l2sink->crop.top = v4l2sink->crop.left = 0; |
1318 |
++ v4l2sink->crop_fields_set |= RECT_TOP_SET | RECT_LEFT_SET; |
1319 |
+ } |
1320 |
+ gst_query_unref (query); |
1321 |
+ |
1322 |
+@@ -919,7 +932,13 @@ gst_v4l2sink_set_caps (GstBaseSink * bsink, GstCaps * caps) |
1323 |
+ GST_VIDEO_SINK_WIDTH (v4l2sink) = w; |
1324 |
+ GST_VIDEO_SINK_HEIGHT (v4l2sink) = h; |
1325 |
+ |
1326 |
+- v4l2sink->current_caps = gst_caps_ref (caps); |
1327 |
++ /* this needs to go after gst_v4l2_object_set_format() to ensure driver |
1328 |
++ * has proper width/height (so we don't confuse it's error checking by |
1329 |
++ * setting a crop larger than the picture size) |
1330 |
++ */ |
1331 |
++ gst_v4l2sink_sync_crop_fields (v4l2sink); |
1332 |
++ |
1333 |
++ v4l2sink->current_caps = caps; |
1334 |
+ |
1335 |
+ return TRUE; |
1336 |
+ } |
1337 |
+@@ -1023,6 +1042,48 @@ gst_v4l2sink_buffer_alloc (GstBaseSink * bsink, guint64 offset, guint size, |
1338 |
+ } |
1339 |
+ } |
1340 |
+ |
1341 |
++/* called to handle events */ |
1342 |
++static gboolean |
1343 |
++gst_v4l2sink_event (GstBaseSink * bsink, GstEvent * event) |
1344 |
++{ |
1345 |
++ GstV4l2Sink *v4l2sink = GST_V4L2SINK (bsink); |
1346 |
++ GstEventType type = GST_EVENT_TYPE (event); |
1347 |
++ |
1348 |
++ GST_DEBUG_OBJECT (v4l2sink, "event %" GST_PTR_FORMAT, event); |
1349 |
++ |
1350 |
++ switch (type) { |
1351 |
++ case GST_EVENT_CROP:{ |
1352 |
++ gint top, left, width, height; |
1353 |
++ gst_event_parse_crop (event, &top, &left, &width, &height); |
1354 |
++ if (top >= 0) { |
1355 |
++ v4l2sink->crop.top = top; |
1356 |
++ v4l2sink->crop_fields_set |= RECT_TOP_SET; |
1357 |
++ } |
1358 |
++ if (left >= 0) { |
1359 |
++ v4l2sink->crop.left = left; |
1360 |
++ v4l2sink->crop_fields_set |= RECT_LEFT_SET; |
1361 |
++ } |
1362 |
++ if (width >= 0) { |
1363 |
++ v4l2sink->crop.width = width; |
1364 |
++ v4l2sink->crop_fields_set |= RECT_WIDTH_SET; |
1365 |
++ } |
1366 |
++ if (height >= 0) { |
1367 |
++ v4l2sink->crop.height = height; |
1368 |
++ v4l2sink->crop_fields_set |= RECT_HEIGHT_SET; |
1369 |
++ } |
1370 |
++ gst_v4l2sink_sync_crop_fields (v4l2sink); |
1371 |
++ return TRUE; |
1372 |
++ } |
1373 |
++ default:{ |
1374 |
++ if (GST_BASE_SINK_CLASS (parent_class)->event) { |
1375 |
++ return GST_BASE_SINK_CLASS (parent_class)->event (bsink, event); |
1376 |
++ } else { |
1377 |
++ return TRUE; |
1378 |
++ } |
1379 |
++ } |
1380 |
++ } |
1381 |
++} |
1382 |
++ |
1383 |
+ /* called after A/V sync to render frame */ |
1384 |
+ static GstFlowReturn |
1385 |
+ gst_v4l2sink_show_frame (GstBaseSink * bsink, GstBuffer * buf) |
1386 |
+-- |
1387 |
+1.7.1 |
1388 |
+ |
1389 |
|
1390 |
diff --git a/media-libs/gst-plugins-good/files/gst-0.10.27-0010-v4l2-prefer-NV12.patch b/media-libs/gst-plugins-good/files/gst-0.10.27-0010-v4l2-prefer-NV12.patch |
1391 |
new file mode 100644 |
1392 |
index 0000000..301056a |
1393 |
--- /dev/null |
1394 |
+++ b/media-libs/gst-plugins-good/files/gst-0.10.27-0010-v4l2-prefer-NV12.patch |
1395 |
@@ -0,0 +1,28 @@ |
1396 |
+From 107c18830342c69229857f968dff33071d07992d Mon Sep 17 00:00:00 2001 |
1397 |
+From: Rob Clark <rob@××.com> |
1398 |
+Date: Tue, 14 Sep 2010 07:44:01 -0500 |
1399 |
+Subject: [PATCH 10/11] v4l2: prefer NV12 |
1400 |
+ |
1401 |
+All else being equal, the buffer sizes are smaller compared to a 422 format |
1402 |
+like YUY2/UYVY.. although ideally rank would come from driver. |
1403 |
+--- |
1404 |
+ sys/v4l2/gstv4l2object.c | 3 +++ |
1405 |
+ 1 files changed, 3 insertions(+), 0 deletions(-) |
1406 |
+ |
1407 |
+diff --git a/sys/v4l2/gstv4l2object.c b/sys/v4l2/gstv4l2object.c |
1408 |
+index 5e34456..644edcf 100644 |
1409 |
+--- a/sys/v4l2/gstv4l2object.c |
1410 |
++++ b/sys/v4l2/gstv4l2object.c |
1411 |
+@@ -886,6 +886,9 @@ gst_v4l2_object_format_get_rank (const struct v4l2_fmtdesc *fmt) |
1412 |
+ break; |
1413 |
+ |
1414 |
+ case V4L2_PIX_FMT_NV12: /* 12 Y/CbCr 4:2:0 */ |
1415 |
++ rank = YUV_BASE_RANK + 11; |
1416 |
++ break; |
1417 |
++ |
1418 |
+ case V4L2_PIX_FMT_NV21: /* 12 Y/CrCb 4:2:0 */ |
1419 |
+ case V4L2_PIX_FMT_YYUV: /* 16 YUV 4:2:2 */ |
1420 |
+ case V4L2_PIX_FMT_HI240: /* 8 8-bit color */ |
1421 |
+-- |
1422 |
+1.7.1 |
1423 |
+ |
1424 |
|
1425 |
diff --git a/media-libs/gst-plugins-good/files/gst-0.10.27-0011-v4l2sink-fix-issue-seen-with-autoconvert.patch b/media-libs/gst-plugins-good/files/gst-0.10.27-0011-v4l2sink-fix-issue-seen-with-autoconvert.patch |
1426 |
new file mode 100644 |
1427 |
index 0000000..3384de7 |
1428 |
--- /dev/null |
1429 |
+++ b/media-libs/gst-plugins-good/files/gst-0.10.27-0011-v4l2sink-fix-issue-seen-with-autoconvert.patch |
1430 |
@@ -0,0 +1,49 @@ |
1431 |
+From 4e319948c62aafd5339c38d065fd8dbfa5a09ced Mon Sep 17 00:00:00 2001 |
1432 |
+From: Rob Clark <rob@××.com> |
1433 |
+Date: Thu, 13 Jan 2011 09:43:08 -0600 |
1434 |
+Subject: [PATCH 11/11] v4l2sink: fix issue seen with autoconvert |
1435 |
+ |
1436 |
+In this scenario _set_caps() will get called earlier than _buffer_alloc() |
1437 |
+so we need to not override the number of buffers in the case that the |
1438 |
+upstream element answers the query about number of requested buffers. |
1439 |
+--- |
1440 |
+ sys/v4l2/gstv4l2sink.c | 6 ++++-- |
1441 |
+ 1 files changed, 4 insertions(+), 2 deletions(-) |
1442 |
+ |
1443 |
+diff --git a/sys/v4l2/gstv4l2sink.c b/sys/v4l2/gstv4l2sink.c |
1444 |
+index feafe7a..ca6ae15 100644 |
1445 |
+--- a/sys/v4l2/gstv4l2sink.c |
1446 |
++++ b/sys/v4l2/gstv4l2sink.c |
1447 |
+@@ -881,6 +881,8 @@ gst_v4l2sink_set_caps (GstBaseSink * bsink, GstCaps * caps) |
1448 |
+ |
1449 |
+ gst_query_parse_buffers_count (query, &min_buffers); |
1450 |
+ |
1451 |
++ GST_DEBUG_OBJECT (v4l2sink, "min_buffers=%d", min_buffers); |
1452 |
++ |
1453 |
+ /* XXX need to account for some buffers used by queue, etc.. probably |
1454 |
+ * queue should handle query, pass on to sink pad, and then add some |
1455 |
+ * number of buffers to the min, so this value is dynamic depending |
1456 |
+@@ -888,10 +890,10 @@ gst_v4l2sink_set_caps (GstBaseSink * bsink, GstCaps * caps) |
1457 |
+ */ |
1458 |
+ if (min_buffers != -1) { |
1459 |
+ min_buffers += 3 + v4l2sink->min_queued_bufs; |
1460 |
++ v4l2sink->num_buffers_can_change = FALSE; |
1461 |
+ } |
1462 |
+ |
1463 |
+ if (min_buffers > v4l2sink->num_buffers) { |
1464 |
+- v4l2sink->num_buffers_can_change = FALSE; |
1465 |
+ v4l2sink->num_buffers = min_buffers; |
1466 |
+ } |
1467 |
+ |
1468 |
+@@ -972,7 +974,7 @@ gst_v4l2sink_buffer_alloc (GstBaseSink * bsink, guint64 offset, guint size, |
1469 |
+ * than four buffers: |
1470 |
+ */ |
1471 |
+ if (!strcmp ("omap_vout", driver)) { |
1472 |
+- if (v4l2sink->num_buffers > 4) { |
1473 |
++ if (v4l2sink->num_buffers_can_change && v4l2sink->num_buffers > 4) { |
1474 |
+ v4l2sink->num_buffers = 4; |
1475 |
+ GST_DEBUG_OBJECT (v4l2sink, |
1476 |
+ "limiting to 4 buffers to work-around omap_vout driver bug"); |
1477 |
+-- |
1478 |
+1.7.1 |
1479 |
+ |
1480 |
|
1481 |
diff --git a/media-libs/gst-plugins-good/files/gst-0.10.27-0099-v4l2sink-Disable-rotation-code-when-not-found.patch b/media-libs/gst-plugins-good/files/gst-0.10.27-0099-v4l2sink-Disable-rotation-code-when-not-found.patch |
1482 |
new file mode 100644 |
1483 |
index 0000000..4a2b992 |
1484 |
--- /dev/null |
1485 |
+++ b/media-libs/gst-plugins-good/files/gst-0.10.27-0099-v4l2sink-Disable-rotation-code-when-not-found.patch |
1486 |
@@ -0,0 +1,103 @@ |
1487 |
+From 606df19aa1230d0c6081e85d914c866eb7674a5a Mon Sep 17 00:00:00 2001 |
1488 |
+From: Daniel Diaz <ddiaz@××.com> |
1489 |
+Date: Fri, 28 Jan 2011 15:23:26 -0600 |
1490 |
+Subject: [PATCH] v4l2sink: Disable rotation code when not found. |
1491 |
+ |
1492 |
+Kernel headers might not include support for V4L2 rotation. |
1493 |
+ |
1494 |
+Signed-off-by: Daniel Diaz <ddiaz@××.com> |
1495 |
+--- |
1496 |
+ sys/v4l2/gstv4l2sink.c | 14 ++++++++++++++ |
1497 |
+ 1 files changed, 14 insertions(+), 0 deletions(-) |
1498 |
+ |
1499 |
+diff --git a/sys/v4l2/gstv4l2sink.c b/sys/v4l2/gstv4l2sink.c |
1500 |
+index ca6ae15..374de88 100644 |
1501 |
+--- a/sys/v4l2/gstv4l2sink.c |
1502 |
++++ b/sys/v4l2/gstv4l2sink.c |
1503 |
+@@ -255,7 +255,9 @@ static GstFlowReturn gst_v4l2sink_buffer_alloc (GstBaseSink * bsink, |
1504 |
+ static gboolean gst_v4l2sink_event (GstBaseSink * bsink, GstEvent * event); |
1505 |
+ static GstFlowReturn gst_v4l2sink_show_frame (GstBaseSink * bsink, |
1506 |
+ GstBuffer * buf); |
1507 |
++#ifdef V4L2_CID_ROTATE |
1508 |
+ static void gst_v4l2sink_sync_rotation (GstV4l2Sink * v4l2sink); |
1509 |
++#endif |
1510 |
+ |
1511 |
+ static void |
1512 |
+ gst_v4l2sink_base_init (gpointer g_class) |
1513 |
+@@ -342,10 +344,12 @@ gst_v4l2sink_class_init (GstV4l2SinkClass * klass) |
1514 |
+ "The height of the video crop; default is equal to negotiated image height", |
1515 |
+ 0, 0xffffffff, 0, G_PARAM_READWRITE)); |
1516 |
+ |
1517 |
++#ifdef V4L2_CID_ROTATE |
1518 |
+ g_object_class_install_property (gobject_class, PROP_ROTATION, |
1519 |
+ g_param_spec_int ("rotation", "Rotation angle", |
1520 |
+ "Rotation angle for the image", MIN_ROTATION_ANGLE, |
1521 |
+ MAX_ROTATION_ANGLE, DEFAULT_ROTATION_ANGLE, G_PARAM_READWRITE)); |
1522 |
++#endif |
1523 |
+ |
1524 |
+ g_object_class_install_property (gobject_class, PROP_FLIP, |
1525 |
+ g_param_spec_enum ("flip", "Flip State", |
1526 |
+@@ -420,7 +424,9 @@ gst_v4l2sink_sync_flip (GstV4l2Sink * v4l2sink) |
1527 |
+ break; |
1528 |
+ } |
1529 |
+ |
1530 |
++#ifdef V4L2_CID_ROTATE |
1531 |
+ gst_v4l2sink_sync_rotation (v4l2sink); |
1532 |
++#endif |
1533 |
+ control.id = V4L2_CID_VFLIP; |
1534 |
+ g_return_if_fail (v4l2_ioctl (fd, VIDIOC_S_CTRL, &control) >= 0); |
1535 |
+ } |
1536 |
+@@ -562,6 +568,7 @@ gst_v4l2sink_sync_crop_fields (GstV4l2Sink * v4l2sink) |
1537 |
+ } |
1538 |
+ } |
1539 |
+ |
1540 |
++#ifdef V4L2_CID_ROTATE |
1541 |
+ static void |
1542 |
+ gst_v4l2sink_sync_rotation (GstV4l2Sink * v4l2sink) |
1543 |
+ { |
1544 |
+@@ -575,6 +582,7 @@ gst_v4l2sink_sync_rotation (GstV4l2Sink * v4l2sink) |
1545 |
+ g_return_if_fail (v4l2_ioctl (fd, VIDIOC_S_CTRL, &control) >= 0); |
1546 |
+ } |
1547 |
+ } |
1548 |
++#endif |
1549 |
+ |
1550 |
+ |
1551 |
+ static void |
1552 |
+@@ -632,10 +640,12 @@ gst_v4l2sink_set_property (GObject * object, |
1553 |
+ v4l2sink->crop_fields_set |= RECT_HEIGHT_SET; |
1554 |
+ gst_v4l2sink_sync_crop_fields (v4l2sink); |
1555 |
+ break; |
1556 |
++#ifdef V4L2_CID_ROTATE |
1557 |
+ case PROP_ROTATION: |
1558 |
+ v4l2sink->rotation = g_value_get_int (value); |
1559 |
+ gst_v4l2sink_sync_rotation (v4l2sink); |
1560 |
+ break; |
1561 |
++#endif |
1562 |
+ case PROP_FLIP: |
1563 |
+ v4l2sink->flip = g_value_get_enum (value); |
1564 |
+ gst_v4l2sink_sync_flip (v4l2sink); |
1565 |
+@@ -687,9 +697,11 @@ gst_v4l2sink_get_property (GObject * object, |
1566 |
+ case PROP_CROP_HEIGHT: |
1567 |
+ g_value_set_uint (value, v4l2sink->crop.height); |
1568 |
+ break; |
1569 |
++#ifdef V4L2_CID_ROTATE |
1570 |
+ case PROP_ROTATION: |
1571 |
+ g_value_set_int (value, v4l2sink->rotation); |
1572 |
+ break; |
1573 |
++#endif |
1574 |
+ case PROP_FLIP: |
1575 |
+ g_value_set_enum (value, v4l2sink->flip); |
1576 |
+ break; |
1577 |
+@@ -715,7 +727,9 @@ gst_v4l2sink_change_state (GstElement * element, GstStateChange transition) |
1578 |
+ /* open the device */ |
1579 |
+ if (!gst_v4l2_object_start (v4l2sink->v4l2object)) |
1580 |
+ return GST_STATE_CHANGE_FAILURE; |
1581 |
++#ifdef V4L2_CID_ROTATE |
1582 |
+ gst_v4l2sink_sync_rotation (v4l2sink); |
1583 |
++#endif |
1584 |
+ gst_v4l2sink_sync_flip (v4l2sink); |
1585 |
+ break; |
1586 |
+ default: |
1587 |
+-- |
1588 |
+1.7.1 |
1589 |
+ |
1590 |
|
1591 |
diff --git a/media-libs/gst-plugins-good/gst-plugins-good-0.10.27_p20110127.ebuild b/media-libs/gst-plugins-good/gst-plugins-good-0.10.27_p20110127.ebuild |
1592 |
new file mode 100644 |
1593 |
index 0000000..272f98a |
1594 |
--- /dev/null |
1595 |
+++ b/media-libs/gst-plugins-good/gst-plugins-good-0.10.27_p20110127.ebuild |
1596 |
@@ -0,0 +1,84 @@ |
1597 |
+# Copyright 1999-2011 Gentoo Foundation |
1598 |
+# Distributed under the terms of the GNU General Public License v2 |
1599 |
+# $Header: $ |
1600 |
+ |
1601 |
+# order is important, gnome2 after gst-plugins |
1602 |
+inherit gst-plugins-good gst-plugins10 gnome2 eutils flag-o-matic libtool |
1603 |
+ |
1604 |
+DESCRIPTION="Set of Good plug-ins for GStreamer" |
1605 |
+HOMEPAGE="http://gstreamer.net/" |
1606 |
+MY_P=${P%%_*} |
1607 |
+SRC_URI="http://gstreamer.freedesktop.org/src/${PN}/${MY_P}.tar.bz2" |
1608 |
+S="${WORKDIR}/${MY_P}" |
1609 |
+ |
1610 |
+LICENSE="LGPL-2.1" |
1611 |
+KEYWORDS="~alpha ~amd64 arm ~hppa ~ia64 ~ppc ~ppc64 ~sh ~sparc ~x86 ~x86-fbsd" |
1612 |
+IUSE="" |
1613 |
+ |
1614 |
+RDEPEND=">=media-libs/gst-plugins-base-0.10.32 |
1615 |
+ >=media-libs/gstreamer-0.10.32 |
1616 |
+ >=dev-libs/liboil-0.3.14 |
1617 |
+ sys-libs/zlib |
1618 |
+ app-arch/bzip2" |
1619 |
+DEPEND="${RDEPEND} |
1620 |
+ >=sys-devel/gettext-0.11.5 |
1621 |
+ dev-util/pkgconfig |
1622 |
+ !<media-libs/gst-plugins-bad-0.10.19" |
1623 |
+ |
1624 |
+# Always enable optional bz2 support for matroska |
1625 |
+# Always enable optional zlib support for qtdemux, id3demux and matroska |
1626 |
+# Many media files require these to work, as some container headers are often compressed, bug 291154 |
1627 |
+GST_PLUGINS_BUILD="bz2 zlib" |
1628 |
+ |
1629 |
+src_unpack() { |
1630 |
+ unpack ${A} |
1631 |
+ cd "${S}" |
1632 |
+ epatch "${FILESDIR}"/gst-0.10.27-0001-v4l2-fix-handling-of-RGB32-BGR32-formats.patch |
1633 |
+ epatch "${FILESDIR}"/gst-0.10.27-0002-v4l2sink-Add-rotation-support.patch |
1634 |
+ epatch "${FILESDIR}"/gst-0.10.27-0003-v4l2sink-Add-flip-property.patch |
1635 |
+ epatch "${FILESDIR}"/gst-0.10.27-0004-v4l2sink-Add-support-for-omap24xxvout-driver.patch |
1636 |
+ epatch "${FILESDIR}"/gst-0.10.27-0005-v4l2sink-Add-support-for-omap_vout-driver.patch |
1637 |
+ epatch "${FILESDIR}"/gst-0.10.27-0006-v4l2-increase-v4l2sink-element-rank.patch |
1638 |
+ epatch "${FILESDIR}"/gst-0.10.27-0007-use-GstQueryBuffers-to-get-buffer-requirements.patch |
1639 |
+ epatch "${FILESDIR}"/gst-0.10.27-0008-add-rowstride-support.patch |
1640 |
+ epatch "${FILESDIR}"/gst-0.10.27-0009-use-GstEventCrop-to-get-crop-info.patch |
1641 |
+ epatch "${FILESDIR}"/gst-0.10.27-0010-v4l2-prefer-NV12.patch |
1642 |
+ epatch "${FILESDIR}"/gst-0.10.27-0011-v4l2sink-fix-issue-seen-with-autoconvert.patch |
1643 |
+ epatch "${FILESDIR}"/gst-0.10.27-0099-v4l2sink-Disable-rotation-code-when-not-found.patch |
1644 |
+} |
1645 |
+ |
1646 |
+src_compile() { |
1647 |
+ # gst doesnt handle optimisations well |
1648 |
+ strip-flags |
1649 |
+ replace-flags "-O3" "-O2" |
1650 |
+ filter-flags "-fprefetch-loop-arrays" # see bug 22249 |
1651 |
+ |
1652 |
+ gst-plugins-good_src_configure \ |
1653 |
+ --with-default-audiosink=autoaudiosink \ |
1654 |
+ --with-default-visualizer=goom |
1655 |
+ |
1656 |
+ emake || die "emake failed." |
1657 |
+} |
1658 |
+ |
1659 |
+# override eclass |
1660 |
+src_install() { |
1661 |
+ gnome2_src_install |
1662 |
+} |
1663 |
+ |
1664 |
+DOCS="AUTHORS ChangeLog NEWS README RELEASE" |
1665 |
+ |
1666 |
+pkg_postinst () { |
1667 |
+ gnome2_pkg_postinst |
1668 |
+ |
1669 |
+ echo |
1670 |
+ elog "The GStreamer plugins setup has changed quite a bit on Gentoo," |
1671 |
+ elog "applications now should provide the basic plugins needed." |
1672 |
+ echo |
1673 |
+ elog "The new seperate plugins are all named 'gst-plugins-<plugin>'." |
1674 |
+ elog "To get a listing of currently available plugins execute 'emerge -s gst-plugins-'." |
1675 |
+ elog "In most cases it shouldn't be needed though to emerge extra plugins." |
1676 |
+} |
1677 |
+ |
1678 |
+pkg_postrm() { |
1679 |
+ gnome2_pkg_postrm |
1680 |
+} |