Gentoo Archives: gentoo-commits

From: "Raúl Porcel" <armin76@g.o>
To: gentoo-commits@l.g.o
Subject: [gentoo-commits] proj/pandaboard:master commit in: media-libs/gst-plugins-good/, media-libs/gst-plugins-good/files/
Date: Mon, 04 Apr 2011 17:48:52
Message-Id: 1264d9379ac0b690f6948b4822cf0cdf81520bd8.armin76@gentoo
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 +}