1 # Video codec dialogs for the BiaMovE application
8 class X264EncDialog (tkSimpleDialog
.Dialog
):
9 """H.264 video encoding options dialog"""
11 self
.result
= "-x264encopts "
12 if (self
.ratecontrolmode
.get() == "abr"):
13 self
.result
+= "bitrate=" + self
.bitrate
.get() + ":qp_min=" + self
.quantizermin
.get() + ":qp_max=" +self
.quantizermax
.get()
14 elif (self
.ratecontrolmode
.get() == "qp"):
15 self
.result
+= "qp=" + self
.quantizerfixed
.get()
17 self
.result
+= "crf=" + self
.ratefactor
.get()
18 self
.result
+= ":subq=" + self
.subpel
.get().split()[0] + ":frameref=" + self
.frameref
.get()
20 if self
.cabac
.get() == 0:
21 self
.result
+= ":nocabac"
23 def body (self
, master
):
24 Tkinter
.Label (master
, text
="x264 video codec options (single pass only) (simplified)", fg
="darkblue").grid (column
=0, row
=0, columnspan
=3)
26 self
.ratecontrolmode
= Tkinter
.StringVar ()
27 self
.ratecontrolmode
.set ("crf")
28 Tkinter
.Radiobutton (master
, variable
=self
.ratecontrolmode
, text
="Average bitrate mode", value
="abr").grid (column
=0, row
=1)
29 Tkinter
.Radiobutton (master
, variable
=self
.ratecontrolmode
, text
="Fixed quantizer mode", value
="qp").grid (column
=0, row
=4)
30 Tkinter
.Radiobutton (master
, variable
=self
.ratecontrolmode
, text
="Constant quality mode", value
="crf").grid(column
=0, row
=5)
32 Tkinter
.Label (master
, text
="Bitrate").grid (column
=1, row
=1)
34 self
.bitrate
= Tkinter
.StringVar ()
35 self
.bitrate
.set (800)
36 Tkinter
.Spinbox (master
, textvariable
=self
.bitrate
, from_
=0, to
=16000).grid (column
=2, row
=1)
38 Tkinter
.Label (master
, text
="Minimum quantizer (1 to 51)").grid (column
=1, row
=2)
40 self
.quantizermin
= Tkinter
.StringVar ()
41 self
.quantizermin
.set (10)
42 Tkinter
.Spinbox (master
, textvariable
=self
.quantizermin
, from_
=1, to
=51).grid (column
=2, row
=2)
44 Tkinter
.Label (master
, text
="Maximum quantizer (1 to 51)").grid (column
=1, row
=3)
46 self
.quantizermax
= Tkinter
.StringVar ()
47 self
.quantizermax
.set (51)
48 Tkinter
.Spinbox (master
, textvariable
=self
.quantizermax
, from_
=1, to
=51).grid (column
=2, row
=3)
50 Tkinter
.Label (master
, text
="Fixed quantizer (0 to 51)").grid (column
=1, row
=4)
52 self
.quantizerfixed
= Tkinter
.StringVar ()
53 self
.quantizerfixed
.set (20)
54 Tkinter
.Spinbox (master
, textvariable
=self
.quantizerfixed
, from_
=0, to
=51).grid (column
=2, row
=4)
56 Tkinter
.Label (master
, text
="Rate factor (1.0 to 50.0)").grid (column
=1, row
=5)
58 self
.ratefactor
= Tkinter
.StringVar ()
59 self
.ratefactor
.set (15)
60 Tkinter
.Spinbox (master
, textvariable
=self
.ratefactor
, from_
=1, to
=50).grid (column
=2, row
=5)
62 Tkinter
.Label (master
, text
="Subpel refinement quality").grid (column
=0, row
=6)
64 self
.subpel
= Tkinter
.StringVar ()
65 self
.subpel
.set ("5 Best quarterpixel precision motion estimation (default)")
66 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)
68 Tkinter
.Label (master
, text
="Reference frames (1 to 16)").grid (column
=0, row
=7)
70 self
.frameref
= Tkinter
.StringVar ()
72 Tkinter
.Spinbox (master
, textvariable
=self
.frameref
, from_
=1, to
=16).grid (column
=1, row
=7)
74 self
.cabac
= Tkinter
.IntVar ()
76 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)
78 class XvidEncDialog (tkSimpleDialog
.Dialog
):
79 """XviD video codec options dialog"""
81 self
.result
= "-xvidencopts profile=" + self
.profile
.get().split()[0]
82 if self
.mode
.get() == "cbr":
83 self
.result
+= ":bitrate=" + self
.bitrate
.get()
85 self
.result
+= ":fixed_quant=" + self
.quantizerfixed
.get()
86 self
.result
+= ":vhq=" + self
.vhq
.get().split()[0] + ":quant_type=" + self
.quantizertype
.get().split()[0]
88 if self
.grayscale
.get() == 1:
89 self
.result
+= ":grayscale"
90 if self
.cartoonmode
.get() == 1:
91 self
.result
+= ":cartoon"
92 if self
.autoaspect
.get() == 1:
93 self
.result
+= ":autoaspect"
94 if self
.interlacing
.get() == 1:
95 self
.result
+= ":interlacing"
97 def body (self
, master
):
98 Tkinter
.Label (master
, text
="XviD video codec options (single pass only) (simplified)", fg
="darkblue").grid (column
=0, row
=0, columnspan
=3)
100 Tkinter
.Label (master
, text
="XViD Profile").grid (column
=0, row
=1)
101 self
.profile
= Tkinter
.StringVar ()
102 self
.profile
.set ("unrestricted No restrictions (default)")
104 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)
106 self
.mode
= Tkinter
.StringVar ()
107 self
.mode
.set ("cbr")
108 Tkinter
.Radiobutton (master
, variable
=self
.mode
, text
="Use constant bitrate mode", value
="cbr").grid (column
=0, row
=2)
109 Tkinter
.Radiobutton (master
, variable
=self
.mode
, text
="Use fixed quantizer mode", value
="quantizer").grid (column
=0, row
=3)
111 Tkinter
.Label (master
, text
="Bitrate (CBR mode)").grid (column
=1, row
=2)
113 self
.bitrate
= Tkinter
.StringVar ()
114 self
.bitrate
.set (687)
115 Tkinter
.Spinbox (master
, textvariable
=self
.bitrate
, from_
=0, to
=16000).grid (column
=2, row
=2)
117 Tkinter
.Label (master
, text
="Fixed Quantizer (1 to 31)").grid (column
=1, row
=3)
119 self
.quantizerfixed
= Tkinter
.StringVar ()
120 self
.quantizerfixed
.set (2)
121 Tkinter
.Spinbox (master
, textvariable
=self
.quantizerfixed
, from_
=1, to
=31).grid (column
=2, row
=3)
123 Tkinter
.Label (master
, text
="Motion search algorithm (vhq)").grid (column
=0, row
=4)
125 self
.vhq
= Tkinter
.StringVar ()
126 self
.vhq
.set ("1 mode decision (inter/intra MB) (default)")
127 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)
129 Tkinter
.Label (master
, text
="Quantizer type").grid (column
=0, row
=5)
130 self
.quantizertype
= Tkinter
.StringVar ()
131 self
.quantizertype
.set ("mpeg (more detail at high bitrates)")
132 Tkinter
.OptionMenu (master
, self
.quantizertype
, "mpeg (more detail at high bitrates)", "h263 (better smoothing at lower bitrates)").grid (column
=1, row
=5, columnspan
=2)
134 self
.grayscale
= Tkinter
.IntVar ()
135 self
.grayscale
.set (0)
136 Tkinter
.Checkbutton (master
, variable
=self
.grayscale
, text
="Grayscale (discard chroma planes)", offvalue
=0, onvalue
=1).grid (column
=0, row
=6, columnspan
=2)
138 self
.cartoonmode
= Tkinter
.IntVar ()
139 self
.cartoonmode
.set (0)
140 Tkinter
.Checkbutton (master
, variable
=self
.cartoonmode
, text
="Optimize for cartoon/anime", offvalue
=0, onvalue
=1).grid (column
=2, row
=6)
142 self
.autoaspect
= Tkinter
.IntVar ()
143 self
.autoaspect
.set (0)
144 Tkinter
.Checkbutton (master
, variable
=self
.autoaspect
, text
="Automatically compute internal aspect ratio", offvalue
=0, onvalue
=1).grid (column
=0, row
=7, columnspan
=2)
146 self
.interlacing
= Tkinter
.IntVar ()
147 self
.interlacing
.set (0)
148 Tkinter
.Checkbutton (master
, variable
=self
.interlacing
, text
="Interlacing", offvalue
=0, onvalue
=1).grid (column
=2, row
=7, columnspan
=3)
150 class LAVCVideoDialog (tkSimpleDialog
.Dialog
):
151 """LAVC video codec options dialog """
153 self
.result
= "-lavcopts " + "vcodec=" + self
.videocodec
.get().split()[0]
155 if self
.quantizertype
.get() == "variable":
156 self
.result
+= ":vbitrate=" + self
.bitrate
.get() + ":vqmin=" + self
.quantizermin
.get() + ":vqmax=" + self
.quantizermax
.get()
158 self
.result
+= ":vqscale=" + self
.quantizerfixed
.get()
160 self
.result
+= ":mbd=" + self
.mbdalgorithm
.get().split()[0]
161 if self
.v4mvectors
.get() == 1:
162 self
.result
+= ":v4mv"
163 if self
.grayscale
.get() == 1:
164 self
.result
+= ":gray"
165 if self
.autoaspect
.get() == 1:
166 self
.result
+= ":autoaspect"
168 def body (self
, master
):
169 Tkinter
.Label (master
, text
="LAVC video codec options (single pass only) (simplified)", fg
="darkblue").grid (column
=0, row
=0, columnspan
=3)
171 Tkinter
.Label (master
, text
="Video codec").grid (column
=0, row
=1)
173 self
.videocodec
= Tkinter
.StringVar ()
174 self
.videocodec
.set ("mpeg4 MPEG-4 (DivX 4/5)")
175 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)
177 self
.quantizertype
= Tkinter
.StringVar ()
178 self
.quantizertype
.set ("variable")
179 Tkinter
.Radiobutton (master
, variable
=self
.quantizertype
, text
="Variable quantizer", value
="variable").grid (column
=0, row
=2)
180 Tkinter
.Radiobutton (master
, variable
=self
.quantizertype
, text
="Fixed quantizer", value
="fixed").grid (column
=0, row
=5)
182 Tkinter
.Label (master
, text
="Video bitrate").grid (column
=1, row
=2)
184 self
.bitrate
= Tkinter
.StringVar ()
185 self
.bitrate
.set (800)
186 Tkinter
.Spinbox (master
, textvariable
=self
.bitrate
, from_
=0, to
=16000).grid (column
=2, row
=2)
188 Tkinter
.Label (master
, text
="Minimum quantizer (vqmin) (1 to 31)").grid (column
=1, row
=3)
190 self
.quantizermin
= Tkinter
.StringVar ()
191 self
.quantizermin
.set ("2")
192 Tkinter
.Spinbox (master
, textvariable
=self
.quantizermin
, from_
=1, to
=31).grid (column
=2, row
=3)
194 Tkinter
.Label (master
, text
="Maximum quantizer (vqmax) (1 to 31)").grid (column
=1, row
=4)
196 self
.quantizermax
= Tkinter
.StringVar ()
197 self
.quantizermax
.set ("31")
198 Tkinter
.Spinbox (master
, textvariable
=self
.quantizermax
, from_
=1, to
=31).grid (column
=2, row
=4)
200 Tkinter
.Label (master
, text
="Fixed quantizer (vqscale) (0 to 31)").grid (column
=1, row
=5)
202 self
.quantizerfixed
= Tkinter
.StringVar ()
203 self
.quantizerfixed
.set ("2")
204 Tkinter
.Spinbox (master
, textvariable
=self
.quantizerfixed
, from_
=0, to
=31).grid (column
=2, row
=5)
206 Tkinter
.Label (master
, text
="Macroblock decision algorithm").grid (column
=0, row
=6)
208 self
.mbdalgorithm
= Tkinter
.StringVar ()
209 self
.mbdalgorithm
.set ("0 Use comparison function given by mbcmp (default)")
210 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)
212 self
.v4mvectors
= Tkinter
.IntVar ()
213 self
.v4mvectors
.set (0)
214 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)
216 self
.grayscale
= Tkinter
.IntVar ()
217 self
.grayscale
.set (0)
218 Tkinter
.Checkbutton (master
, text
="Grayscale only encoding (faster)", variable
=self
.grayscale
, onvalue
=1, offvalue
=0).grid (column
=0, row
=8, columnspan
=3)
220 self
.autoaspect
= Tkinter
.IntVar ()
221 self
.autoaspect
.set (0)
222 Tkinter
.Checkbutton (master
, text
="Automatically compute internal aspect ratio", variable
=self
.autoaspect
, onvalue
=1, offvalue
=0).grid (column
=0, row
=9, columnspan
=3)
224 class NUVDialog (tkSimpleDialog
.Dialog
):
225 """Nuppel video codec options dialog """
227 self
.result
= "-nuvopts q=" + self
.qualitylevel
.get() + ":c=" + self
.chrominance
.get() + ":l=" + self
.luminance
.get()
228 if self
.disablelzo
.get() == 1:
229 self
.result
+= ":nolzo"
231 self
.result
+= ":lzo"
232 if self
.disablertjpeg
.get() == 1:
233 self
.result
+= ":raw"
235 self
.result
+= ":rtjpeg"
237 def body (self
, master
):
238 Tkinter
.Label (master
, text
="Nuppel video encoding options", fg
="darkblue").grid (column
=0, row
=0, columnspan
=2)
240 Tkinter
.Label (master
, text
="Quality level (3 to 255)").grid (column
=0, row
=1)
242 self
.qualitylevel
= Tkinter
.StringVar ()
243 self
.qualitylevel
.set (255)
244 Tkinter
.Spinbox (master
, textvariable
=self
.qualitylevel
, from_
=3, to
=255).grid (column
=1, row
=1)
246 Tkinter
.Label (master
, text
="Chrominance threshold (0 to 20)").grid (column
=0, row
=2)
248 self
.chrominance
= Tkinter
.StringVar ()
249 self
.chrominance
.set (1)
250 Tkinter
.Spinbox (master
, textvariable
=self
.chrominance
, from_
=0, to
=20).grid (column
=1, row
=2)
252 Tkinter
.Label (master
, text
="Luminance threshold (0 to 20)").grid (column
=0, row
=3)
254 self
.luminance
= Tkinter
.StringVar ()
255 self
.luminance
.set (1)
256 Tkinter
.Spinbox (master
, textvariable
=self
.luminance
, from_
=0, to
=20).grid (column
=1, row
=3)
258 self
.disablelzo
= Tkinter
.IntVar ()
259 self
.disablelzo
.set (0)
260 Tkinter
.Checkbutton (master
, text
="Disable LZO compression", variable
=self
.disablelzo
, onvalue
=1, offvalue
=0).grid (column
=0, row
=4, columnspan
=2)
262 self
.disablertjpeg
= Tkinter
.IntVar ()
263 self
.disablertjpeg
.set (0)
264 Tkinter
.Checkbutton (master
, text
="Disable RTJPEG encoding", variable
=self
.disablertjpeg
, onvalue
=1, offvalue
=0).grid (column
=0, row
=5, columnspan
=2)