Drehen Sie CMSampleBuffer/CVPixelBufferIOS

Programmierung für iOS
Guest
 Drehen Sie CMSampleBuffer/CVPixelBuffer

Post 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);
}

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post