diff --git a/src/plugins/directshow/camera/dscamerasession.cpp b/src/plugins/directshow/camera/dscamerasession.cpp index 3f1187baa5fe4412e5b93c078201df33ded6b3de..55ab868ce006e5f7eb6d4a546e967611e25515ae 100644 --- a/src/plugins/directshow/camera/dscamerasession.cpp +++ b/src/plugins/directshow/camera/dscamerasession.cpp @@ -529,12 +529,10 @@ int DSCameraSession::captureImage(const QString &fileName) return m_imageIdCounter; } -void DSCameraSession::onFrameAvailable(double time, quint8 *buffer, long len) +void DSCameraSession::onFrameAvailable(double time, const QByteArray &data) { // !!! Not called on the main thread Q_UNUSED(time); - // Deep copy, the data might be modified or freed after the callback returns - QByteArray data(reinterpret_cast<const char *>(buffer), len); m_presentMutex.lock(); diff --git a/src/plugins/directshow/camera/dscamerasession.h b/src/plugins/directshow/camera/dscamerasession.h index 6b6cb49b2e4b563b9ed7eb915dd1a6e19d85498a..90407f49e9faf36b4a50c2a9174bc3acd788efb1 100644 --- a/src/plugins/directshow/camera/dscamerasession.h +++ b/src/plugins/directshow/camera/dscamerasession.h @@ -156,7 +156,7 @@ private: void setStatus(QCamera::Status status); - void onFrameAvailable(double time, quint8 *buffer, long len); + void onFrameAvailable(double time, const QByteArray &data); void saveCapturedImage(int id, const QImage &image, const QString &path); bool createFilterGraph(); diff --git a/src/plugins/directshow/common/directshowsamplegrabber.cpp b/src/plugins/directshow/common/directshowsamplegrabber.cpp index b33c3cfc625496963d63632c38f0cd3d90fb8052..fb95370ca55298af122c72bd46c0ea24533cf4f3 100644 --- a/src/plugins/directshow/common/directshowsamplegrabber.cpp +++ b/src/plugins/directshow/common/directshowsamplegrabber.cpp @@ -99,9 +99,11 @@ public: STDMETHODIMP BufferCB(double time, BYTE *buffer, long bufferLen) { - if (m_grabber) - Q_EMIT m_grabber->bufferAvailable(time, buffer, bufferLen); - + if (m_grabber) { + // Deep copy, the data might be modified or freed after the callback returns + QByteArray data(reinterpret_cast<const char *>(buffer), bufferLen); + Q_EMIT m_grabber->bufferAvailable(time, data); + } return S_OK; } diff --git a/src/plugins/directshow/common/directshowsamplegrabber.h b/src/plugins/directshow/common/directshowsamplegrabber.h index edabae2db0d7150f087772bd5883c7ededc66ba2..a9b72fcd1ce0bab398ddbe7a34815cdaaae44056 100644 --- a/src/plugins/directshow/common/directshowsamplegrabber.h +++ b/src/plugins/directshow/common/directshowsamplegrabber.h @@ -75,7 +75,7 @@ public: Q_SIGNALS: void sampleAvailable(double time, IMediaSample *sample); - void bufferAvailable(double time, quint8 *buffer, long len); + void bufferAvailable(double time, const QByteArray &data); private: IBaseFilter *m_filter; diff --git a/src/plugins/directshow/player/directshowplayerservice.cpp b/src/plugins/directshow/player/directshowplayerservice.cpp index 2f959b232e2b05b02b5b78901437828497717376..9cbb6296966cccb63faad3af042a361e7e4797a0 100644 --- a/src/plugins/directshow/player/directshowplayerservice.cpp +++ b/src/plugins/directshow/player/directshowplayerservice.cpp @@ -1453,7 +1453,7 @@ void DirectShowPlayerService::videoOutputChanged() QT_WARNING_PUSH QT_WARNING_DISABLE_GCC("-Wmissing-field-initializers") -void DirectShowPlayerService::onAudioBufferAvailable(double time, quint8 *buffer, long len) +void DirectShowPlayerService::onAudioBufferAvailable(double time, const QByteArray &data) { QMutexLocker locker(&m_mutex); if (!m_audioProbeControl || !m_audioSampleGrabber) @@ -1497,18 +1497,16 @@ void DirectShowPlayerService::onAudioBufferAvailable(double time, quint8 *buffer format.setSampleType(QAudioFormat::SignedInt); const quint64 startTime = quint64(time * 1000.); - QAudioBuffer audioBuffer(QByteArray(reinterpret_cast<const char *>(buffer), len), + QAudioBuffer audioBuffer(data, format, startTime); Q_EMIT m_audioProbeControl->audioBufferProbed(audioBuffer); } -void DirectShowPlayerService::onVideoBufferAvailable(double time, quint8 *buffer, long len) +void DirectShowPlayerService::onVideoBufferAvailable(double time, const QByteArray &data) { Q_UNUSED(time); - Q_UNUSED(buffer); - Q_UNUSED(len); QMutexLocker locker(&m_mutex); if (!m_videoProbeControl || !m_videoSampleGrabber) @@ -1536,7 +1534,6 @@ void DirectShowPlayerService::onVideoBufferAvailable(double time, quint8 *buffer const QSize &size = videoFormat.frameSize(); const int bytesPerLine = DirectShowMediaType::bytesPerLine(videoFormat); - QByteArray data(reinterpret_cast<const char *>(buffer), len); QVideoFrame frame(new QMemoryVideoBuffer(data, bytesPerLine), size, format); diff --git a/src/plugins/directshow/player/directshowplayerservice.h b/src/plugins/directshow/player/directshowplayerservice.h index 676d88fb540c92288ec00e4491a4a3cddb6bfd3b..01d05449e39d023a78d44ed2e01bddb26537780d 100644 --- a/src/plugins/directshow/player/directshowplayerservice.h +++ b/src/plugins/directshow/player/directshowplayerservice.h @@ -106,8 +106,8 @@ protected: private Q_SLOTS: void videoOutputChanged(); - void onAudioBufferAvailable(double time, quint8 *buffer, long len); - void onVideoBufferAvailable(double time, quint8 *buffer, long len); + void onAudioBufferAvailable(double time, const QByteArray &data); + void onVideoBufferAvailable(double time, const QByteArray &data); private: void releaseGraph(); diff --git a/tests/auto/integration/qaudioinput/tst_qaudioinput.cpp b/tests/auto/integration/qaudioinput/tst_qaudioinput.cpp index 8463149db90834b0e77d6149fa2f9c306e699c3e..14023f22993cde49c91c5fd24af690c75eeffd4c 100644 --- a/tests/auto/integration/qaudioinput/tst_qaudioinput.cpp +++ b/tests/auto/integration/qaudioinput/tst_qaudioinput.cpp @@ -222,7 +222,7 @@ void tst_QAudioInput::initTestCase() const QString temporaryAudioPath = m_temporaryDir->path() + slash; foreach (const QAudioFormat &format, testFormats) { const QString fileName = temporaryAudioPath + formatToFileName(format) + QStringLiteral(".wav"); - audioFiles.append(FilePtr(new QFile(fileName))); + audioFiles.append(FilePtr::create(fileName)); } qgetenv("QT_TEST_CI").toInt(&m_inCISystem,10); }