Author: duncan
Date: Sat Jan  6 11:58:31 2007
New Revision: 8940

Modified:
   branches/rel-1/freevo/src/encodingcore.py
   branches/rel-1/freevo/src/video/plugins/reencode.py

Log:
[ 1629198 ] Freevo 1.7 iPod Video Encoding
Patch from Justin Wetherell applied


Modified: branches/rel-1/freevo/src/encodingcore.py
==============================================================================
--- branches/rel-1/freevo/src/encodingcore.py   (original)
+++ branches/rel-1/freevo/src/encodingcore.py   Sat Jan  6 11:58:31 2007
@@ -58,14 +58,15 @@
 #"hardcoded capabilities" .. these might change or become dynamic in the 
future, when more capabilities are supported
 #the "container format" will remain hardcoded
 
-ContainerCapList = [ 'Avi', 'Mkv' ]
-VideoCodecList = [ 'MPEG 4 (lavc)', 'XViD']
-AudioCodecList = [ 'MPEG 1 Layer 3 (mp3)', 'Ogg' ]
+ContainerCapList = [ 'Avi', 'Mkv', 'mp4' ]
+VideoCodecList = [ 'MPEG 4 (lavc)', 'XViD', 'iPodv' ]
+AudioCodecList = [ 'MPEG 1 Layer 3 (mp3)', 'Ogg', 'iPoda' ]
 
 VFDict = {
     'Deinterlacing' : ['None','Linear blend','Lavc deinterlacer'],
     'Inverse Telecine' : ['None','On (stateless filter)'],
-    'Denoise' : ['None','Normal denoise','HQ denoise']
+    'Denoise' : ['None','Normal denoise','HQ denoise'],
+    'iPod' : ['iPod']
     }
 
 MencoderFilters = {
@@ -73,15 +74,16 @@
     'Lavc deinterlacer' : "lavcdeint",
     'On (stateless filter)' : "ivtc=1",
     'Normal denoise' : "denoise3d",
-    'HQ denoise' : "hqdn3d"
+    'HQ denoise' : "hqdn3d",
+    'iPod' : "scale=320:240"
     }
 
 MencoderMapping = {
-    'MPEG 4 (lavc)' : 
["lavc",["-lavcopts","vcodec=mpeg4:vhq:vqmin=2:v4mv:trell:autoaspect:vbitrate=%s%s"]],
-#to hard    'MPEG 4 (lavc)' : 
["lavc",["-lavcopts","vcodec=mpeg4:vhq:vqmin=2:v4mv:vlelim=-4:vcelim=9:lumi_mask=0.05:dark_mask=0.01:autoaspect:vbitrate=%s%s"]],
-#old one    'MPEG 4 (lavc)' : 
["lavc",["-lavcopts","vcodec=mpeg4:vhq:autoaspect:vbitrate=%s%s"]],
-    'XViD' : ["xvid",["-xvidencopts","bitrate=%s%s"]],
-    'MPEG 1 Layer 3 (mp3)' : ["mp3lame",["-lameopts", "cbr:br=%s"]]
+    'MPEG 4 (lavc)' : 
["copy","lavc",["-lavcopts","vcodec=mpeg4:vhq:vqmin=2:v4mv:trell:autoaspect:vbitrate=%s%s"]],
+    'XViD' : ["copy","xvid",["-xvidencopts","bitrate=%s%s"]],
+    'MPEG 1 Layer 3 (mp3)' : ["frameno","mp3lame",["-lameopts", "cbr:br=%s"]],
+    'iPodv' : 
["lavc","lavc",["-lavcopts","vcodec=mpeg4:vbitrate=%s%s:mbd=2:cmp=2:subcmp=2:trell=yes:v4mv=yes:vglobal=1:acodec=aac:abitrate=128:aic=2:aglobal=1"],["-of","lavf"],["-ffourcc","mp4v"],["-lavfopts","format=mp4:i_certify_that_my_video_stream_does_not_use_b_frames"]],
+    'iPoda' : 
["lavc","lavc",["-lavcopts","acodec=aac:abitrate=%s:aic=2:aglobal=1"],["-lavfopts","format=mp4:i_certify_that_my_video_stream_does_not_use_b_frames"]]
     }
 
 
