]> code.delx.au - transcoding/blobdiff - encode.py
Readded better fixmux option
[transcoding] / encode.py
index 708cf6edc2adc14ca6276a6125f288cc5a575f08..d265dc50ac9c206fecbe9cfdf23f21ecc41f7e24 100755 (executable)
--- a/encode.py
+++ b/encode.py
@@ -53,25 +53,28 @@ def duplicate_opts(opts):
        return optparse.Values(opts.__dict__)
 
 def insert_mplayer_options(cmd, o):
-       do_opt = partial(append_cmd, cmd)
-
-       if o.deinterlace:
-               cmd += ["-vf-add", "yadif"]
-       if o.noskip:
-               cmd += ["-noskip"]
-       if o.skipkb:
-               cmd += ["-sb", str(o.skipkb * 1024)]
+       if o.mplayer_done:
+               return
 
+       do_opt = partial(append_cmd, cmd)
        do_opt("-mc", o.mc)
-       do_opt("-fps", o.ifps)
        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)
+       do_opt("-vf", o.vfilters)
+       do_opt("-af", o.afilters)
+
+       if o.deinterlace:
+               cmd += ["-vf-pre", "yadif"]
+       if o.detelecine:
+               cmd += ["-vf-pre", "pullup,softskip", "-ofps", "24000/1001"]
+       if o.noskip:
+               cmd += ["-noskip"]
+       if o.skipkb:
+               cmd += ["-sb", str(o.skipkb * 1024)]
 
 
 class Command(object):
@@ -159,33 +162,28 @@ class MKVMerge(Command):
 
 
 
-class MencoderFixRemux(Command):
+class MencoderLossless(Command):
        def init(self):
                self.check_command("mencoder")
-               self.check_no_file("remux.avi")
+               self.check_no_file("lossless.avi")
 
-               orig = self.opts
-               self.opts = duplicate_opts(orig)
-               orig.input = "remux.avi"
-               orig.dvd = orig.chapter = orig.startpos = orig.endpos = None
+               ofut = self.opts
+               self.opts = duplicate_opts(ofut)
+               ofut.input = "lossless.avi"
+               ofut.mplayer_done = True
 
        def run(self):
+               fifo = False
+               if fifo:
+                       os.mkfifo("lossless.avi")
                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)
-
-
+               cmd = []
+               cmd += ["mencoder", self.opts.input, "-o", "lossless.avi"]
+               cmd += ["-noconfig", "all"]
+               cmd += ["-oac", "copy", "-ovc", "lavc", "-lavcopts", "vcodec=ffv1:autoaspect"]
+               insert_mplayer_options(cmd, self.opts)
+               cmd += ["-vf-add", "harddup"]
+               self.do_exec(cmd, wait=not fifo)
 
 
 
@@ -204,7 +202,7 @@ class MPlayer(Command):
                cmd += ["-vo", "yuv4mpeg:file=video.y4m"]
                cmd += ["-ao", "pcm:waveheader:file=audio.wav"]
                insert_mplayer_options(cmd, self.opts)
-               cmd += self.profile.extra
+               cmd += self.profile.mplayeropts
                self.do_exec(cmd, wait=False)
 
 
@@ -221,8 +219,7 @@ class MencoderCopyAC3(Command):
                cmd += ["-ovc", "copy", "-oac", "copy"]
                cmd += ["-of", "rawaudio", "-o", "audio.ac3"]
                insert_mplayer_options(cmd, self.opts)
-               cmd += self.profile.extra
-               self.do_exec(cmd, wait=False)
+               self.do_exec(cmd)
 
 
 class X264(Command):
@@ -270,11 +267,6 @@ class Faac(Command):
                self.do_exec(cmd, wait=False)
 
 
