diff options
Diffstat (limited to 'src/plugins/directshow/common')
-rw-r--r-- | src/plugins/directshow/common/directshowsamplegrabber.cpp | 8 | ||||
-rw-r--r-- | src/plugins/directshow/common/directshowsamplegrabber.h | 2 |
2 files changed, 6 insertions, 4 deletions
diff --git a/src/plugins/directshow/common/directshowsamplegrabber.cpp b/src/plugins/directshow/common/directshowsamplegrabber.cpp index b33c3cfc6..fb95370ca 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 edabae2db..a9b72fcd1 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; |