Page 1 of 1

Drehen Sie CMSampleBuffer/CVPixelBuffer

Posted: 09 Feb 2025, 08:39
by Guest
Ich versuche derzeit, die Ausrichtung eines CMSampleBuffer zu ändern, indem ich zuerst in einen cvpixelBuffer konvertiere und dann Vimagerotate90_Argb8888 verwendet wird, um den Puffer zu konvertieren. Das Problem mit meinem Code ist, dass Vimagerotate90_Argb8888 sofort abstürzt. Ich weiß, dass es Antworten gibt (wie dieses oder diesess), aber alle diese Lösungen funktionieren in meinem Fall nicht, und ich kann wirklich keine Irrtum finden oder an etwas nachdenken, das dieses Verhalten verursachen würde. Mein aktueller Code ist unten: < /p>

Code: Select all

- (CVPixelBufferRef)rotateBuffer:(CMSampleBufferRef)sampleBuffer {
CVPixelBufferRef pixelBuffer = CMSampleBufferGetImageBuffer(sampleBuffer);
CVPixelBufferLockBaseAddress(pixelBuffer, 0);

size_t bytesPerRow = CVPixelBufferGetBytesPerRow(pixelBuffer);
size_t width = CVPixelBufferGetWidth(pixelBuffer);
size_t height = CVPixelBufferGetHeight(pixelBuffer);
size_t currSize = bytesPerRow * height * sizeof(unsigned char);
size_t bytesPerRowOut = 4 * height * sizeof(unsigned char);

OSType pixelFormat = CVPixelBufferGetPixelFormatType(pixelBuffer);

void *baseAddress = CVPixelBufferGetBaseAddress(pixelBuffer);
unsigned char *outPixelData = (unsigned char *)malloc(currSize);

vImage_Buffer sourceBuffer = {baseAddress, height, width, bytesPerRow};
vImage_Buffer destinationBuffer = {outPixelData, width, height, bytesPerRowOut};

uint8_t rotation = kRotate90DegreesClockwise;

Pixel_8888 bgColor = {0, 0, 0, 0};
vImageRotate90_ARGB8888(&sourceBuffer, &destinationBuffer, rotation, bgColor, kvImageNoFlags); // Crash!

CVPixelBufferRef rotatedBuffer = NULL;
CVPixelBufferCreateWithBytes(kCFAllocatorDefault, destinationBuffer.width, destinationBuffer.height, pixelFormat, destinationBuffer.data, destinationBuffer.rowBytes, freePixelBufferData, NULL, NULL, &rotatedBuffer);

CVPixelBufferUnlockBaseAddress(pixelBuffer, 0);

return rotatedBuffer;
}

void freePixelBufferData(void *releaseRefCon, const void *baseAddress) {
free((void *)baseAddress);
}