2011-04-01 3 views
4

Quelqu'un peut-il m'aider à tracer ces fuites de mémoire CoreVideo lors de l'exécution d'Instruments dans XCode? Fondamentalement, la fuite de mémoire se produit lorsque j'appuie sur le bouton "Enregistrer la vidéo" sur mon lecteur jpeg motion personnalisé. Je ne peux pas dire exactement quelle partie de mon code fuit car Leaks Instruments ne pointe sur aucun de mes appels. BTW, j'utilise l'appareil iPad pour tester les fuites.iOS fuites de mémoire CoreVideo

Heres les messages des Fuites Instruments:

  • Bibliothèque Responsable = CoreVideo
  • Responsable Cadre: CVPixelBufferBacking :: initWithPixelBufferDescription (..) CVObjectAlloc (...) CVBuffer :: init()

Voici mon code qui gère chaque image de mouvement jpeg s treamed par le serveur:

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

}

est ici la fonction 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; 

}

Aprpeciate toute aide! Merci

+0

Comment avez-vous vérifié la fuite? Via des instruments? Mon application se termine après l'utilisation de 400 Mo de mémoire et je vois cette raison dans le débogueur XCode: Terminé en raison de problème de mémoire – Nil

Répondre

2

J'ai refaçonné la méthode processFrame et je n'obtiens plus les fuites.

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

} 
0

Je ne vois rien de trop évident. J'ai remarqué que vous utilisez self.buffer et buffer ici. Si elle est conservée, vous pourriez fuir là. Si CVPixelBufferPoolCreatePixelBuffer si allouer de la mémoire dans la deuxième ligne après self.buffer conservé dans la première ligne, le premier pourrait être une fuite.

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

Espérons que ça aide.

+0

J'ai essayé de supprimer le "self" de self.buffer mais j'ai toujours des fuites de mémoire. Merci – German