Threading guarantees with AVCaptureVideoDataOutput

I'm writing some camera functionality that uses AVCaptureVideoDataOutput.

I've set it up so that it calls my AVCaptureVideoDataOutputSampleBufferDelegate on a background thread, by making my own dispatch_queue and configuring the AVCaptureVideoDataOutput.

My question is then, if I configure my AVCaptureSession differently, or even stop it altogether, is this guaranteed to flush all pending jobs on my background thread?

I have a more practical example below, showing how I am accessing something from the foreground thread from the background thread, but I wonder when/how it's safe to clean up that resource.

I have setup similar to the following:

// Foreground thread logic

dispatch_queue_t queue = dispatch_queue_create("avf_camera_queue", nullptr);

AVCaptureSession *captureSession = [[AVCaptureSession alloc] init];

setupInputDevice(captureSession); // Connects the AVCaptureDevice...

// Store some arbitrary data to be attached to the frame, stored on the foreground thread
FrameMetaData frameMetaData = ...; 

MySampleBufferDelegate *sampleBufferDelegate = [MySampleBufferDelegate alloc];
// Capture frameMetaData by reference in lambda
[sampleBufferDelegate setFrameMetaDataGetter: [&frameMetaData]() { return &frameMetaData; }];

AVCaptureVideoDataOutput *captureVideoDataOutput = [[AVCaptureVideoDataOutput alloc] init];
[captureVideoDataOutput setSampleBufferDelegate:sampleBufferDelegate
                                          queue:queue];

[captureSession addOutput:captureVideoDataOutput];

[captureSession startRunning];
[captureSession stopRunning];

// Is it now safe to destroy frameMetaData, or do we need manual barrier?

And then in MySampleBufferDelegate:

- (void)captureOutput:(AVCaptureOutput *)captureOutput
        didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer
               fromConnection:(AVCaptureConnection *)connection
{
    // Invokes the callback set above
    FrameMetaData *frameMetaData = frameMetaDataGetter();
    
    emitSampleBuffer(sampleBuffer, frameMetaData);
}
Threading guarantees with AVCaptureVideoDataOutput
 
 
Q