--- Begin Message ---
Package: kamoso
Version: 2.0.2-2+b1
Severity: wishlist
Dear Maintainer,
We would like to transition to qt-gstreamer 1.x and Kamoso is one of the users
of that package.
I've produced a patch that makes the qt4 version of kamoso compatible with qt-
gstreamer. I believe upstream is working on a qt5 version.
I haven't forwarded this patch upstream, however I'll point some of the KDE
developers to it to see if we should.
Diane.
-- System Information:
Debian Release: 8.0
APT prefers stable-updates
APT policy: (500, 'stable-updates'), (500, 'unstable'), (500, 'testing'),
(500, 'stable'), (1, 'experimental')
Architecture: amd64 (x86_64)
Foreign Architectures: i386
Kernel: Linux 3.16.0-4-amd64 (SMP w/4 CPU cores)
Locale: LANG=en_US.UTF-8, LC_CTYPE=en_US.UTF-8 (charmap=UTF-8)
Shell: /bin/sh linked to /bin/dash
Init: systemd (via /run/systemd/system)
Versions of packages kamoso depends on:
ii gstreamer0.10-plugins-good 0.10.31-3+nmu4+b1
ii gstreamer0.10-x 0.10.36-2
ii kde-runtime 4:4.14.2-2
ii libc6 2.19-18
ii libgcc1 1:4.9.2-10
ii libkdecore5 4:4.14.2-5
ii libkdeui5 4:4.14.2-5
ii libkfile4 4:4.14.2-5
ii libkio5 4:4.14.2-5
ii libkipi11 4:4.13.3-1
ii libnepomuk4 4:4.14.2-5
ii libphonon4 4:4.8.0-5
ii libqt4-dbus 4:4.8.6+git64-g5dc8b2b+dfsg-3
ii libqtcore4 4:4.8.6+git64-g5dc8b2b+dfsg-3
ii libqtglib-2.0-0 1.2.0-2
ii libqtgstreamer-0.10-0 0.10.2-2.1
ii libqtgstreamerui-0.10-0 0.10.2-2.1
ii libqtgui4 4:4.8.6+git64-g5dc8b2b+dfsg-3
ii libsolid4 4:4.14.2-5
ii libstdc++6 4.9.2-10
ii phonon 4:4.8.0-5
Versions of packages kamoso recommends:
ii kipi-plugins 4:4.4.0-1.1
kamoso suggests no packages.
-- no debconf information
diff --git a/cmake/FindGStreamer.cmake b/cmake/FindGStreamer.cmake
index a1b6e33..b5634bb 100644
--- a/cmake/FindGStreamer.cmake
+++ b/cmake/FindGStreamer.cmake
@@ -15,40 +15,38 @@
# TODO: Other versions --> GSTREAMER_X_Y_FOUND (Example: GSTREAMER_0_8_FOUND and GSTREAMER_0_10_FOUND etc)
-IF (GSTREAMER_INCLUDE_DIR AND GSTREAMER_LIBRARIES AND GSTREAMER_BASE_LIBRARY AND GSTREAMER_INTERFACE_LIBRARY)
+IF (GSTREAMER_INCLUDE_DIR AND GSTREAMER_LIBRARIES AND GSTREAMER_BASE_LIBRARY)
# in cache already
SET(GStreamer_FIND_QUIETLY TRUE)
-ELSE (GSTREAMER_INCLUDE_DIR AND GSTREAMER_LIBRARIES AND GSTREAMER_BASE_LIBRARY AND GSTREAMER_INTERFACE_LIBRARY)
+ELSE (GSTREAMER_INCLUDE_DIR AND GSTREAMER_LIBRARIES AND GSTREAMER_BASE_LIBRARY)
SET(GStreamer_FIND_QUIETLY FALSE)
-ENDIF (GSTREAMER_INCLUDE_DIR AND GSTREAMER_LIBRARIES AND GSTREAMER_BASE_LIBRARY AND GSTREAMER_INTERFACE_LIBRARY)
+ENDIF (GSTREAMER_INCLUDE_DIR AND GSTREAMER_LIBRARIES AND GSTREAMER_BASE_LIBRARY)
+SET(GSTREAMER_API_VERSION 1.0)
IF (NOT WIN32)
FIND_PACKAGE(PkgConfig REQUIRED)
# use pkg-config to get the directories and then use these values
# in the FIND_PATH() and FIND_LIBRARY() calls
# don't make this check required - otherwise you can't use macro_optional_find_package on this one
- PKG_CHECK_MODULES(PKG_GSTREAMER gstreamer-0.10)
+ PKG_CHECK_MODULES(PKG_GSTREAMER gstreamer-${GSTREAMER_API_VERSION})
SET(GSTREAMER_VERSION ${PKG_GSTREAMER_VERSION})
SET(GSTREAMER_DEFINITIONS ${PKG_GSTREAMER_CFLAGS})
ENDIF (NOT WIN32)
+message(STATUS "Found GStreamer package: ${PKG_GSTREAMER_VERSION}")
+
FIND_PATH(GSTREAMER_INCLUDE_DIR gst/gst.h
PATHS
${PKG_GSTREAMER_INCLUDE_DIRS}
- PATH_SUFFIXES gstreamer-0.10
- )
-
-FIND_LIBRARY(GSTREAMER_LIBRARIES NAMES gstreamer-0.10
- PATHS
- ${PKG_GSTREAMER_LIBRARY_DIRS}
+ PATH_SUFFIXES gstreamer-${GSTREAMER_API_VERSION}
)
-FIND_LIBRARY(GSTREAMER_BASE_LIBRARY NAMES gstbase-0.10
+FIND_LIBRARY(GSTREAMER_LIBRARIES NAMES gstreamer-${GSTREAMER_API_VERSION}
PATHS
${PKG_GSTREAMER_LIBRARY_DIRS}
)
-FIND_LIBRARY(GSTREAMER_INTERFACE_LIBRARY NAMES gstinterfaces-0.10
+FIND_LIBRARY(GSTREAMER_BASE_LIBRARY NAMES gstbase-${GSTREAMER_API_VERSION}
PATHS
${PKG_GSTREAMER_LIBRARY_DIRS}
)
@@ -63,12 +61,7 @@ ELSE (GSTREAMER_LIBRARIES)
MESSAGE(STATUS "GStreamer: WARNING: library not found")
ENDIF (GSTREAMER_LIBRARIES)
-IF (GSTREAMER_INTERFACE_LIBRARY)
-ELSE (GSTREAMER_INTERFACE_LIBRARY)
- MESSAGE(STATUS "GStreamer: WARNING: interface library not found")
-ENDIF (GSTREAMER_INTERFACE_LIBRARY)
-
INCLUDE(FindPackageHandleStandardArgs)
-FIND_PACKAGE_HANDLE_STANDARD_ARGS(GStreamer DEFAULT_MSG GSTREAMER_LIBRARIES GSTREAMER_INCLUDE_DIR GSTREAMER_BASE_LIBRARY GSTREAMER_INTERFACE_LIBRARY)
+FIND_PACKAGE_HANDLE_STANDARD_ARGS(GStreamer DEFAULT_MSG GSTREAMER_LIBRARIES GSTREAMER_INCLUDE_DIR GSTREAMER_BASE_LIBRARY)
-MARK_AS_ADVANCED(GSTREAMER_INCLUDE_DIR GSTREAMER_LIBRARIES GSTREAMER_BASE_LIBRARY GSTREAMER_INTERFACE_LIBRARY)
+MARK_AS_ADVANCED(GSTREAMER_INCLUDE_DIR GSTREAMER_LIBRARIES GSTREAMER_BASE_LIBRARY )
diff --git a/src/webcamwidget.cpp b/src/webcamwidget.cpp
index 62b7831..dc886ef 100644
--- a/src/webcamwidget.cpp
+++ b/src/webcamwidget.cpp
@@ -46,6 +46,7 @@
#include <QGst/Element>
#include <QGst/Parse>
#include <QGst/Buffer>
+#include <QGst/Memory>
#include <QGst/Pad>
#include <QGst/Fourcc>
#include <QGst/ElementFactory>
@@ -55,7 +56,7 @@
#include <QGst/Structure>
#include <QGst/Clock>
#include <QGst/Init>
-#include <QGst/XOverlay>
+#include <QGst/VideoOverlay>
#include <QGst/Message>
#include <gst/gst.h>
#include <gst/video/video.h>
@@ -130,8 +131,8 @@ void WebcamWidget::playFile(const Device &device)
QByteArray pipe = basicPipe();
//Set the right colorspace to convert to QImage
- pipe += " ! ffmpegcolorspace ! "
- GST_VIDEO_CAPS_xRGB_HOST_ENDIAN
+ pipe += " ! videoconvert ! "
+ GST_VIDEO_CAPS_MAKE("RGB")
" ! fakesink name=fakesink";
kDebug() << "================ PIPELINE ================";
@@ -157,7 +158,7 @@ void WebcamWidget::playFile(const Device &device)
setVideoSettings();
kDebug() << "================ Capabilities ================";
- kDebug() << d->m_pipeline->getElementByName("v4l2src")->getStaticPad("src")->caps()->toString();
+ //kDebug() << d->m_pipeline->getElementByName("v4l2src")->getStaticPad("src")->caps()->toString();
d->m_pipeline->setState(QGst::StatePlaying);
}
@@ -179,72 +180,87 @@ bool WebcamWidget::takePhoto(const KUrl &dest)
}
kDebug() << dest;
d->destination = dest;
+ if (!d->m_bin) {
+ return false;
+ }
d->m_bin->getElementByName("fakesink")->setProperty("signal-handoffs", true);
QGlib::connect(d->m_bin->getElementByName("fakesink"), "handoff", this, &WebcamWidget::photoGstCallback);
return true;
}
//This code has been borrowed from the Qt Multimedia project.
-void WebcamWidget::photoGstCallback(QGst::BufferPtr buffer, QGst::PadPtr)
+void WebcamWidget::photoGstCallback(QGst::BufferPtr buffer, QGst::PadPtr pad)
{
kDebug();
QImage img;
- QGst::CapsPtr caps = buffer->caps();
+ QGst::CapsPtr caps = pad->currentCaps();
const QGst::StructurePtr structure = caps->internalStructure(0);
int width, height;
width = structure.data()->value("width").get<int>();
height = structure.data()->value("height").get<int>();
+ QString format;
+ format = structure.data()->value("format").get<QString>();
kDebug() << "We've got a caps in here";
kDebug() << "Size: " << width << "x" << height;
kDebug() << "Name: " << structure.data()->name();
+ kDebug() << "Format: " << format;
- if (qstrcmp(structure.data()->name().toLatin1(), "video/x-raw-yuv") == 0) {
+ if (format == "YUV") {
QGst::Fourcc fourcc = structure->value("format").get<QGst::Fourcc>();
kDebug() << "fourcc: " << fourcc.value.as_integer;
if (fourcc.value.as_integer == QGst::Fourcc("I420").value.as_integer) {
+ QGst::MapInfo memory_info;
img = QImage(width/2, height/2, QImage::Format_RGB32);
- const uchar *data = (const uchar *)buffer->data();
+ if (buffer->map(memory_info, QGst::MapRead)) {
+ const uchar *data = (const uchar *)memory_info.data();
- for (int y=0; y<height; y+=2) {
- const uchar *yLine = data + y*width;
- const uchar *uLine = data + width*height + y*width/4;
- const uchar *vLine = data + width*height*5/4 + y*width/4;
+ for (int y=0; y<height; y+=2) {
+ const uchar *yLine = data + y*width;
+ const uchar *uLine = data + width*height + y*width/4;
+ const uchar *vLine = data + width*height*5/4 + y*width/4;
- for (int x=0; x<width; x+=2) {
- const qreal Y = 1.164*(yLine[x]-16);
- const int U = uLine[x/2]-128;
- const int V = vLine[x/2]-128;
+ for (int x=0; x<width; x+=2) {
+ const qreal Y = 1.164*(yLine[x]-16);
+ const int U = uLine[x/2]-128;
+ const int V = vLine[x/2]-128;
- int b = qBound(0, int(Y + 2.018*U), 255);
- int g = qBound(0, int(Y - 0.813*V - 0.391*U), 255);
- int r = qBound(0, int(Y + 1.596*V), 255);
+ int b = qBound(0, int(Y + 2.018*U), 255);
+ int g = qBound(0, int(Y - 0.813*V - 0.391*U), 255);
+ int r = qBound(0, int(Y + 1.596*V), 255);
- img.setPixel(x/2,y/2,qRgb(r,g,b));
+ img.setPixel(x/2,y/2,qRgb(r,g,b));
+ }
}
+ buffer->unmap(memory_info);
}
} else {
kDebug() << "Not I420";
}
- } else if (qstrcmp(structure.data()->name().toLatin1(), "video/x-raw-rgb") == 0) {
- kDebug() << "RGB name";
+ } else if (format == "RGB") {
QImage::Format format = QImage::Format_Invalid;
int bpp = structure.data()->value("bpp").get<int>();
+ // need a better solution.
+ bpp = 24;
if (bpp == 24)
format = QImage::Format_RGB888;
else if (bpp == 32)
format = QImage::Format_RGB32;
if (format != QImage::Format_Invalid) {
- img = QImage((const uchar *)buffer->data(),
- width,
- height,
- format);
- img.bits(); //detach
+ QGst::MapInfo memory_info;
+ if (buffer->map(memory_info, QGst::MapRead)) {
+ img = QImage((const uchar *)memory_info.data(),
+ width,
+ height,
+ format);
+ img.bits(); //detach
+ buffer->unmap(memory_info);
+ }
}
}
@@ -285,7 +301,7 @@ void WebcamWidget::recordVideo(bool sound)
//Get the audio from alsa
" ! mux. autoaudiosrc "
//Sound type and quality
- " ! audio/x-raw-int,rate=48000,channels=2,depth=16 "
+ " ! audio/x-raw,rate=48000,channels=2,depth=16 "
//Encode sound as vorbis
" ! queue ! audioconvert ! queue "
" ! vorbisenc "
@@ -368,11 +384,11 @@ QByteArray WebcamWidget::basicPipe()
//Accepted capabilities
pipe +=
- " ! ffmpegcolorspace"
- " ! video/x-raw-yuv, width=640, height=480, framerate=15/1;"
- " video/x-raw-yuv, width=640, height=480, framerate=24/1;"
- " video/x-raw-yuv, width=640, height=480, framerate=30/1;"
- " video/x-raw-yuv, width=352, height=288, framerate=15/1"
+ " ! videoconvert"
+ " ! video/x-raw, width=640, height=480, framerate=15/1;"
+ " video/x-raw, width=640, height=480, framerate=24/1;"
+ " video/x-raw, width=640, height=480, framerate=30/1;"
+ " video/x-raw, width=352, height=288, framerate=15/1"
//Basic plug-in for video controls
" ! gamma name=gamma"
@@ -424,7 +440,7 @@ void WebcamWidget::activeAspectRatio()
{
QGst::BinPtr sink = d->m_bin->getElementByName("videosink").staticCast<QGst::Bin>();
- QGlib::RefPointer<QGst::XOverlay> over = sink->getElementByInterface<QGst::XOverlay>();
+ QGlib::RefPointer<QGst::VideoOverlay> over = sink->getElementByInterface<QGst::VideoOverlay>();
if (over->findProperty("force-aspect-ratio")) {
kDebug() << "Setting aspect ratio";
--- End Message ---