@@ -158,6 +160,7 @@
             return "Unknown container format"
 
         self.container = container
+        self.output = ('%s.%s' % (self.output,self.container))
 
     def getContainerList(self):
         return ContainerCapList
@@ -207,7 +210,7 @@
 
     def setVideoFilters(self, videofilters):
         """Set video filters"""
-        for vfilter, option in videofilters.items():
+        for vfilter, option in videofilters:
             if MencoderFilters.has_key(option):
                 self.vfilters += [ MencoderFilters[option] ]
 
@@ -322,9 +325,10 @@
 
     def _GCLMAudiopass(self):
         """Returns audio pass specefic part of mencoder cl"""
-        return ["-ovc", "frameno", "-oac", MencoderMapping[self.acodec][0], 
MencoderMapping[self.acodec][1][0],
-                MencoderMapping[self.acodec][1][1] % self.abrate,
-                "-o", "frameno.avi"]
+        if self.acodec=='iPoda':
+                  return ["-ovc", MencoderMapping[self.acodec][0], "-oac", 
MencoderMapping[self.acodec][1], MencoderMapping[self.acodec][2][0], 
MencoderMapping[self.acodec][2][1] % self.abrate, 
MencoderMapping[self.acodec][3][0], MencoderMapping[self.acodec][3][1], "-o", 
"frameno.avi"]
+        else:
+                  return ["-ovc", MencoderMapping[self.acodec][0], "-oac", 
MencoderMapping[self.acodec][1], MencoderMapping[self.acodec][2][0], 
MencoderMapping[self.acodec][2][1] % self.abrate, "-o", "frameno.avi"]
 
     def _GCLMVideopass(self, passnr):
         """Returns video pass specefic part of mencoder cl"""
@@ -346,7 +350,7 @@
         if self.crop != None:
             vf += [ "crop=%s" % self.crop ]
 
-        #in case of xvid and anamorphic dvd, add scaling to compensate AR.. 
+        #in case of xvid and anamorphic dvd, add scaling to compensate AR..
         #if we didn't find cropping we have no res, so no tricks
         if self.vcodec == "XViD" and (self.crop != None):
             if self.ana:
@@ -363,6 +367,8 @@
             idealres = self._OptimalRes(self.cropres[0], int(yscaled))
             _debug_("Rescaled, rounded yres is %sx%s" % (idealres[0], 
idealres[1]))
             vf += [ "scale=%s:%s" % (idealres[0], idealres[1])]
+        elif self.vcodec == "iPodv":
+            vf += [ "scale=320:240" ]
 
         _debug_("Video filters: %s" % vf)
 
@@ -379,9 +385,10 @@
         else:
             output=self.output
 
-        args = ["-oac", "copy", "-ovc",MencoderMapping[self.vcodec][0], 
MencoderMapping[self.vcodec][1][0],
-                MencoderMapping[self.vcodec][1][1] % (self.vbrate, vpass),
-                "-vf", vfilter, "-o", output]
+        if (self.vcodec=='iPodv'):
+               args = ["-oac", MencoderMapping[self.vcodec][0], "-ovc", 
MencoderMapping[self.vcodec][1], MencoderMapping[self.vcodec][2][0], 
MencoderMapping[self.vcodec][2][1] % (self.vbrate, vpass), "-vf", vfilter, 
MencoderMapping[self.vcodec][3][0], MencoderMapping[self.vcodec][3][1], 
MencoderMapping[self.vcodec][4][0], MencoderMapping[self.vcodec][4][1], 
MencoderMapping[self.vcodec][5][0], MencoderMapping[self.vcodec][5][1], "-o", 
output]
+        else:
+               args = ["-oac", MencoderMapping[self.vcodec][0], "-ovc", 
MencoderMapping[self.vcodec][1], MencoderMapping[self.vcodec][2][0], 
MencoderMapping[self.vcodec][2][1] % (self.vbrate, vpass), "-vf", vfilter, 
"-o", output]
 
         #if we have a progressive ntsc file, lock the output fps (do this with 
ivtc too)
         if ("ivtc=1" in vf) or self.ntscprog:

