from Carbon import Qt from Carbon import QuickTime import macfs from Carbon import Qd from Carbon.QuickDraw import srcCopy from ExtPixMapWrapper import ExtPixMapWrapper from Carbon.Qdoffs import * import ImageMac import W def GetFrames(m): frameCount=0 theTime=0 type=QuickTime.VideoMediaType #type='MPEG' flags=QuickTime.nextTimeMediaSample flags=flags+QuickTime.nextTimeEdgeOK while theTime>=0: (theTime,duration)=m.GetMovieNextInterestingTime(flags,1,type,theTime,0) #print "theTime ",theTime," duration ",duration frameCount=frameCount+1 flags = QuickTime.nextTimeMediaSample return frameCount-1 def GetMovieFromOpenFile(): fss, ok = macfs.StandardGetFile(QuickTime.MovieFileType) mov = None if ok: movieResRef = Qt.OpenMovieFile(fss, 1) mov, d1, d2 = Qt.NewMovieFromFile(movieResRef, 0, QuickTime.newMovieActive) return mov class ExtMovie: def __init__(self,mov): self.frames=0 self.frameArray=[] self.movie=mov self._countFrames() r=self.movie.GetMovieBox() self.myRect=(0,0,r[2]-r[0],r[3]-r[1]) self.movie.SetMovieBox(self.myRect) self.pm=ExtPixMapWrapper() self.pm.left=0 self.pm.top=0 self.pm.right=r[2]-r[0] self.pm.bottom=r[3]-r[1] self.gw=NewGWorld(32,self.myRect,None,None,0) self.movie.SetMovieGWorld(self.gw.as_GrafPtr(), self.gw.GetGWorldDevice()) self.GotoFrame(0) def _countFrames(self): #deve contare il numero di frame, creare un array con i tempi per ogni frame theTime=0 #type=QuickTime.VIDEO_TYPE type=QuickTime.VideoMediaType flags=QuickTime.nextTimeMediaSample+QuickTime.nextTimeEdgeOK while theTime>=0: (theTime,duration)=self.movie.GetMovieNextInterestingTime(flags,1,type,theTime,0) self.frameArray.append((theTime,duration)) flags = QuickTime.nextTimeMediaSample self.frames=self.frames+1 def GotoFrame(self,n): if n<=self.frames: self.curFrame=n (port,device)=GetGWorld() SetGWorld(self.gw.as_GrafPtr(),None) (self.now,self.duration)=self.frameArray[n] self.movie.SetMovieTimeValue(self.now) pixmap=self.gw.GetGWorldPixMap() if not LockPixels(pixmap): print "not locked" else: #Qd.EraseRect(self.myRect) #this draws the frame inside the current gworld self.movie.MoviesTask(0) #this puts it in the buffer pixmap self.pm.grab(0,0,self.myRect[2],self.myRect[3]) UnlockPixels(pixmap) #self.im=self.pm.toImage() SetGWorld(port,device) def NextFrame(self): self.curFrame=self.curFrame+1 if self.curFrame>self.frames: self.curFrame=0 self.GotoFrame(self.curFrame) def isLastFrame(): return self.curFrame==self.frames def GetImage(self): return self.pm.toImage() def GetImageN(self,n): self.GotoFrame(n) return self.pm.toImage() def GetNumeric(self): return self.pm.toNumeric() def GetNumericN(self,n): self.GotoFrame(n) return self.pm.toNumeric() def Blit(self,destRect): Qd.RGBForeColor( (0,0,0) ) Qd.RGBBackColor((65535, 65535, 65535)) #Qd.MoveTo(10,10) #Qd.LineTo(200,150) Qd.CopyBits(self.gw.portBits,Qd.GetPort().portBits,self.myRect,destRect,srcCopy,None) class MovieWin(W.Window): def __init__(self,eMovie,title="MovieWin"): self.ExtMovie=eMovie def test(): import ImageFilter from MLab import max from MLab import min from Numeric import * Qt.EnterMovies() m=GetMovieFromOpenFile() em=ExtMovie(m) print "Total frames:",em.frames," Current frame:",em.curFrame #ImageMac.showImage(em.GetImage(),"frame 0",1) #em.GotoFrame(500) #ImageMac.showImage(em.GetImage().filter(ImageFilter.SMOOTH),"frame 500",2) #ImageMac.showImage(em.GetImageN(1000),"frame 1000",2) #r=array(((1,0,0,0),(0,0,0,0),(0,0,0,0),(0,0,0,0))) #g=array(((0,0,0,0),(0,1,0,0),(0,0,0,0),(0,0,0,0))) #b=array(((0,0,0,0),(0,0,0,0),(0,0,1,0),(0,0,0,0))) #bw=array(((0.3086,0.6094,0.0820,0))) #r2=array(((1,0,0,0))) #ImageMac.showNumeric(em.GetNumericN(0),"frame 0",1) #print em.GetNumericN(500).shape #print "original (1,1)",em.GetNumericN(0)[100,100] #print "product shape ",innerproduct(em.GetNumericN(0),r).shape #print "product (1,1) ",innerproduct(em.GetNumericN(0),r)[100,100] #ImageMac.showNumeric(ImageMac.BWImage(em.GetNumericN(50))) #ImageMac.showNumeric(innerproduct(em.GetNumericN(500),r),"frame 500r",2) #ImageMac.showNumeric(innerproduct(em.GetNumericN(500),g),"frame 500g",2) #ImageMac.showNumeric(innerproduct(em.GetNumericN(500),b),"frame 500b",2) #ImageMac.showNumeric(innerproduct(em.GetNumericN(500),r2),"frame 500r2",2) #ImageMac.showNumeric(innerproduct(em.GetNumericN(10),bw),"frame 0bw",1) #ImageMac.showNumeric(innerproduct(em.GetNumericN(400),bw),"frame 10bw",1) #colordif=(em.GetNumericN(100)-em.GetNumericN(10))+(255,255,255,255) #colordif=colordif/2 #ImageMac.showNumeric(colordif,"colordif",1) #ImageMac.showNumeric(ImageMac.BWImage(colordif),"bwcolordif",1) ilut=arange(0,256) #ilut[118]=255 #ilut[119]=255 #ilut[120]=255 ilut[121]=255 ilut[122]=255 ilut[123]=255 ilut[124]=255 ilut[125]=255 ilut[126]=255 ilut[127]=255 ilut[128]=255 ilut[129]=255 #ilut[130]=255 #ilut[131]=255 #ilut[132]=255 mlut=ones(256) mlut[118]=0 mlut[119]=0 mlut[120]=0 mlut[121]=0 mlut[122]=0 mlut[123]=0 mlut[124]=0 mlut[125]=0 mlut[126]=0 mlut[127]=0 mlut[128]=0 mlut[129]=0 mlut[130]=0 mlut[131]=0 mlut[132]=0 ImageMac.showImage(em.GetImageN(100),"provaImg",2) ImageMac.showNumeric(em.GetNumericN(100),"provaNum",2) ImageMac.showImage(em.GetImageN(100).filter(ImageFilter.SMOOTH),"frame 500",2) #image=ImageMac.BWImage(em.GetNumericN(100)) #ImageMac.showNumeric(image) #difimage=abs(image-ImageMac.BWImage(em.GetNumericN(10))) #ImageMac.PlotHisto(difimage,32) #ImageMac.showNumeric(difimage) #difimage=127+(image-ImageMac.BWImage(em.GetNumericN(10)))/2 #ImageMac.PlotHisto(difimage,32) #ImageMac.showNumeric(difimage) #fimage=ImageMac.Filter3x3(16.0,(1,1,1,1,8,1,1,1,1),difimage) #ImageMac.showNumeric(fimage) #difimage2=choose(fimage.astype(UnsignedInt8),ilut) #ImageMac.showNumeric(difimage2) #(r,g,b,a)=ImageMac.SplitBands(em.GetNumericN(10)) #ImageMac.showNumeric(r,"r") #ImageMac.showNumeric(g,"g") #ImageMac.showNumeric(b,"b") #ImageMac.showNumeric(a,"a") #bwdif=abs(((innerproduct(em.GetNumericN(400),bw)-innerproduct(em.GetNumericN(10),bw))+255)/2) #ImageMac.showNumeric(bwdif,"frame diff/bw",1) #ImageMac.PlotHisto(bwdif) #ImageMac.showNumeric(choose(bwdif.astype(UnsignedInt8),ilut),"frame diff/bw",1) #ImageMac.PlotHisto(choose(bwdif.astype(UnsignedInt8),ilut)) #bwimage=ImageMac.BWImage(em.GetNumericN(100)) #ImageMac.showNumeric((ImageMac.BWImage(em.GetNumericN(90))+ImageMac.BWImage(em.GetNumericN(110))+ImageMac.BWImage(em.GetNumericN(130))+ImageMac.BWImage(em.GetNumericN(150))+ImageMac.BWImage(em.GetNumericN(170)))/5) #bwdif=abs(((bwimage-ImageMac.BWImage(em.GetNumericN(10)))+255)/2) #ImageMac.showNumeric(bwimage,"original frame",1) #ImageMac.showNumeric(bwdif,"frame diff/bw",1) #ImageMac.PlotHisto(bwdif) #ImageMac.showNumeric(choose(bwdif.astype(UnsignedInt8),ilut),"frame diff/bw",1) #mmask=choose(bwdif.astype(UnsignedInt8),mlut) #ImageMac.showNumeric(255-255*mmask,"frame diff/bw",1) #mmask.shape=bwimage.shape #ImageMac.showNumeric(mmask*bwimage,"frame diff/bw",1) #ImageMac.showNumeric((innerproduct(em.GetNumericN(300),bw)-innerproduct(em.GetNumericN(0),bw)),"frame diff/bw",1) #ImageMac.showNumeric((innerproduct(em.GetNumericN(400)-em.GetNumericN(10),bw)),"frame diff2/bw",1) #cdif=em.GetNumericN(400)-em.GetNumericN(10) #ImageMac.showNumeric(,"frame diff2/bw",1) #ImageMac.showNumeric(innerproduct(cdif,r),"frame 500r",1) #ImageMac.showNumeric(innerproduct(cdif,g),"frame 500g",1) #ImageMac.showNumeric(innerproduct(cdif,b),"frame 500b",1) def test2(): Qt.EnterMovies() m=GetMovieFromOpenFile() if m==None: print "no movie opened" else: em=ExtMovie(m) print "Total frames: ",em.frames," Current frame:",em.curFrame ImageMac.showImage(em.GetImage(),"frame 0",1) if __name__ == '__main__': test2()