From 108dda7a90bd0f0337358b0db47ae55acd16dea6 Mon Sep 17 00:00:00 2001 From: Yoann Lopes Date: Thu, 20 Nov 2014 17:54:18 +0100 Subject: GStreamer: port to 1.0. 0.10 is still used by default. To enable GStreamer 1.0, pass GST_VERSION=1.0 to qmake for qtmultimedia.pro. Contributions from: Andrew den Exter Ilya Smelykh Jim Hodapp Sergio Schvezov Change-Id: I72a46d1170a8794a149bdb5e20767afcc5b7587c Reviewed-by: Andrew den Exter --- src/gsttools/qgstreameraudioprobecontrol.cpp | 47 +++++++++++++++++++--------- 1 file changed, 32 insertions(+), 15 deletions(-) (limited to 'src/gsttools/qgstreameraudioprobecontrol.cpp') diff --git a/src/gsttools/qgstreameraudioprobecontrol.cpp b/src/gsttools/qgstreameraudioprobecontrol.cpp index 3baca530f..9670d0f19 100644 --- a/src/gsttools/qgstreameraudioprobecontrol.cpp +++ b/src/gsttools/qgstreameraudioprobecontrol.cpp @@ -37,32 +37,48 @@ QGstreamerAudioProbeControl::QGstreamerAudioProbeControl(QObject *parent) : QMediaAudioProbeControl(parent) { - } QGstreamerAudioProbeControl::~QGstreamerAudioProbeControl() { - } -void QGstreamerAudioProbeControl::bufferProbed(GstBuffer* buffer) +void QGstreamerAudioProbeControl::probeCaps(GstCaps *caps) { - GstCaps* caps = gst_buffer_get_caps(buffer); - if (!caps) - return; - QAudioFormat format = QGstUtils::audioFormatForCaps(caps); - gst_caps_unref(caps); - if (!format.isValid()) - return; - QAudioBuffer audioBuffer = QAudioBuffer(QByteArray((const char*)buffer->data, buffer->size), format); + QMutexLocker locker(&m_bufferMutex); + m_format = format; +} - { - QMutexLocker locker(&m_bufferMutex); - m_pendingBuffer = audioBuffer; - QMetaObject::invokeMethod(this, "bufferProbed", Qt::QueuedConnection); +bool QGstreamerAudioProbeControl::probeBuffer(GstBuffer *buffer) +{ + qint64 position = GST_BUFFER_TIMESTAMP(buffer); + position = position >= 0 + ? position / G_GINT64_CONSTANT(1000) // microseconds + : -1; + + QByteArray data; +#if GST_CHECK_VERSION(1,0,0) + GstMapInfo info; + if (gst_buffer_map(buffer, &info, GST_MAP_READ)) { + data = QByteArray(reinterpret_cast(info.data), info.size); + gst_buffer_unmap(buffer, &info); + } else { + return true; + } +#else + data = QByteArray(reinterpret_cast(buffer->data), buffer->size); +#endif + + QMutexLocker locker(&m_bufferMutex); + if (m_format.isValid()) { + if (!m_pendingBuffer.isValid()) + QMetaObject::invokeMethod(this, "bufferProbed", Qt::QueuedConnection); + m_pendingBuffer = QAudioBuffer(data, m_format, position); } + + return true; } void QGstreamerAudioProbeControl::bufferProbed() @@ -73,6 +89,7 @@ void QGstreamerAudioProbeControl::bufferProbed() if (!m_pendingBuffer.isValid()) return; audioBuffer = m_pendingBuffer; + m_pendingBuffer = QAudioBuffer(); } emit audioBufferProbed(audioBuffer); } -- cgit v1.2.3