iOS: cambia el tamaño automáticamente de CVPixelBufferRef

Estoy intentando recortar y escalar un CMSampleBufferRef basado en las inputs del usuario, en la ratio , el código siguiente toma un CMSampleBufferRef, lo convierte en un CVImageBufferRef y usa CVPixelBuffer para recortar la image interna en function de sus bytes. El objective de este process es tener un CVPixelBufferRef recortado y escalado para escribir en el video

 - (CVPixelBufferRef)modifyImage:(CMSampleBufferRef) sampleBuffer { @synchronized (self) { CVImageBufferRef imageBuffer = CMSampleBufferGetImageBuffer(sampleBuffer); // Lock the image buffer CVPixelBufferLockBaseAddress(imageBuffer,0); // Get information about the image uint8_t *baseAddress = (uint8_t *)CVPixelBufferGetBaseAddress(imageBuffer); size_t bytesPerRow = CVPixelBufferGetBytesPerRow(imageBuffer); size_t width = CVPixelBufferGetWidth(imageBuffer); size_t height = CVPixelBufferGetHeight(imageBuffer); CVPixelBufferRef pxbuffer; NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys: [NSNumber numberWithBool:YES], kCVPixelBufferCGImageCompatibilityKey, [NSNumber numberWithBool:YES], kCVPixelBufferCGBitmapContextCompatibilityKey, [NSNumber numberWithInt:720], kCVPixelBufferWidthKey, [NSNumber numberWithInt:1280], kCVPixelBufferHeightKey, nil]; NSInteger tempWidth = (NSInteger) (width / ratio); NSInteger tempHeight = (NSInteger) (height / ratio); NSInteger baseAddressStart = 100 + 100 * bytesPerRow; CVReturn status = CVPixelBufferCreateWithBytes(kCFAllocatorDefault, tempWidth, tempHeight, kCVPixelFormatType_32BGRA, &baseAddress[baseAddressStart], bytesPerRow, MyPixelBufferReleaseCallback, NULL, (CFDictionaryRef)options, &pxbuffer); if (status != 0) { CKLog(@"%d", status); return NULL; } CVPixelBufferUnlockBaseAddress(imageBuffer,0); return pxbuffer; } } 

Todo funciona bien, excepto que cuando bash escribirlo en el dispositivo de video usando este método, sigue recibiendo una advertencia de memory. Está bien si mantengo la misma proporción

 - (void)writeBufferFrame:(CMSampleBufferRef)sampleBuffer pixelBuffer:(CVPixelBufferRef)pixelBuffer { CMTime lastSampleTime = CMSampleBufferGetPresentationTimeStamp(sampleBuffer); if(self.videoWriter.status != AVAssetWriterStatusWriting) { CKLog(@"%d", self.videoWriter.status); [self.videoWriter startWriting]; [self.videoWriter startSessionAtSourceTime:lastSampleTime]; } CVPixelBufferRef pxbuffer = [self modifyImage:sampleBuffer]; BOOL success = [self.avAdaptor appendPixelBuffer:pxbuffer withPresentationTime:lastSampleTime]; if (!success) NSLog(@"Warning: Unable to write buffer to video"); } 

También probé con diferentes enfoques usando CMSampleBufferRef y CGContext . Si puede proporcionar una solución para cualquier enfoque aquí, puedo darle el puntaje completo

Intente utilizar el indicador kCVPixelBufferLock_ReadOnly en ambas llamadas a -CVPixelBufferLockBaseAddress y -CVPixelBufferUnlockBaseAddress. Y, a veces, este problema se puede resolver copyndo el búfer de píxeles. Realice la asignación una vez:

 unsigned char *data = (unsigned char*)malloc(ySize * sizeof(unsigned char)); 

Después de eso, copie los datos de pixelBuffer a los datos

size_t size = height * bytesPerRow;

memcpy (datos, baseAddress, tamaño);

Después de eso, usa datos. Espero que eso te ayude.