diff options
Diffstat (limited to 'src/plugins/multimedia/ffmpeg/qavfsamplebufferdelegate.mm')
-rw-r--r-- | src/plugins/multimedia/ffmpeg/qavfsamplebufferdelegate.mm | 44 |
1 files changed, 23 insertions, 21 deletions
diff --git a/src/plugins/multimedia/ffmpeg/qavfsamplebufferdelegate.mm b/src/plugins/multimedia/ffmpeg/qavfsamplebufferdelegate.mm index 54dc3e578..ecdce8266 100644 --- a/src/plugins/multimedia/ffmpeg/qavfsamplebufferdelegate.mm +++ b/src/plugins/multimedia/ffmpeg/qavfsamplebufferdelegate.mm @@ -8,6 +8,7 @@ #include "qffmpeghwaccel_p.h" #include "qavfhelpers_p.h" #include "qffmpegvideobuffer_p.h" +#include "private/qvideoframe_p.h" #undef AVMediaType @@ -25,64 +26,63 @@ namespace { class CVImageVideoBuffer : public QAbstractVideoBuffer { public: - CVImageVideoBuffer(CVImageBufferRef imageBuffer) - : QAbstractVideoBuffer(QVideoFrame::NoHandle), m_buffer(imageBuffer) + CVImageVideoBuffer(CVImageBufferRef imageBuffer) : m_buffer(imageBuffer) { CVPixelBufferRetain(imageBuffer); } ~CVImageVideoBuffer() { - CVImageVideoBuffer::unmap(); + Q_ASSERT(m_mode == QtVideo::MapMode::NotMapped); CVPixelBufferRelease(m_buffer); } - CVImageVideoBuffer::MapData map(QVideoFrame::MapMode mode) override + CVImageVideoBuffer::MapData map(QtVideo::MapMode mode) override { MapData mapData; - if (m_mode == QVideoFrame::NotMapped) { + if (m_mode == QtVideo::MapMode::NotMapped) { CVPixelBufferLockBaseAddress( - m_buffer, mode == QVideoFrame::ReadOnly ? kCVPixelBufferLock_ReadOnly : 0); + m_buffer, mode == QtVideo::MapMode::ReadOnly ? kCVPixelBufferLock_ReadOnly : 0); m_mode = mode; } - mapData.nPlanes = CVPixelBufferGetPlaneCount(m_buffer); - Q_ASSERT(mapData.nPlanes <= 3); + mapData.planeCount = CVPixelBufferGetPlaneCount(m_buffer); + Q_ASSERT(mapData.planeCount <= 3); - if (!mapData.nPlanes) { + if (!mapData.planeCount) { // single plane mapData.bytesPerLine[0] = CVPixelBufferGetBytesPerRow(m_buffer); mapData.data[0] = static_cast<uchar *>(CVPixelBufferGetBaseAddress(m_buffer)); - mapData.size[0] = CVPixelBufferGetDataSize(m_buffer); - mapData.nPlanes = mapData.data[0] ? 1 : 0; + mapData.dataSize[0] = CVPixelBufferGetDataSize(m_buffer); + mapData.planeCount = mapData.data[0] ? 1 : 0; return mapData; } // For a bi-planar or tri-planar format we have to set the parameters correctly: - for (int i = 0; i < mapData.nPlanes; ++i) { + for (int i = 0; i < mapData.planeCount; ++i) { mapData.bytesPerLine[i] = CVPixelBufferGetBytesPerRowOfPlane(m_buffer, i); - mapData.size[i] = mapData.bytesPerLine[i] * CVPixelBufferGetHeightOfPlane(m_buffer, i); + mapData.dataSize[i] = mapData.bytesPerLine[i] * CVPixelBufferGetHeightOfPlane(m_buffer, i); mapData.data[i] = static_cast<uchar *>(CVPixelBufferGetBaseAddressOfPlane(m_buffer, i)); } return mapData; } - QVideoFrame::MapMode mapMode() const override { return m_mode; } - void unmap() override { - if (m_mode != QVideoFrame::NotMapped) { + if (m_mode != QtVideo::MapMode::NotMapped) { CVPixelBufferUnlockBaseAddress( - m_buffer, m_mode == QVideoFrame::ReadOnly ? kCVPixelBufferLock_ReadOnly : 0); - m_mode = QVideoFrame::NotMapped; + m_buffer, m_mode == QtVideo::MapMode::ReadOnly ? kCVPixelBufferLock_ReadOnly : 0); + m_mode = QtVideo::MapMode::NotMapped; } } + QVideoFrameFormat format() const override { return {}; } + private: CVImageBufferRef m_buffer; - QVideoFrame::MapMode m_mode = QVideoFrame::NotMapped; + QtVideo::MapMode m_mode = QtVideo::MapMode::NotMapped; }; } @@ -147,7 +147,8 @@ static QVideoFrame createHwVideoFrame(QAVFSampleBufferDelegate &delegate, avFrame->pts = delegate.startTime - *delegate.baseTime; - return QVideoFrame(new QFFmpegVideoBuffer(std::move(avFrame)), format); + return QVideoFramePrivate::createFrame(std::make_unique<QFFmpegVideoBuffer>(std::move(avFrame)), + format); } - (instancetype)initWithFrameHandler:(std::function<void(const QVideoFrame &)>)handler @@ -200,7 +201,8 @@ static QVideoFrame createHwVideoFrame(QAVFSampleBufferDelegate &delegate, auto frame = createHwVideoFrame(*self, imageBuffer, format); if (!frame.isValid()) - frame = QVideoFrame(new CVImageVideoBuffer(imageBuffer), format); + frame = QVideoFramePrivate::createFrame(std::make_unique<CVImageVideoBuffer>(imageBuffer), + std::move(format)); frame.setStartTime(startTime - *baseTime); frame.setEndTime(frameTime - *baseTime); |