diff options
Diffstat (limited to 'dynamic-layers')
8 files changed, 685 insertions, 0 deletions
diff --git a/dynamic-layers/qt4-layer/recipes-qt4/qt4/qt4-embedded_%.bbappend b/dynamic-layers/qt4-layer/recipes-qt4/qt4/qt4-embedded_%.bbappend new file mode 100644 index 000000000..14324ca1a --- /dev/null +++ b/dynamic-layers/qt4-layer/recipes-qt4/qt4/qt4-embedded_%.bbappend | |||
| @@ -0,0 +1 @@ | |||
| include qt4-imx-support.inc | |||
diff --git a/dynamic-layers/qt4-layer/recipes-qt4/qt4/qt4-imx-support.inc b/dynamic-layers/qt4-layer/recipes-qt4/qt4/qt4-imx-support.inc new file mode 100644 index 000000000..0efb56451 --- /dev/null +++ b/dynamic-layers/qt4-layer/recipes-qt4/qt4/qt4-imx-support.inc | |||
| @@ -0,0 +1,28 @@ | |||
| 1 | FILESEXTRAPATHS_prepend := "${THISDIR}/qt4:" | ||
| 2 | |||
| 3 | python __anonymous () { | ||
| 4 | families = ['mx6'] | ||
| 5 | cur_families = (d.getVar('SOC_FAMILY', True) or '').split(':') | ||
| 6 | if any(map(lambda x: x in cur_families, | ||
| 7 | families)): | ||
| 8 | d.appendVarFlag('do_configure', 'depends', ' virtual/kernel:do_shared_workdir') | ||
| 9 | } | ||
| 10 | |||
| 11 | SRC_URI_append_mx6 += " \ | ||
| 12 | file://0001-Add-support-for-i.MX-codecs-to-phonon.patch \ | ||
| 13 | file://0002-i.MX-video-renderer-Allow-v4l-device-from-environmen.patch \ | ||
| 14 | file://0003-i.MX6-force-egl-visual-ID-33.patch \ | ||
| 15 | " | ||
| 16 | |||
| 17 | DEPENDS_append_mx6 = " virtual/kernel virtual/libgles2" | ||
| 18 | QT_GLFLAGS_mx6 = "-opengl es2 -openvg" | ||
| 19 | QT_CONFIG_FLAGS_append_mx6 = " -I${STAGING_KERNEL_DIR}/include/uapi \ | ||
| 20 | -I${STAGING_KERNEL_DIR}/include/ \ | ||
| 21 | -DLINUX=1 -DEGL_API_FB=1 \ | ||
| 22 | -DQT_QPA_EXPERIMENTAL_TOUCHEVENT=1" | ||
| 23 | |||
| 24 | # The QT_CONFIG_FLAGS can pollute *.la files with -Dxxx | ||
| 25 | do_compile_append_mx6 () { | ||
| 26 | find lib -name "*.la" | xargs -n1 sed -i 's/-D.*=1//g' | ||
| 27 | } | ||
| 28 | |||
diff --git a/dynamic-layers/qt4-layer/recipes-qt4/qt4/qt4-x11-free_%.bbappend b/dynamic-layers/qt4-layer/recipes-qt4/qt4/qt4-x11-free_%.bbappend new file mode 100644 index 000000000..14324ca1a --- /dev/null +++ b/dynamic-layers/qt4-layer/recipes-qt4/qt4/qt4-x11-free_%.bbappend | |||
| @@ -0,0 +1 @@ | |||
| include qt4-imx-support.inc | |||
diff --git a/dynamic-layers/qt4-layer/recipes-qt4/qt4/qt4/0001-Add-support-for-i.MX-codecs-to-phonon.patch b/dynamic-layers/qt4-layer/recipes-qt4/qt4/qt4/0001-Add-support-for-i.MX-codecs-to-phonon.patch new file mode 100644 index 000000000..1213650c2 --- /dev/null +++ b/dynamic-layers/qt4-layer/recipes-qt4/qt4/qt4/0001-Add-support-for-i.MX-codecs-to-phonon.patch | |||
| @@ -0,0 +1,468 @@ | |||
| 1 | From 2ff5682e42771519757756dedbf27b7a9e8e25d9 Mon Sep 17 00:00:00 2001 | ||
| 2 | From: Rogerio Pimentel <rogerio.pimentel@freescale.com> | ||
| 3 | Date: Tue, 24 Jul 2012 13:47:01 -0300 | ||
| 4 | Subject: [PATCH] Add support for i.MX codecs to phonon | ||
| 5 | |||
| 6 | Add support for i.MX codecs to phonon | ||
| 7 | |||
| 8 | Signed-off-by: Daniele Dall'Acqua <daniele.d@freescale.com> | ||
| 9 | Signed-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 | 60 ++------ | ||
| 14 | src/3rdparty/phonon/gstreamer/videowidget.h | 1 + | ||
| 15 | src/3rdparty/phonon/gstreamer/widgetrenderer.cpp | 169 ++++++++++++++-------- | ||
| 16 | src/3rdparty/phonon/gstreamer/widgetrenderer.h | 17 ++- | ||
| 17 | src/3rdparty/phonon/gstreamer/x11renderer.cpp | 22 +--- | ||
| 18 | 7 files changed, 141 insertions(+), 133 deletions(-) | ||
| 19 | |||
| 20 | diff --git a/src/3rdparty/phonon/gstreamer/abstractrenderer.h b/src/3rdparty/phonon/gstreamer/abstractrenderer.h | ||
| 21 | index 10a2822..fa0d87d 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 ) {}; | ||
| 29 | |||
| 30 | protected: | ||
| 31 | VideoWidget *m_videoWidget; | ||
| 32 | diff --git a/src/3rdparty/phonon/gstreamer/mediaobject.cpp b/src/3rdparty/phonon/gstreamer/mediaobject.cpp | ||
| 33 | index 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)); | ||
| 54 | diff --git a/src/3rdparty/phonon/gstreamer/videowidget.cpp b/src/3rdparty/phonon/gstreamer/videowidget.cpp | ||
| 55 | index a4c6f79..3682d3f 100644 | ||
| 56 | --- a/src/3rdparty/phonon/gstreamer/videowidget.cpp | ||
| 57 | +++ b/src/3rdparty/phonon/gstreamer/videowidget.cpp | ||
| 58 | @@ -83,50 +83,16 @@ 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 | - | ||
| 63 | - //The videoplug element is the final element before the pluggable videosink | ||
| 64 | - m_videoplug = gst_element_factory_make ("identity", NULL); | ||
| 65 | - | ||
| 66 | - //Colorspace ensures that the output of the stream matches the input format accepted by our video sink | ||
| 67 | - m_colorspace = gst_element_factory_make ("ffmpegcolorspace", NULL); | ||
| 68 | - | ||
| 69 | - //Video scale is used to prepare the correct aspect ratio and scale. | ||
| 70 | - GstElement *videoScale = gst_element_factory_make ("videoscale", NULL); | ||
| 71 | - | ||
| 72 | - //We need a queue to support the tee from parent node | ||
| 73 | - GstElement *queue = gst_element_factory_make ("queue", NULL); | ||
| 74 | - | ||
| 75 | - if (queue && m_videoBin && videoScale && m_colorspace && videoSink && m_videoplug) { | ||
| 76 | - //Ensure that the bare essentials are prepared | ||
| 77 | - gst_bin_add_many (GST_BIN (m_videoBin), queue, m_colorspace, m_videoplug, videoScale, videoSink, (const char*)NULL); | ||
| 78 | - bool success = false; | ||
| 79 | - //Video balance controls color/sat/hue in the YUV colorspace | ||
| 80 | - m_videoBalance = gst_element_factory_make ("videobalance", NULL); | ||
| 81 | - if (m_videoBalance) { | ||
| 82 | - // For video balance to work we have to first ensure that the video is in YUV colorspace, | ||
| 83 | - // then hand it off to the videobalance filter before finally converting it back to RGB. | ||
| 84 | - // Hence we nede a videoFilter to convert the colorspace before and after videobalance | ||
| 85 | - GstElement *m_colorspace2 = gst_element_factory_make ("ffmpegcolorspace", NULL); | ||
| 86 | - gst_bin_add_many(GST_BIN(m_videoBin), m_videoBalance, m_colorspace2, (const char*)NULL); | ||
| 87 | - success = gst_element_link_many(queue, m_colorspace, m_videoBalance, m_colorspace2, videoScale, m_videoplug, videoSink, (const char*)NULL); | ||
| 88 | - } else { | ||
| 89 | - //If video balance is not available, just connect to sink directly | ||
| 90 | - success = gst_element_link_many(queue, m_colorspace, videoScale, m_videoplug, videoSink, (const char*)NULL); | ||
| 91 | - } | ||
| 92 | - | ||
| 93 | - if (success) { | ||
| 94 | - GstPad *videopad = gst_element_get_pad (queue, "sink"); | ||
| 95 | - gst_element_add_pad (m_videoBin, gst_ghost_pad_new ("sink", videopad)); | ||
| 96 | - gst_object_unref (videopad); | ||
| 97 | -#ifndef Q_WS_QPA | ||
| 98 | - QWidget *parentWidget = qobject_cast<QWidget*>(parent()); | ||
| 99 | - if (parentWidget) | ||
| 100 | - parentWidget->winId(); // Due to some existing issues with alien in 4.4, | ||
| 101 | - // we must currently force the creation of a parent widget. | ||
| 102 | -#endif | ||
| 103 | - m_isValid = true; //initialization ok, accept input | ||
| 104 | - } | ||
| 105 | - } | ||
| 106 | + gst_bin_add_many (GST_BIN (m_videoBin), videoSink, NULL); | ||
| 107 | + GstPad *videopad = gst_element_get_pad (videoSink,"sink"); | ||
| 108 | + gst_element_add_pad (m_videoBin, gst_ghost_pad_new ("sink", videopad)); | ||
| 109 | + gst_object_unref (videopad); | ||
| 110 | + QWidget *parentWidget = qobject_cast<QWidget*>(parent()); | ||
| 111 | + | ||
| 112 | + if (parentWidget) | ||
| 113 | + parentWidget->winId(); // Due to some existing issues with alien in 4.4, | ||
| 114 | + // we must currently force the creation of a parent widget. | ||
| 115 | + m_isValid = true; //initialization ok, accept input | ||
| 116 | } | ||
| 117 | |||
| 118 | void VideoWidget::paintEvent(QPaintEvent *event) | ||
| 119 | @@ -135,6 +101,12 @@ void VideoWidget::paintEvent(QPaintEvent *event) | ||
| 120 | m_renderer->handlePaint(event); | ||
| 121 | } | ||
| 122 | |||
| 123 | +void VideoWidget::moveEvent(QMoveEvent * event ) | ||
| 124 | +{ | ||
| 125 | + Q_ASSERT(m_renderer); | ||
| 126 | + m_renderer->handleMove(event); | ||
| 127 | +} | ||
| 128 | + | ||
| 129 | void VideoWidget::setVisible(bool val) { | ||
| 130 | Q_ASSERT(m_renderer); | ||
| 131 | |||
| 132 | diff --git a/src/3rdparty/phonon/gstreamer/videowidget.h b/src/3rdparty/phonon/gstreamer/videowidget.h | ||
| 133 | index 8603f6a..38c7b17 100644 | ||
| 134 | --- a/src/3rdparty/phonon/gstreamer/videowidget.h | ||
| 135 | +++ b/src/3rdparty/phonon/gstreamer/videowidget.h | ||
| 136 | @@ -65,6 +65,7 @@ public: | ||
| 137 | qreal saturation() const; | ||
| 138 | void setSaturation(qreal); | ||
| 139 | void setMovieSize(const QSize &size); | ||
| 140 | + void moveEvent(QMoveEvent * event ); | ||
| 141 | QSize sizeHint() const; | ||
| 142 | QRect scaleToAspect(QRect srcRect, int w, int h) const; | ||
| 143 | QRect calculateDrawFrameRect() const; | ||
| 144 | diff --git a/src/3rdparty/phonon/gstreamer/widgetrenderer.cpp b/src/3rdparty/phonon/gstreamer/widgetrenderer.cpp | ||
| 145 | index 423af9d..aa4925a 100644 | ||
| 146 | --- a/src/3rdparty/phonon/gstreamer/widgetrenderer.cpp | ||
| 147 | +++ b/src/3rdparty/phonon/gstreamer/widgetrenderer.cpp | ||
| 148 | @@ -15,7 +15,9 @@ | ||
| 149 | along with this library. If not, see <http://www.gnu.org/licenses/>. | ||
| 150 | */ | ||
| 151 | |||
| 152 | +#include <QMouseEvent> | ||
| 153 | #include <QtGui/QPainter> | ||
| 154 | +#include <QPaintEvent> | ||
| 155 | #include <gst/gst.h> | ||
| 156 | #include "common.h" | ||
| 157 | #include "message.h" | ||
| 158 | @@ -24,6 +26,18 @@ | ||
| 159 | #include "widgetrenderer.h" | ||
| 160 | #include "qrgb.h" | ||
| 161 | |||
| 162 | +#include <stdio.h> | ||
| 163 | +#include <stdlib.h> | ||
| 164 | +#include <errno.h> | ||
| 165 | +#include <stdint.h> | ||
| 166 | +#include <fcntl.h> | ||
| 167 | +#include <sys/ioctl.h> | ||
| 168 | +#include <unistd.h> | ||
| 169 | +#include <linux/mxcfb.h> | ||
| 170 | + | ||
| 171 | +#define MXCFB_GBL_ALPHA 255 | ||
| 172 | +#define MXCFB_CLR_KEY 0x00000000 // ARGB8888 | ||
| 173 | + | ||
| 174 | // support old OpenGL installations (1.2) | ||
| 175 | // assume that if TEXTURE0 isn't defined, none are | ||
| 176 | #ifndef GL_TEXTURE0 | ||
| 177 | @@ -35,26 +49,6 @@ | ||
| 178 | #ifndef QT_NO_PHONON_VIDEO | ||
| 179 | QT_BEGIN_NAMESPACE | ||
| 180 | |||
| 181 | -static void frameRendered() | ||
| 182 | -{ | ||
| 183 | - static QString displayFps = qgetenv("PHONON_GST_FPS"); | ||
| 184 | - if (displayFps.isEmpty()) | ||
| 185 | - return; | ||
| 186 | - | ||
| 187 | - static int frames = 0; | ||
| 188 | - static QTime lastTime = QTime::currentTime(); | ||
| 189 | - QTime time = QTime::currentTime(); | ||
| 190 | - | ||
| 191 | - int delta = lastTime.msecsTo(time); | ||
| 192 | - if (delta > 2000) { | ||
| 193 | - printf("FPS: %f\n", 1000.0 * frames / qreal(delta)); | ||
| 194 | - lastTime = time; | ||
| 195 | - frames = 0; | ||
| 196 | - } | ||
| 197 | - | ||
| 198 | - ++frames; | ||
| 199 | -} | ||
| 200 | - | ||
| 201 | namespace Phonon | ||
| 202 | { | ||
| 203 | namespace Gstreamer | ||
| 204 | @@ -62,17 +56,11 @@ namespace Gstreamer | ||
| 205 | |||
| 206 | WidgetRenderer::WidgetRenderer(VideoWidget *videoWidget) | ||
| 207 | : AbstractRenderer(videoWidget) | ||
| 208 | - , m_width(0) | ||
| 209 | - , m_height(0) | ||
| 210 | { | ||
| 211 | - videoWidget->backend()->logMessage("Creating QWidget renderer"); | ||
| 212 | - if ((m_videoSink = GST_ELEMENT(g_object_new(get_type_RGB(), NULL)))) { | ||
| 213 | - gst_object_ref (GST_OBJECT (m_videoSink)); //Take ownership | ||
| 214 | + if ((m_videoSink = gst_element_factory_make("mfw_v4lsink", NULL)) && m_videoSink != NULL) { | ||
| 215 | + | ||
| 216 | + gst_object_ref (GST_OBJECT (m_videoSink)); //Take ownership | ||
| 217 | gst_object_sink (GST_OBJECT (m_videoSink)); | ||
| 218 | - | ||
| 219 | - QWidgetVideoSinkBase* sink = reinterpret_cast<QWidgetVideoSinkBase*>(m_videoSink); | ||
| 220 | - // Let the videosink know which widget to direct frame updates to | ||
| 221 | - sink->renderWidget = videoWidget; | ||
| 222 | } | ||
| 223 | |||
| 224 | // Clear the background with black by default | ||
| 225 | @@ -84,67 +72,124 @@ 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 | - | ||
| 235 | - m_frame = QImage(); | ||
| 236 | - { | ||
| 237 | - m_frame = QImage((uchar *)array.constData(), w, h, QImage::Format_RGB32); | ||
| 238 | - } | ||
| 239 | + if (m_videoSink) { | ||
| 240 | + gst_object_unref (GST_OBJECT (m_videoSink)); | ||
| 241 | + m_videoSink = 0; | ||
| 242 | + } | ||
| 243 | +} | ||
| 244 | |||
| 245 | - m_array = array; | ||
| 246 | - m_width = w; | ||
| 247 | - m_height = h; | ||
| 248 | +void WidgetRenderer::setVideoSize(void) | ||
| 249 | +{ | ||
| 250 | |||
| 251 | - m_videoWidget->update(); | ||
| 252 | + int adj_x; | ||
| 253 | + int adj_y; | ||
| 254 | + | ||
| 255 | + QSize wSize = m_videoWidget->size(); | ||
| 256 | + m_drawFrameRect = m_videoWidget->calculateDrawFrameRect(); | ||
| 257 | + framePos = m_videoWidget->mapToGlobal(QPoint(0,0)); | ||
| 258 | + | ||
| 259 | + //Center the video in the widget | ||
| 260 | + | ||
| 261 | + adj_x = (wSize.width()/2) - (m_drawFrameRect.width()/2); | ||
| 262 | + adj_y = (wSize.height()/2) - (m_drawFrameRect.height()/2); | ||
| 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 | + | ||
| 309 | + alpha.alpha = MXCFB_GBL_ALPHA; | ||
| 310 | + alpha.enable = 1; | ||
| 311 | + | ||
| 312 | + if (ioctl(fd_fb, MXCFB_SET_GBL_ALPHA, &alpha) < 0) { | ||
| 313 | + printf("Error in applying Alpha\n"); | ||
| 314 | + } | ||
| 315 | + | ||
| 316 | + color_key.color_key = MXCFB_CLR_KEY & 0x00FFFFFF; | ||
| 317 | + color_key.enable = 1; | ||
| 318 | + if ( ioctl(fd_fb, MXCFB_SET_CLR_KEY, &color_key) < 0) { | ||
| 319 | + | ||
| 320 | + printf("Error in applying Color Key\n"); | ||
| 321 | + return -1; | ||
| 322 | + } | ||
| 323 | + | ||
| 324 | + close (fd_fb); | ||
| 325 | + | ||
| 326 | + return 0; | ||
| 327 | } | ||
| 328 | |||
| 329 | -void WidgetRenderer::handlePaint(QPaintEvent *event) | ||
| 330 | +void WidgetRenderer::handleMove( QMoveEvent * event) | ||
| 331 | { | ||
| 332 | - Q_UNUSED(event); | ||
| 333 | - QPainter painter(m_videoWidget); | ||
| 334 | - m_drawFrameRect = m_videoWidget->calculateDrawFrameRect(); | ||
| 335 | - painter.drawImage(drawFrameRect(), currentFrame()); | ||
| 336 | - frameRendered(); | ||
| 337 | + Q_UNUSED(event); | ||
| 338 | + | ||
| 339 | + if (framePos != m_videoWidget->mapToGlobal(QPoint(0,0))) | ||
| 340 | + setVideoSize(); | ||
| 341 | } | ||
| 342 | |||
| 343 | bool WidgetRenderer::eventFilter(QEvent * event) | ||
| 344 | { | ||
| 345 | - if (event->type() == QEvent::User) { | ||
| 346 | - NewFrameEvent *frameEvent= static_cast <NewFrameEvent *>(event); | ||
| 347 | - setNextFrame(frameEvent->frame, frameEvent->width, frameEvent->height); | ||
| 348 | - return true; | ||
| 349 | + if (event->type() == QEvent::Show) { | ||
| 350 | + | ||
| 351 | + setOverlay(); | ||
| 352 | + return true; | ||
| 353 | + | ||
| 354 | + } else if (event->type() == QEvent::Resize) { | ||
| 355 | + | ||
| 356 | + setVideoSize(); | ||
| 357 | + return true; | ||
| 358 | } | ||
| 359 | + if (framePos != m_videoWidget->mapToGlobal(QPoint(0,0))) | ||
| 360 | + setVideoSize(); | ||
| 361 | return false; | ||
| 362 | } | ||
| 363 | |||
| 364 | +void WidgetRenderer::aspectRatioChanged(Phonon::VideoWidget::AspectRatio) | ||
| 365 | +{ | ||
| 366 | + setVideoSize(); | ||
| 367 | +} | ||
| 368 | + | ||
| 369 | +void WidgetRenderer::scaleModeChanged(Phonon::VideoWidget::ScaleMode) | ||
| 370 | +{ | ||
| 371 | + setVideoSize(); | ||
| 372 | +} | ||
| 373 | + | ||
| 374 | +void WidgetRenderer::movieSizeChanged(const QSize &movieSize) | ||
| 375 | +{ | ||
| 376 | + Q_UNUSED(movieSize); | ||
| 377 | + setVideoSize(); | ||
| 378 | +} | ||
| 379 | + | ||
| 380 | } | ||
| 381 | } //namespace Phonon::Gstreamer | ||
| 382 | |||
| 383 | diff --git a/src/3rdparty/phonon/gstreamer/widgetrenderer.h b/src/3rdparty/phonon/gstreamer/widgetrenderer.h | ||
| 384 | index 03ee9c0..6de1a03 100644 | ||
| 385 | --- a/src/3rdparty/phonon/gstreamer/widgetrenderer.h | ||
| 386 | +++ b/src/3rdparty/phonon/gstreamer/widgetrenderer.h | ||
| 387 | @@ -40,20 +40,21 @@ class WidgetRenderer : public AbstractRenderer | ||
| 388 | { | ||
| 389 | public: | ||
| 390 | WidgetRenderer(VideoWidget *videoWidget); | ||
| 391 | + ~WidgetRenderer(void); | ||
| 392 | bool eventFilter(QEvent * event); | ||
| 393 | void handlePaint(QPaintEvent *paintEvent); | ||
| 394 | void handleMediaNodeEvent(const MediaNodeEvent *event); | ||
| 395 | - const QImage& currentFrame() const; | ||
| 396 | QRect drawFrameRect() const { return m_drawFrameRect; } | ||
| 397 | - void setNextFrame(const QByteArray &array, int width, int height); | ||
| 398 | - bool frameIsSet() { return !m_array.isNull(); } | ||
| 399 | - void clearFrame(); | ||
| 400 | + void aspectRatioChanged(Phonon::VideoWidget::AspectRatio aspectRatio); | ||
| 401 | + void scaleModeChanged(Phonon::VideoWidget::ScaleMode scaleMode); | ||
| 402 | + void movieSizeChanged(const QSize &movieSize); | ||
| 403 | + void setVideoSize(void); | ||
| 404 | + int setOverlay(void); | ||
| 405 | + void handleMove(QMoveEvent* event); | ||
| 406 | private: | ||
| 407 | - mutable QImage m_frame; | ||
| 408 | - QByteArray m_array; | ||
| 409 | - int m_width; | ||
| 410 | - int m_height; | ||
| 411 | + void paintEvent ( QPaintEvent * event ); | ||
| 412 | QRect m_drawFrameRect; | ||
| 413 | + QPoint framePos; | ||
| 414 | }; | ||
| 415 | |||
| 416 | } | ||
| 417 | diff --git a/src/3rdparty/phonon/gstreamer/x11renderer.cpp b/src/3rdparty/phonon/gstreamer/x11renderer.cpp | ||
| 418 | index 968f3a8..c4662e7 100644 | ||
| 419 | --- a/src/3rdparty/phonon/gstreamer/x11renderer.cpp | ||
| 420 | +++ b/src/3rdparty/phonon/gstreamer/x11renderer.cpp | ||
| 421 | @@ -31,6 +31,8 @@ | ||
| 422 | #include "mediaobject.h" | ||
| 423 | #include "message.h" | ||
| 424 | |||
| 425 | +#define FSL_GSTREAMER 1 | ||
| 426 | + | ||
| 427 | QT_BEGIN_NAMESPACE | ||
| 428 | |||
| 429 | namespace Phonon | ||
| 430 | @@ -78,31 +80,16 @@ X11Renderer::~X11Renderer() | ||
| 431 | { | ||
| 432 | m_renderWidget->setAttribute(Qt::WA_PaintOnScreen, false); | ||
| 433 | m_renderWidget->setAttribute(Qt::WA_NoSystemBackground, false); | ||
| 434 | + if (m_videoSink) { | ||
| 435 | + gst_object_unref (GST_OBJECT (m_videoSink)); | ||
| 436 | + } | ||
| 437 | delete m_renderWidget; | ||
| 438 | } | ||
| 439 | |||
| 440 | GstElement* X11Renderer::createVideoSink() | ||
| 441 | { | ||
| 442 | - GstElement *videoSink = gst_element_factory_make ("xvimagesink", NULL); | ||
| 443 | - if (videoSink) { | ||
| 444 | - // Check if the xv sink is usable | ||
| 445 | - if (gst_element_set_state(videoSink, GST_STATE_READY) != GST_STATE_CHANGE_SUCCESS) { | ||
| 446 | - gst_object_unref(GST_OBJECT(videoSink)); | ||
| 447 | - videoSink = 0; | ||
| 448 | - } else { | ||
| 449 | - // Note that this should not really be necessary as these are | ||
| 450 | - // default values, though under certain conditions values are retained | ||
| 451 | - // even between application instances. (reproducible on 0.10.16/Gutsy) | ||
| 452 | - g_object_set(G_OBJECT(videoSink), "brightness", 0, (const char*)NULL); | ||
| 453 | - g_object_set(G_OBJECT(videoSink), "contrast", 0, (const char*)NULL); | ||
| 454 | - g_object_set(G_OBJECT(videoSink), "hue", 0, (const char*)NULL); | ||
| 455 | - g_object_set(G_OBJECT(videoSink), "saturation", 0, (const char*)NULL); | ||
| 456 | - } | ||
| 457 | - } | ||
| 458 | - | ||
| 459 | - if (!videoSink) | ||
| 460 | - videoSink = gst_element_factory_make ("ximagesink", NULL); | ||
| 461 | |||
| 462 | + GstElement *videoSink = gst_element_factory_make ("mfw_v4lsink", NULL); | ||
| 463 | gst_object_ref (GST_OBJECT (videoSink)); //Take ownership | ||
| 464 | gst_object_sink (GST_OBJECT (videoSink)); | ||
| 465 | |||
| 466 | -- | ||
| 467 | 1.7.1 | ||
| 468 | |||
diff --git a/dynamic-layers/qt4-layer/recipes-qt4/qt4/qt4/0002-i.MX-video-renderer-Allow-v4l-device-from-environmen.patch b/dynamic-layers/qt4-layer/recipes-qt4/qt4/qt4/0002-i.MX-video-renderer-Allow-v4l-device-from-environmen.patch new file mode 100644 index 000000000..0226db598 --- /dev/null +++ b/dynamic-layers/qt4-layer/recipes-qt4/qt4/qt4/0002-i.MX-video-renderer-Allow-v4l-device-from-environmen.patch | |||
| @@ -0,0 +1,46 @@ | |||
| 1 | From 023befba9aad60ef58177fd987a6aa40c357b2b2 Mon Sep 17 00:00:00 2001 | ||
| 2 | From: Eric Nelson <eric.nelson@boundarydevices.com> | ||
| 3 | Date: Fri, 16 Aug 2013 11:42:23 -0700 | ||
| 4 | Subject: [PATCH] i.MX video renderer: Allow v4l device from environment | ||
| 5 | |||
| 6 | The i.MX6 supports multiple IPUs and multiple V4L2 output | ||
| 7 | devices for each. | ||
| 8 | |||
| 9 | Devices are numbered starting with /dev/video16 and defined | ||
| 10 | for each configured display. In general, /dev/video16 will | ||
| 11 | correspond to the RGB (background) layer for /dev/fb0. | ||
| 12 | If a display is the first on an IPU, an additional V4L2 | ||
| 13 | output will be defined that corresponds to the normally | ||
| 14 | YUV overlay (foreground) layer. | ||
| 15 | |||
| 16 | This patch allows association of the proper device for | ||
| 17 | a particular session for use in multi-headed applications. | ||
| 18 | The default is /dev/video17: | ||
| 19 | export v4lsinkdev=/dev/video17 | ||
| 20 | |||
| 21 | Signed-off-by: Eric Nelson <eric.nelson@boundarydevices.com> | ||
| 22 | --- | ||
| 23 | src/3rdparty/phonon/gstreamer/widgetrenderer.cpp | 5 ++++- | ||
| 24 | 1 file changed, 4 insertions(+), 1 deletion(-) | ||
| 25 | |||
| 26 | diff --git a/src/3rdparty/phonon/gstreamer/widgetrenderer.cpp b/src/3rdparty/phonon/gstreamer/widgetrenderer.cpp | ||
| 27 | index aa4925a..a502ccd 100644 | ||
| 28 | --- a/src/3rdparty/phonon/gstreamer/widgetrenderer.cpp | ||
| 29 | +++ b/src/3rdparty/phonon/gstreamer/widgetrenderer.cpp | ||
| 30 | @@ -58,9 +58,12 @@ WidgetRenderer::WidgetRenderer(VideoWidget *videoWidget) | ||
| 31 | : AbstractRenderer(videoWidget) | ||
| 32 | { | ||
| 33 | if ((m_videoSink = gst_element_factory_make("mfw_v4lsink", NULL)) && m_videoSink != NULL) { | ||
| 34 | - | ||
| 35 | + char *videodev; | ||
| 36 | gst_object_ref (GST_OBJECT (m_videoSink)); //Take ownership | ||
| 37 | gst_object_sink (GST_OBJECT (m_videoSink)); | ||
| 38 | + videodev=getenv("v4lsinkdev"); | ||
| 39 | + if (videodev) | ||
| 40 | + g_object_set (G_OBJECT (m_videoSink), "device", videodev, NULL); | ||
| 41 | } | ||
| 42 | |||
| 43 | // Clear the background with black by default | ||
| 44 | -- | ||
| 45 | 1.8.1.2 | ||
| 46 | |||
diff --git a/dynamic-layers/qt4-layer/recipes-qt4/qt4/qt4/0003-i.MX6-force-egl-visual-ID-33.patch b/dynamic-layers/qt4-layer/recipes-qt4/qt4/qt4/0003-i.MX6-force-egl-visual-ID-33.patch new file mode 100644 index 000000000..9aa158d7e --- /dev/null +++ b/dynamic-layers/qt4-layer/recipes-qt4/qt4/qt4/0003-i.MX6-force-egl-visual-ID-33.patch | |||
| @@ -0,0 +1,35 @@ | |||
| 1 | From: Javier Viguera <javier.viguera@digi.com> | ||
| 2 | Date: Mon, 3 Mar 2014 17:10:41 +0100 | ||
| 3 | Subject: [PATCH] i.MX6: force egl visual ID 33 | ||
| 4 | |||
| 5 | Workaround mismatch between EGL binary libraries and QT for FSL MX6 | ||
| 6 | based platforms. | ||
| 7 | |||
| 8 | Error: | ||
| 9 | Warning: EGL suggested using X Visual ID 33 (ARGB0888) for EGL config 28 (ARGB0444), but this is incompatable | ||
| 10 | Unable to find an X11 visual which matches EGL config 28 | ||
| 11 | |||
| 12 | Patch adapted from: | ||
| 13 | |||
| 14 | http://wiki.wandboard.org/index.php/Integrate_Qt5_into_yocto_sato_image_on_Wandboard | ||
| 15 | |||
| 16 | Upstream-Status: Inappropriate [workaround] | ||
| 17 | |||
| 18 | Signed-off-by: Javier Viguera <javier.viguera@digi.com> | ||
| 19 | --- | ||
| 20 | src/gui/egl/qegl_x11.cpp | 2 +- | ||
| 21 | 1 file changed, 1 insertion(+), 1 deletion(-) | ||
| 22 | |||
| 23 | diff --git a/src/gui/egl/qegl_x11.cpp b/src/gui/egl/qegl_x11.cpp | ||
| 24 | index 196d0f77bf2d..8acf5a6c99d4 100644 | ||
| 25 | --- a/src/gui/egl/qegl_x11.cpp | ||
| 26 | +++ b/src/gui/egl/qegl_x11.cpp | ||
| 27 | @@ -319,7 +319,7 @@ VisualID QEgl::getCompatibleVisualId(EGLConfig config) | ||
| 28 | } | ||
| 29 | |||
| 30 | qWarning("Unable to find an X11 visual which matches EGL config %d", configId); | ||
| 31 | - return (VisualID)0; | ||
| 32 | + return (VisualID)33; | ||
| 33 | } | ||
| 34 | |||
| 35 | void qt_set_winid_on_widget(QWidget* w, Qt::HANDLE id) | ||
diff --git a/dynamic-layers/qt4-layer/recipes-qt4/qt4/qt4/mx6/g++.conf b/dynamic-layers/qt4-layer/recipes-qt4/qt4/qt4/mx6/g++.conf new file mode 100644 index 000000000..915ecba05 --- /dev/null +++ b/dynamic-layers/qt4-layer/recipes-qt4/qt4/qt4/mx6/g++.conf | |||
| @@ -0,0 +1,40 @@ | |||
| 1 | # | ||
| 2 | # qmake configuration for common gcc | ||
| 3 | # | ||
| 4 | |||
| 5 | QMAKE_COMPILER = gcc | ||
| 6 | |||
| 7 | QMAKE_CC = $(OE_QMAKE_CC) | ||
| 8 | QMAKE_CFLAGS += $(OE_QMAKE_CFLAGS) -DLINUX=1 -DEGL_API_FB=1 | ||
| 9 | QMAKE_CFLAGS_RELEASE_WITH_DEBUGINFO += $(OE_QMAKE_CFLAGS) | ||
| 10 | QMAKE_CFLAGS_PRECOMPILE += -x c-header -c ${QMAKE_PCH_INPUT} -o ${QMAKE_PCH_OUTPUT} | ||
| 11 | QMAKE_CFLAGS_USE_PRECOMPILE += -include ${QMAKE_PCH_OUTPUT_BASE} | ||
| 12 | |||
| 13 | QMAKE_CXX = $(OE_QMAKE_CXX) | ||
| 14 | QMAKE_CXXFLAGS += $(OE_QMAKE_CXXFLAGS) -DLINUX=1 -DEGL_API_FB=1 | ||
| 15 | QMAKE_CXXFLAGS_RELEASE_WITH_DEBUGINFO += $$QMAKE_CFLAGS_RELEASE_WITH_DEBUGINFO | ||
| 16 | QMAKE_CXXFLAGS_PRECOMPILE += -x c++-header -c ${QMAKE_PCH_INPUT} -o ${QMAKE_PCH_OUTPUT} | ||
| 17 | QMAKE_CXXFLAGS_USE_PRECOMPILE = $$QMAKE_CFLAGS_USE_PRECOMPILE | ||
| 18 | |||
| 19 | QMAKE_LINK = $(OE_QMAKE_LINK) | ||
| 20 | QMAKE_LINK_SHLIB = $(OE_QMAKE_LINK) | ||
| 21 | QMAKE_LINK_C = $(OE_QMAKE_LINK) | ||
| 22 | QMAKE_LINK_C_SHLIB = $(OE_QMAKE_LINK) | ||
| 23 | QMAKE_LFLAGS += $(OE_QMAKE_LDFLAGS) | ||
| 24 | QMAKE_LFLAGS_NOUNDEF += -Wl,--no-undefined | ||
| 25 | QMAKE_LFLAGS_RPATH = -Wl,-rpath-link, | ||
| 26 | |||
| 27 | QMAKE_PCH_OUTPUT_EXT = .gch | ||
| 28 | |||
| 29 | # -Bsymbolic-functions (ld) support | ||
| 30 | QMAKE_LFLAGS_BSYMBOLIC_FUNC = -Wl,-Bsymbolic-functions | ||
| 31 | QMAKE_LFLAGS_DYNAMIC_LIST = -Wl,--dynamic-list, | ||
| 32 | |||
| 33 | # do not depend on gdb | ||
| 34 | CONFIG -= gdb_dwarf_index | ||
| 35 | |||
| 36 | # some linking helper... | ||
| 37 | CONFIG += rpath_libdirs | ||
| 38 | |||
| 39 | # for the SDK | ||
| 40 | isEmpty(QMAKE_QT_CONFIG):QMAKE_QT_CONFIG = $(OE_QMAKE_QT_CONFIG) | ||
diff --git a/dynamic-layers/qt4-layer/recipes-qt4/qt4/qt4/mx6/linux.conf b/dynamic-layers/qt4-layer/recipes-qt4/qt4/qt4/mx6/linux.conf new file mode 100644 index 000000000..c644d8bae --- /dev/null +++ b/dynamic-layers/qt4-layer/recipes-qt4/qt4/qt4/mx6/linux.conf | |||
| @@ -0,0 +1,66 @@ | |||
| 1 | # | ||
| 2 | # qmake configuration for common linux | ||
| 3 | # | ||
| 4 | |||
| 5 | QMAKE_CFLAGS_THREAD += -D_REENTRANT | ||
| 6 | QMAKE_CXXFLAGS_THREAD += $$QMAKE_CFLAGS_THREAD | ||
| 7 | |||
| 8 | QMAKE_INCDIR = | ||
| 9 | QMAKE_LIBDIR = | ||
| 10 | QMAKE_INCDIR_X11 = | ||
| 11 | QMAKE_LIBDIR_X11 = | ||
| 12 | QMAKE_INCDIR_QT = $(OE_QMAKE_INCDIR_QT) | ||
| 13 | QMAKE_LIBDIR_QT = $(OE_QMAKE_LIBDIR_QT) | ||
| 14 | QMAKE_INCDIR_OPENGL = | ||
| 15 | QMAKE_LIBDIR_OPENGL = | ||
| 16 | QMAKE_INCDIR_OPENGL_ES1 = $$QMAKE_INCDIR_OPENGL | ||
| 17 | QMAKE_LIBDIR_OPENGL_ES1 = $$QMAKE_LIBDIR_OPENGL | ||
| 18 | QMAKE_INCDIR_OPENGL_ES2 = $$QMAKE_INCDIR_OPENGL | ||
| 19 | QMAKE_LIBDIR_OPENGL_ES2 = $$QMAKE_LIBDIR_OPENGL | ||
| 20 | QMAKE_INCDIR_EGL = | ||
| 21 | QMAKE_LIBDIR_EGL = | ||
| 22 | QMAKE_INCDIR_OPENVG = | ||
| 23 | QMAKE_LIBDIR_OPENVG = | ||
| 24 | |||
| 25 | |||
| 26 | QMAKE_LIBS = | ||
| 27 | QMAKE_LIBS_DYNLOAD = -ldl | ||
| 28 | QMAKE_LIBS_X11 = $(OE_QMAKE_LIBS_X11) | ||
| 29 | QMAKE_LIBS_X11SM = $(OE_QMAKE_LIBS_X11SM) | ||
| 30 | QMAKE_LIBS_NIS = -lnsl | ||
| 31 | QMAKE_LIBS_EGL = -lEGL -lGAL -DLINUX=1 -DEGL_API_FB=1 | ||
| 32 | QMAKE_LIBS_OPENGL = -lGL | ||
| 33 | QMAKE_LIBS_OPENGL_QT = -lGL | ||
| 34 | QMAKE_LIBS_OPENGL_ES1 = -lGLES_CM | ||
| 35 | QMAKE_LIBS_OPENGL_ES2 = -lGLESv2 -lGAL -lEGL -DLINUX=1 -DEGL_API_FB=1 | ||
| 36 | QMAKE_LIBS_OPENVG = -lOpenVG -lGAL -lEGL -DLINUX=1 -DEGL_API_FB=1 | ||
| 37 | QMAKE_LIBS_THREAD = -lpthread | ||
| 38 | |||
| 39 | QMAKE_MOC = $(OE_QMAKE_MOC) | ||
| 40 | QMAKE_UIC = $(OE_QMAKE_UIC) | ||
| 41 | QMAKE_UIC3 = $(OE_QMAKE_UIC3) | ||
| 42 | QMAKE_RCC = $(OE_QMAKE_RCC) | ||
| 43 | QMAKE_QDBUSCPP2XML = $(OE_QMAKE_QDBUSCPP2XML) | ||
| 44 | QMAKE_QDBUSXML2CPP = $(OE_QMAKE_QDBUSXML2CPP) | ||
| 45 | |||
| 46 | QMAKE_AR = $(OE_QMAKE_AR) cqs | ||
| 47 | QMAKE_OBJCOPY = objcopy | ||
| 48 | QMAKE_RANLIB = | ||
| 49 | |||
| 50 | QMAKE_TAR = tar -cf | ||
| 51 | QMAKE_GZIP = gzip -9f | ||
| 52 | |||
| 53 | QMAKE_COPY = cp -f | ||
| 54 | QMAKE_COPY_FILE = $(COPY) | ||
| 55 | QMAKE_COPY_DIR = $(COPY) -r | ||
| 56 | QMAKE_MOVE = mv -f | ||
| 57 | QMAKE_DEL_FILE = rm -f | ||
| 58 | QMAKE_DEL_DIR = rmdir | ||
| 59 | QMAKE_STRIP = $(OE_QMAKE_STRIP) | ||
| 60 | QMAKE_STRIPFLAGS_LIB += --strip-unneeded | ||
| 61 | QMAKE_CHK_DIR_EXISTS = test -d | ||
| 62 | QMAKE_MKDIR = mkdir -p | ||
| 63 | QMAKE_INSTALL_FILE = install -m 644 -p | ||
| 64 | QMAKE_INSTALL_PROGRAM = install -m 755 -p | ||
| 65 | |||
| 66 | include(unix.conf) | ||