-class SwallowAudio(Command):
-       def run(self):
-               self.do_exec(["dd", "if=audio.wav", "of=/dev/null"], wait=False)
-
-
 class Mencoder(Command):
        codec2opts = {
                "xvid": "-xvidencopts",
@@ -306,7 +298,7 @@ class Mencoder(Command):
                cmd += ["-oac", p.acodec]
                if p.aopts:
                        cmd += [self.codec2opts[p.acodec], p.aopts]
-               cmd += self.profile.extra
+               cmd += self.profile.mplayeropts
                cmd += ["-o", self.opts.output + ".avi"]
 
                self.do_exec(cmd)
@@ -336,7 +328,7 @@ class MencoderDemux(Command):
                p = self.profile
 
                cmd = ["mencoder", "-ovc", "copy", "-oac", "copy", o.output + ".avi"]
-               cmd += ["-noconfig", "all"]
+               cmd += ["-noconfig", "all", "-noskip", "-mc", "0"]
                self.do_exec(cmd + ["-of", "rawaudio", "-o", p.audio_tmp])
                self.do_exec(cmd + ["-of", "rawvideo", "-o", p.video_tmp])
                self.do_exec(["rm", "-f", o.output + ".avi"])
@@ -345,7 +337,6 @@ class MencoderDemux(Command):
 
 class Profile(object):
        def __init__(self, commands, **kwargs):
-               self.extra = []
                self.commands = commands
                self.__dict__.update(kwargs)
 
@@ -366,20 +357,22 @@ profiles = {
        "x264/lame" :
        Profile(
                commands=[MPlayer, X264, Lame, Wait, MKVMerge],
-               x264opts=["--preset", "veryslow", "--crf", "19"],
-               lameopts=["--preset", "extreme"],
+               mplayeropts=[],
+               x264opts=["--preset", "veryslow", "--crf", "20"],
+               lameopts=["--preset", "medium"],
        ),
 
        "x264/copyac3" :
        Profile(
-               commands=[MPlayer, X264, SwallowAudio, Wait, MencoderCopyAC3, MKVMerge],
-               x264opts=["--preset", "veryslow", "--crf", "19"],
-               lameopts=["--preset", "extreme"],
+               commands=[MPlayer, X264, Wait, MencoderCopyAC3, MKVMerge],
+               mplayeropts=["-nosound"],
+               x264opts=["--preset", "veryslow", "--crf", "20"],
        ),
 
        "xvid/lame" :
        Profile(
                commands=[Mencoder],
+               mplayeropts=["-ffourcc", "DX50"],
                vcodec="xvid",
                vopts="fixed_quant=2:vhq=4:autoaspect",
                acodec="mp3lame",
@@ -389,24 +382,25 @@ profiles = {
        "apple-quicktime" :
        Profile(
                commands=[MPlayer, X264, Faac, Wait, MP4Box],
-               x264opts=["--crf", "19", "--bframes", "1"],
+               mplayeropts=[],
+               x264opts=["--crf", "20", "--bframes", "1"],
                faacopts=["-q", "100", "--mpeg-vers", "4"],
        ),
 
        "nokia-n97" :
        Profile(
                commands=[Mencoder, MencoderDemux, MP4Box],
+               mplayeropts=["-vf-add", "scale=640:-10"],
                vcodec="xvid",
-               vopts="bitrate=256:vhq=4:autoaspect:max_bframes=0",
+               vopts="bitrate=384:vhq=4:autoaspect:max_bframes=0",
                acodec="faac",
                aopts="br=64:mpeg=4:object=2",
-               extra=["-vf-add", "scale=640:-10"],
        ),
 }
 
 mappings = {
-       "x264", "x264/lame",
-       "xvid", "xvid/lame",
+       "x264": "x264/lame",
+       "xvid": "xvid/lame",
 }
 for x, y in mappings.iteritems():
        profiles[x] = profiles[y]
@@ -423,14 +417,14 @@ def parse_args():
 
        parser = optparse.OptionParser(usage="%prog [options] input [output]")
        parser.add_option("--dvd", action="store", dest="dvd")
-       parser.add_option("--deinterlace", action="store_true", dest="deinterlace")
        parser.add_option("--fixmux", action="store_true", dest="fixmux")
-       parser.add_option("--mc", action="store", dest="mc", type="int")
+       parser.add_option("--deinterlace", action="store_true", dest="deinterlace")
+       parser.add_option("--detelecine", action="store_true", dest="detelecine")
+       parser.add_option("--mc", action="store", dest="mc", type="float")
        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("--chapter", action="store", dest="chapter")
-       parser.add_option("--ifps", action="store", dest="ifps")
        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")
@@ -459,6 +453,7 @@ def parse_args():
                opts.input = input
 
        opts.output = os.path.abspath(output)
+       opts.mplayer_done = False
 
        return opts
 
@@ -481,8 +476,8 @@ def main():
 
                try:
                        commands = []
-                       if opts.fixmux:
-                               profile.commands.insert(0, MencoderFixRemux)
+                       if opts.fixmux or opts.detelecine:
+                               profile.commands.insert(0, MencoderLossless)
                        for CommandClass in profile.commands:
                                if Command in CommandClass.__bases__:
                                        command = CommandClass(profile, opts)