summaryrefslogtreecommitdiffstats
path: root/recipes-qt
diff options
context:
space:
mode:
authorRogerio Pimentel <rogerio.pimentel@freescale.com>2012-06-14 08:53:38 -0500
committerOtavio Salvador <otavio@ossystems.com.br>2012-06-14 12:03:37 -0300
commit907d9aea9e56fc6c06913f7b1dfbb2b1d0f2bea3 (patch)
treeb21d3358a5e74d948ea6690c8cb6ddbc884248f5 /recipes-qt
parent97558c1d2255a19e8d49f6dcedaf4a5ac8f19ee2 (diff)
downloadmeta-fsl-arm-907d9aea9e56fc6c06913f7b1dfbb2b1d0f2bea3.tar.gz
Add QT4.7.4 patch to support Freescale codecs
This patch adds a QT4.7.4 patch file to add support for Freescale Multimedia codecs Signed-off-by: Rogerio Pimentel <rogerio.pimentel@freescale.com>
Diffstat (limited to 'recipes-qt')
-rw-r--r--recipes-qt/qt4/qt4-embedded_4.7.4.bbappend10
-rw-r--r--recipes-qt/qt4/qt4/0001-Add-support-for-i.MX-codecs-to-phonon.patch453
2 files changed, 463 insertions, 0 deletions
diff --git a/recipes-qt/qt4/qt4-embedded_4.7.4.bbappend b/recipes-qt/qt4/qt4-embedded_4.7.4.bbappend
new file mode 100644
index 0000000..cebb203
--- /dev/null
+++ b/recipes-qt/qt4/qt4-embedded_4.7.4.bbappend
@@ -0,0 +1,10 @@
1#Freescale
2FILESEXTRAPATHS_prepend := "${THISDIR}/qt4:"
3
4SRC_URI_append_mx5 += "file://0001-Add-support-for-i.MX-codecs-to-phonon.patch"
5SRC_URI_append_mx6 += "file://0001-Add-support-for-i.MX-codecs-to-phonon.patch"
6
7PACKAGE_ARCH_mx5 = "${MACHINE_ARCH}"
8PACKAGE_ARCH_mx6 = "${MACHINE_ARCH}"
9
10PRINC := "${@int(PRINC) + 1}"
diff --git a/recipes-qt/qt4/qt4/0001-Add-support-for-i.MX-codecs-to-phonon.patch b/recipes-qt/qt4/qt4/0001-Add-support-for-i.MX-codecs-to-phonon.patch
new file mode 100644
index 0000000..c8c12e0
--- /dev/null
+++ b/recipes-qt/qt4/qt4/0001-Add-support-for-i.MX-codecs-to-phonon.patch
@@ -0,0 +1,453 @@
1From d46b70c7679e6706a001771c322185fcc95a981c Mon Sep 17 00:00:00 2001
2From: Rogerio Pimentel <rogerio.pimentel@freescale.com>
3Date: Mon, 4 Jun 2012 14:25:31 -0300
4Subject: [PATCH] Add support for i.MX codecs to phonon
5
6Add support for i.MX codecs to phonon
7
8Signed-off-by: Daniele Dall'Acqua <daniele.d@freescale.com>
9Signed-off-by: Rogerio Pimentel <rogerio.pimentel@freescale.com>
10---
11 src/3rdparty/phonon/gstreamer/abstractrenderer.h | 1 +
12 src/3rdparty/phonon/gstreamer/mediaobject.cpp | 4 +
13 src/3rdparty/phonon/gstreamer/videowidget.cpp | 57 ++------
14 src/3rdparty/phonon/gstreamer/videowidget.h | 1 +
15 src/3rdparty/phonon/gstreamer/widgetrenderer.cpp | 166 +++++++++++++---------
16 src/3rdparty/phonon/gstreamer/widgetrenderer.h | 17 ++-
17 src/3rdparty/phonon/gstreamer/x11renderer.cpp | 23 +---
18 7 files changed, 136 insertions(+), 133 deletions(-)
19
20diff --git a/src/3rdparty/phonon/gstreamer/abstractrenderer.h b/src/3rdparty/phonon/gstreamer/abstractrenderer.h
21index 10a2822..4901530 100644
22--- a/src/3rdparty/phonon/gstreamer/abstractrenderer.h
23+++ b/src/3rdparty/phonon/gstreamer/abstractrenderer.h
24@@ -49,6 +49,7 @@ public:
25 virtual bool eventFilter(QEvent *) = 0;
26 virtual void handlePaint(QPaintEvent *) {}
27 virtual bool paintsOnWidget() { return true; } // Controls overlays
28+ virtual void handleMove(QMoveEvent * event ) = 0;
29
30 protected:
31 VideoWidget *m_videoWidget;
32diff --git a/src/3rdparty/phonon/gstreamer/mediaobject.cpp b/src/3rdparty/phonon/gstreamer/mediaobject.cpp
33index 23a60c0..f806d64 100644
34--- a/src/3rdparty/phonon/gstreamer/mediaobject.cpp
35+++ b/src/3rdparty/phonon/gstreamer/mediaobject.cpp
36@@ -515,6 +515,9 @@ void MediaObject::createPipeline()
37 // reduce buffer overruns as these are not gracefully handled at the moment.
38 m_audioPipe = gst_element_factory_make("queue", NULL);
39 g_object_set(G_OBJECT(m_audioPipe), "max-size-time", MAX_QUEUE_TIME, (const char*)NULL);
40+ g_object_set(G_OBJECT(m_audioPipe), "max-size-time", 0, (const char*)NULL);
41+ g_object_set(G_OBJECT(m_audioPipe), "max-size-buffers", 0, (const char*)NULL);
42+ g_object_set(G_OBJECT(m_audioPipe), "max-size-bytes", 0, (const char*)NULL);
43 gst_bin_add(GST_BIN(m_audioGraph), m_audioPipe);
44 GstPad *audiopad = gst_element_get_pad (m_audioPipe, "sink");
45 gst_element_add_pad (m_audioGraph, gst_ghost_pad_new ("sink", audiopad));
46@@ -527,6 +530,7 @@ void MediaObject::createPipeline()
47
48 m_videoPipe = gst_element_factory_make("queue", NULL);
49 g_object_set(G_OBJECT(m_videoPipe), "max-size-time", MAX_QUEUE_TIME, (const char*)NULL);
50+ g_object_set(G_OBJECT(m_videoPipe), "max-size-time", 33000, (const char*)NULL);
51 gst_bin_add(GST_BIN(m_videoGraph), m_videoPipe);
52 GstPad *videopad = gst_element_get_pad (m_videoPipe, "sink");
53 gst_element_add_pad (m_videoGraph, gst_ghost_pad_new ("sink", videopad));
54diff --git a/src/3rdparty/phonon/gstreamer/videowidget.cpp b/src/3rdparty/phonon/gstreamer/videowidget.cpp
55index e1f0ec9..6c9862b 100644
56--- a/src/3rdparty/phonon/gstreamer/videowidget.cpp
57+++ b/src/3rdparty/phonon/gstreamer/videowidget.cpp
58@@ -81,48 +81,17 @@ void VideoWidget::setupVideoBin()
59 Q_ASSERT(m_videoBin);
60 gst_object_ref (GST_OBJECT (m_videoBin)); //Take ownership
61 gst_object_sink (GST_OBJECT (m_videoBin));
62+ gst_bin_add_many (GST_BIN (m_videoBin), videoSink, NULL);
63+ GstPad *videopad = gst_element_get_pad (videoSink,"sink");
64+ gst_element_add_pad (m_videoBin, gst_ghost_pad_new ("sink", videopad));
65+ gst_object_unref (videopad);
66+ QWidget *parentWidget = qobject_cast<QWidget*>(parent());
67
68- //The videoplug element is the final element before the pluggable videosink
69- m_videoplug = gst_element_factory_make ("identity", NULL);
70-
71- //Colorspace ensures that the output of the stream matches the input format accepted by our video sink
72- m_colorspace = gst_element_factory_make ("ffmpegcolorspace", NULL);
73-
74- //Video scale is used to prepare the correct aspect ratio and scale.
75- GstElement *videoScale = gst_element_factory_make ("videoscale", NULL);
76-
77- //We need a queue to support the tee from parent node
78- GstElement *queue = gst_element_factory_make ("queue", NULL);
79-
80- if (queue && m_videoBin && videoScale && m_colorspace && videoSink && m_videoplug) {
81- //Ensure that the bare essentials are prepared
82- gst_bin_add_many (GST_BIN (m_videoBin), queue, m_colorspace, m_videoplug, videoScale, videoSink, (const char*)NULL);
83- bool success = false;
84- //Video balance controls color/sat/hue in the YUV colorspace
85- m_videoBalance = gst_element_factory_make ("videobalance", NULL);
86- if (m_videoBalance) {
87- // For video balance to work we have to first ensure that the video is in YUV colorspace,
88- // then hand it off to the videobalance filter before finally converting it back to RGB.
89- // Hence we nede a videoFilter to convert the colorspace before and after videobalance
90- GstElement *m_colorspace2 = gst_element_factory_make ("ffmpegcolorspace", NULL);
91- gst_bin_add_many(GST_BIN(m_videoBin), m_videoBalance, m_colorspace2, (const char*)NULL);
92- success = gst_element_link_many(queue, m_colorspace, m_videoBalance, m_colorspace2, videoScale, m_videoplug, videoSink, (const char*)NULL);
93- } else {
94- //If video balance is not available, just connect to sink directly
95- success = gst_element_link_many(queue, m_colorspace, videoScale, m_videoplug, videoSink, (const char*)NULL);
96- }
97+ if (parentWidget)
98+ parentWidget->winId(); // Due to some existing issues with alien in 4.4,
99+ // we must currently force the creation of a parent widget.
100+ m_isValid = true; //initialization ok, accept input
101
102- if (success) {
103- GstPad *videopad = gst_element_get_pad (queue, "sink");
104- gst_element_add_pad (m_videoBin, gst_ghost_pad_new ("sink", videopad));
105- gst_object_unref (videopad);
106- QWidget *parentWidget = qobject_cast<QWidget*>(parent());
107- if (parentWidget)
108- parentWidget->winId(); // Due to some existing issues with alien in 4.4,
109- // we must currently force the creation of a parent widget.
110- m_isValid = true; //initialization ok, accept input
111- }
112- }
113 }
114
115 void VideoWidget::paintEvent(QPaintEvent *event)
116@@ -131,6 +100,12 @@ void VideoWidget::paintEvent(QPaintEvent *event)
117 m_renderer->handlePaint(event);
118 }
119
120+void VideoWidget::moveEvent(QMoveEvent * event )
121+{
122+ Q_ASSERT(m_renderer);
123+ m_renderer->handleMove(event);
124+}
125+
126 void VideoWidget::setVisible(bool val) {
127 Q_ASSERT(m_renderer);
128
129diff --git a/src/3rdparty/phonon/gstreamer/videowidget.h b/src/3rdparty/phonon/gstreamer/videowidget.h
130index 8603f6a..38c7b17 100644
131--- a/src/3rdparty/phonon/gstreamer/videowidget.h
132+++ b/src/3rdparty/phonon/gstreamer/videowidget.h
133@@ -65,6 +65,7 @@ public:
134 qreal saturation() const;
135 void setSaturation(qreal);
136 void setMovieSize(const QSize &size);
137+ void moveEvent(QMoveEvent * event );
138 QSize sizeHint() const;
139 QRect scaleToAspect(QRect srcRect, int w, int h) const;
140 QRect calculateDrawFrameRect() const;
141diff --git a/src/3rdparty/phonon/gstreamer/widgetrenderer.cpp b/src/3rdparty/phonon/gstreamer/widgetrenderer.cpp
142index 423af9d..de524ec 100644
143--- a/src/3rdparty/phonon/gstreamer/widgetrenderer.cpp
144+++ b/src/3rdparty/phonon/gstreamer/widgetrenderer.cpp
145@@ -15,7 +15,9 @@
146 along with this library. If not, see <http://www.gnu.org/licenses/>.
147 */
148
149+#include <QMouseEvent>
150 #include <QtGui/QPainter>
151+#include <QPaintEvent>
152 #include <gst/gst.h>
153 #include "common.h"
154 #include "message.h"
155@@ -24,6 +26,19 @@
156 #include "widgetrenderer.h"
157 #include "qrgb.h"
158
159+#include <stdio.h>
160+#include <stdlib.h>
161+#include <errno.h>
162+#include <stdint.h>
163+#include <fcntl.h>
164+#include <sys/ioctl.h>
165+#include <unistd.h>
166+
167+#include <linux/mxcfb.h>
168+
169+#define MXCFB_GBL_ALPHA 255
170+#define MXCFB_CLR_KEY 0x00000000 // ARGB8888
171+
172 // support old OpenGL installations (1.2)
173 // assume that if TEXTURE0 isn't defined, none are
174 #ifndef GL_TEXTURE0
175@@ -35,26 +50,6 @@
176 #ifndef QT_NO_PHONON_VIDEO
177 QT_BEGIN_NAMESPACE
178
179-static void frameRendered()
180-{
181- static QString displayFps = qgetenv("PHONON_GST_FPS");
182- if (displayFps.isEmpty())
183- return;
184-
185- static int frames = 0;
186- static QTime lastTime = QTime::currentTime();
187- QTime time = QTime::currentTime();
188-
189- int delta = lastTime.msecsTo(time);
190- if (delta > 2000) {
191- printf("FPS: %f\n", 1000.0 * frames / qreal(delta));
192- lastTime = time;
193- frames = 0;
194- }
195-
196- ++frames;
197-}
198-
199 namespace Phonon
200 {
201 namespace Gstreamer
202@@ -62,20 +57,12 @@ namespace Gstreamer
203
204 WidgetRenderer::WidgetRenderer(VideoWidget *videoWidget)
205 : AbstractRenderer(videoWidget)
206- , m_width(0)
207- , m_height(0)
208 {
209- videoWidget->backend()->logMessage("Creating QWidget renderer");
210- if ((m_videoSink = GST_ELEMENT(g_object_new(get_type_RGB(), NULL)))) {
211- gst_object_ref (GST_OBJECT (m_videoSink)); //Take ownership
212+ if ((m_videoSink = gst_element_factory_make("mfw_v4lsink", NULL)) && m_videoSink != NULL) {
213+ gst_object_ref (GST_OBJECT (m_videoSink)); //Take ownership
214 gst_object_sink (GST_OBJECT (m_videoSink));
215-
216- QWidgetVideoSinkBase* sink = reinterpret_cast<QWidgetVideoSinkBase*>(m_videoSink);
217- // Let the videosink know which widget to direct frame updates to
218- sink->renderWidget = videoWidget;
219 }
220
221- // Clear the background with black by default
222 QPalette palette;
223 palette.setColor(QPalette::Background, Qt::black);
224 m_videoWidget->setPalette(palette);
225@@ -84,65 +71,116 @@ WidgetRenderer::WidgetRenderer(VideoWidget *videoWidget)
226 m_videoWidget->setAttribute(Qt::WA_PaintOnScreen, false);
227 }
228
229-void WidgetRenderer::setNextFrame(const QByteArray &array, int w, int h)
230+WidgetRenderer::~WidgetRenderer()
231 {
232- if (m_videoWidget->root()->state() == Phonon::LoadingState)
233- return;
234+ if (m_videoSink) {
235+ gst_object_unref (GST_OBJECT (m_videoSink));
236+ m_videoSink = 0;
237+ }
238+}
239
240- m_frame = QImage();
241- {
242- m_frame = QImage((uchar *)array.constData(), w, h, QImage::Format_RGB32);
243- }
244+void WidgetRenderer::setVideoSize(void)
245+{
246+
247+ int adj_x;
248+ int adj_y;
249+
250+ QSize wSize = m_videoWidget->size();
251+ m_drawFrameRect = m_videoWidget->calculateDrawFrameRect();
252+ framePos = m_videoWidget->mapToGlobal(QPoint(0,0));
253
254- m_array = array;
255- m_width = w;
256- m_height = h;
257+ //Center the video in the widget
258
259- m_videoWidget->update();
260+ adj_x = (wSize.width()/2) - (m_drawFrameRect.width()/2);
261+ adj_y = (wSize.height()/2) - (m_drawFrameRect.height()/2);
262+
263+ g_object_set(G_OBJECT(m_videoSink), "axis-left",adj_x + framePos.x(),(const char*)NULL);
264+ g_object_set(G_OBJECT(m_videoSink), "axis-top", adj_y + framePos.y(), (const char*)NULL);
265+ g_object_set(G_OBJECT(m_videoSink), "disp-width", m_drawFrameRect.width(), (const char*)NULL);
266+ g_object_set(G_OBJECT(m_videoSink), "disp-height", m_drawFrameRect.height(), (const char*)NULL);
267+ g_object_set(G_OBJECT(m_videoSink), "setpara", 1, (const char*)NULL);
268 }
269
270 void WidgetRenderer::handleMediaNodeEvent(const MediaNodeEvent *event)
271 {
272 switch (event->type()) {
273- case MediaNodeEvent::SourceChanged:
274- {
275- clearFrame();
276- break;
277- }
278 default:
279 break;
280 }
281 }
282
283-void WidgetRenderer::clearFrame()
284+void WidgetRenderer::handlePaint(QPaintEvent *event)
285 {
286- m_frame = QImage();
287- m_array = QByteArray();
288- m_videoWidget->update();
289+ Q_UNUSED(event);
290+ QPainter painter(m_videoWidget);
291+ painter.fillRect(m_videoWidget->rect(), m_videoWidget->palette().background());
292 }
293
294-const QImage &WidgetRenderer::currentFrame() const
295+int WidgetRenderer::setOverlay(void)
296 {
297- return m_frame;
298+ struct mxcfb_color_key color_key;
299+ struct mxcfb_gbl_alpha alpha;
300+ int fd_fb;
301+
302+ if ((fd_fb = open("/dev/fb0", O_RDWR, 0)) < 0)
303+ {
304+ printf("Unable to open %s\n", "/dev/fb0");
305+ return -1;
306+ }
307+
308+ alpha.alpha = MXCFB_GBL_ALPHA;
309+ alpha.enable = 1;
310+
311+ if (ioctl(fd_fb, MXCFB_SET_GBL_ALPHA, &alpha) < 0) {
312+ printf("Error in applying Alpha\n");
313+ }
314+
315+ color_key.color_key = MXCFB_CLR_KEY & 0x00FFFFFF;
316+ color_key.enable = 1;
317+ if ( ioctl(fd_fb, MXCFB_SET_CLR_KEY, &color_key) < 0) {
318+ printf("Error in applying Color Key\n");
319+ return -1;
320+ }
321+ close (fd_fb);
322+ return 0;
323 }
324
325-void WidgetRenderer::handlePaint(QPaintEvent *event)
326+void WidgetRenderer::handleMove( QMoveEvent * event)
327 {
328- Q_UNUSED(event);
329- QPainter painter(m_videoWidget);
330- m_drawFrameRect = m_videoWidget->calculateDrawFrameRect();
331- painter.drawImage(drawFrameRect(), currentFrame());
332- frameRendered();
333+ Q_UNUSED(event);
334+
335+ if (framePos != m_videoWidget->mapToGlobal(QPoint(0,0)))
336+ setVideoSize();
337 }
338
339 bool WidgetRenderer::eventFilter(QEvent * event)
340 {
341- if (event->type() == QEvent::User) {
342- NewFrameEvent *frameEvent= static_cast <NewFrameEvent *>(event);
343- setNextFrame(frameEvent->frame, frameEvent->width, frameEvent->height);
344- return true;
345- }
346- return false;
347+ if (event->type() == QEvent::Show) {
348+ setOverlay();
349+ return true;
350+ } else if (event->type() == QEvent::Resize) {
351+ setVideoSize();
352+ return true;
353+ }
354+ if (framePos != m_videoWidget->mapToGlobal(QPoint(0,0)))
355+ setVideoSize();
356+ return false;
357+}
358+
359+void WidgetRenderer::aspectRatioChanged(Phonon::VideoWidget::AspectRatio)
360+{
361+ setVideoSize();
362+}
363+
364+void WidgetRenderer::scaleModeChanged(Phonon::VideoWidget::ScaleMode)
365+{
366+ setVideoSize();
367+}
368+
369+void WidgetRenderer::movieSizeChanged(const QSize &movieSize)
370+{
371+ Q_UNUSED(movieSize);
372+ setVideoSize();
373 }
374
375 }
376diff --git a/src/3rdparty/phonon/gstreamer/widgetrenderer.h b/src/3rdparty/phonon/gstreamer/widgetrenderer.h
377index 03ee9c0..886975a 100644
378--- a/src/3rdparty/phonon/gstreamer/widgetrenderer.h
379+++ b/src/3rdparty/phonon/gstreamer/widgetrenderer.h
380@@ -40,20 +40,21 @@ class WidgetRenderer : public AbstractRenderer
381 {
382 public:
383 WidgetRenderer(VideoWidget *videoWidget);
384+ ~WidgetRenderer(void);
385 bool eventFilter(QEvent * event);
386 void handlePaint(QPaintEvent *paintEvent);
387 void handleMediaNodeEvent(const MediaNodeEvent *event);
388- const QImage& currentFrame() const;
389 QRect drawFrameRect() const { return m_drawFrameRect; }
390- void setNextFrame(const QByteArray &array, int width, int height);
391- bool frameIsSet() { return !m_array.isNull(); }
392- void clearFrame();
393+ void aspectRatioChanged(Phonon::VideoWidget::AspectRatio aspectRatio);
394+ void scaleModeChanged(Phonon::VideoWidget::ScaleMode scaleMode);
395+ void movieSizeChanged(const QSize &movieSize);
396+ void setVideoSize(void);
397+ int setOverlay(void);
398+ void handleMove(QMoveEvent* event);
399 private:
400- mutable QImage m_frame;
401- QByteArray m_array;
402- int m_width;
403- int m_height;
404+ void paintEvent ( QPaintEvent * event );
405 QRect m_drawFrameRect;
406+ QPoint framePos;
407 };
408
409 }
410diff --git a/src/3rdparty/phonon/gstreamer/x11renderer.cpp b/src/3rdparty/phonon/gstreamer/x11renderer.cpp
411index 968f3a8..2119840 100644
412--- a/src/3rdparty/phonon/gstreamer/x11renderer.cpp
413+++ b/src/3rdparty/phonon/gstreamer/x11renderer.cpp
414@@ -31,6 +31,8 @@
415 #include "mediaobject.h"
416 #include "message.h"
417
418+#define FSL_GSTREAMER 1
419+
420 QT_BEGIN_NAMESPACE
421
422 namespace Phonon
423@@ -83,26 +85,7 @@ X11Renderer::~X11Renderer()
424
425 GstElement* X11Renderer::createVideoSink()
426 {
427- GstElement *videoSink = gst_element_factory_make ("xvimagesink", NULL);
428- if (videoSink) {
429- // Check if the xv sink is usable
430- if (gst_element_set_state(videoSink, GST_STATE_READY) != GST_STATE_CHANGE_SUCCESS) {
431- gst_object_unref(GST_OBJECT(videoSink));
432- videoSink = 0;
433- } else {
434- // Note that this should not really be necessary as these are
435- // default values, though under certain conditions values are retained
436- // even between application instances. (reproducible on 0.10.16/Gutsy)
437- g_object_set(G_OBJECT(videoSink), "brightness", 0, (const char*)NULL);
438- g_object_set(G_OBJECT(videoSink), "contrast", 0, (const char*)NULL);
439- g_object_set(G_OBJECT(videoSink), "hue", 0, (const char*)NULL);
440- g_object_set(G_OBJECT(videoSink), "saturation", 0, (const char*)NULL);
441- }
442- }
443-
444- if (!videoSink)
445- videoSink = gst_element_factory_make ("ximagesink", NULL);
446-
447+ GstElement *videoSink = gst_element_factory_make ("mfw_v4lsink", NULL);
448 gst_object_ref (GST_OBJECT (videoSink)); //Take ownership
449 gst_object_sink (GST_OBJECT (videoSink));
450
451--
4521.7.1
453