При попытке скопировать CVPixelBufferRef происходит сбой при получении видео с разрешением 1080p.(1920x1080) EXC_BAD_ACCESS (code = 1, address = 0x114af8000)
Код отлично работает при использовании видео 1280x720 и не вызывает сбоев.
Сбой на 2-й последней строке при выполнении memcpy.
* РЕДАКТИРОВАТЬ В соответствии с запросом размер данных исходного CVImageBufferRef (изображение) и нового (pixelBufferCopy)
Рабочее разрешение 720p: размер данных для image: 1388224 размер данных для pixelBufferCopy: 1385288
Разрешение при сбое 1080p: размер данных 'image': 3140704 размер данных 'pixelBufferCopy': 3114728
CVPixelBufferLockBaseAddress(image, 0);
int bufferWidth = (int)CVPixelBufferGetWidth(image);
int bufferHeight = (int)CVPixelBufferGetHeight(image);
size_t bytesPerRow = CVPixelBufferGetBytesPerRow(image);
uint8_t *baseAddress = CVPixelBufferGetBaseAddress(image);
OSType typ = CVPixelBufferGetPixelFormatType(image);
CVImageBufferRef pixelBufferCopy = NULL;
NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:
[NSNumber numberWithBool:YES], kCVPixelBufferCGImageCompatibilityKey,
[NSNumber numberWithBool:YES], kCVPixelBufferCGBitmapContextCompatibilityKey, nil];
double dataSize = CVPixelBufferGetDataSize(image);
CVReturn status = CVPixelBufferCreate(kCFAllocatorDefault, bufferWidth, bufferHeight, typ, (__bridge CFDictionaryRef) options, &pixelBufferCopy);
uint8_t *copyBaseAddress = CVPixelBufferGetBaseAddress(pixelBufferCopy);
memcpy(copyBaseAddress, baseAddress, dataSize);
CVPixelBufferUnlockBaseAddress(image, 0);
Вот данные из CVPixelBufferRef, которые вылетают.
<CVPixelBuffer 0x1c4327b20 width=1920 height=1080 pixelFormat=420v iosurface=0x1c420dd30 planes=2>
<Plane 0 width=1920 height=1080 bytesPerRow=1920>
<Plane 1 width=960 height=540 bytesPerRow=1920>
<attributes=<CFBasicHash 0x1c5679280 [0x1b4a43310]>{type = immutable dict, count = 5,
entries =>
0 : <CFString 0x1ad86d708 [0x1b4a43310]>{contents = "PixelFormatDescription"} = <CFBasicHash 0x1c5676600 [0x1b4a43310]>{type = immutable dict, count = 12,
entries =>
1 : <CFString 0x1ad86dd08 [0x1b4a43310]>{contents = "FillExtendedPixelsCallback"} = <CFData 0x1c44b66e0 [0x1b4a43310]>{length = 24, capacity = 24, bytes = 0x00000000000000004804e686010000000000000000000000}
5 : <CFString 0x1ad86d9c8 [0x1b4a43310]>{contents = "ContainsAlpha"} = <CFBoolean 0x1b4a43878 [0x1b4a43310]>{value = false}
6 : <CFString 0x1ad86dba8 [0x1b4a43310]>{contents = "ContainsYCbCr"} = <CFBoolean 0x1b4a43868 [0x1b4a43310]>{value = true}
7 : <CFString 0x1ad86d688 [0x1b4a43310]>{contents = "OpenGLESCompatibility"} = <CFBoolean 0x1b4a43868 [0x1b4a43310]>{value = true}
9 : <CFString 0x1ad86d648 [0x1b4a43310]>{contents = "IOSurfaceOpenGLESTextureCompatibility"} = <CFBoolean 0x1b4a43868 [0x1b4a43310]>{value = true}
10 : <CFString 0x1ad86dc08 [0x1b4a43310]>{contents = "ComponentRange"} = <CFString 0x1ad86dc28 [0x1b4a43310]>{contents = "VideoRange"}
12 : <CFString 0x1ad86d628 [0x1b4a43310]>{contents = "IOSurfaceCoreAnimationCompatibility"} = <CFBoolean 0x1b4a43868 [0x1b4a43310]>{value = true}
13 : <CFString 0x1ad86d668 [0x1b4a43310]>{contents = "IOSurfaceOpenGLESFBOCompatibility"} = <CFBoolean 0x1b4a43868 [0x1b4a43310]>{value = true}
15 : <CFString 0x1ad86d968 [0x1b4a43310]>{contents = "PixelFormat"} = <CFNumber 0xb000000343230762 [0x1b4a43310]>{value = +875704438, type = kCFNumberSInt32Type}
18 : <CFString 0x1ad86db88 [0x1b4a43310]>{contents = "BitsPerComponent"} = <CFNumber 0xb000000000000082 [0x1b4a43310]>{value = +8, type = kCFNumberSInt32Type}
21 : <CFString 0x1ad86dbc8 [0x1b4a43310]>{contents = "ContainsRGB"} = <CFBoolean 0x1b4a43878 [0x1b4a43310]>{value = false}
22 : <CFString 0x1ad86d9e8 [0x1b4a43310]>{contents = "Planes"} = (
{
BitsPerBlock = 8;
BlackBlock = <10>;
},
{
BitsPerBlock = 16;
BlackBlock = <8080>;
HorizontalSubsampling = 2;
VerticalSubsampling = 2;
}
)
}
2 : <CFString 0x1ad86d4e8 [0x1b4a43310]>{contents = "ExtendedPixelsRight"} = <CFNumber 0xb000000000000002 [0x1b4a43310]>{value = +0, type = kCFNumberSInt32Type}
3 : <CFString 0x1ad86d4c8 [0x1b4a43310]>{contents = "ExtendedPixelsTop"} = <CFNumber 0xb000000000000002 [0x1b4a43310]>{value = +0, type = kCFNumberSInt32Type}
4 : <CFString 0x1ad86d4a8 [0x1b4a43310]>{contents = "ExtendedPixelsLeft"} = <CFNumber 0xb000000000000002 [0x1b4a43310]>{value = +0, type = kCFNumberSInt32Type}
5 : <CFString 0x1ad86d508 [0x1b4a43310]>{contents = "ExtendedPixelsBottom"} = <CFNumber 0xb000000000000082 [0x1b4a43310]>{value = +8, type = kCFNumberSInt32Type}
}
propagatedAttachments=<CFBasicHash 0x1c5679540 [0x1b4a43310]>{type = mutable dict, count = 7,
entries =>
0 : <CFString 0x1ad86d268 [0x1b4a43310]>{contents = "CVImageBufferChromaLocationTopField"} = Left
1 : <CFString 0x1ad86cfa8 [0x1b4a43310]>{contents = "CVImageBufferYCbCrMatrix"} = <CFString 0x1c4622960 [0x1b4a43310]>{contents = "ITU_R_709_2"}
2 : <CFString 0x1c445d820 [0x1b4a43310]>{contents = "FrameMetadataDictionary"} = <CFBasicHash 0x1c5675700 [0x1b4a43310]>{type = mutable dict, count = 1,
entries =>
0 : <CFString 0x10f3d8540 [0x1b4a43310]>{contents = "FrameBitsPerPixel"} = <CFNumber 0x1c4622c20 [0x1b4a43310]>{value = +0.01191023284313725422, type = kCFNumberFloat64Type}
}
5 : <CFString 0x1ad86d088 [0x1b4a43310]>{contents = "CVImageBufferColorPrimaries"} = <CFString 0x1c4622cc0 [0x1b4a43310]>{contents = "ITU_R_709_2"}
8 : <CFString 0x1ad86d108 [0x1b4a43310]>{contents = "CVImageBufferTransferFunction"} = <CFString 0x1c4622e60 [0x1b4a43310]>{contents = "ITU_R_709_2"}
10 : <CFString 0x1ad86d288 [0x1b4a43310]>{contents = "CVImageBufferChromaLocationBottomField"} = Left
12 : <CFString 0x1ad86ce28 [0x1b4a43310]>{contents = "CVFieldCount"} = <CFNumber 0xb000000000000012 [0x1b4a43310]>{value = +1, type = kCFNumberSInt32Type}
}
nonPropagatedAttachments=<CFBasicHash 0x1c5679500 [0x1b4a43310]>{type = mutable dict, count = 0,
entries =>
}
>
Вот CVPixelBufferRef, который не будет аварийно завершать работу
<CVPixelBuffer 0x1c4135c20 width=1280 height=720 pixelFormat=420v iosurface=0x1c4412490 planes=2>
<Plane 0 width=1280 height=720 bytesPerRow=1280>
<Plane 1 width=640 height=360 bytesPerRow=1280>
<attributes=<CFBasicHash 0x1c5669600 [0x1b4a43310]>{type = immutable dict, count = 1,
entries =>
0 : <CFString 0x1ad86d708 [0x1b4a43310]>{contents = "PixelFormatDescription"} = <CFBasicHash 0x1c1c77a80 [0x1b4a43310]>{type = immutable dict, count = 12,
entries =>
1 : <CFString 0x1ad86dd08 [0x1b4a43310]>{contents = "FillExtendedPixelsCallback"} = <CFData 0x1c04a4aa0 [0x1b4a43310]>{length = 24, capacity = 24, bytes = 0x00000000000000004804e686010000000000000000000000}
5 : <CFString 0x1ad86d9c8 [0x1b4a43310]>{contents = "ContainsAlpha"} = <CFBoolean 0x1b4a43878 [0x1b4a43310]>{value = false}
6 : <CFString 0x1ad86dba8 [0x1b4a43310]>{contents = "ContainsYCbCr"} = <CFBoolean 0x1b4a43868 [0x1b4a43310]>{value = true}
7 : <CFString 0x1ad86d688 [0x1b4a43310]>{contents = "OpenGLESCompatibility"} = <CFBoolean 0x1b4a43868 [0x1b4a43310]>{value = true}
9 : <CFString 0x1ad86d648 [0x1b4a43310]>{contents = "IOSurfaceOpenGLESTextureCompatibility"} = <CFBoolean 0x1b4a43868 [0x1b4a43310]>{value = true}
10 : <CFString 0x1ad86dc08 [0x1b4a43310]>{contents = "ComponentRange"} = <CFString 0x1ad86dc28 [0x1b4a43310]>{contents = "VideoRange"}
12 : <CFString 0x1ad86d628 [0x1b4a43310]>{contents = "IOSurfaceCoreAnimationCompatibility"} = <CFBoolean 0x1b4a43868 [0x1b4a43310]>{value = true}
13 : <CFString 0x1ad86d668 [0x1b4a43310]>{contents = "IOSurfaceOpenGLESFBOCompatibility"} = <CFBoolean 0x1b4a43868 [0x1b4a43310]>{value = true}
15 : <CFString 0x1ad86d968 [0x1b4a43310]>{contents = "PixelFormat"} = <CFNumber 0xb000000343230762 [0x1b4a43310]>{value = +875704438, type = kCFNumberSInt32Type}
18 : <CFString 0x1ad86db88 [0x1b4a43310]>{contents = "BitsPerComponent"} = <CFNumber 0xb000000000000082 [0x1b4a43310]>{value = +8, type = kCFNumberSInt32Type}
21 : <CFString 0x1ad86dbc8 [0x1b4a43310]>{contents = "ContainsRGB"} = <CFBoolean 0x1b4a43878 [0x1b4a43310]>{value = false}
22 : <CFString 0x1ad86d9e8 [0x1b4a43310]>{contents = "Planes"} = (
{
BitsPerBlock = 8;
BlackBlock = <10>;
},
{
BitsPerBlock = 16;
BlackBlock = <8080>;
HorizontalSubsampling = 2;
VerticalSubsampling = 2;
}
)
}
}
propagatedAttachments=<CFBasicHash 0x1c5a6a440 [0x1b4a43310]>{type = mutable dict, count = 7,
entries =>
0 : <CFString 0x1ad86d268 [0x1b4a43310]>{contents = "CVImageBufferChromaLocationTopField"} = Left
1 : <CFString 0x1ad86cfa8 [0x1b4a43310]>{contents = "CVImageBufferYCbCrMatrix"} = <CFString 0x1c462c820 [0x1b4a43310]>{contents = "ITU_R_709_2"}
2 : <CFString 0x15de15900 [0x1b4a43310]>{contents = "FrameMetadataDictionary"} = <CFBasicHash 0x1c5c73dc0 [0x1b4a43310]>{type = mutable dict, count = 1,
entries =>
0 : <CFString 0x15de077a0 [0x1b4a43310]>{contents = "FrameBitsPerPixel"} = <CFNumber 0x1c462c9a0 [0x1b4a43310]>{value = +0.00331380208333333353, type = kCFNumberFloat64Type}
}
5 : <CFString 0x1ad86d088 [0x1b4a43310]>{contents = "CVImageBufferColorPrimaries"} = <CFString 0x1c462bb20 [0x1b4a43310]>{contents = "ITU_R_709_2"}
8 : <CFString 0x1ad86d108 [0x1b4a43310]>{contents = "CVImageBufferTransferFunction"} = <CFString 0x1c462b8e0 [0x1b4a43310]>{contents = "ITU_R_709_2"}
10 : <CFString 0x1ad86d288 [0x1b4a43310]>{contents = "CVImageBufferChromaLocationBottomField"} = Left
12 : <CFString 0x1ad86ce28 [0x1b4a43310]>{contents = "CVFieldCount"} = <CFNumber 0xb000000000000012 [0x1b4a43310]>{value = +1, type = kCFNumberSInt32Type}
}
nonPropagatedAttachments=<CFBasicHash 0x1c5673240 [0x1b4a43310]>{type = mutable dict, count = 0,
entries =>
}
>
Буду признателен за любые предложения относительно того, что может быть не так.
Спасибо, код