summaryrefslogtreecommitdiffstats
path: root/src/plugins/avfoundation/camera/avfmediaassetwriter.h
diff options
context:
space:
mode:
authorTimur Pocheptsov <timur.pocheptsov@theqtcompany.com>2016-04-19 15:21:50 +0200
committerTimur Pocheptsov <timur.pocheptsov@theqtcompany.com>2016-04-21 11:32:41 +0000
commitf97e1988a6f76d46d551678666a96fa5f36a92f7 (patch)
tree1f204bfce7287dfc1deaf86fb8613f49fd81ed53 /src/plugins/avfoundation/camera/avfmediaassetwriter.h
parentffe61fd5169b5dd6f2a475ddccbf3679696d380f (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.h24
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;