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