]> code.delx.au - transcoding/blobdiff - encode.py
Added --fixmux option that copies input streams to an AVI before transcoding
[transcoding] / encode.py
index c788bb632d8df67107b85633068dfe5d61a4289e..a15193074eac521d60dfd2aa847883daeb344c67 100755 (executable)
--- a/encode.py
+++ b/encode.py
@@ -1,5 +1,6 @@
 #!/usr/bin/env python
 
+from functools import partial
 import optparse
 import re
 import subprocess
@@ -43,6 +44,10 @@ def midentify(source, field):
                if key == field:
                        return value.strip()
 
+def append_cmd(cmd, opt, var):
+       if var is not None:
+               cmd.append(opt)
+               cmd.append(str(var))
 
 
 class Command(object):
@@ -57,9 +62,13 @@ class Command(object):
        def __init__(self, profile, opts):
                self.profile = profile
                self.opts = opts
+               self.init()
                self.audio_tmp = "audio." + self.codec2exts[profile.acodec]
                self.video_tmp = "video." + self.codec2exts[profile.vcodec]
-       
+
+       def init(self):
+               pass
+
        def print_install_message(self):
                print >>sys.stderr, "Problem with command: %s", self.name
                if self.package:
@@ -126,10 +135,39 @@ class MKVMerge(Command):
 
 
 
+class MencoderFixRemux(Command):
+       def init(self):
+               orig = self.opts
+               self.opts = optparse.Values(orig.__dict__)
+               orig.input = "remux.avi"
+               orig.dvd = orig.chapter = orig.startpos = orig.endpos = None
+
+       def check(self):
+               self.check_command("mencoder")
+               self.check_no_file("remux.avi")
+
+       def run(self):
+               o = self.opts
+               cmd = [
+                       "mencoder",
+                       "-o", "remux.avi",
+                       "-oac", "copy", "-ovc", "copy",
+                       "-mc", "0.1",
+                       o.input,
+               ]
+               do_opt = partial(append_cmd, cmd)
+               do_opt("-dvd-device", o.dvd)
+               do_opt("-chapter", o.chapter)
+               do_opt("-ss", o.startpos)
+               do_opt("-endpos", o.endpos)
+               self.do_exec(cmd)
+
+
+
 class MencoderMux(Command):
        def check(self):
                self.check_command("mencoder")
-               self.check_no_file(self.opts.output + ".avi")
+               self.check_no_file(self.opts.output + ".tmp.avi")
 
        def run(self):
                self.do_exec([
@@ -151,26 +189,44 @@ class Mencoder(Command):
                "mp3lame": "-lameopts",
        }
 
+       def init(self):
+               if self.opts.copyac3:
+                       self.profile.acodec = "copyac3"
+                       self.profile.aopts = None
+               self.check_options()
+
+       def check_options(self):
+               o = self.opts
+               if o.detelecine and o.ofps:
+                       raise FatalException("Cannot use --detelecine with --ofps")
+               if o.deinterlace and o.detelecine:
+                       raise FatalException("Cannot use --detelecine with --deinterlace")
+       
        def insert_options(self, cmd):
-               def try_opt(opt, var):
-                       if var is not None:
-                               cmd.append(opt)
-                               cmd.append(var)
-               if self.opts.deinterlace:
-                       cmd += ["-vf-add", "pp=lb"]
-               if self.opts.detelecine:
-                       self.opts.ofps = "24000/1001"
+               o = self.opts
+               do_opt = partial(append_cmd, cmd)
+
+               if o.deinterlace:
+                       cmd += ["-vf-add", "yadif"]
+               if o.detelecine:
+                       o.ofps = "24000/1001"
                        cmd += ["-vf-add", "pullup,softskip"]
-               try_opt("-fps", self.opts.ifps)
-               try_opt("-ofps", self.opts.ofps)
-               try_opt("-ss", self.opts.startpos)
-               try_opt("-endpos", self.opts.endpos)
-               try_opt("-dvd-device", self.opts.dvd)
-               try_opt("-chapter", self.opts.chapter)
-               try_opt("-aid", self.opts.audioid)
-               try_opt("-sid", self.opts.subtitleid)
-               try_opt("-vf-add", self.opts.vfilters)
-               try_opt("-af-add", self.opts.afilters)
+               if o.noskip:
+                       cmd += ["-noskip"]
+               if o.skipkb:
+                       cmd += ["-sb", str(o.skipkb * 1024)]
+
+               do_opt("-mc", o.mc)
+               do_opt("-fps", o.ifps)
+               do_opt("-ofps", o.ofps)
+               do_opt("-ss", o.startpos)
+               do_opt("-endpos", o.endpos)
+               do_opt("-dvd-device", o.dvd)
+               do_opt("-chapter", o.chapter)
+               do_opt("-aid", o.audioid)
+               do_opt("-sid", o.subtitleid)
+               do_opt("-vf-add", o.vfilters)
+               do_opt("-af-add", o.afilters)
                cmd += ["-vf-add", "harddup"]
 
        def subst_values(self, cmd, vpass):
@@ -186,10 +242,8 @@ class Mencoder(Command):
                p = self.profile
 
                acodec = p.acodec
-               if self.opts.copyac3:
+               if acodec == "copyac3":
                        acodec = "copy"
-                       p.acodec = "copyac3"
-                       p.aopts = None
 
                cmd = []
                cmd += ["mencoder", self.opts.input]
@@ -319,7 +373,10 @@ def parse_args():
        parser.add_option("--dvd", action="store", dest="dvd")
        parser.add_option("--deinterlace", action="store_true", dest="deinterlace")
        parser.add_option("--detelecine", action="store_true", dest="detelecine")
+       parser.add_option("--fixmux", action="store_true", dest="fixmux")
        parser.add_option("--copyac3", action="store_true", dest="copyac3")
+       parser.add_option("--mc", action="store", dest="mc", type="int")
+       parser.add_option("--noskip", action="store_true", dest="noskip")
        parser.add_option("--vfilters", action="store", dest="vfilters")
        parser.add_option("--afilters", action="store", dest="afilters")
        parser.add_option("--vbitrate", action="store", dest="vbitrate", type="int")
@@ -327,6 +384,7 @@ def parse_args():
        parser.add_option("--chapter", action="store", dest="chapter")
        parser.add_option("--ifps", action="store", dest="ifps")
        parser.add_option("--ofps", action="store", dest="ofps")
+       parser.add_option("--skipkb", action="store", dest="skipkb", type="int")
        parser.add_option("--startpos", action="store", dest="startpos")
        parser.add_option("--endpos", action="store", dest="endpos")
        parser.add_option("--audioid", action="store", dest="audioid")
@@ -381,6 +439,8 @@ def main():
 
                try:
                        commands = []
+                       if opts.fixmux:
+                               profile.commands.insert(0, MencoderFixRemux)
                        for CommandClass in profile.commands:
                                command = CommandClass(profile, opts)
                                commands.append(command)