Modified: branches/rel-1/freevo/src/video/plugins/reencode.py
==============================================================================
--- branches/rel-1/freevo/src/video/plugins/reencode.py (original)
+++ branches/rel-1/freevo/src/video/plugins/reencode.py Sat Jan  6 11:58:31 2007
@@ -7,11 +7,11 @@
 # Notes:
 #    To activate, put the following line in local_conf.py:
 #       plugin.activate('video.reencode')
-# ToDo:        
+# ToDo:
 #
 # -----------------------------------------------------------------------
 # Freevo - A Home Theater PC framework
-# Copyright (C) 2002 Krister Lagerstrom, et al. 
+# Copyright (C) 2002 Krister Lagerstrom, et al.
 # Please see the file freevo/Docs/CREDITS for a complete list of authors.
 #
 # This program is free software; you can redistribute it and/or modify
@@ -45,7 +45,7 @@
 class PluginInterface(plugin.ItemPlugin):
     """
     Plug-in to archive recorded TV programmes using EncodingServer
-    
+
     This plugin NEEDS a running encodingserver to work properly.
     You can start an encodingserver with "freevo encodingserver start".
     """
@@ -73,14 +73,14 @@
                 print 'media:', item.media
                 if hasattr(item.media, 'devicename'):
                     print item.media.devicename
-            
+
         if item.type == 'video' and item.mode == 'file':
             # TODO: use a config variable
             (filename, extn) = os.path.splitext(item.filename)
             if extn in ['.mpeg','.mpg']:
                 #for dvd on disc
                 self.dvdsource = item.filename
-                
+
                 self.title = item.name
                 self.source = item.filename
                 self.filename = filename+'.avi'
