Only interact with the AVSampleBufferDisplayLayer on the main thread

This commit is contained in:
Cameron Gutman
2018-06-01 00:31:41 -07:00
parent ec0124e255
commit 04b2fccaef
2 changed files with 18 additions and 7 deletions

View File

@@ -324,6 +324,7 @@ void ClLogMessage(const char* format, ...)
LiInitializeVideoCallbacks(&_drCallbacks);
_drCallbacks.setup = DrDecoderSetup;
_drCallbacks.submitDecodeUnit = DrSubmitDecodeUnit;
_drCallbacks.capabilities = CAPABILITY_DIRECT_SUBMIT;
// RFI doesn't work properly with HEVC on iOS 11 with an iPhone SE (at least)
// It doesnt work on macOS either, tested with Network Link Conditioner.

View File

@@ -269,8 +269,13 @@
if (displayLayer.status == AVQueuedSampleBufferRenderingStatusFailed) {
Log(LOG_E, @"Display layer rendering failed: %@", displayLayer.error);
// Recreate the display layer
[self reinitializeDisplayLayer];
// Recreate the display layer on the main thread.
// We need to use dispatch_sync() or we may miss
// some parameter sets while the layer is being
// recreated.
dispatch_sync(dispatch_get_main_queue(), ^{
[self reinitializeDisplayLayer];
});
// Request an IDR frame to initialize the new decoder
free(data);
@@ -337,14 +342,19 @@
CFDictionarySetValue(dict, kCMSampleAttachmentKey_NotSync, kCFBooleanFalse);
CFDictionarySetValue(dict, kCMSampleAttachmentKey_DependsOnOthers, kCFBooleanFalse);
}
[displayLayer enqueueSampleBuffer:sampleBuffer];
#if !TARGET_OS_IPHONE
_view.frameCount++;
#endif
// Dereference the buffers
CFRelease(blockBuffer);
CFRelease(sampleBuffer);
// Enqueue video samples on the main thread
dispatch_async(dispatch_get_main_queue(), ^{
[self->displayLayer enqueueSampleBuffer:sampleBuffer];
// Dereference the buffers
CFRelease(blockBuffer);
CFRelease(sampleBuffer);
});
return DR_OK;
}