gpt4 book ai didi

iphone - CGContextDrawImage 崩溃

转载 作者:行者123 更新时间:2023-11-29 04:15:39 26 4
gpt4 key购买 nike

我正在尝试从 CGImage 创建 CVPixelBufferRef 所以这里是方法:

- (CVPixelBufferRef) pixelBufferFromCGImage: (CGImageRef) image
{
CGImageRetain(image);
NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:
[NSNumber numberWithBool:YES], kCVPixelBufferCGImageCompatibilityKey,
[NSNumber numberWithBool:YES], kCVPixelBufferCGBitmapContextCompatibilityKey,
nil];
CVPixelBufferRef pxbuffer = NULL;

CVPixelBufferCreate(kCFAllocatorDefault, CGImageGetWidth(image),
CGImageGetHeight(image), kCVPixelFormatType_32ARGB, (CFDictionaryRef) options,
&pxbuffer);

CVPixelBufferLockBaseAddress(pxbuffer, 0);
void *pxdata = CVPixelBufferGetBaseAddress(pxbuffer);
CGColorSpaceRef rgbColorSpace = CGColorSpaceCreateDeviceRGB();
CGContextRef context = CGBitmapContextCreate(pxdata, CGImageGetWidth(image),
CGImageGetHeight(image), 8, 4*CGImageGetWidth(image), rgbColorSpace,
kCGImageAlphaNoneSkipFirst);
CGContextRetain(context);
CGContextConcatCTM(context, CGAffineTransformMakeRotation(0));
CGContextDrawImage(context, CGRectMake(0, 0, CGImageGetWidth(image),
CGImageGetHeight(image)), image);
CGColorSpaceRelease(rgbColorSpace);
CGContextRelease(context);
CVPixelBufferUnlockBaseAddress(pxbuffer, 0);
CGContextRelease(context);
CGImageRelease(image);
return pxbuffer;
}

我经常调用这个方法,它是用于生成视频帧,25fps。大多数情况下这工作正常,但在某些时候它会在这行代码上崩溃:

 CGContextDrawImage(context, CGRectMake(0, 0, CGImageGetWidth(image),
CGImageGetHeight(image)), image);

我已经测试了内存使用和内存泄漏,一切都很好,但挤压仍然发生。

崩溃堆栈:线程 6 崩溃:

0   ImageIO                         0x39270806 CGImageReadGetBytesAtOffset + 34
1 ImageIO 0x392707d6 CGImageReadSessionGetBytes + 22
2 ImageIO 0x39280c3c fill_input_buffer + 148
3 ImageIO 0x3928003a read_markers + 154
4 ImageIO 0x3927fd82 consume_markers + 34
5 ImageIO 0x3927fbd2 _cg_jpeg_consume_input + 66
6 ImageIO 0x3927fb62 _cg_jpeg_read_header + 38
7 ImageIO 0x39292782 copyImageBlockSetJPEG + 2346
8 ImageIO 0x3928953e ImageProviderCopyImageBlockSetCallback + 510
9 CoreGraphics 0x38e0b9d6 CGImageProviderCopyImageBlockSetWithOptions + 158
10 CoreGraphics 0x38e0b66a img_blocks_create + 370
11 CoreGraphics 0x38e07a98 img_data_lock + 1488
12 CoreGraphics 0x38e06d2a CGSImageDataLock + 126

最佳答案

从崩溃堆栈来看,您的图像本身似乎已在其他线程上释放,可能在您调用CGImageRetain()之前。 .事实上,您正在调用CGImageRetain()这里表明您期望如此。但如果是这样的话,保留是不够的,因为它会产生竞争条件。在您尝试保留图像之前,该图像可能已被破坏。所以要么CGImageRetain是不必要的或者是不够的。在任何情况下,它都不应该在这里(也不应该是它的平衡 CGImageRelease )。

这表明在其他线程上使用此图像非常危险,这要么表明您奇怪地调用了此方法,要么表明您让线程变得过于复杂。例如,如果您使用 NSThread直接,你可能让它变得太复杂了。

我会审核此图像上的其他保留和释放,并确保它们不会在调用此方法的过程中发生。我很确定这就是正在发生的事情。

旁注:你有一个多余的CGContextRetain/CGContextRelease那些是不需要的。当您调用CGBitmapContextCreate()时,其中包含保留(名称中包含“Create”)。也就是说,这只是一个小性能问题;你已经正确地平衡了它们。但它表明您其他地方的内存管理也可能很奇怪,因此您应该对其进行审核。

关于iphone - CGContextDrawImage 崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13767685/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com