From 2b052fef1ed3ca236f7d30c9cdd5f82fb92e4e89 Mon Sep 17 00:00:00 2001 From: Acaki Date: Sat, 16 Aug 2025 17:03:36 +0800 Subject: [PATCH] fix: frozen image when switching from metal to AVSB --- VoidLink/Stream/VideoDecoderRenderer.m | 35 ++++++++++++++++++++++---- 1 file changed, 30 insertions(+), 5 deletions(-) diff --git a/VoidLink/Stream/VideoDecoderRenderer.m b/VoidLink/Stream/VideoDecoderRenderer.m index 75f9f54e..a703f2a9 100644 --- a/VoidLink/Stream/VideoDecoderRenderer.m +++ b/VoidLink/Stream/VideoDecoderRenderer.m @@ -59,12 +59,18 @@ extern int ff_isom_write_av1c(AVIOContext *pb, const uint8_t *buf, int size, - (void)reinitializeDisplayLayer { - if (_displayLayer == nil) { - _displayLayer = [[AVSampleBufferDisplayLayer alloc] init]; - _displayLayer.backgroundColor = [UIColor blackColor].CGColor; - _displayLayer.videoGravity = AVLayerVideoGravityResize; - [_view.layer addSublayer:_displayLayer]; + // Clean up existing display layer if it exists + if (_displayLayer != nil) { + [_displayLayer flushAndRemoveImage]; + [_displayLayer removeFromSuperlayer]; + _displayLayer = nil; } + + // Create a new display layer + _displayLayer = [[AVSampleBufferDisplayLayer alloc] init]; + _displayLayer.backgroundColor = [UIColor blackColor].CGColor; + _displayLayer.videoGravity = AVLayerVideoGravityResize; + [_view.layer addSublayer:_displayLayer]; // Ensure the AVSampleBufferDisplayLayer is sized to preserve the aspect ratio // of the video stream. We used to use AVLayerVideoGravityResizeAspect, but that @@ -358,6 +364,14 @@ int DrSubmitDecodeUnit(PDECODE_UNIT decodeUnit); if (_renderingBackend == RENDER_AVSB) { [_displayLink invalidate]; + _displayLink = nil; + + // Properly clean up the display layer + if (_displayLayer != nil) { + [_displayLayer flushAndRemoveImage]; + [_displayLayer removeFromSuperlayer]; + _displayLayer = nil; + } } if (_decompressionSession != NULL) { @@ -365,6 +379,17 @@ int DrSubmitDecodeUnit(PDECODE_UNIT decodeUnit); CFRelease(_decompressionSession); _decompressionSession = nil; } + + // Clean up format descriptors + if (_formatDesc != nil) { + CFRelease(_formatDesc); + _formatDesc = nil; + } + + if (_formatDescImageBuffer != nil) { + CFRelease(_formatDescImageBuffer); + _formatDescImageBuffer = nil; + } } #define NALU_START_PREFIX_SIZE 3