Cleaned up binary
[biamove.git] / videocodecdialogs.py
1 # Video codec dialogs for the BiaMovE application
2
3 import Tkinter
4 import tkFileDialog
5 import tkSimpleDialog
6 import tkMessageBox
7
8 class X264EncDialog (tkSimpleDialog.Dialog):
9 """H.264 video encoding options dialog"""
10 def apply (self):
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()
16 else:
17 self.result += "crf=" + self.ratefactor.get()
18 self.result += ":subq=" + self.subpel.get().split()[0] + ":frameref=" + self.frameref.get()
19
20 if self.cabac.get() == 0:
21 self.result += ":nocabac"
22
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)
25
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)
31
32 Tkinter.Label (master, text="Bitrate").grid (column=1, row=1)
33
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)
37
38 Tkinter.Label (master, text="Minimum quantizer (1 to 51)").grid (column=1, row=2)
39
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)
43
44 Tkinter.Label (master, text="Maximum quantizer (1 to 51)").grid (column=1, row=3)
45
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)
49
50 Tkinter.Label (master, text="Fixed quantizer (0 to 51)").grid (column=1, row=4)
51
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)
55
56 Tkinter.Label (master, text="Rate factor (1.0 to 50.0)").grid (column=1, row=5)
57
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)
61
62 Tkinter.Label (master, text="Subpel refinement quality").grid (column=0, row=6)
63
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)
67
68 Tkinter.Label (master, text="Reference frames (1 to 16)").grid (column=0, row=7)
69
70 self.frameref = Tkinter.StringVar ()
71 self.frameref.set (1)
72 Tkinter.Spinbox (master, textvariable=self.frameref, from_=1, to=16).grid (column=1, row=7)
73
74 self.cabac = Tkinter.IntVar ()
75 self.cabac.set (1)
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)
77
78 class XvidEncDialog (tkSimpleDialog.Dialog):
79 """XviD video codec options dialog"""
80 def apply (self):
81 self.result = "-xvidencopts profile=" + self.profile.get().split()[0]
82 if self.mode.get() == "cbr":
83 self.result += ":bitrate=" + self.bitrate.get()
84 else:
85 self.result += ":fixed_quant=" + self.quantizerfixed.get()
86 self.result += ":vhq=" + self.vhq.get().split()[0] + ":quant_type=" + self.quantizertype.get().split()[0]
87
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"
96
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)
99
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)")
103
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)
105
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)
110
111 Tkinter.Label (master, text="Bitrate (CBR mode)").grid (column=1, row=2)
112
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)
116
117 Tkinter.Label (master, text="Fixed Quantizer (1 to 31)").grid (column=1, row=3)
118
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)
122
123 Tkinter.Label (master, text="Motion search algorithm (vhq)").grid (column=0, row=4)
124
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)
128
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)
133
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)
137
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)
141
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)
145
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)
149
150 class LAVCVideoDialog (tkSimpleDialog.Dialog):
151 """LAVC video codec options dialog """
152 def apply (self):
153 self.result = "-lavcopts " + "vcodec=" + self.videocodec.get().split()[0]
154
155 if self.quantizertype.get() == "variable":
156 self.result += ":vbitrate=" + self.bitrate.get() + ":vqmin=" + self.quantizermin.get() + ":vqmax=" + self.quantizermax.get()
157 else:
158 self.result += ":vqscale=" + self.quantizerfixed.get()
159
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"
167
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)
170
171 Tkinter.Label (master, text="Video codec").grid (column=0, row=1)
172
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)
176
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)
181
182 Tkinter.Label (master, text="Video bitrate").grid (column=1, row=2)
183
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)
187
188 Tkinter.Label (master, text="Minimum quantizer (vqmin) (1 to 31)").grid (column=1, row=3)
189
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)
193
194 Tkinter.Label (master, text="Maximum quantizer (vqmax) (1 to 31)").grid (column=1, row=4)
195
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)
199
200 Tkinter.Label (master, text="Fixed quantizer (vqscale) (0 to 31)").grid (column=1, row=5)
201
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)
205
206 Tkinter.Label (master, text="Macroblock decision algorithm").grid (column=0, row=6)
207
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)
211
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)
215
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)
219
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)
223
224 class NUVDialog (tkSimpleDialog.Dialog):
225 """Nuppel video codec options dialog """
226 def apply (self):
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"
230 else:
231 self.result += ":lzo"
232 if self.disablertjpeg.get() == 1:
233 self.result += ":raw"
234 else:
235 self.result += ":rtjpeg"
236
237 def body (self, master):
238 Tkinter.Label (master, text="Nuppel video encoding options", fg="darkblue").grid (column=0, row=0, columnspan=2)
239
240 Tkinter.Label (master, text="Quality level (3 to 255)").grid (column=0, row=1)
241
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)
245
246 Tkinter.Label (master, text="Chrominance threshold (0 to 20)").grid (column=0, row=2)
247
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)
251
252 Tkinter.Label (master, text="Luminance threshold (0 to 20)").grid (column=0, row=3)
253
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)
257
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)
261
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)