iOS CoreVideo Memory Leaks

¿Alguien puede ayudarme a rastrear estas memory leaks de CoreVideo al ejecutar Instruments en XCode?

Básicamente, la pérdida de memory ocurre cuando presiono el button "Grabar video" en mi reproductor jpeg de movimiento personalizado. No puedo decir exactamente qué parte de mi código se está filtrando ya que Leaks Instruments no señala ninguna de mis llamadas. Por cierto, estoy usando el dispositivo iPad para probar las fugas.

Aquí están los posts de los Instrumentos de Fugas:

  • Biblioteca responsable = CoreVideo
  • Marco responsable: CVPixelBufferBacking :: initWithPixelBufferDescription (..) CVObjectAlloc (…) CVBuffer :: init ()

Aquí está mi código que maneja cada cuadro jpeg de movimiento transmitido por el server:

-(void)processServerData:(NSData *)data{ /* //render the video in the UIImage control */ UIImage *image =[UIImage imageWithData:data]; self.imageCtrl.image = image; /* //check if we are recording */ if (myRecorder.isRecording) { //create initial sample: todo:check if this is still needed if (counter==0) { self.buffer = [Recorder pixelBufferFromCGImage:image.CGImage size:myRecorder.imageSize]; CVPixelBufferPoolCreatePixelBuffer (NULL, myRecorder.adaptor.pixelBufferPool, &buffer); if(buffer) { CVBufferRelease(buffer); } } if (counter < myRecorder.maxFrames) { if([myRecorder.writerInput isReadyForMoreMediaData]) { CMTime frameTime = CMTimeMake(1, myRecorder.timeScale); CMTime lastTime=CMTimeMake(counter, myRecorder.timeScale); CMTime presentTime=CMTimeAdd(lastTime, frameTime); self.buffer = [Recorder pixelBufferFromCGImage:image.CGImage size:myRecorder.imageSize]; [myRecorder.adaptor appendPixelBuffer:buffer withPresentationTime:presentTime]; if(buffer) { CVBufferRelease(buffer); } counter++; if (counter==myRecorder.maxFrames) { [myRecorder finishSession]; counter=0; myRecorder.isRecording = NO; } } else { NSLog(@"adaptor not ready counter=%d ",counter ); } } } 

}

Aquí está la function pixelBufferFromCGImage:

 + (CVPixelBufferRef) pixelBufferFromCGImage: (CGImageRef) image size:(CGSize) size{ NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys: [NSNumber numberWithBool:YES], kCVPixelBufferCGImageCompatibilityKey, [NSNumber numberWithBool:YES], kCVPixelBufferCGBitmapContextCompatibilityKey, nil]; CVPixelBufferRef pxbuffer = NULL; CVReturn status = CVPixelBufferCreate(kCFAllocatorDefault, size.width, size.height, kCVPixelFormatType_32ARGB, (CFDictionaryRef) options, &pxbuffer); NSParameterAssert(status == kCVReturnSuccess && pxbuffer != NULL); CVPixelBufferLockBaseAddress(pxbuffer, 0); void *pxdata = CVPixelBufferGetBaseAddress(pxbuffer); NSParameterAssert(pxdata != NULL); CGColorSpaceRef rgbColorSpace = CGColorSpaceCreateDeviceRGB(); CGContextRef context = CGBitmapContextCreate(pxdata, size.width, size.height, 8, 4*size.width, rgbColorSpace, kCGImageAlphaNoneSkipFirst); NSParameterAssert(context); CGContextConcatCTM(context, CGAffineTransformMakeRotation(0)); CGContextDrawImage(context, CGRectMake(0, 0, CGImageGetWidth(image), CGImageGetHeight(image)), image); CGColorSpaceRelease(rgbColorSpace); CGContextRelease(context); CVPixelBufferUnlockBaseAddress(pxbuffer, 0); return pxbuffer; 

}

¡Aprecia cualquier ayuda! Gracias

Reorderé el método processFrame y ya no recibo las filtraciones.

 -(void) processFrame:(UIImage *) image { if (myRecorder.frameCounter < myRecorder.maxFrames) { if([myRecorder.writerInput isReadyForMoreMediaData]) { CMTime frameTime = CMTimeMake(1, myRecorder.timeScale); CMTime lastTime=CMTimeMake(myRecorder.frameCounter, myRecorder.timeScale); CMTime presentTime=CMTimeAdd(lastTime, frameTime); buffer = [Recorder pixelBufferFromCGImage:image.CGImage size:myRecorder.imageSize]; if(buffer) { [myRecorder.adaptor appendPixelBuffer:buffer withPresentationTime:presentTime]; myRecorder.frameCounter++; CVBufferRelease(buffer); if (myRecorder.frameCounter==myRecorder.maxFrames) { [myRecorder finishSession]; myRecorder.frameCounter=0; myRecorder.isRecording = NO; } } else { NSLog(@"Buffer is empty"); } } else { NSLog(@"adaptor not ready frameCounter=%d ",myRecorder.frameCounter ); } } } 

No veo nada demasiado obvio. Me di count de que usas self.buffer y buffer aquí. Si se retiene, es posible que se filtre allí. Si CVPixelBufferPoolCreatePixelBuffer si asigna memory en la segunda línea después de self.buffer retenido en la primera línea, el primero podría estar goteando.

  self.buffer = [Recorder pixelBufferFromCGImage:image.CGImage size:myRecorder.imageSize]; CVPixelBufferPoolCreatePixelBuffer (NULL, myRecorder.adaptor.pixelBufferPool, &buffer); 

Espero que ayude.