+ Replica alla discussione
Mostra risultati 1 a 2 di 2

Discussione: obj-c corevideo/image

  1. #1
    Novizio
    Iscritto
    07-06
    Messaggi
    2

    obj-c corevideo/image

    Io ci provo, magari becco il guru che mi risolve il dilemma.

    Sto lavorando in objective-c con un pizzico di c liscio per un progetto di visione artificiale... Dettagli a parte, al momento ho un unico grosso problema. L'esempio di riferimento è il CIVideoDemoGL (http://developer.apple.com/samplecod...oGL/index.html) : unica NSOpenGLView, qualche pulsante, pochi fronzoli... Il metodo che ho modificato per integrare il pezzo di codice che ho sviluppato è il renderCurrentFrame che, di suo, crea una ciimage dal buffer di corevideo mediante convenience method, la lavora tramite un CGContext e da questo crea una ciimage in uscita (anch’essa tramite convenience method) da disegnare nel CIContext definito:

    Codice:
    - (void)renderCurrentFrame
    {
        // bla bla bla
            
        if(currentFrame)
        {
    		// bla bla bla
    
    		inputImage = [CIImage imageWithCVImageBuffer:currentFrame];
    		
                    // bla bla bla
    
    		// richiamo del metodo incriminato, di cui parlo fra un po'
    		
    		// creazione dell'outputImage: bla bla bla
    		
    		// visualizzazione dell'immagine: bla bla bla
    		 
        }
        QTVisualContextTask(qtVisualContext);
    	
    } 
    All’interno di questo metodo, come ho accennato sopra, richiamo un metodo di una classe mia che prende in ingresso la ciimage precedentemente menzionata e spara in output un vettore di NSRect:

    Codice:
    -(NSMutableArray*) foundFaces:(CIImage*)image
    {
    	[image retain];	 // il retainCount qui vale 2... 
    
    	// bla bla bla
    
    	VJIntegralImage *tempImage = [[VJIntegralImage alloc] init];
    	[tempImage doTheMagicWithImage:image];
    	[tempImage release];
    
    	// bla bla bla
    
    	[image release];	// e qui torna a valere 2
            return faces;
    } 
    Come si può vedere, all’interno richiamo infine un altro metodo di una classe mia, che prende in ingresso la solita ciimage e alla fin fine (anche se non si vede) spara fuori in output una matrice di float. Sta matrice viene prodotta lavorando in c sulla bitmap dell’immagine in ingresso. Il metodo relativo è il seguente:

    Codice:
    -(BOOL)doTheMagicWithImage:(CIImage*)image
    {
    	[image retain];  // retainCount == 3
    	// creo una NSImage a partire dalla ciimage, sfruttando l'NSCIImageRep ottenuta dalla CIImage
    	inputNSCIImageRep = [[NSCIImageRep alloc] initWithCIImage:localCIImage];	
    	localNSImage = [[NSImage alloc] initWithSize:NSMakeSize(w, h)];
    	[localNSImage addRepresentation:inputNSCIImageRep];	
            // estraggo l’NSBitmapImageRep dall’NSImage
    	inputImageRep = [[NSBitmapImageRep alloc] initWithData:[localNSImage TIFFRepresentation]];  
    	[image release];
    } 
    Nel dealloc infine ci sono i release dei vari oggetti intermedi, che riportano appunto il retainCount della ciimage a 2.

    Morale della favola. Utilizzando il MallocDebug, appare un memory leak sostanzioso in corrispondenza della chiamata di TIFFRepresentation... Il programma, infatti, ad ogni tick dell’activity monitor consuma qualcosa come 10-15mb così, in simpatia. Non ci sono altri leak importanti tranne questo: quelli che c’erano li ho già tolti con successo.
    Dalle mie analisi, risulta un problema sulla deallocazione della ciimage. Se infatti arrivo al pareggio dei retainCount, ossia se termino renderCurrentFrame con retainCount pari a 1, il programma crusha con un messaggio objc_msgSend (tipico appunto di quando non trova l’oggetto a cui mandare il messaggio... quale non si sa). Se evito di fare un release sulla ciimage (quindi facendola terminare con retainCount == 2) il programma non crusha ma consuma quei 15 mb esponenziali di memoria di cui parlavo. Infine lo stesso programma, senza la parte che ho aggiunto io, invece scorre liscio come l’olio senza memory leak, con la ciimage che arriva alla fine di renderCurrentFrame con retainCount = 1. Tramite tagli successivi di codice, sono perciò arrivato ad isolare il problema, appunto riguardante inputImageRep e la chiamata a TIFFRepresentation.

    Chiedo dunque se qualcuno mi sa spiegare questo comportamento. Ho cominciato da poco a programmare in obj-c, ma mi pare d'aver seguito alla lettera i consigli della nonna riguardanti la gestione della memoria. Non capisco insomma perchè l'accesso alla bitmaprep gli provochi questo squilibrio ormonale: in fondo è semplicemente un puntatore alla bitmapdata dell'immagine, e in quanto tale dovrebbe essere deallocata alla deallocazione dell'immagine... perchè non è così?

    PS: spero di essere stato sufficientemente chiaro, in caso contrario chiedetemi pure...

  2. #2
    Novizio
    Iscritto
    07-06
    Messaggi
    2
    Problema risolto... o per meglio dire aggirato.
    Ho ricavato l'NSBitmapRep dal CGContext usando:

    Codice:
    NSMutableData* imageData = [NSMutableData data];
    CGImageDestinationRef destCG = CGImageDestinationCreateWithData((CFMutableDataRef)imageData,kUTTypeTIFF,1,NULL);
    CGImageDestinationAddImage(destCG, currentCGImageRef, NULL);
    CGImageDestinationFinalize(destCG);
    NSBitmapImageRep *bitmap = [[NSBitmapImageRep alloc] initWithData:imageData];
    CFRelease(destCG);
    
    passando poi direttamente l'oggetto bitmap al resto del programma (evitando quindi di passare per CIImage e NSImage). Con retain/release adeguati, e rilasciando infine la bitmap al termine dell'elaborazione, il programma funziona correttamente e senza consumarmi un tir di memoria.

    Come ho specificato, il problema è stato aggirato, non risolto: a quanto pare, il rilascio delle risorse che avevo messo in atto (corretto da un punto di vista formale) portava però
    1) o ad un rilascio anticipato di qualcuna di esse (probabilmente la ciimage) rispetto al playback, con conseguente crash (a dimostrazione di questo problema di "tempistica", il fatto che eseguendo il programma passo passo con un breakpoint sulla rendering routine non si verifica alcun crash)
    2) o ad un rilascio non completo di qualcuna di esse
    Purtroppo non sono stato in grado di capire a fondo la ragione del problema, ma solo di porvi rimedio.

    PS: l'ambito generale del mio programma (almeno in riferimento a questo topic) è l'elaborazione puntuale (a livello di bitmap) sui pixel dei frame di un video... quindi se qualcuno si dovesse trovare a lavorare in un ambito simile, potrebbe incontrare il medesimo dilemma. Se qualcuno dovesse comunque trovare una soluzione più elegante della mia (e ci vorrebbe anche poco, a conoscer bene cocoa...), vi prego di comunicarmela!

    au revoir. ;-)

Discussioni simili

  1. salvare gif da image ready
    By solring in forum MAC PROFESSIONALE - MacProf - Software, Hardware e consigli
    Risposte: 4
    Ultimo messaggio: 12-06-06, 21:05
  2. Widget Google Image
    By paloma84 in forum Dashboard
    Risposte: 0
    Ultimo messaggio: 14-01-06, 16:15
  3. matlab + image acquisition
    By vittoriac3 in forum Programmazione
    Risposte: 1
    Ultimo messaggio: 30-11-05, 21:10
  4. Core Image
    By Mac OS Y in forum Utenti alle prime armi
    Risposte: 2
    Ultimo messaggio: 29-10-05, 08:53
  5. Tiger e Core Image
    By andhaka in forum Speciale Tiger - Mac OS X 10.4
    Risposte: 5
    Ultimo messaggio: 22-05-05, 18:18

Regole messaggi

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts