diff options
author | Timur Pocheptsov <timur.pocheptsov@theqtcompany.com> | 2016-04-19 15:21:50 +0200 |
---|---|---|
committer | Timur Pocheptsov <timur.pocheptsov@theqtcompany.com> | 2016-04-21 11:32:41 +0000 |
commit | f97e1988a6f76d46d551678666a96fa5f36a92f7 (patch) | |
tree | 1f204bfce7287dfc1deaf86fb8613f49fd81ed53 /src/plugins/avfoundation/camera/avfmediaassetwriter.h | |
parent | ffe61fd5169b5dd6f2a475ddccbf3679696d380f (diff) |
AVFMediaAssetWriter - fix potential race condition(s)
1. m_writerQueue is now shared by recorder control and asset writer
to ensure it lives long enough.
2. m_delegate->method() calls from async block can be dangerous, since by the time
this block is actually executed, delegate can be deleted already. This fix uses
Q_INVOKABLE and invokeMethod with QueuedConnection instead.
3. -finishWritingWithCompletionHandler: is async and when the block finally gets
executed, lock and 'if aborted' test are still needed.
4. Simplify the logic and reduce locking.
Change-Id: If23daf2fe22043244033427a7f6517a0fe3f23d1
Reviewed-by: Yoann Lopes <yoann.lopes@qt.io>
Diffstat (limited to 'src/plugins/avfoundation/camera/avfmediaassetwriter.h')
-rw-r--r-- | src/plugins/avfoundation/camera/avfmediaassetwriter.h | 24 |
1 files changed, 5 insertions, 19 deletions
diff --git a/src/plugins/avfoundation/camera/avfmediaassetwriter.h b/src/plugins/avfoundation/camera/avfmediaassetwriter.h index de8126295..21915e9ee 100644 --- a/src/plugins/avfoundation/camera/avfmediaassetwriter.h +++ b/src/plugins/avfoundation/camera/avfmediaassetwriter.h @@ -44,19 +44,9 @@ QT_BEGIN_NAMESPACE +class AVFMediaRecorderControlIOS; class AVFCameraService; -class AVFMediaAssetWriterDelegate -{ -public: - virtual ~AVFMediaAssetWriterDelegate(); - - virtual void assetWriterStarted() = 0; - virtual void assetWriterFailedToStart() = 0; - virtual void assetWriterFailedToStop() = 0; - virtual void assetWriterFinished() = 0; -}; - typedef QAtomicInteger<bool> AVFAtomicBool; typedef QAtomicInteger<qint64> AVFAtomicInt64; @@ -80,18 +70,15 @@ QT_END_NAMESPACE // Serial queue for audio output: QT_PREPEND_NAMESPACE(AVFScopedPointer)<dispatch_queue_t> m_audioQueue; // Queue to write sample buffers: - dispatch_queue_t m_writerQueue; + QT_PREPEND_NAMESPACE(AVFScopedPointer)<dispatch_queue_t> m_writerQueue; QT_PREPEND_NAMESPACE(AVFScopedPointer)<AVAssetWriter> m_assetWriter; - // Delegate's queue. - dispatch_queue_t m_delegateQueue; - QT_PREPEND_NAMESPACE(AVFMediaAssetWriterDelegate) *m_delegate; + QT_PREPEND_NAMESPACE(AVFMediaRecorderControlIOS) *m_delegate; bool m_setStartTime; QT_PREPEND_NAMESPACE(AVFAtomicBool) m_stopped; - bool m_stoppedInternal; - bool m_aborted; + QT_PREPEND_NAMESPACE(AVFAtomicBool) m_aborted; QT_PREPEND_NAMESPACE(QMutex) m_writerMutex; @public @@ -102,8 +89,7 @@ QT_END_NAMESPACE } - (id)initWithQueue:(dispatch_queue_t)writerQueue - delegate:(QT_PREPEND_NAMESPACE(AVFMediaAssetWriterDelegate) *)delegate - delegateQueue:(dispatch_queue_t)delegateQueue; + delegate:(QT_PREPEND_NAMESPACE(AVFMediaRecorderControlIOS) *)delegate; - (bool)setupWithFileURL:(NSURL *)fileURL cameraService:(QT_PREPEND_NAMESPACE(AVFCameraService) *)service; |