From 4b84798a7e263ba3a96cebad93a36f450394b7c0 Mon Sep 17 00:00:00 2001 From: Otavio Salvador Date: Fri, 8 Jan 2016 14:15:35 -0200 Subject: qt4: Move BSP related bbappend files to dynamic layer The Qt4 recipes are now in a specific layer, meta-qt4, so we cannot append those recipes if the layer is not included. This moves the bbappend files to the 'qt4-layer' collection, enabling it in case the collection is available. Fixes [YOCTO: #8898] Signed-off-by: Otavio Salvador --- qt4-layer/recipes-qt4/qt4/qt4-embedded_%.bbappend | 1 + qt4-layer/recipes-qt4/qt4/qt4-imx-support.inc | 28 ++ qt4-layer/recipes-qt4/qt4/qt4-x11-free_%.bbappend | 1 + ...001-Add-support-for-i.MX-codecs-to-phonon.patch | 468 +++++++++++++++++++++ ...renderer-Allow-v4l-device-from-environmen.patch | 46 ++ .../qt4/0003-i.MX6-force-egl-visual-ID-33.patch | 35 ++ qt4-layer/recipes-qt4/qt4/qt4/mx6/g++.conf | 40 ++ qt4-layer/recipes-qt4/qt4/qt4/mx6/linux.conf | 66 +++ recipes-qt/qt4/qt4-embedded_%.bbappend | 1 - recipes-qt/qt4/qt4-imx-support.inc | 28 -- recipes-qt/qt4/qt4-x11-free_%.bbappend | 1 - ...001-Add-support-for-i.MX-codecs-to-phonon.patch | 468 --------------------- ...renderer-Allow-v4l-device-from-environmen.patch | 46 -- .../qt4/0003-i.MX6-force-egl-visual-ID-33.patch | 35 -- recipes-qt/qt4/qt4/mx6/g++.conf | 40 -- recipes-qt/qt4/qt4/mx6/linux.conf | 66 --- 16 files changed, 685 insertions(+), 685 deletions(-) create mode 100644 qt4-layer/recipes-qt4/qt4/qt4-embedded_%.bbappend create mode 100644 qt4-layer/recipes-qt4/qt4/qt4-imx-support.inc create mode 100644 qt4-layer/recipes-qt4/qt4/qt4-x11-free_%.bbappend create mode 100644 qt4-layer/recipes-qt4/qt4/qt4/0001-Add-support-for-i.MX-codecs-to-phonon.patch create mode 100644 qt4-layer/recipes-qt4/qt4/qt4/0002-i.MX-video-renderer-Allow-v4l-device-from-environmen.patch create mode 100644 qt4-layer/recipes-qt4/qt4/qt4/0003-i.MX6-force-egl-visual-ID-33.patch create mode 100644 qt4-layer/recipes-qt4/qt4/qt4/mx6/g++.conf create mode 100644 qt4-layer/recipes-qt4/qt4/qt4/mx6/linux.conf delete mode 100644 recipes-qt/qt4/qt4-embedded_%.bbappend delete mode 100644 recipes-qt/qt4/qt4-imx-support.inc delete mode 100644 recipes-qt/qt4/qt4-x11-free_%.bbappend delete mode 100644 recipes-qt/qt4/qt4/0001-Add-support-for-i.MX-codecs-to-phonon.patch delete mode 100644 recipes-qt/qt4/qt4/0002-i.MX-video-renderer-Allow-v4l-device-from-environmen.patch delete mode 100644 recipes-qt/qt4/qt4/0003-i.MX6-force-egl-visual-ID-33.patch delete mode 100644 recipes-qt/qt4/qt4/mx6/g++.conf delete mode 100644 recipes-qt/qt4/qt4/mx6/linux.conf diff --git a/qt4-layer/recipes-qt4/qt4/qt4-embedded_%.bbappend b/qt4-layer/recipes-qt4/qt4/qt4-embedded_%.bbappend new file mode 100644 index 0000000..14324ca --- /dev/null +++ b/qt4-layer/recipes-qt4/qt4/qt4-embedded_%.bbappend @@ -0,0 +1 @@ +include qt4-imx-support.inc diff --git a/qt4-layer/recipes-qt4/qt4/qt4-imx-support.inc b/qt4-layer/recipes-qt4/qt4/qt4-imx-support.inc new file mode 100644 index 0000000..0efb564 --- /dev/null +++ b/qt4-layer/recipes-qt4/qt4/qt4-imx-support.inc @@ -0,0 +1,28 @@ +FILESEXTRAPATHS_prepend := "${THISDIR}/qt4:" + +python __anonymous () { + families = ['mx6'] + cur_families = (d.getVar('SOC_FAMILY', True) or '').split(':') + if any(map(lambda x: x in cur_families, + families)): + d.appendVarFlag('do_configure', 'depends', ' virtual/kernel:do_shared_workdir') +} + +SRC_URI_append_mx6 += " \ + file://0001-Add-support-for-i.MX-codecs-to-phonon.patch \ + file://0002-i.MX-video-renderer-Allow-v4l-device-from-environmen.patch \ + file://0003-i.MX6-force-egl-visual-ID-33.patch \ +" + +DEPENDS_append_mx6 = " virtual/kernel virtual/libgles2" +QT_GLFLAGS_mx6 = "-opengl es2 -openvg" +QT_CONFIG_FLAGS_append_mx6 = " -I${STAGING_KERNEL_DIR}/include/uapi \ + -I${STAGING_KERNEL_DIR}/include/ \ + -DLINUX=1 -DEGL_API_FB=1 \ + -DQT_QPA_EXPERIMENTAL_TOUCHEVENT=1" + +# The QT_CONFIG_FLAGS can pollute *.la files with -Dxxx +do_compile_append_mx6 () { + find lib -name "*.la" | xargs -n1 sed -i 's/-D.*=1//g' +} + diff --git a/qt4-layer/recipes-qt4/qt4/qt4-x11-free_%.bbappend b/qt4-layer/recipes-qt4/qt4/qt4-x11-free_%.bbappend new file mode 100644 index 0000000..14324ca --- /dev/null +++ b/qt4-layer/recipes-qt4/qt4/qt4-x11-free_%.bbappend @@ -0,0 +1 @@ +include qt4-imx-support.inc diff --git a/qt4-layer/recipes-qt4/qt4/qt4/0001-Add-support-for-i.MX-codecs-to-phonon.patch b/qt4-layer/recipes-qt4/qt4/qt4/0001-Add-support-for-i.MX-codecs-to-phonon.patch new file mode 100644 index 0000000..1213650 --- /dev/null +++ b/qt4-layer/recipes-qt4/qt4/qt4/0001-Add-support-for-i.MX-codecs-to-phonon.patch @@ -0,0 +1,468 @@ +From 2ff5682e42771519757756dedbf27b7a9e8e25d9 Mon Sep 17 00:00:00 2001 +From: Rogerio Pimentel +Date: Tue, 24 Jul 2012 13:47:01 -0300 +Subject: [PATCH] Add support for i.MX codecs to phonon + +Add support for i.MX codecs to phonon + +Signed-off-by: Daniele Dall'Acqua +Signed-off-by: Rogerio Pimentel +--- + src/3rdparty/phonon/gstreamer/abstractrenderer.h | 1 + + src/3rdparty/phonon/gstreamer/mediaobject.cpp | 4 + + src/3rdparty/phonon/gstreamer/videowidget.cpp | 60 ++------ + src/3rdparty/phonon/gstreamer/videowidget.h | 1 + + src/3rdparty/phonon/gstreamer/widgetrenderer.cpp | 169 ++++++++++++++-------- + src/3rdparty/phonon/gstreamer/widgetrenderer.h | 17 ++- + src/3rdparty/phonon/gstreamer/x11renderer.cpp | 22 +--- + 7 files changed, 141 insertions(+), 133 deletions(-) + +diff --git a/src/3rdparty/phonon/gstreamer/abstractrenderer.h b/src/3rdparty/phonon/gstreamer/abstractrenderer.h +index 10a2822..fa0d87d 100644 +--- a/src/3rdparty/phonon/gstreamer/abstractrenderer.h ++++ b/src/3rdparty/phonon/gstreamer/abstractrenderer.h +@@ -49,6 +49,7 @@ public: + virtual bool eventFilter(QEvent *) = 0; + virtual void handlePaint(QPaintEvent *) {} + virtual bool paintsOnWidget() { return true; } // Controls overlays ++ virtual void handleMove(QMoveEvent * event ) {}; + + protected: + VideoWidget *m_videoWidget; +diff --git a/src/3rdparty/phonon/gstreamer/mediaobject.cpp b/src/3rdparty/phonon/gstreamer/mediaobject.cpp +index 23a60c0..f806d64 100644 +--- a/src/3rdparty/phonon/gstreamer/mediaobject.cpp ++++ b/src/3rdparty/phonon/gstreamer/mediaobject.cpp +@@ -515,6 +515,9 @@ void MediaObject::createPipeline() + // reduce buffer overruns as these are not gracefully handled at the moment. + m_audioPipe = gst_element_factory_make("queue", NULL); + g_object_set(G_OBJECT(m_audioPipe), "max-size-time", MAX_QUEUE_TIME, (const char*)NULL); ++ g_object_set(G_OBJECT(m_audioPipe), "max-size-time", 0, (const char*)NULL); ++ g_object_set(G_OBJECT(m_audioPipe), "max-size-buffers", 0, (const char*)NULL); ++ g_object_set(G_OBJECT(m_audioPipe), "max-size-bytes", 0, (const char*)NULL); + gst_bin_add(GST_BIN(m_audioGraph), m_audioPipe); + GstPad *audiopad = gst_element_get_pad (m_audioPipe, "sink"); + gst_element_add_pad (m_audioGraph, gst_ghost_pad_new ("sink", audiopad)); +@@ -527,6 +530,7 @@ void MediaObject::createPipeline() + + m_videoPipe = gst_element_factory_make("queue", NULL); + g_object_set(G_OBJECT(m_videoPipe), "max-size-time", MAX_QUEUE_TIME, (const char*)NULL); ++ g_object_set(G_OBJECT(m_videoPipe), "max-size-time", 33000, (const char*)NULL); + gst_bin_add(GST_BIN(m_videoGraph), m_videoPipe); + GstPad *videopad = gst_element_get_pad (m_videoPipe, "sink"); + gst_element_add_pad (m_videoGraph, gst_ghost_pad_new ("sink", videopad)); +diff --git a/src/3rdparty/phonon/gstreamer/videowidget.cpp b/src/3rdparty/phonon/gstreamer/videowidget.cpp +index a4c6f79..3682d3f 100644 +--- a/src/3rdparty/phonon/gstreamer/videowidget.cpp ++++ b/src/3rdparty/phonon/gstreamer/videowidget.cpp +@@ -83,50 +83,16 @@ void VideoWidget::setupVideoBin() + Q_ASSERT(m_videoBin); + gst_object_ref (GST_OBJECT (m_videoBin)); //Take ownership + gst_object_sink (GST_OBJECT (m_videoBin)); +- +- //The videoplug element is the final element before the pluggable videosink +- m_videoplug = gst_element_factory_make ("identity", NULL); +- +- //Colorspace ensures that the output of the stream matches the input format accepted by our video sink +- m_colorspace = gst_element_factory_make ("ffmpegcolorspace", NULL); +- +- //Video scale is used to prepare the correct aspect ratio and scale. +- GstElement *videoScale = gst_element_factory_make ("videoscale", NULL); +- +- //We need a queue to support the tee from parent node +- GstElement *queue = gst_element_factory_make ("queue", NULL); +- +- if (queue && m_videoBin && videoScale && m_colorspace && videoSink && m_videoplug) { +- //Ensure that the bare essentials are prepared +- gst_bin_add_many (GST_BIN (m_videoBin), queue, m_colorspace, m_videoplug, videoScale, videoSink, (const char*)NULL); +- bool success = false; +- //Video balance controls color/sat/hue in the YUV colorspace +- m_videoBalance = gst_element_factory_make ("videobalance", NULL); +- if (m_videoBalance) { +- // For video balance to work we have to first ensure that the video is in YUV colorspace, +- // then hand it off to the videobalance filter before finally converting it back to RGB. +- // Hence we nede a videoFilter to convert the colorspace before and after videobalance +- GstElement *m_colorspace2 = gst_element_factory_make ("ffmpegcolorspace", NULL); +- gst_bin_add_many(GST_BIN(m_videoBin), m_videoBalance, m_colorspace2, (const char*)NULL); +- success = gst_element_link_many(queue, m_colorspace, m_videoBalance, m_colorspace2, videoScale, m_videoplug, videoSink, (const char*)NULL); +- } else { +- //If video balance is not available, just connect to sink directly +- success = gst_element_link_many(queue, m_colorspace, videoScale, m_videoplug, videoSink, (const char*)NULL); +- } +- +- if (success) { +- GstPad *videopad = gst_element_get_pad (queue, "sink"); +- gst_element_add_pad (m_videoBin, gst_ghost_pad_new ("sink", videopad)); +- gst_object_unref (videopad); +-#ifndef Q_WS_QPA +- QWidget *parentWidget = qobject_cast(parent()); +- if (parentWidget) +- parentWidget->winId(); // Due to some existing issues with alien in 4.4, +- // we must currently force the creation of a parent widget. +-#endif +- m_isValid = true; //initialization ok, accept input +- } +- } ++ gst_bin_add_many (GST_BIN (m_videoBin), videoSink, NULL); ++ GstPad *videopad = gst_element_get_pad (videoSink,"sink"); ++ gst_element_add_pad (m_videoBin, gst_ghost_pad_new ("sink", videopad)); ++ gst_object_unref (videopad); ++ QWidget *parentWidget = qobject_cast(parent()); ++ ++ if (parentWidget) ++ parentWidget->winId(); // Due to some existing issues with alien in 4.4, ++ // we must currently force the creation of a parent widget. ++ m_isValid = true; //initialization ok, accept input + } + + void VideoWidget::paintEvent(QPaintEvent *event) +@@ -135,6 +101,12 @@ void VideoWidget::paintEvent(QPaintEvent *event) + m_renderer->handlePaint(event); + } + ++void VideoWidget::moveEvent(QMoveEvent * event ) ++{ ++ Q_ASSERT(m_renderer); ++ m_renderer->handleMove(event); ++} ++ + void VideoWidget::setVisible(bool val) { + Q_ASSERT(m_renderer); + +diff --git a/src/3rdparty/phonon/gstreamer/videowidget.h b/src/3rdparty/phonon/gstreamer/videowidget.h +index 8603f6a..38c7b17 100644 +--- a/src/3rdparty/phonon/gstreamer/videowidget.h ++++ b/src/3rdparty/phonon/gstreamer/videowidget.h +@@ -65,6 +65,7 @@ public: + qreal saturation() const; + void setSaturation(qreal); + void setMovieSize(const QSize &size); ++ void moveEvent(QMoveEvent * event ); + QSize sizeHint() const; + QRect scaleToAspect(QRect srcRect, int w, int h) const; + QRect calculateDrawFrameRect() const; +diff --git a/src/3rdparty/phonon/gstreamer/widgetrenderer.cpp b/src/3rdparty/phonon/gstreamer/widgetrenderer.cpp +index 423af9d..aa4925a 100644 +--- a/src/3rdparty/phonon/gstreamer/widgetrenderer.cpp ++++ b/src/3rdparty/phonon/gstreamer/widgetrenderer.cpp +@@ -15,7 +15,9 @@ + along with this library. If not, see . + */ + ++#include + #include ++#include + #include + #include "common.h" + #include "message.h" +@@ -24,6 +26,18 @@ + #include "widgetrenderer.h" + #include "qrgb.h" + ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++#define MXCFB_GBL_ALPHA 255 ++#define MXCFB_CLR_KEY 0x00000000 // ARGB8888 ++ + // support old OpenGL installations (1.2) + // assume that if TEXTURE0 isn't defined, none are + #ifndef GL_TEXTURE0 +@@ -35,26 +49,6 @@ + #ifndef QT_NO_PHONON_VIDEO + QT_BEGIN_NAMESPACE + +-static void frameRendered() +-{ +- static QString displayFps = qgetenv("PHONON_GST_FPS"); +- if (displayFps.isEmpty()) +- return; +- +- static int frames = 0; +- static QTime lastTime = QTime::currentTime(); +- QTime time = QTime::currentTime(); +- +- int delta = lastTime.msecsTo(time); +- if (delta > 2000) { +- printf("FPS: %f\n", 1000.0 * frames / qreal(delta)); +- lastTime = time; +- frames = 0; +- } +- +- ++frames; +-} +- + namespace Phonon + { + namespace Gstreamer +@@ -62,17 +56,11 @@ namespace Gstreamer + + WidgetRenderer::WidgetRenderer(VideoWidget *videoWidget) + : AbstractRenderer(videoWidget) +- , m_width(0) +- , m_height(0) + { +- videoWidget->backend()->logMessage("Creating QWidget renderer"); +- if ((m_videoSink = GST_ELEMENT(g_object_new(get_type_RGB(), NULL)))) { +- gst_object_ref (GST_OBJECT (m_videoSink)); //Take ownership ++ if ((m_videoSink = gst_element_factory_make("mfw_v4lsink", NULL)) && m_videoSink != NULL) { ++ ++ gst_object_ref (GST_OBJECT (m_videoSink)); //Take ownership + gst_object_sink (GST_OBJECT (m_videoSink)); +- +- QWidgetVideoSinkBase* sink = reinterpret_cast(m_videoSink); +- // Let the videosink know which widget to direct frame updates to +- sink->renderWidget = videoWidget; + } + + // Clear the background with black by default +@@ -84,67 +72,124 @@ WidgetRenderer::WidgetRenderer(VideoWidget *videoWidget) + m_videoWidget->setAttribute(Qt::WA_PaintOnScreen, false); + } + +-void WidgetRenderer::setNextFrame(const QByteArray &array, int w, int h) ++WidgetRenderer::~WidgetRenderer() + { +- if (m_videoWidget->root()->state() == Phonon::LoadingState) +- return; +- +- m_frame = QImage(); +- { +- m_frame = QImage((uchar *)array.constData(), w, h, QImage::Format_RGB32); +- } ++ if (m_videoSink) { ++ gst_object_unref (GST_OBJECT (m_videoSink)); ++ m_videoSink = 0; ++ } ++} + +- m_array = array; +- m_width = w; +- m_height = h; ++void WidgetRenderer::setVideoSize(void) ++{ + +- m_videoWidget->update(); ++ int adj_x; ++ int adj_y; ++ ++ QSize wSize = m_videoWidget->size(); ++ m_drawFrameRect = m_videoWidget->calculateDrawFrameRect(); ++ framePos = m_videoWidget->mapToGlobal(QPoint(0,0)); ++ ++ //Center the video in the widget ++ ++ adj_x = (wSize.width()/2) - (m_drawFrameRect.width()/2); ++ adj_y = (wSize.height()/2) - (m_drawFrameRect.height()/2); ++ g_object_set(G_OBJECT(m_videoSink), "axis-left",adj_x + framePos.x(),(const char*)NULL); ++ g_object_set(G_OBJECT(m_videoSink), "axis-top", adj_y + framePos.y(), (const char*)NULL); ++ g_object_set(G_OBJECT(m_videoSink), "disp-width", m_drawFrameRect.width(), (const char*)NULL); ++ g_object_set(G_OBJECT(m_videoSink), "disp-height", m_drawFrameRect.height(), (const char*)NULL); ++ g_object_set(G_OBJECT(m_videoSink), "setpara", 1, (const char*)NULL); + } + + void WidgetRenderer::handleMediaNodeEvent(const MediaNodeEvent *event) + { + switch (event->type()) { +- case MediaNodeEvent::SourceChanged: +- { +- clearFrame(); +- break; +- } + default: + break; + } + } + +-void WidgetRenderer::clearFrame() ++void WidgetRenderer::handlePaint(QPaintEvent *event) + { +- m_frame = QImage(); +- m_array = QByteArray(); +- m_videoWidget->update(); ++ Q_UNUSED(event); ++ QPainter painter(m_videoWidget); ++ painter.fillRect(m_videoWidget->rect(), m_videoWidget->palette().background()); + } + +-const QImage &WidgetRenderer::currentFrame() const ++int WidgetRenderer::setOverlay(void) + { +- return m_frame; ++ struct mxcfb_color_key color_key; ++ struct mxcfb_gbl_alpha alpha; ++ int fd_fb; ++ ++ if ((fd_fb = open("/dev/fb0", O_RDWR, 0)) < 0) ++ { ++ printf("Unable to open %s\n", "/dev/fb0"); ++ return -1; ++ ++ } ++ ++ alpha.alpha = MXCFB_GBL_ALPHA; ++ alpha.enable = 1; ++ ++ if (ioctl(fd_fb, MXCFB_SET_GBL_ALPHA, &alpha) < 0) { ++ printf("Error in applying Alpha\n"); ++ } ++ ++ color_key.color_key = MXCFB_CLR_KEY & 0x00FFFFFF; ++ color_key.enable = 1; ++ if ( ioctl(fd_fb, MXCFB_SET_CLR_KEY, &color_key) < 0) { ++ ++ printf("Error in applying Color Key\n"); ++ return -1; ++ } ++ ++ close (fd_fb); ++ ++ return 0; + } + +-void WidgetRenderer::handlePaint(QPaintEvent *event) ++void WidgetRenderer::handleMove( QMoveEvent * event) + { +- Q_UNUSED(event); +- QPainter painter(m_videoWidget); +- m_drawFrameRect = m_videoWidget->calculateDrawFrameRect(); +- painter.drawImage(drawFrameRect(), currentFrame()); +- frameRendered(); ++ Q_UNUSED(event); ++ ++ if (framePos != m_videoWidget->mapToGlobal(QPoint(0,0))) ++ setVideoSize(); + } + + bool WidgetRenderer::eventFilter(QEvent * event) + { +- if (event->type() == QEvent::User) { +- NewFrameEvent *frameEvent= static_cast (event); +- setNextFrame(frameEvent->frame, frameEvent->width, frameEvent->height); +- return true; ++ if (event->type() == QEvent::Show) { ++ ++ setOverlay(); ++ return true; ++ ++ } else if (event->type() == QEvent::Resize) { ++ ++ setVideoSize(); ++ return true; + } ++ if (framePos != m_videoWidget->mapToGlobal(QPoint(0,0))) ++ setVideoSize(); + return false; + } + ++void WidgetRenderer::aspectRatioChanged(Phonon::VideoWidget::AspectRatio) ++{ ++ setVideoSize(); ++} ++ ++void WidgetRenderer::scaleModeChanged(Phonon::VideoWidget::ScaleMode) ++{ ++ setVideoSize(); ++} ++ ++void WidgetRenderer::movieSizeChanged(const QSize &movieSize) ++{ ++ Q_UNUSED(movieSize); ++ setVideoSize(); ++} ++ + } + } //namespace Phonon::Gstreamer + +diff --git a/src/3rdparty/phonon/gstreamer/widgetrenderer.h b/src/3rdparty/phonon/gstreamer/widgetrenderer.h +index 03ee9c0..6de1a03 100644 +--- a/src/3rdparty/phonon/gstreamer/widgetrenderer.h ++++ b/src/3rdparty/phonon/gstreamer/widgetrenderer.h +@@ -40,20 +40,21 @@ class WidgetRenderer : public AbstractRenderer + { + public: + WidgetRenderer(VideoWidget *videoWidget); ++ ~WidgetRenderer(void); + bool eventFilter(QEvent * event); + void handlePaint(QPaintEvent *paintEvent); + void handleMediaNodeEvent(const MediaNodeEvent *event); +- const QImage& currentFrame() const; + QRect drawFrameRect() const { return m_drawFrameRect; } +- void setNextFrame(const QByteArray &array, int width, int height); +- bool frameIsSet() { return !m_array.isNull(); } +- void clearFrame(); ++ void aspectRatioChanged(Phonon::VideoWidget::AspectRatio aspectRatio); ++ void scaleModeChanged(Phonon::VideoWidget::ScaleMode scaleMode); ++ void movieSizeChanged(const QSize &movieSize); ++ void setVideoSize(void); ++ int setOverlay(void); ++ void handleMove(QMoveEvent* event); + private: +- mutable QImage m_frame; +- QByteArray m_array; +- int m_width; +- int m_height; ++ void paintEvent ( QPaintEvent * event ); + QRect m_drawFrameRect; ++ QPoint framePos; + }; + + } +diff --git a/src/3rdparty/phonon/gstreamer/x11renderer.cpp b/src/3rdparty/phonon/gstreamer/x11renderer.cpp +index 968f3a8..c4662e7 100644 +--- a/src/3rdparty/phonon/gstreamer/x11renderer.cpp ++++ b/src/3rdparty/phonon/gstreamer/x11renderer.cpp +@@ -31,6 +31,8 @@ + #include "mediaobject.h" + #include "message.h" + ++#define FSL_GSTREAMER 1 ++ + QT_BEGIN_NAMESPACE + + namespace Phonon +@@ -78,31 +80,16 @@ X11Renderer::~X11Renderer() + { + m_renderWidget->setAttribute(Qt::WA_PaintOnScreen, false); + m_renderWidget->setAttribute(Qt::WA_NoSystemBackground, false); ++ if (m_videoSink) { ++ gst_object_unref (GST_OBJECT (m_videoSink)); ++ } + delete m_renderWidget; + } + + GstElement* X11Renderer::createVideoSink() + { +- GstElement *videoSink = gst_element_factory_make ("xvimagesink", NULL); +- if (videoSink) { +- // Check if the xv sink is usable +- if (gst_element_set_state(videoSink, GST_STATE_READY) != GST_STATE_CHANGE_SUCCESS) { +- gst_object_unref(GST_OBJECT(videoSink)); +- videoSink = 0; +- } else { +- // Note that this should not really be necessary as these are +- // default values, though under certain conditions values are retained +- // even between application instances. (reproducible on 0.10.16/Gutsy) +- g_object_set(G_OBJECT(videoSink), "brightness", 0, (const char*)NULL); +- g_object_set(G_OBJECT(videoSink), "contrast", 0, (const char*)NULL); +- g_object_set(G_OBJECT(videoSink), "hue", 0, (const char*)NULL); +- g_object_set(G_OBJECT(videoSink), "saturation", 0, (const char*)NULL); +- } +- } +- +- if (!videoSink) +- videoSink = gst_element_factory_make ("ximagesink", NULL); + ++ GstElement *videoSink = gst_element_factory_make ("mfw_v4lsink", NULL); + gst_object_ref (GST_OBJECT (videoSink)); //Take ownership + gst_object_sink (GST_OBJECT (videoSink)); + +-- +1.7.1 + diff --git a/qt4-layer/recipes-qt4/qt4/qt4/0002-i.MX-video-renderer-Allow-v4l-device-from-environmen.patch b/qt4-layer/recipes-qt4/qt4/qt4/0002-i.MX-video-renderer-Allow-v4l-device-from-environmen.patch new file mode 100644 index 0000000..0226db5 --- /dev/null +++ b/qt4-layer/recipes-qt4/qt4/qt4/0002-i.MX-video-renderer-Allow-v4l-device-from-environmen.patch @@ -0,0 +1,46 @@ +From 023befba9aad60ef58177fd987a6aa40c357b2b2 Mon Sep 17 00:00:00 2001 +From: Eric Nelson +Date: Fri, 16 Aug 2013 11:42:23 -0700 +Subject: [PATCH] i.MX video renderer: Allow v4l device from environment + +The i.MX6 supports multiple IPUs and multiple V4L2 output +devices for each. + +Devices are numbered starting with /dev/video16 and defined +for each configured display. In general, /dev/video16 will +correspond to the RGB (background) layer for /dev/fb0. +If a display is the first on an IPU, an additional V4L2 +output will be defined that corresponds to the normally +YUV overlay (foreground) layer. + +This patch allows association of the proper device for +a particular session for use in multi-headed applications. +The default is /dev/video17: + export v4lsinkdev=/dev/video17 + +Signed-off-by: Eric Nelson +--- + src/3rdparty/phonon/gstreamer/widgetrenderer.cpp | 5 ++++- + 1 file changed, 4 insertions(+), 1 deletion(-) + +diff --git a/src/3rdparty/phonon/gstreamer/widgetrenderer.cpp b/src/3rdparty/phonon/gstreamer/widgetrenderer.cpp +index aa4925a..a502ccd 100644 +--- a/src/3rdparty/phonon/gstreamer/widgetrenderer.cpp ++++ b/src/3rdparty/phonon/gstreamer/widgetrenderer.cpp +@@ -58,9 +58,12 @@ WidgetRenderer::WidgetRenderer(VideoWidget *videoWidget) + : AbstractRenderer(videoWidget) + { + if ((m_videoSink = gst_element_factory_make("mfw_v4lsink", NULL)) && m_videoSink != NULL) { +- ++ char *videodev; + gst_object_ref (GST_OBJECT (m_videoSink)); //Take ownership + gst_object_sink (GST_OBJECT (m_videoSink)); ++ videodev=getenv("v4lsinkdev"); ++ if (videodev) ++ g_object_set (G_OBJECT (m_videoSink), "device", videodev, NULL); + } + + // Clear the background with black by default +-- +1.8.1.2 + diff --git a/qt4-layer/recipes-qt4/qt4/qt4/0003-i.MX6-force-egl-visual-ID-33.patch b/qt4-layer/recipes-qt4/qt4/qt4/0003-i.MX6-force-egl-visual-ID-33.patch new file mode 100644 index 0000000..9aa158d --- /dev/null +++ b/qt4-layer/recipes-qt4/qt4/qt4/0003-i.MX6-force-egl-visual-ID-33.patch @@ -0,0 +1,35 @@ +From: Javier Viguera +Date: Mon, 3 Mar 2014 17:10:41 +0100 +Subject: [PATCH] i.MX6: force egl visual ID 33 + +Workaround mismatch between EGL binary libraries and QT for FSL MX6 +based platforms. + +Error: +Warning: EGL suggested using X Visual ID 33 (ARGB0888) for EGL config 28 (ARGB0444), but this is incompatable +Unable to find an X11 visual which matches EGL config 28 + +Patch adapted from: + +http://wiki.wandboard.org/index.php/Integrate_Qt5_into_yocto_sato_image_on_Wandboard + +Upstream-Status: Inappropriate [workaround] + +Signed-off-by: Javier Viguera +--- + src/gui/egl/qegl_x11.cpp | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/src/gui/egl/qegl_x11.cpp b/src/gui/egl/qegl_x11.cpp +index 196d0f77bf2d..8acf5a6c99d4 100644 +--- a/src/gui/egl/qegl_x11.cpp ++++ b/src/gui/egl/qegl_x11.cpp +@@ -319,7 +319,7 @@ VisualID QEgl::getCompatibleVisualId(EGLConfig config) + } + + qWarning("Unable to find an X11 visual which matches EGL config %d", configId); +- return (VisualID)0; ++ return (VisualID)33; + } + + void qt_set_winid_on_widget(QWidget* w, Qt::HANDLE id) diff --git a/qt4-layer/recipes-qt4/qt4/qt4/mx6/g++.conf b/qt4-layer/recipes-qt4/qt4/qt4/mx6/g++.conf new file mode 100644 index 0000000..915ecba --- /dev/null +++ b/qt4-layer/recipes-qt4/qt4/qt4/mx6/g++.conf @@ -0,0 +1,40 @@ +# +# qmake configuration for common gcc +# + +QMAKE_COMPILER = gcc + +QMAKE_CC = $(OE_QMAKE_CC) +QMAKE_CFLAGS += $(OE_QMAKE_CFLAGS) -DLINUX=1 -DEGL_API_FB=1 +QMAKE_CFLAGS_RELEASE_WITH_DEBUGINFO += $(OE_QMAKE_CFLAGS) +QMAKE_CFLAGS_PRECOMPILE += -x c-header -c ${QMAKE_PCH_INPUT} -o ${QMAKE_PCH_OUTPUT} +QMAKE_CFLAGS_USE_PRECOMPILE += -include ${QMAKE_PCH_OUTPUT_BASE} + +QMAKE_CXX = $(OE_QMAKE_CXX) +QMAKE_CXXFLAGS += $(OE_QMAKE_CXXFLAGS) -DLINUX=1 -DEGL_API_FB=1 +QMAKE_CXXFLAGS_RELEASE_WITH_DEBUGINFO += $$QMAKE_CFLAGS_RELEASE_WITH_DEBUGINFO +QMAKE_CXXFLAGS_PRECOMPILE += -x c++-header -c ${QMAKE_PCH_INPUT} -o ${QMAKE_PCH_OUTPUT} +QMAKE_CXXFLAGS_USE_PRECOMPILE = $$QMAKE_CFLAGS_USE_PRECOMPILE + +QMAKE_LINK = $(OE_QMAKE_LINK) +QMAKE_LINK_SHLIB = $(OE_QMAKE_LINK) +QMAKE_LINK_C = $(OE_QMAKE_LINK) +QMAKE_LINK_C_SHLIB = $(OE_QMAKE_LINK) +QMAKE_LFLAGS += $(OE_QMAKE_LDFLAGS) +QMAKE_LFLAGS_NOUNDEF += -Wl,--no-undefined +QMAKE_LFLAGS_RPATH = -Wl,-rpath-link, + +QMAKE_PCH_OUTPUT_EXT = .gch + +# -Bsymbolic-functions (ld) support +QMAKE_LFLAGS_BSYMBOLIC_FUNC = -Wl,-Bsymbolic-functions +QMAKE_LFLAGS_DYNAMIC_LIST = -Wl,--dynamic-list, + +# do not depend on gdb +CONFIG -= gdb_dwarf_index + +# some linking helper... +CONFIG += rpath_libdirs + +# for the SDK +isEmpty(QMAKE_QT_CONFIG):QMAKE_QT_CONFIG = $(OE_QMAKE_QT_CONFIG) diff --git a/qt4-layer/recipes-qt4/qt4/qt4/mx6/linux.conf b/qt4-layer/recipes-qt4/qt4/qt4/mx6/linux.conf new file mode 100644 index 0000000..c644d8b --- /dev/null +++ b/qt4-layer/recipes-qt4/qt4/qt4/mx6/linux.conf @@ -0,0 +1,66 @@ +# +# qmake configuration for common linux +# + +QMAKE_CFLAGS_THREAD += -D_REENTRANT +QMAKE_CXXFLAGS_THREAD += $$QMAKE_CFLAGS_THREAD + +QMAKE_INCDIR = +QMAKE_LIBDIR = +QMAKE_INCDIR_X11 = +QMAKE_LIBDIR_X11 = +QMAKE_INCDIR_QT = $(OE_QMAKE_INCDIR_QT) +QMAKE_LIBDIR_QT = $(OE_QMAKE_LIBDIR_QT) +QMAKE_INCDIR_OPENGL = +QMAKE_LIBDIR_OPENGL = +QMAKE_INCDIR_OPENGL_ES1 = $$QMAKE_INCDIR_OPENGL +QMAKE_LIBDIR_OPENGL_ES1 = $$QMAKE_LIBDIR_OPENGL +QMAKE_INCDIR_OPENGL_ES2 = $$QMAKE_INCDIR_OPENGL +QMAKE_LIBDIR_OPENGL_ES2 = $$QMAKE_LIBDIR_OPENGL +QMAKE_INCDIR_EGL = +QMAKE_LIBDIR_EGL = +QMAKE_INCDIR_OPENVG = +QMAKE_LIBDIR_OPENVG = + + +QMAKE_LIBS = +QMAKE_LIBS_DYNLOAD = -ldl +QMAKE_LIBS_X11 = $(OE_QMAKE_LIBS_X11) +QMAKE_LIBS_X11SM = $(OE_QMAKE_LIBS_X11SM) +QMAKE_LIBS_NIS = -lnsl +QMAKE_LIBS_EGL = -lEGL -lGAL -DLINUX=1 -DEGL_API_FB=1 +QMAKE_LIBS_OPENGL = -lGL +QMAKE_LIBS_OPENGL_QT = -lGL +QMAKE_LIBS_OPENGL_ES1 = -lGLES_CM +QMAKE_LIBS_OPENGL_ES2 = -lGLESv2 -lGAL -lEGL -DLINUX=1 -DEGL_API_FB=1 +QMAKE_LIBS_OPENVG = -lOpenVG -lGAL -lEGL -DLINUX=1 -DEGL_API_FB=1 +QMAKE_LIBS_THREAD = -lpthread + +QMAKE_MOC = $(OE_QMAKE_MOC) +QMAKE_UIC = $(OE_QMAKE_UIC) +QMAKE_UIC3 = $(OE_QMAKE_UIC3) +QMAKE_RCC = $(OE_QMAKE_RCC) +QMAKE_QDBUSCPP2XML = $(OE_QMAKE_QDBUSCPP2XML) +QMAKE_QDBUSXML2CPP = $(OE_QMAKE_QDBUSXML2CPP) + +QMAKE_AR = $(OE_QMAKE_AR) cqs +QMAKE_OBJCOPY = objcopy +QMAKE_RANLIB = + +QMAKE_TAR = tar -cf +QMAKE_GZIP = gzip -9f + +QMAKE_COPY = cp -f +QMAKE_COPY_FILE = $(COPY) +QMAKE_COPY_DIR = $(COPY) -r +QMAKE_MOVE = mv -f +QMAKE_DEL_FILE = rm -f +QMAKE_DEL_DIR = rmdir +QMAKE_STRIP = $(OE_QMAKE_STRIP) +QMAKE_STRIPFLAGS_LIB += --strip-unneeded +QMAKE_CHK_DIR_EXISTS = test -d +QMAKE_MKDIR = mkdir -p +QMAKE_INSTALL_FILE = install -m 644 -p +QMAKE_INSTALL_PROGRAM = install -m 755 -p + +include(unix.conf) diff --git a/recipes-qt/qt4/qt4-embedded_%.bbappend b/recipes-qt/qt4/qt4-embedded_%.bbappend deleted file mode 100644 index 14324ca..0000000 --- a/recipes-qt/qt4/qt4-embedded_%.bbappend +++ /dev/null @@ -1 +0,0 @@ -include qt4-imx-support.inc diff --git a/recipes-qt/qt4/qt4-imx-support.inc b/recipes-qt/qt4/qt4-imx-support.inc deleted file mode 100644 index 0efb564..0000000 --- a/recipes-qt/qt4/qt4-imx-support.inc +++ /dev/null @@ -1,28 +0,0 @@ -FILESEXTRAPATHS_prepend := "${THISDIR}/qt4:" - -python __anonymous () { - families = ['mx6'] - cur_families = (d.getVar('SOC_FAMILY', True) or '').split(':') - if any(map(lambda x: x in cur_families, - families)): - d.appendVarFlag('do_configure', 'depends', ' virtual/kernel:do_shared_workdir') -} - -SRC_URI_append_mx6 += " \ - file://0001-Add-support-for-i.MX-codecs-to-phonon.patch \ - file://0002-i.MX-video-renderer-Allow-v4l-device-from-environmen.patch \ - file://0003-i.MX6-force-egl-visual-ID-33.patch \ -" - -DEPENDS_append_mx6 = " virtual/kernel virtual/libgles2" -QT_GLFLAGS_mx6 = "-opengl es2 -openvg" -QT_CONFIG_FLAGS_append_mx6 = " -I${STAGING_KERNEL_DIR}/include/uapi \ - -I${STAGING_KERNEL_DIR}/include/ \ - -DLINUX=1 -DEGL_API_FB=1 \ - -DQT_QPA_EXPERIMENTAL_TOUCHEVENT=1" - -# The QT_CONFIG_FLAGS can pollute *.la files with -Dxxx -do_compile_append_mx6 () { - find lib -name "*.la" | xargs -n1 sed -i 's/-D.*=1//g' -} - diff --git a/recipes-qt/qt4/qt4-x11-free_%.bbappend b/recipes-qt/qt4/qt4-x11-free_%.bbappend deleted file mode 100644 index 14324ca..0000000 --- a/recipes-qt/qt4/qt4-x11-free_%.bbappend +++ /dev/null @@ -1 +0,0 @@ -include qt4-imx-support.inc 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 deleted file mode 100644 index 1213650..0000000 --- a/recipes-qt/qt4/qt4/0001-Add-support-for-i.MX-codecs-to-phonon.patch +++ /dev/null @@ -1,468 +0,0 @@ -From 2ff5682e42771519757756dedbf27b7a9e8e25d9 Mon Sep 17 00:00:00 2001 -From: Rogerio Pimentel -Date: Tue, 24 Jul 2012 13:47:01 -0300 -Subject: [PATCH] Add support for i.MX codecs to phonon - -Add support for i.MX codecs to phonon - -Signed-off-by: Daniele Dall'Acqua -Signed-off-by: Rogerio Pimentel ---- - src/3rdparty/phonon/gstreamer/abstractrenderer.h | 1 + - src/3rdparty/phonon/gstreamer/mediaobject.cpp | 4 + - src/3rdparty/phonon/gstreamer/videowidget.cpp | 60 ++------ - src/3rdparty/phonon/gstreamer/videowidget.h | 1 + - src/3rdparty/phonon/gstreamer/widgetrenderer.cpp | 169 ++++++++++++++-------- - src/3rdparty/phonon/gstreamer/widgetrenderer.h | 17 ++- - src/3rdparty/phonon/gstreamer/x11renderer.cpp | 22 +--- - 7 files changed, 141 insertions(+), 133 deletions(-) - -diff --git a/src/3rdparty/phonon/gstreamer/abstractrenderer.h b/src/3rdparty/phonon/gstreamer/abstractrenderer.h -index 10a2822..fa0d87d 100644 ---- a/src/3rdparty/phonon/gstreamer/abstractrenderer.h -+++ b/src/3rdparty/phonon/gstreamer/abstractrenderer.h -@@ -49,6 +49,7 @@ public: - virtual bool eventFilter(QEvent *) = 0; - virtual void handlePaint(QPaintEvent *) {} - virtual bool paintsOnWidget() { return true; } // Controls overlays -+ virtual void handleMove(QMoveEvent * event ) {}; - - protected: - VideoWidget *m_videoWidget; -diff --git a/src/3rdparty/phonon/gstreamer/mediaobject.cpp b/src/3rdparty/phonon/gstreamer/mediaobject.cpp -index 23a60c0..f806d64 100644 ---- a/src/3rdparty/phonon/gstreamer/mediaobject.cpp -+++ b/src/3rdparty/phonon/gstreamer/mediaobject.cpp -@@ -515,6 +515,9 @@ void MediaObject::createPipeline() - // reduce buffer overruns as these are not gracefully handled at the moment. - m_audioPipe = gst_element_factory_make("queue", NULL); - g_object_set(G_OBJECT(m_audioPipe), "max-size-time", MAX_QUEUE_TIME, (const char*)NULL); -+ g_object_set(G_OBJECT(m_audioPipe), "max-size-time", 0, (const char*)NULL); -+ g_object_set(G_OBJECT(m_audioPipe), "max-size-buffers", 0, (const char*)NULL); -+ g_object_set(G_OBJECT(m_audioPipe), "max-size-bytes", 0, (const char*)NULL); - gst_bin_add(GST_BIN(m_audioGraph), m_audioPipe); - GstPad *audiopad = gst_element_get_pad (m_audioPipe, "sink"); - gst_element_add_pad (m_audioGraph, gst_ghost_pad_new ("sink", audiopad)); -@@ -527,6 +530,7 @@ void MediaObject::createPipeline() - - m_videoPipe = gst_element_factory_make("queue", NULL); - g_object_set(G_OBJECT(m_videoPipe), "max-size-time", MAX_QUEUE_TIME, (const char*)NULL); -+ g_object_set(G_OBJECT(m_videoPipe), "max-size-time", 33000, (const char*)NULL); - gst_bin_add(GST_BIN(m_videoGraph), m_videoPipe); - GstPad *videopad = gst_element_get_pad (m_videoPipe, "sink"); - gst_element_add_pad (m_videoGraph, gst_ghost_pad_new ("sink", videopad)); -diff --git a/src/3rdparty/phonon/gstreamer/videowidget.cpp b/src/3rdparty/phonon/gstreamer/videowidget.cpp -index a4c6f79..3682d3f 100644 ---- a/src/3rdparty/phonon/gstreamer/videowidget.cpp -+++ b/src/3rdparty/phonon/gstreamer/videowidget.cpp -@@ -83,50 +83,16 @@ void VideoWidget::setupVideoBin() - Q_ASSERT(m_videoBin); - gst_object_ref (GST_OBJECT (m_videoBin)); //Take ownership - gst_object_sink (GST_OBJECT (m_videoBin)); -- -- //The videoplug element is the final element before the pluggable videosink -- m_videoplug = gst_element_factory_make ("identity", NULL); -- -- //Colorspace ensures that the output of the stream matches the input format accepted by our video sink -- m_colorspace = gst_element_factory_make ("ffmpegcolorspace", NULL); -- -- //Video scale is used to prepare the correct aspect ratio and scale. -- GstElement *videoScale = gst_element_factory_make ("videoscale", NULL); -- -- //We need a queue to support the tee from parent node -- GstElement *queue = gst_element_factory_make ("queue", NULL); -- -- if (queue && m_videoBin && videoScale && m_colorspace && videoSink && m_videoplug) { -- //Ensure that the bare essentials are prepared -- gst_bin_add_many (GST_BIN (m_videoBin), queue, m_colorspace, m_videoplug, videoScale, videoSink, (const char*)NULL); -- bool success = false; -- //Video balance controls color/sat/hue in the YUV colorspace -- m_videoBalance = gst_element_factory_make ("videobalance", NULL); -- if (m_videoBalance) { -- // For video balance to work we have to first ensure that the video is in YUV colorspace, -- // then hand it off to the videobalance filter before finally converting it back to RGB. -- // Hence we nede a videoFilter to convert the colorspace before and after videobalance -- GstElement *m_colorspace2 = gst_element_factory_make ("ffmpegcolorspace", NULL); -- gst_bin_add_many(GST_BIN(m_videoBin), m_videoBalance, m_colorspace2, (const char*)NULL); -- success = gst_element_link_many(queue, m_colorspace, m_videoBalance, m_colorspace2, videoScale, m_videoplug, videoSink, (const char*)NULL); -- } else { -- //If video balance is not available, just connect to sink directly -- success = gst_element_link_many(queue, m_colorspace, videoScale, m_videoplug, videoSink, (const char*)NULL); -- } -- -- if (success) { -- GstPad *videopad = gst_element_get_pad (queue, "sink"); -- gst_element_add_pad (m_videoBin, gst_ghost_pad_new ("sink", videopad)); -- gst_object_unref (videopad); --#ifndef Q_WS_QPA -- QWidget *parentWidget = qobject_cast(parent()); -- if (parentWidget) -- parentWidget->winId(); // Due to some existing issues with alien in 4.4, -- // we must currently force the creation of a parent widget. --#endif -- m_isValid = true; //initialization ok, accept input -- } -- } -+ gst_bin_add_many (GST_BIN (m_videoBin), videoSink, NULL); -+ GstPad *videopad = gst_element_get_pad (videoSink,"sink"); -+ gst_element_add_pad (m_videoBin, gst_ghost_pad_new ("sink", videopad)); -+ gst_object_unref (videopad); -+ QWidget *parentWidget = qobject_cast(parent()); -+ -+ if (parentWidget) -+ parentWidget->winId(); // Due to some existing issues with alien in 4.4, -+ // we must currently force the creation of a parent widget. -+ m_isValid = true; //initialization ok, accept input - } - - void VideoWidget::paintEvent(QPaintEvent *event) -@@ -135,6 +101,12 @@ void VideoWidget::paintEvent(QPaintEvent *event) - m_renderer->handlePaint(event); - } - -+void VideoWidget::moveEvent(QMoveEvent * event ) -+{ -+ Q_ASSERT(m_renderer); -+ m_renderer->handleMove(event); -+} -+ - void VideoWidget::setVisible(bool val) { - Q_ASSERT(m_renderer); - -diff --git a/src/3rdparty/phonon/gstreamer/videowidget.h b/src/3rdparty/phonon/gstreamer/videowidget.h -index 8603f6a..38c7b17 100644 ---- a/src/3rdparty/phonon/gstreamer/videowidget.h -+++ b/src/3rdparty/phonon/gstreamer/videowidget.h -@@ -65,6 +65,7 @@ public: - qreal saturation() const; - void setSaturation(qreal); - void setMovieSize(const QSize &size); -+ void moveEvent(QMoveEvent * event ); - QSize sizeHint() const; - QRect scaleToAspect(QRect srcRect, int w, int h) const; - QRect calculateDrawFrameRect() const; -diff --git a/src/3rdparty/phonon/gstreamer/widgetrenderer.cpp b/src/3rdparty/phonon/gstreamer/widgetrenderer.cpp -index 423af9d..aa4925a 100644 ---- a/src/3rdparty/phonon/gstreamer/widgetrenderer.cpp -+++ b/src/3rdparty/phonon/gstreamer/widgetrenderer.cpp -@@ -15,7 +15,9 @@ - along with this library. If not, see . - */ - -+#include - #include -+#include - #include - #include "common.h" - #include "message.h" -@@ -24,6 +26,18 @@ - #include "widgetrenderer.h" - #include "qrgb.h" - -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+ -+#define MXCFB_GBL_ALPHA 255 -+#define MXCFB_CLR_KEY 0x00000000 // ARGB8888 -+ - // support old OpenGL installations (1.2) - // assume that if TEXTURE0 isn't defined, none are - #ifndef GL_TEXTURE0 -@@ -35,26 +49,6 @@ - #ifndef QT_NO_PHONON_VIDEO - QT_BEGIN_NAMESPACE - --static void frameRendered() --{ -- static QString displayFps = qgetenv("PHONON_GST_FPS"); -- if (displayFps.isEmpty()) -- return; -- -- static int frames = 0; -- static QTime lastTime = QTime::currentTime(); -- QTime time = QTime::currentTime(); -- -- int delta = lastTime.msecsTo(time); -- if (delta > 2000) { -- printf("FPS: %f\n", 1000.0 * frames / qreal(delta)); -- lastTime = time; -- frames = 0; -- } -- -- ++frames; --} -- - namespace Phonon - { - namespace Gstreamer -@@ -62,17 +56,11 @@ namespace Gstreamer - - WidgetRenderer::WidgetRenderer(VideoWidget *videoWidget) - : AbstractRenderer(videoWidget) -- , m_width(0) -- , m_height(0) - { -- videoWidget->backend()->logMessage("Creating QWidget renderer"); -- if ((m_videoSink = GST_ELEMENT(g_object_new(get_type_RGB(), NULL)))) { -- gst_object_ref (GST_OBJECT (m_videoSink)); //Take ownership -+ if ((m_videoSink = gst_element_factory_make("mfw_v4lsink", NULL)) && m_videoSink != NULL) { -+ -+ gst_object_ref (GST_OBJECT (m_videoSink)); //Take ownership - gst_object_sink (GST_OBJECT (m_videoSink)); -- -- QWidgetVideoSinkBase* sink = reinterpret_cast(m_videoSink); -- // Let the videosink know which widget to direct frame updates to -- sink->renderWidget = videoWidget; - } - - // Clear the background with black by default -@@ -84,67 +72,124 @@ WidgetRenderer::WidgetRenderer(VideoWidget *videoWidget) - m_videoWidget->setAttribute(Qt::WA_PaintOnScreen, false); - } - --void WidgetRenderer::setNextFrame(const QByteArray &array, int w, int h) -+WidgetRenderer::~WidgetRenderer() - { -- if (m_videoWidget->root()->state() == Phonon::LoadingState) -- return; -- -- m_frame = QImage(); -- { -- m_frame = QImage((uchar *)array.constData(), w, h, QImage::Format_RGB32); -- } -+ if (m_videoSink) { -+ gst_object_unref (GST_OBJECT (m_videoSink)); -+ m_videoSink = 0; -+ } -+} - -- m_array = array; -- m_width = w; -- m_height = h; -+void WidgetRenderer::setVideoSize(void) -+{ - -- m_videoWidget->update(); -+ int adj_x; -+ int adj_y; -+ -+ QSize wSize = m_videoWidget->size(); -+ m_drawFrameRect = m_videoWidget->calculateDrawFrameRect(); -+ framePos = m_videoWidget->mapToGlobal(QPoint(0,0)); -+ -+ //Center the video in the widget -+ -+ adj_x = (wSize.width()/2) - (m_drawFrameRect.width()/2); -+ adj_y = (wSize.height()/2) - (m_drawFrameRect.height()/2); -+ g_object_set(G_OBJECT(m_videoSink), "axis-left",adj_x + framePos.x(),(const char*)NULL); -+ g_object_set(G_OBJECT(m_videoSink), "axis-top", adj_y + framePos.y(), (const char*)NULL); -+ g_object_set(G_OBJECT(m_videoSink), "disp-width", m_drawFrameRect.width(), (const char*)NULL); -+ g_object_set(G_OBJECT(m_videoSink), "disp-height", m_drawFrameRect.height(), (const char*)NULL); -+ g_object_set(G_OBJECT(m_videoSink), "setpara", 1, (const char*)NULL); - } - - void WidgetRenderer::handleMediaNodeEvent(const MediaNodeEvent *event) - { - switch (event->type()) { -- case MediaNodeEvent::SourceChanged: -- { -- clearFrame(); -- break; -- } - default: - break; - } - } - --void WidgetRenderer::clearFrame() -+void WidgetRenderer::handlePaint(QPaintEvent *event) - { -- m_frame = QImage(); -- m_array = QByteArray(); -- m_videoWidget->update(); -+ Q_UNUSED(event); -+ QPainter painter(m_videoWidget); -+ painter.fillRect(m_videoWidget->rect(), m_videoWidget->palette().background()); - } - --const QImage &WidgetRenderer::currentFrame() const -+int WidgetRenderer::setOverlay(void) - { -- return m_frame; -+ struct mxcfb_color_key color_key; -+ struct mxcfb_gbl_alpha alpha; -+ int fd_fb; -+ -+ if ((fd_fb = open("/dev/fb0", O_RDWR, 0)) < 0) -+ { -+ printf("Unable to open %s\n", "/dev/fb0"); -+ return -1; -+ -+ } -+ -+ alpha.alpha = MXCFB_GBL_ALPHA; -+ alpha.enable = 1; -+ -+ if (ioctl(fd_fb, MXCFB_SET_GBL_ALPHA, &alpha) < 0) { -+ printf("Error in applying Alpha\n"); -+ } -+ -+ color_key.color_key = MXCFB_CLR_KEY & 0x00FFFFFF; -+ color_key.enable = 1; -+ if ( ioctl(fd_fb, MXCFB_SET_CLR_KEY, &color_key) < 0) { -+ -+ printf("Error in applying Color Key\n"); -+ return -1; -+ } -+ -+ close (fd_fb); -+ -+ return 0; - } - --void WidgetRenderer::handlePaint(QPaintEvent *event) -+void WidgetRenderer::handleMove( QMoveEvent * event) - { -- Q_UNUSED(event); -- QPainter painter(m_videoWidget); -- m_drawFrameRect = m_videoWidget->calculateDrawFrameRect(); -- painter.drawImage(drawFrameRect(), currentFrame()); -- frameRendered(); -+ Q_UNUSED(event); -+ -+ if (framePos != m_videoWidget->mapToGlobal(QPoint(0,0))) -+ setVideoSize(); - } - - bool WidgetRenderer::eventFilter(QEvent * event) - { -- if (event->type() == QEvent::User) { -- NewFrameEvent *frameEvent= static_cast (event); -- setNextFrame(frameEvent->frame, frameEvent->width, frameEvent->height); -- return true; -+ if (event->type() == QEvent::Show) { -+ -+ setOverlay(); -+ return true; -+ -+ } else if (event->type() == QEvent::Resize) { -+ -+ setVideoSize(); -+ return true; - } -+ if (framePos != m_videoWidget->mapToGlobal(QPoint(0,0))) -+ setVideoSize(); - return false; - } - -+void WidgetRenderer::aspectRatioChanged(Phonon::VideoWidget::AspectRatio) -+{ -+ setVideoSize(); -+} -+ -+void WidgetRenderer::scaleModeChanged(Phonon::VideoWidget::ScaleMode) -+{ -+ setVideoSize(); -+} -+ -+void WidgetRenderer::movieSizeChanged(const QSize &movieSize) -+{ -+ Q_UNUSED(movieSize); -+ setVideoSize(); -+} -+ - } - } //namespace Phonon::Gstreamer - -diff --git a/src/3rdparty/phonon/gstreamer/widgetrenderer.h b/src/3rdparty/phonon/gstreamer/widgetrenderer.h -index 03ee9c0..6de1a03 100644 ---- a/src/3rdparty/phonon/gstreamer/widgetrenderer.h -+++ b/src/3rdparty/phonon/gstreamer/widgetrenderer.h -@@ -40,20 +40,21 @@ class WidgetRenderer : public AbstractRenderer - { - public: - WidgetRenderer(VideoWidget *videoWidget); -+ ~WidgetRenderer(void); - bool eventFilter(QEvent * event); - void handlePaint(QPaintEvent *paintEvent); - void handleMediaNodeEvent(const MediaNodeEvent *event); -- const QImage& currentFrame() const; - QRect drawFrameRect() const { return m_drawFrameRect; } -- void setNextFrame(const QByteArray &array, int width, int height); -- bool frameIsSet() { return !m_array.isNull(); } -- void clearFrame(); -+ void aspectRatioChanged(Phonon::VideoWidget::AspectRatio aspectRatio); -+ void scaleModeChanged(Phonon::VideoWidget::ScaleMode scaleMode); -+ void movieSizeChanged(const QSize &movieSize); -+ void setVideoSize(void); -+ int setOverlay(void); -+ void handleMove(QMoveEvent* event); - private: -- mutable QImage m_frame; -- QByteArray m_array; -- int m_width; -- int m_height; -+ void paintEvent ( QPaintEvent * event ); - QRect m_drawFrameRect; -+ QPoint framePos; - }; - - } -diff --git a/src/3rdparty/phonon/gstreamer/x11renderer.cpp b/src/3rdparty/phonon/gstreamer/x11renderer.cpp -index 968f3a8..c4662e7 100644 ---- a/src/3rdparty/phonon/gstreamer/x11renderer.cpp -+++ b/src/3rdparty/phonon/gstreamer/x11renderer.cpp -@@ -31,6 +31,8 @@ - #include "mediaobject.h" - #include "message.h" - -+#define FSL_GSTREAMER 1 -+ - QT_BEGIN_NAMESPACE - - namespace Phonon -@@ -78,31 +80,16 @@ X11Renderer::~X11Renderer() - { - m_renderWidget->setAttribute(Qt::WA_PaintOnScreen, false); - m_renderWidget->setAttribute(Qt::WA_NoSystemBackground, false); -+ if (m_videoSink) { -+ gst_object_unref (GST_OBJECT (m_videoSink)); -+ } - delete m_renderWidget; - } - - GstElement* X11Renderer::createVideoSink() - { -- GstElement *videoSink = gst_element_factory_make ("xvimagesink", NULL); -- if (videoSink) { -- // Check if the xv sink is usable -- if (gst_element_set_state(videoSink, GST_STATE_READY) != GST_STATE_CHANGE_SUCCESS) { -- gst_object_unref(GST_OBJECT(videoSink)); -- videoSink = 0; -- } else { -- // Note that this should not really be necessary as these are -- // default values, though under certain conditions values are retained -- // even between application instances. (reproducible on 0.10.16/Gutsy) -- g_object_set(G_OBJECT(videoSink), "brightness", 0, (const char*)NULL); -- g_object_set(G_OBJECT(videoSink), "contrast", 0, (const char*)NULL); -- g_object_set(G_OBJECT(videoSink), "hue", 0, (const char*)NULL); -- g_object_set(G_OBJECT(videoSink), "saturation", 0, (const char*)NULL); -- } -- } -- -- if (!videoSink) -- videoSink = gst_element_factory_make ("ximagesink", NULL); - -+ GstElement *videoSink = gst_element_factory_make ("mfw_v4lsink", NULL); - gst_object_ref (GST_OBJECT (videoSink)); //Take ownership - gst_object_sink (GST_OBJECT (videoSink)); - --- -1.7.1 - diff --git a/recipes-qt/qt4/qt4/0002-i.MX-video-renderer-Allow-v4l-device-from-environmen.patch b/recipes-qt/qt4/qt4/0002-i.MX-video-renderer-Allow-v4l-device-from-environmen.patch deleted file mode 100644 index 0226db5..0000000 --- a/recipes-qt/qt4/qt4/0002-i.MX-video-renderer-Allow-v4l-device-from-environmen.patch +++ /dev/null @@ -1,46 +0,0 @@ -From 023befba9aad60ef58177fd987a6aa40c357b2b2 Mon Sep 17 00:00:00 2001 -From: Eric Nelson -Date: Fri, 16 Aug 2013 11:42:23 -0700 -Subject: [PATCH] i.MX video renderer: Allow v4l device from environment - -The i.MX6 supports multiple IPUs and multiple V4L2 output -devices for each. - -Devices are numbered starting with /dev/video16 and defined -for each configured display. In general, /dev/video16 will -correspond to the RGB (background) layer for /dev/fb0. -If a display is the first on an IPU, an additional V4L2 -output will be defined that corresponds to the normally -YUV overlay (foreground) layer. - -This patch allows association of the proper device for -a particular session for use in multi-headed applications. -The default is /dev/video17: - export v4lsinkdev=/dev/video17 - -Signed-off-by: Eric Nelson ---- - src/3rdparty/phonon/gstreamer/widgetrenderer.cpp | 5 ++++- - 1 file changed, 4 insertions(+), 1 deletion(-) - -diff --git a/src/3rdparty/phonon/gstreamer/widgetrenderer.cpp b/src/3rdparty/phonon/gstreamer/widgetrenderer.cpp -index aa4925a..a502ccd 100644 ---- a/src/3rdparty/phonon/gstreamer/widgetrenderer.cpp -+++ b/src/3rdparty/phonon/gstreamer/widgetrenderer.cpp -@@ -58,9 +58,12 @@ WidgetRenderer::WidgetRenderer(VideoWidget *videoWidget) - : AbstractRenderer(videoWidget) - { - if ((m_videoSink = gst_element_factory_make("mfw_v4lsink", NULL)) && m_videoSink != NULL) { -- -+ char *videodev; - gst_object_ref (GST_OBJECT (m_videoSink)); //Take ownership - gst_object_sink (GST_OBJECT (m_videoSink)); -+ videodev=getenv("v4lsinkdev"); -+ if (videodev) -+ g_object_set (G_OBJECT (m_videoSink), "device", videodev, NULL); - } - - // Clear the background with black by default --- -1.8.1.2 - diff --git a/recipes-qt/qt4/qt4/0003-i.MX6-force-egl-visual-ID-33.patch b/recipes-qt/qt4/qt4/0003-i.MX6-force-egl-visual-ID-33.patch deleted file mode 100644 index 9aa158d..0000000 --- a/recipes-qt/qt4/qt4/0003-i.MX6-force-egl-visual-ID-33.patch +++ /dev/null @@ -1,35 +0,0 @@ -From: Javier Viguera -Date: Mon, 3 Mar 2014 17:10:41 +0100 -Subject: [PATCH] i.MX6: force egl visual ID 33 - -Workaround mismatch between EGL binary libraries and QT for FSL MX6 -based platforms. - -Error: -Warning: EGL suggested using X Visual ID 33 (ARGB0888) for EGL config 28 (ARGB0444), but this is incompatable -Unable to find an X11 visual which matches EGL config 28 - -Patch adapted from: - -http://wiki.wandboard.org/index.php/Integrate_Qt5_into_yocto_sato_image_on_Wandboard - -Upstream-Status: Inappropriate [workaround] - -Signed-off-by: Javier Viguera ---- - src/gui/egl/qegl_x11.cpp | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/src/gui/egl/qegl_x11.cpp b/src/gui/egl/qegl_x11.cpp -index 196d0f77bf2d..8acf5a6c99d4 100644 ---- a/src/gui/egl/qegl_x11.cpp -+++ b/src/gui/egl/qegl_x11.cpp -@@ -319,7 +319,7 @@ VisualID QEgl::getCompatibleVisualId(EGLConfig config) - } - - qWarning("Unable to find an X11 visual which matches EGL config %d", configId); -- return (VisualID)0; -+ return (VisualID)33; - } - - void qt_set_winid_on_widget(QWidget* w, Qt::HANDLE id) diff --git a/recipes-qt/qt4/qt4/mx6/g++.conf b/recipes-qt/qt4/qt4/mx6/g++.conf deleted file mode 100644 index 915ecba..0000000 --- a/recipes-qt/qt4/qt4/mx6/g++.conf +++ /dev/null @@ -1,40 +0,0 @@ -# -# qmake configuration for common gcc -# - -QMAKE_COMPILER = gcc - -QMAKE_CC = $(OE_QMAKE_CC) -QMAKE_CFLAGS += $(OE_QMAKE_CFLAGS) -DLINUX=1 -DEGL_API_FB=1 -QMAKE_CFLAGS_RELEASE_WITH_DEBUGINFO += $(OE_QMAKE_CFLAGS) -QMAKE_CFLAGS_PRECOMPILE += -x c-header -c ${QMAKE_PCH_INPUT} -o ${QMAKE_PCH_OUTPUT} -QMAKE_CFLAGS_USE_PRECOMPILE += -include ${QMAKE_PCH_OUTPUT_BASE} - -QMAKE_CXX = $(OE_QMAKE_CXX) -QMAKE_CXXFLAGS += $(OE_QMAKE_CXXFLAGS) -DLINUX=1 -DEGL_API_FB=1 -QMAKE_CXXFLAGS_RELEASE_WITH_DEBUGINFO += $$QMAKE_CFLAGS_RELEASE_WITH_DEBUGINFO -QMAKE_CXXFLAGS_PRECOMPILE += -x c++-header -c ${QMAKE_PCH_INPUT} -o ${QMAKE_PCH_OUTPUT} -QMAKE_CXXFLAGS_USE_PRECOMPILE = $$QMAKE_CFLAGS_USE_PRECOMPILE - -QMAKE_LINK = $(OE_QMAKE_LINK) -QMAKE_LINK_SHLIB = $(OE_QMAKE_LINK) -QMAKE_LINK_C = $(OE_QMAKE_LINK) -QMAKE_LINK_C_SHLIB = $(OE_QMAKE_LINK) -QMAKE_LFLAGS += $(OE_QMAKE_LDFLAGS) -QMAKE_LFLAGS_NOUNDEF += -Wl,--no-undefined -QMAKE_LFLAGS_RPATH = -Wl,-rpath-link, - -QMAKE_PCH_OUTPUT_EXT = .gch - -# -Bsymbolic-functions (ld) support -QMAKE_LFLAGS_BSYMBOLIC_FUNC = -Wl,-Bsymbolic-functions -QMAKE_LFLAGS_DYNAMIC_LIST = -Wl,--dynamic-list, - -# do not depend on gdb -CONFIG -= gdb_dwarf_index - -# some linking helper... -CONFIG += rpath_libdirs - -# for the SDK -isEmpty(QMAKE_QT_CONFIG):QMAKE_QT_CONFIG = $(OE_QMAKE_QT_CONFIG) diff --git a/recipes-qt/qt4/qt4/mx6/linux.conf b/recipes-qt/qt4/qt4/mx6/linux.conf deleted file mode 100644 index c644d8b..0000000 --- a/recipes-qt/qt4/qt4/mx6/linux.conf +++ /dev/null @@ -1,66 +0,0 @@ -# -# qmake configuration for common linux -# - -QMAKE_CFLAGS_THREAD += -D_REENTRANT -QMAKE_CXXFLAGS_THREAD += $$QMAKE_CFLAGS_THREAD - -QMAKE_INCDIR = -QMAKE_LIBDIR = -QMAKE_INCDIR_X11 = -QMAKE_LIBDIR_X11 = -QMAKE_INCDIR_QT = $(OE_QMAKE_INCDIR_QT) -QMAKE_LIBDIR_QT = $(OE_QMAKE_LIBDIR_QT) -QMAKE_INCDIR_OPENGL = -QMAKE_LIBDIR_OPENGL = -QMAKE_INCDIR_OPENGL_ES1 = $$QMAKE_INCDIR_OPENGL -QMAKE_LIBDIR_OPENGL_ES1 = $$QMAKE_LIBDIR_OPENGL -QMAKE_INCDIR_OPENGL_ES2 = $$QMAKE_INCDIR_OPENGL -QMAKE_LIBDIR_OPENGL_ES2 = $$QMAKE_LIBDIR_OPENGL -QMAKE_INCDIR_EGL = -QMAKE_LIBDIR_EGL = -QMAKE_INCDIR_OPENVG = -QMAKE_LIBDIR_OPENVG = - - -QMAKE_LIBS = -QMAKE_LIBS_DYNLOAD = -ldl -QMAKE_LIBS_X11 = $(OE_QMAKE_LIBS_X11) -QMAKE_LIBS_X11SM = $(OE_QMAKE_LIBS_X11SM) -QMAKE_LIBS_NIS = -lnsl -QMAKE_LIBS_EGL = -lEGL -lGAL -DLINUX=1 -DEGL_API_FB=1 -QMAKE_LIBS_OPENGL = -lGL -QMAKE_LIBS_OPENGL_QT = -lGL -QMAKE_LIBS_OPENGL_ES1 = -lGLES_CM -QMAKE_LIBS_OPENGL_ES2 = -lGLESv2 -lGAL -lEGL -DLINUX=1 -DEGL_API_FB=1 -QMAKE_LIBS_OPENVG = -lOpenVG -lGAL -lEGL -DLINUX=1 -DEGL_API_FB=1 -QMAKE_LIBS_THREAD = -lpthread - -QMAKE_MOC = $(OE_QMAKE_MOC) -QMAKE_UIC = $(OE_QMAKE_UIC) -QMAKE_UIC3 = $(OE_QMAKE_UIC3) -QMAKE_RCC = $(OE_QMAKE_RCC) -QMAKE_QDBUSCPP2XML = $(OE_QMAKE_QDBUSCPP2XML) -QMAKE_QDBUSXML2CPP = $(OE_QMAKE_QDBUSXML2CPP) - -QMAKE_AR = $(OE_QMAKE_AR) cqs -QMAKE_OBJCOPY = objcopy -QMAKE_RANLIB = - -QMAKE_TAR = tar -cf -QMAKE_GZIP = gzip -9f - -QMAKE_COPY = cp -f -QMAKE_COPY_FILE = $(COPY) -QMAKE_COPY_DIR = $(COPY) -r -QMAKE_MOVE = mv -f -QMAKE_DEL_FILE = rm -f -QMAKE_DEL_DIR = rmdir -QMAKE_STRIP = $(OE_QMAKE_STRIP) -QMAKE_STRIPFLAGS_LIB += --strip-unneeded -QMAKE_CHK_DIR_EXISTS = test -d -QMAKE_MKDIR = mkdir -p -QMAKE_INSTALL_FILE = install -m 644 -p -QMAKE_INSTALL_PROGRAM = install -m 755 -p - -include(unix.conf) -- cgit v1.2.3-54-g00ecf