@@ -88,117 +88,129 @@
                 self.item = item
                 return [ (self.encoding_profile_menu, _('Re-encode this 
program...')) ]
         return []
-        
+
     def encoding_profile_menu(self, menuw=None, arg=None):
         #create a menu with a few encoding options (1cd, 2cd, xvid, mpeg4)
         #args : tuple, (videocodec, size, multipass
-        menu_items = [ menu.MenuItem("XViD, 800bps", self.create_job, 
(1,700,False,800)) ]
-        menu_items.append( menu.MenuItem("XViD, 800bps, High Quality", 
self.create_job, (1,700,True,800)) )
-        menu_items.append( menu.MenuItem("XViD, 1200bps", self.create_job, 
(1,1400,False,1200)) )
-        menu_items.append( menu.MenuItem("XViD, 1200bps, High Quality", 
self.create_job, (1,1400,True,1200)) )
-        menu_items.append( menu.MenuItem("DivX, 800bps", self.create_job, 
(0,700,False,800)) )
-        menu_items.append( menu.MenuItem("DivX, 800bps, High Quality", 
self.create_job, (0,700,True,800)) )
-        menu_items.append( menu.MenuItem("DivX, 1200bps", self.create_job, 
(0,1400,False,1200)) )
-        menu_items.append( menu.MenuItem("DivX, 1200bps, High Quality", 
self.create_job, (0,1400,True,1200)) )
-        
+        menu_items = [ menu.MenuItem("XViD, 800bps", self.create_job, 
(0,0,1,None,700,False,800)) ]
+        menu_items.append( menu.MenuItem("XViD, 800bps, High Quality", 
self.create_job, (0,0,1,None,700,True,800)) )
+        menu_items.append( menu.MenuItem("XViD, 1200bps", self.create_job, 
(0,0,1,None,1400,False,1200)) )
+        menu_items.append( menu.MenuItem("XViD, 1200bps, High Quality", 
self.create_job, (0,0,1,None,1400,True,1200)) )
+        menu_items.append( menu.MenuItem("DivX, 800bps", self.create_job, 
(0,0,0,None,700,False,800)) )
+        menu_items.append( menu.MenuItem("DivX, 800bps, High Quality", 
self.create_job, (0,0,0,None,700,True,800)) )
+        menu_items.append( menu.MenuItem("DivX, 1200bps", self.create_job, 
(0,0,0,None,1400,False,1200)) )
+        menu_items.append( menu.MenuItem("DivX, 1200bps, High Quality", 
self.create_job, (0,0,0,None,1400,True,1200)) )
+
+        menu_items.append( menu.MenuItem("iPod", 
self.create_job,(2,2,2,None,None,False,1200)) )
+
         encoding_menu = menu.Menu(_('Choose your encoding profile'), 
menu_items)
         menuw.pushmenu(encoding_menu)
-        
+
     def create_job(self, menuw=None, arg=None):
         print 'arg:', arg
         #unwrap settings tupple
-        (vcodecnr, tgtsize, mpass, vbitrate) = arg
+        (contnr, audionr, vcodecnr, vfilter, tgtsize, mpass, vbitrate) = arg
 
         #we are going to create a job and send it to the encoding server, this 
can take some time while analyzing
-        
+
         box = PopupBox(text=_('Please wait, analyzing video...'))
         box.show()
 
         (status, resp) = initEncodeJob(self.source, self.filename, self.title)
         print 'initEncodeJob:status:', status, ' resp:', resp
-                
+
         box.destroy()
-        
+
         if not status:
             self.error(resp)
             return
-            
+
         idnr = resp
-        
+
         #ask for possible containers and set the first one (should be avi), we 
will get a list
         (status, resp) = getContainerCAP(idnr)
         print 'getContainerCAP:status:', status, ' resp:', resp
-            
+
         if not status:
             self.error(resp)
             return
-        
-        container = resp[0]
-        
+
+        container = resp[contnr]
+
         (status, resp) = setContainer(idnr, container)
         print 'setContainer:status:', status, ' resp:', resp
-        
+
         if not status:
             self.error(resp)
             return
-            
+
         #ask for possible videocodec and set the first one (should be mpeg4), 
we will get a list
         (status, resp) = getVideoCodecCAP(idnr)
         print 'getVideoCodecCAP:status:', status, ' resp:', resp
-            
+
         if not status:
             self.error(resp)
             return
-        
+
         vcodec = resp[vcodecnr]
-        
+
         (status, resp) = setVideoCodec(idnr, vcodec, tgtsize, mpass, vbitrate)
         print 'setVideoCodec:status:', status, ' resp:', resp
-        
+
         if not status:
             self.error(resp)
             return
-            
+
         #ask for possible audiocodec and set the first one (should be mp3), we 
will get a list
         #Audiocodec call isn't necessary atm, it defaults to 128 kbit mp3, but 
this might change in the future
         #so we play safe
         (status, resp) = getAudioCodecCAP(idnr)
         print 'getAudioCodecCAP:status:', status, ' resp:', resp
-            
+
         if not status:
             self.error(resp)
             return
-        
-        acodec = resp[0]
-        
+
+        acodec = resp[audionr]
+
         (status, resp) = setAudioCodec(idnr, acodec, 128)
         print 'setAudioCodec:status:', status, ' resp:', resp
-        
+
+        if not status:
+            self.error(resp)
+            return
+
+        (status, resp) = getVideoFiltersCAP(idnr)
+        print 'getVideoFiltersCAP:status:', status, ' resp:', resp
+
         if not status:
             self.error(resp)
             return
-        
+
+        #vfilters=resp[vfilter]
+        #(status, resp) = setVideoFilters(idnr, vfilters)
+        #print 'setVideoFilter:status:', status, ' resp:', resp
+
         #And finally, qeue and start the job
         (status, resp) = queueIt(idnr, True)
         print 'queueIt:status:', status, ' resp:', resp
-            
+
         if not status:
             self.error(resp)
             return
-        
+
         self.menuw = menuw
         AlertBox(width=400, height=200, text=_("Encoding started"), 
handler=self.mopup).show()
-        
+
         print "boe"
         #menuw.delete_menu()
-        #menuw.delete_menu()       
-        
-        
-        
+        #menuw.delete_menu()
+
+
     def error(self, text=""):
         AlertBox(width=400, height=200, text="ERROR: %s" % text).show()
-        
-    
+
+
     def mopup(self):
         self.menuw.delete_menu()
         self.menuw.back_one_menu()

-------------------------------------------------------------------------
Take Surveys. Earn Cash. Influence the Future of IT
Join SourceForge.net's Techsay panel and you'll get the chance to share your
opinions on IT & business topics through brief surveys - and earn cash
http://www.techsay.com/default.php?page=join.php&p=sourceforge&CID=DEVDEV
_______________________________________________
Freevo-cvslog mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/freevo-cvslog

Reply via email to