+# Video codec dialogs for the BiaMovE application
+
+import Tkinter
+import tkFileDialog
+import tkSimpleDialog
+import tkMessageBox
+
+class X264EncDialog (tkSimpleDialog.Dialog):
+ """H.264 video encoding options dialog"""
+ def apply (self):
+ self.result = "-x264encopts "
+ if (self.ratecontrolmode.get() == "abr"):
+ self.result += "bitrate=" + self.bitrate.get() + ":qp_min=" + self.quantizermin.get() + ":qp_max=" +self.quantizermax.get()
+ elif (self.ratecontrolmode.get() == "qp"):
+ self.result += "qp=" + self.quantizerfixed.get()
+ else:
+ self.result += "crf=" + self.ratefactor.get()
+ self.result += ":subq=" + self.subpel.get().split()[0] + ":frameref=" + self.frameref.get()
+
+ if self.cabac.get() == 0:
+ self.result += ":nocabac"
+
+ def body (self, master):
+ Tkinter.Label (master, text="x264 video codec options (single pass only) (simplified)", fg="darkblue").grid (column=0, row=0, columnspan=3)
+
+ self.ratecontrolmode = Tkinter.StringVar ()
+ self.ratecontrolmode.set ("crf")
+ Tkinter.Radiobutton (master, variable=self.ratecontrolmode, text="Average bitrate mode", value="abr").grid (column=0, row=1)
+ Tkinter.Radiobutton (master, variable=self.ratecontrolmode, text="Fixed quantizer mode", value="qp").grid (column=0, row=4)
+ Tkinter.Radiobutton (master, variable=self.ratecontrolmode, text="Constant quality mode", value="crf").grid(column=0, row=5)
+
+ Tkinter.Label (master, text="Bitrate").grid (column=1, row=1)
+
+ self.bitrate = Tkinter.StringVar ()
+ self.bitrate.set (800)
+ Tkinter.Spinbox (master, textvariable=self.bitrate, from_=0, to=16000).grid (column=2, row=1)
+
+ Tkinter.Label (master, text="Minimum quantizer (1 to 51)").grid (column=1, row=2)
+
+ self.quantizermin = Tkinter.StringVar ()
+ self.quantizermin.set (10)
+ Tkinter.Spinbox (master, textvariable=self.quantizermin, from_=1, to=51).grid (column=2, row=2)
+
+ Tkinter.Label (master, text="Maximum quantizer (1 to 51)").grid (column=1, row=3)
+
+ self.quantizermax = Tkinter.StringVar ()
+ self.quantizermax.set (51)
+ Tkinter.Spinbox (master, textvariable=self.quantizermax, from_=1, to=51).grid (column=2, row=3)
+
+ Tkinter.Label (master, text="Fixed quantizer (0 to 51)").grid (column=1, row=4)
+
+ self.quantizerfixed = Tkinter.StringVar ()
+ self.quantizerfixed.set (20)
+ Tkinter.Spinbox (master, textvariable=self.quantizerfixed, from_=0, to=51).grid (column=2, row=4)
+
+ Tkinter.Label (master, text="Rate factor (1.0 to 50.0)").grid (column=1, row=5)
+
+ self.ratefactor = Tkinter.StringVar ()
+ self.ratefactor.set (15)
+ Tkinter.Spinbox (master, textvariable=self.ratefactor, from_=1, to=50).grid (column=2, row=5)
+
+ Tkinter.Label (master, text="Subpel refinement quality").grid (column=0, row=6)
+
+ self.subpel = Tkinter.StringVar ()
+ self.subpel.set ("5 Best quarterpixel precision motion estimation (default)")
+ Tkinter.OptionMenu (master, self.subpel, "1 Fullpixel precision motion estimation + fast qp refinement (fastest)", "2 Halfpixel precision motion estimation + fast qp refinement", "3 Halfpixel precision motion estimation + slower qp refinement", "4 Fast quarterpixel precision motion estimation + refinement", "5 Best quarterpixel precision motion estimation (default)", "6 Enables rate-distortion optimization of macroblock types in I- and P-frames", "7 Enables rate-distortion optimization of motion vectors and intra modes. (best)").grid (column=1, row=6, columnspan=2)
+
+ Tkinter.Label (master, text="Reference frames (1 to 16)").grid (column=0, row=7)
+
+ self.frameref = Tkinter.StringVar ()
+ self.frameref.set (1)
+ Tkinter.Spinbox (master, textvariable=self.frameref, from_=1, to=16).grid (column=1, row=7)
+
+ self.cabac = Tkinter.IntVar ()
+ self.cabac.set (1)
+ Tkinter.Checkbutton (master, text="Use Context-Adaptive Binary Arithmetic Coding (cabac)", variable=self.cabac, onvalue=1, offvalue=0).grid (column=0, row=8, columnspan=3)
+
+class XvidEncDialog (tkSimpleDialog.Dialog):
+ """XviD video codec options dialog"""
+ def apply (self):
+ self.result = "-xvidencopts profile=" + self.profile.get().split()[0]
+ if self.mode.get() == "cbr":
+ self.result += ":bitrate=" + self.bitrate.get()
+ else:
+ self.result += ":fixed_quant=" + self.quantizerfixed.get()
+ self.result += ":vhq=" + self.vhq.get().split()[0] + ":quant_type=" + self.quantizertype.get().split()[0]
+
+ if self.grayscale.get() == 1:
+ self.result += ":grayscale"
+ if self.cartoonmode.get() == 1:
+ self.result += ":cartoon"
+ if self.autoaspect.get() == 1:
+ self.result += ":autoaspect"
+ if self.interlacing.get() == 1:
+ self.result += ":interlacing"
+
+ def body (self, master):
+ Tkinter.Label (master, text="XviD video codec options (single pass only) (simplified)", fg="darkblue").grid (column=0, row=0, columnspan=3)
+
+ Tkinter.Label (master, text="XViD Profile").grid (column=0, row=1)
+ self.profile = Tkinter.StringVar ()
+ self.profile.set ("unrestricted No restrictions (default)")
+
+ Tkinter.OptionMenu (master, self.profile, "unrestricted No restrictions (default)", "sp0 Simple profile at level 0", "sp1 Simple profile at level 1", "sp2 Simple profile at level 2", "sp3 Simple profile at level 3", "asp0 Advanced simple profile at level 0", "asp1 Advanced simple profile at level 1", "asp2 Advanced simple profile at level 2", "asp3 Advanced simple profile at level 3", "asp4 Advanced simple profile at level 4", "asp5 Advanced simple profile at level 5", "dxnhandheld DXN handheld profile", "dxnportntsc DXN portable NTSC profile", "dxnportpal DXN portable PAL profile", "dxnhtntsc DXN home theatre NTSC profile", "dxnhtpal DXN home theatre PAL profile", "dxnhdtv DXN HDTV profile").grid (column=1, row=1)
+
+ self.mode = Tkinter.StringVar ()
+ self.mode.set ("cbr")
+ Tkinter.Radiobutton (master, variable=self.mode, text="Use constant bitrate mode", value="cbr").grid (column=0, row=2)
+ Tkinter.Radiobutton (master, variable=self.mode, text="Use fixed quantizer mode", value="quantizer").grid (column=0, row=3)
+
+ Tkinter.Label (master, text="Bitrate (CBR mode)").grid (column=1, row=2)
+
+ self.bitrate = Tkinter.StringVar ()
+ self.bitrate.set (687)
+ Tkinter.Spinbox (master, textvariable=self.bitrate, from_=0, to=16000).grid (column=2, row=2)
+
+ Tkinter.Label (master, text="Fixed Quantizer (1 to 31)").grid (column=1, row=3)
+
+ self.quantizerfixed = Tkinter.StringVar ()
+ self.quantizerfixed.set (2)
+ Tkinter.Spinbox (master, textvariable=self.quantizerfixed, from_=1, to=31).grid (column=2, row=3)
+
+ Tkinter.Label (master, text="Motion search algorithm (vhq)").grid (column=0, row=4)
+
+ self.vhq = Tkinter.StringVar ()
+ self.vhq.set ("1 mode decision (inter/intra MB) (default)")
+ Tkinter.OptionMenu (master, self.vhq, "0 off", "1 mode decision (inter/intra MB) (default)", "2 limited search", "3 medium search", "4 wide search").grid (column=1, row=4, columnspan=2)
+
+ Tkinter.Label (master, text="Quantizer type").grid (column=0, row=5)
+ self.quantizertype = Tkinter.StringVar ()
+ self.quantizertype.set ("mpeg (more detail at high bitrates)")
+ Tkinter.OptionMenu (master, self.quantizertype, "mpeg (more detail at high bitrates)", "h263 (better smoothing at lower bitrates)").grid (column=1, row=5, columnspan=2)
+
+ self.grayscale = Tkinter.IntVar ()
+ self.grayscale.set (0)
+ Tkinter.Checkbutton (master, variable=self.grayscale, text="Grayscale (discard chroma planes)", offvalue=0, onvalue=1).grid (column=0, row=6, columnspan=2)
+
+ self.cartoonmode = Tkinter.IntVar ()
+ self.cartoonmode.set (0)
+ Tkinter.Checkbutton (master, variable=self.cartoonmode, text="Optimize for cartoon/anime", offvalue=0, onvalue=1).grid (column=2, row=6)
+
+ self.autoaspect = Tkinter.IntVar ()
+ self.autoaspect.set (0)
+ Tkinter.Checkbutton (master, variable=self.autoaspect, text="Automatically compute internal aspect ratio", offvalue=0, onvalue=1).grid (column=0, row=7, columnspan=2)
+
+ self.interlacing = Tkinter.IntVar ()
+ self.interlacing.set (0)
+ Tkinter.Checkbutton (master, variable=self.interlacing, text="Interlacing", offvalue=0, onvalue=1).grid (column=2, row=7, columnspan=3)
+
+class LAVCVideoDialog (tkSimpleDialog.Dialog):
+ """LAVC video codec options dialog """
+ def apply (self):
+ self.result = "-lavcopts " + "vcodec=" + self.videocodec.get().split()[0]
+
+ if self.quantizertype.get() == "variable":
+ self.result += ":vbitrate=" + self.bitrate.get() + ":vqmin=" + self.quantizermin.get() + ":vqmax=" + self.quantizermax.get()
+ else:
+ self.result += ":vqscale=" + self.quantizerfixed.get()
+
+ self.result += ":mbd=" + self.mbdalgorithm.get().split()[0]
+ if self.v4mvectors.get() == 1:
+ self.result += ":v4mv"
+ if self.grayscale.get() == 1:
+ self.result += ":gray"
+ if self.autoaspect.get() == 1:
+ self.result += ":autoaspect"
+
+ def body (self, master):
+ Tkinter.Label (master, text="LAVC video codec options (single pass only) (simplified)", fg="darkblue").grid (column=0, row=0, columnspan=3)
+
+ Tkinter.Label (master, text="Video codec").grid (column=0, row=1)
+
+ self.videocodec = Tkinter.StringVar ()
+ self.videocodec.set ("mpeg4 MPEG-4 (DivX 4/5)")
+ Tkinter.OptionMenu (master, self.videocodec, "asv1 ASUS Video v1", "asv2 ASUS Video v2", "dvvideo Sony Digital Video", "ffv1 FFMpeg lossless video codec", "ffvhuff Nonstandard 20% smaller HuffYUV using YV12", "flv Sorenson H.263 used in Flash Video", "h261 H.261", "h263 H.263", "h263p H.263+", "huffyuv HuffYUV", "libtheora Theora", "libx264 x264 H.264/AVC MPEG-4 Part 10", "libxvid Xvid MPEG-4 Part 2 (ASP)", "ljpeg Lossless JPEG", "mjpeg Motion JPEG", "mpeg1video MPEG-1 video", "mpeg2video MPEG-2 video", "mpeg4 MPEG-4 (DivX 4/5)", "msmpeg4 DivX 3", "msmpeg4v2 MS MPEG4v2", "roqvideo ID Software RoQ Video", "rv10 an old RealVideo codec", "snow FFmpeg's experimental wavelet-based codec", "svq1 Apple Sorenson Video 1", "wmv1 Windows Media Video, version 1 (AKA WMV7)", "wmv2 Windows Media Video, version 2 (AKA WMV8)").grid (column=1, row=1, columnspan=2)
+
+ self.quantizertype = Tkinter.StringVar ()
+ self.quantizertype.set ("variable")
+ Tkinter.Radiobutton (master, variable=self.quantizertype, text="Variable quantizer", value="variable").grid (column=0, row=2)
+ Tkinter.Radiobutton (master, variable=self.quantizertype, text="Fixed quantizer", value="fixed").grid (column=0, row=5)
+
+ Tkinter.Label (master, text="Video bitrate").grid (column=1, row=2)
+
+ self.bitrate = Tkinter.StringVar ()
+ self.bitrate.set (800)
+ Tkinter.Spinbox (master, textvariable=self.bitrate, from_=0, to=16000).grid (column=2, row=2)
+
+ Tkinter.Label (master, text="Minimum quantizer (vqmin) (1 to 31)").grid (column=1, row=3)
+
+ self.quantizermin = Tkinter.StringVar ()
+ self.quantizermin.set ("2")
+ Tkinter.Spinbox (master, textvariable=self.quantizermin, from_=1, to=31).grid (column=2, row=3)
+
+ Tkinter.Label (master, text="Maximum quantizer (vqmax) (1 to 31)").grid (column=1, row=4)
+
+ self.quantizermax = Tkinter.StringVar ()
+ self.quantizermax.set ("31")
+ Tkinter.Spinbox (master, textvariable=self.quantizermax, from_=1, to=31).grid (column=2, row=4)
+
+ Tkinter.Label (master, text="Fixed quantizer (vqscale) (0 to 31)").grid (column=1, row=5)
+
+ self.quantizerfixed = Tkinter.StringVar ()
+ self.quantizerfixed.set ("2")
+ Tkinter.Spinbox (master, textvariable=self.quantizerfixed, from_=0, to=31).grid (column=2, row=5)
+
+ Tkinter.Label (master, text="Macroblock decision algorithm").grid (column=0, row=6)
+
+ self.mbdalgorithm = Tkinter.StringVar ()
+ self.mbdalgorithm.set ("0 Use comparison function given by mbcmp (default)")
+ Tkinter.OptionMenu (master, self.mbdalgorithm, "0 Use comparison function given by mbcmp (default)", "1 Select the MB mode which needs the fewest bits (=vhq)", "2 Select the MB mode which has the best rate distortion").grid (column=1, row=6, columnspan=2)
+
+ self.v4mvectors = Tkinter.IntVar ()
+ self.v4mvectors.set (0)
+ Tkinter.Checkbutton (master, text="Allow 4 motion vectors per macroblock (slightly better quality)", variable= self.v4mvectors, onvalue=1, offvalue=0).grid (column=0, row=7, columnspan=3)
+
+ self.grayscale = Tkinter.IntVar ()
+ self.grayscale.set (0)
+ Tkinter.Checkbutton (master, text="Grayscale only encoding (faster)", variable=self.grayscale, onvalue=1, offvalue=0).grid (column=0, row=8, columnspan=3)
+
+ self.autoaspect = Tkinter.IntVar ()
+ self.autoaspect.set (0)
+ Tkinter.Checkbutton (master, text="Automatically compute internal aspect ratio", variable=self.autoaspect, onvalue=1, offvalue=0).grid (column=0, row=9, columnspan=3)
+
+class NUVDialog (tkSimpleDialog.Dialog):
+ """Nuppel video codec options dialog """
+ def apply (self):
+ self.result = "-nuvopts q=" + self.qualitylevel.get() + ":c=" + self.chrominance.get() + ":l=" + self.luminance.get()
+ if self.disablelzo.get() == 1:
+ self.result += ":nolzo"
+ else:
+ self.result += ":lzo"
+ if self.disablertjpeg.get() == 1:
+ self.result += ":raw"
+ else:
+ self.result += ":rtjpeg"
+
+ def body (self, master):
+ Tkinter.Label (master, text="Nuppel video encoding options", fg="darkblue").grid (column=0, row=0, columnspan=2)
+
+ Tkinter.Label (master, text="Quality level (3 to 255)").grid (column=0, row=1)
+
+ self.qualitylevel = Tkinter.StringVar ()
+ self.qualitylevel.set (255)
+ Tkinter.Spinbox (master, textvariable=self.qualitylevel, from_=3, to=255).grid (column=1, row=1)
+
+ Tkinter.Label (master, text="Chrominance threshold (0 to 20)").grid (column=0, row=2)
+
+ self.chrominance = Tkinter.StringVar ()
+ self.chrominance.set (1)
+ Tkinter.Spinbox (master, textvariable=self.chrominance, from_=0, to=20).grid (column=1, row=2)
+
+ Tkinter.Label (master, text="Luminance threshold (0 to 20)").grid (column=0, row=3)
+
+ self.luminance = Tkinter.StringVar ()
+ self.luminance.set (1)
+ Tkinter.Spinbox (master, textvariable=self.luminance, from_=0, to=20).grid (column=1, row=3)
+
+ self.disablelzo = Tkinter.IntVar ()
+ self.disablelzo.set (0)
+ Tkinter.Checkbutton (master, text="Disable LZO compression", variable=self.disablelzo, onvalue=1, offvalue=0).grid (column=0, row=4, columnspan=2)
+
+ self.disablertjpeg = Tkinter.IntVar ()
+ self.disablertjpeg.set (0)
+ Tkinter.Checkbutton (master, text="Disable RTJPEG encoding", variable=self.disablertjpeg, onvalue=1, offvalue=0).grid (column=0, row=5, columnspan=2)