• Open Menu Close Menu
  • Apple
  • Shopping Bag
  • Apple
  • Mac
  • iPad
  • iPhone
  • Watch
  • TV
  • Music
  • Support
  • Search apple.com
  • Shopping Bag

Lists

Open Menu Close Menu
  • Terms and Conditions
  • Lists hosted on this site
  • Email the Postmaster
  • Tips for posting to public mailing lists
Running out of memory when adding CGImageRef-to-NSImage frames to QTMovie in NSOperation subclass
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Running out of memory when adding CGImageRef-to-NSImage frames to QTMovie in NSOperation subclass


  • Subject: Running out of memory when adding CGImageRef-to-NSImage frames to QTMovie in NSOperation subclass
  • From: Michael Hanna <email@hidden>
  • Date: Sat, 7 Feb 2009 16:36:09 -0800

I have an NSOperation that opens a CGImageRef from a digital
camera(large file). It creates a full-size TIFFRepresentation in RAM,
then scales it down to a smaller CGContextRef. I create an NSImage out
of this CGContextRef. This same NSOperation then adds it to a QTMovie
with the -addImage:forDuration:withAttributes: method.

Once the image is added, I send off an NSNotification and the
thread/NSOperation dequeues(I'm assuming).

Once the frame-adding operation is complete, the movie (originally
created with a tempfile on the main thread) that is generated is
subsequently added to another NSOperationQueue which just writes it to
a file.

However, I find that I run out of RAM very quickly during the
image-creation phase. When analysing it in Instruments, objects don't
appear to be getting deallocated(not sure which objects). After about
120 images, my 4-gig macbook pro runs out RAM ... mmap error stating
that it couldn't allocate RAM.

I thought encapsulating the image-creation and movie-creation together
in a separate thread would guarantee me that once that operation got
dequeued at least the NSImage objects associated with that autorelease
pool would be sent a -release message and be freed.

It appears the NSImage is being properly disposed-of because when I try:

    NSLog(@"[anImage retainCount] %d", [anImage retainCount]);
    [self setImageAsMPEG4:anImage];
    NSLog(@"[anImage retainCount] %d", [anImage retainCount]);

the second call to [anImage retainCount] causes a crash:

objc[4573]: FREED(id): message retainCount sent to freed object=0x24114470

so the NSImage must be gone? Why does my RAM fill-up then? I keep the
full movie in memory because I need it to save to disk later, but it
shouldn't hog all the system resources after 120 1/2 second frames,
should it?

So here is the main() method to the NSOperation subclass that takes a
CGImageRef, converts it to an NSImage, the adds it as a frame to a
QTMovie:

-(void)main
{
	NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init];

    [QTMovie enterQTKitOnThreadDisablingThreadSafetyProtection];
    //[self.movieExport.movie attachToCurrentThread];

    NSAssert(m_fileURL != nil, @"file url is nil!");

    NSImage *anImage = nil;

	if (![self isCancelled])
	{

        CGImageRef scaledImage = [self scaledImageForURL:m_fileURL];

        NSBitmapImageRep *bitmapRep = [[[NSBitmapImageRep alloc]
initWithCGImage:scaledImage] autorelease];

        CFRelease(scaledImage);

        anImage = [[NSImage alloc] initWithData:[bitmapRep
TIFFRepresentation]];
	}

    NSLog(@"[anImage retainCount] %d", [anImage retainCount]);
    [self setImageAsMPEG4:anImage];
    //NSLog(@"[anImage retainCount] %d", [anImage retainCount]);

    //[self.movieExport.movie detachFromCurrentThread];
    [QTMovie exitQTKitOnThread];

	[pool release];
}

I don't think I have enough room in this email to include
-scaledImageForURL: nor -setImageAsMPEG4: but can supply it in a
subsequent posting.

Michael
_______________________________________________

Cocoa-dev mailing list (email@hidden)

Please do not post admin requests or moderator comments to the list.
Contact the moderators at cocoa-dev-admins(at)lists.apple.com

Help/Unsubscribe/Update your Subscription:

This email sent to email@hidden

  • Follow-Ups:
    • Re: Running out of memory when adding CGImageRef-to-NSImage frames to QTMovie in NSOperation subclass
      • From: Ken Ferry <email@hidden>
  • Prev by Date: Re: Syntax errors, undeclared variables
  • Next by Date: iphone and images issues
  • Previous by thread: SOAP Client - OpenSource - Call for supporting developpers
  • Next by thread: Re: Running out of memory when adding CGImageRef-to-NSImage frames to QTMovie in NSOperation subclass
  • Index(es):
    • Date
    • Thread