Cleaned up binary
[biamove.git] / videofilterdialogs.py
1 # Video filter dialogs for the BiaMovE application
2
3 import Tkinter
4 import tkFileDialog
5 import tkSimpleDialog
6 import tkMessageBox
7
8 class FilterPictureDialog (tkSimpleDialog.Dialog):
9 """Implements a picture dialog box for adjusting brightness, contrast etc."""
10
11 def apply (self):
12 self.result = self.gamma.get () + ":" + self.contrast.get () + ":" + self.brightness.get() + ":" + self.saturation.get ()
13
14 def body (self, master):
15 Tkinter.Label (master, text="Picture adjustments (simplified)", fg="darkblue").grid (column=0, row=0, columnspan=2)
16
17 Tkinter.Label (master, text="Gamma correction").grid (column=0, row=1)
18
19 self.gamma = Tkinter.StringVar ()
20 self.gamma_scale = Tkinter.Scale (master, variable=self.gamma, from_=0.1, to=10, length=200, resolution=0.05, orient=Tkinter.HORIZONTAL)
21 self.gamma_scale.set (1)
22 self.gamma_scale.grid (column=1, row=1)
23
24 Tkinter.Label (master, text="Contrast").grid (column=0, row=2)
25
26 self.contrast = Tkinter.StringVar ()
27 self.contrast_scale = Tkinter.Scale (master, variable=self.contrast, from_=-2, to=2, length=200, resolution=0.05,
28 orient=Tkinter.HORIZONTAL)
29 self.contrast_scale.set (1)
30 self.contrast_scale.grid (column=1, row=2)
31
32 Tkinter.Label (master, text="Brightness").grid (column=0, row=3)
33
34 self.brightness = Tkinter.StringVar ()
35 self.brightness_scale = Tkinter.Scale (master, variable=self.brightness, from_=-1, to=1, length=200,
36 resolution=0.05, orient=Tkinter.HORIZONTAL)
37 self.brightness_scale.set (0)
38 self.brightness_scale.grid (column=1, row=3)
39
40 Tkinter.Label (master, text="Saturation").grid (column=0,row=4)
41
42 self.saturation = Tkinter.StringVar ()
43 self.saturation_scale = Tkinter.Scale (master, variable=self.saturation, from_=0, to=3, length=200,
44 resolution=0.05, orient=Tkinter.HORIZONTAL)
45 self.saturation_scale.set (1)
46 self.saturation_scale.grid (column=1, row=4)
47
48 class FilterCropDialog (tkSimpleDialog.Dialog):
49 """Implements the crop dialog box for cropping parts of the video"""
50 def apply (self):
51 self.result = self.crop_width.get() + ":" + self.crop_height.get()
52
53 self.result += ":"
54
55 if self.center_width.get() == 0:
56 self.result += self.horizontal.get ()
57 self.result += ":"
58 if self.center_height.get() == 0:
59 self.result += self.vertical.get ()
60
61 self.result = self.result.strip (":")
62
63 def body (self, master):
64 Tkinter.Label (master, text="Crop parameters (simplified)", fg="darkblue").grid (column=0, row=0, columnspan=2)
65 Tkinter.Label (master, text="Width").grid (column=0, row=1)
66
67 self.crop_width = Tkinter.StringVar ()
68 Tkinter.Entry (master, textvariable=self.crop_width).grid (column=1, row=1)
69
70 Tkinter.Label (master, text="Height").grid (column=0, row=2)
71
72 self.crop_height = Tkinter.StringVar ()
73 Tkinter.Entry (master, textvariable=self.crop_height).grid (column=1, row=2)
74
75 Tkinter.Label (master, text="Position of video in cropped frame", fg="darkblue").grid (column=0, row=3, columnspan=2)
76
77 self.center_width = Tkinter.IntVar ()
78 self.center_width.set (1)
79 Tkinter.Checkbutton (master, variable=self.center_width, text="Center horizontally", onvalue=1, offvalue=0).grid (column=0, row=4)
80
81 self.center_height = Tkinter.IntVar ()
82 self.center_height.set (1)
83 Tkinter.Checkbutton (master, variable=self.center_height, text="Center vertically", onvalue=1, offvalue=0).grid (column=1, row=4)
84
85 Tkinter.Label (master, text="Horizontal position").grid (column=0, row=5)
86
87 self.horizontal = Tkinter.StringVar ()
88 Tkinter.Entry (master, textvariable=self.horizontal).grid (column=1, row=5)
89
90 Tkinter.Label (master, text="Vertical position").grid (column=0, row=6)
91
92 self.vertical = Tkinter.StringVar ()
93 Tkinter.Entry (master, textvariable=self.vertical).grid (column=1, row=6)
94
95 class FilterExpandDialog (tkSimpleDialog.Dialog):
96 """Implements the expand dialog box for expanding the video"""
97 def apply (self):
98 if self.relative_width.get() == 1:
99 self.result = "-" + self.expand_width.get()
100 else:
101 self.result = self.expand_width.get()
102 if self.relative_height.get() == 1:
103 self.result += ":-" + self.expand_height.get()
104 else:
105 self.result += ":" + self.expand_height.get()
106
107 self.result += ":"
108 if self.center_width.get() == 0:
109 self.result += self.horizontal.get()
110 self.result += ":"
111 if self.center_height.get() == 0:
112 self.result += self.vertical.get()
113
114 self.result += ":" + str (self.osdsubtitle.get())
115
116
117 def body (self, master):
118 Tkinter.Label (master, text="Expand parameters (simplified)", fg="darkblue").grid (column=0, row=0, columnspan=3)
119 Tkinter.Label (master, text="Width").grid (column=0, row=1)
120
121 self.expand_width = Tkinter.StringVar ()
122 Tkinter.Entry (master, textvariable=self.expand_width).grid (column=1, row=1)
123
124 self.relative_width = Tkinter.IntVar ()
125 self.relative_width.set (0)
126 Tkinter.Checkbutton (master, variable = self.relative_width, text="Offset width (not absolute)", onvalue=1, offvalue=0).grid (column=2, row=1)
127
128 Tkinter.Label (master, text="Height").grid (column=0, row=2)
129
130 self.expand_height = Tkinter.StringVar ()
131 Tkinter.Entry (master, textvariable=self.expand_height).grid (column=1, row=2)
132
133 self.relative_height = Tkinter.IntVar ()
134 self.relative_height.set (0)
135 Tkinter.Checkbutton (master, variable = self.relative_height, text="Offset height (not absolute)", onvalue=1, offvalue=0).grid (column=2, row=2)
136
137 Tkinter.Label (master, text="Position of video in expanded frame", fg="darkblue").grid (column=0, row=3, columnspan=3)
138
139 self.center_width = Tkinter.IntVar ()
140 self.center_width.set (1)
141 Tkinter.Checkbutton (master, variable=self.center_width, text="Center horizontally", onvalue=1, offvalue=0).grid (column=1, row=4)
142
143 self.center_height = Tkinter.IntVar ()
144 self.center_height.set (1)
145 Tkinter.Checkbutton (master, variable=self.center_height, text="Center vertically", onvalue=1, offvalue=0).grid (column=2, row=4)
146
147 Tkinter.Label (master, text="Horizontal position").grid (column=0, row=5)
148
149 self.horizontal = Tkinter.StringVar ()
150 self.horizontal.set (0)
151 Tkinter.Entry (master, textvariable=self.horizontal).grid (column=1, row=5)
152
153 Tkinter.Label (master, text="Vertical position").grid (column=0, row=6)
154
155 self.vertical = Tkinter.StringVar ()
156 self.vertical.set (0)
157 Tkinter.Entry (master, textvariable=self.vertical).grid (column=1, row=6)
158
159 self.osdsubtitle = Tkinter.IntVar ()
160 self.osdsubtitle.set (0)
161 Tkinter.Checkbutton (master, variable=self.osdsubtitle, text="OSD/Subtitle rendering", onvalue=1, offvalue=0).grid (column=0, row=7, columnspan=3)
162
163 class FilterScaleDialog (tkSimpleDialog.Dialog):
164 """Implements the dialog box for scaling the video"""
165 def apply (self):
166 if self.width_mode.get() == "(specify manually)":
167 self.result = self.width_value.get()
168 else:
169 self.result = self.width_mode.get().split()[0]
170 if self.height_mode.get() == "(specify manually)":
171 self.result += ":" + self.height_value.get()
172 else:
173 self.result += ":" + self.height_mode.get().split()[0]
174 self.result += ":" + str(self.interlacing.get())
175
176 def body (self, master):
177 Tkinter.Label (master, text="Video scale parameters (simplified)", fg="darkblue").grid (column=0, row=0, columnspan=3)
178
179 Tkinter.Label (master, text="Width").grid (column=0, row=1)
180
181 self.width_mode = Tkinter.StringVar ()
182 self.width_mode.set ("(specify manually)")
183 Tkinter.OptionMenu (master, self.width_mode, "0 scaled d_width", "-1 original width", "-2 calculate from height using prescaled aspect ratio", "-3 calculate from height using original aspect ratio", "(specify manually)").grid (column=1, row=1)
184
185 self.width_value = Tkinter.StringVar ()
186 Tkinter.Entry (master, textvariable=self.width_value).grid (column=2, row=1)
187
188 Tkinter.Label (master, text="Height").grid (column=0, row=2)
189
190 self.height_mode = Tkinter.StringVar ()
191 self.height_mode.set ("(specify manually)")
192 Tkinter.OptionMenu (master, self.height_mode, "0 scaled d_height", "-1 original height", "-2 calculate from width using prescaled aspect ratio", "-3 calculate from width using original aspect ratio", "(specify manually)").grid (column=1, row=2)
193
194 self.height_value = Tkinter.StringVar ()
195 Tkinter.Entry (master, textvariable=self.height_value).grid (column=2, row=2)
196
197 self.interlacing = Tkinter.IntVar ()
198 self.interlacing.set (0)
199 Tkinter.Checkbutton (master, variable=self.interlacing, text="Interaced scaling", onvalue=1, offvalue=0).grid (column=0, row=3, columnspan=3)
200
201 class VideoFiltersDialog (tkSimpleDialog.Dialog):
202 """ Implement a dialog box to implement video filter
203 1. crop
204 2. scale
205 3. expand
206 4. force encoding duplicate frames (harddup)
207 5. picture adjustments (brightness contrast etc)"""
208 def on_crop_filter (self):
209 cropdlg = FilterCropDialog (self)
210 if cropdlg.result != None:
211 self.crop_params.set (cropdlg.result)
212 self.active_filters["crop"] = cropdlg.result
213
214 if "crop" not in self.filterlist.get(0, Tkinter.END):
215 self.filterlist.insert (Tkinter.END, "crop")
216
217 def on_scale_filter (self):
218 scaledlg = FilterScaleDialog (self)
219 if scaledlg.result != None:
220 self.scale_params.set (scaledlg.result)
221 self.active_filters["scale"] = scaledlg.result
222
223 if "scale" not in self.filterlist.get(0, Tkinter.END):
224 self.filterlist.insert (Tkinter.END, "scale")
225
226 def on_remove (self):
227 self.filterlist.delete (Tkinter.ANCHOR)
228
229 def on_softskip_filter (self):
230 if "softskip" not in self.filterlist.get (0, Tkinter.END):
231 self.filterlist.insert (Tkinter.END, "softskip")
232
233 def on_expand_filter (self):
234 expanddlg = FilterExpandDialog (self)
235 if expanddlg.result != None:
236 self.expand_params.set (expanddlg.result)
237 self.active_filters["expand"] = expanddlg.result
238
239 if "expand" not in self.filterlist.get (0, Tkinter.END):
240 self.filterlist.insert (Tkinter.END, "expand")
241
242 def on_picture_filter (self):
243 picturedlg = FilterPictureDialog (self)
244 if picturedlg.result != None:
245 self.picture_params.set (picturedlg.result)
246 self.active_filters["eq2"] = picturedlg.result
247
248 if "eq2" not in self.filterlist.get (0, Tkinter.END):
249 self.filterlist.insert (Tkinter.END, "eq2")
250
251 def apply (self):
252 self.result = ""
253 for item in self.filterlist.get (0, Tkinter.END):
254 if self.active_filters.has_key (item):
255 self.result += item + "=" + self.active_filters[item]
256 else:
257 self.result += item
258 self.result += ","
259
260 if self.harddup.get () == 1:
261 self.result += "harddup"
262 self.result = self.result.strip (",")
263
264 def body (self, master):
265 Tkinter.Label (master, text="Setup video filters (simplified)", fg="darkblue").grid (column=0, row=0, columnspan=4)
266
267 Tkinter.Label (master, text="Active filters list").grid (column=0, row=1)
268 self.filterlist = Tkinter.Listbox (master, height=5,width=30)
269 self.filterlist.grid (column=1, row=1, rowspan=6)
270 Tkinter.Button (master, text="remove", command=self.on_remove).grid(column=1,row=1)
271
272 Tkinter.Button (master, text="crop...", command=self.on_crop_filter).grid (column=2, row=2)
273
274 self.crop_params = Tkinter.StringVar ()
275 Tkinter.Label (master, textvariable=self.crop_params).grid (column=3, row=2)
276
277 Tkinter.Button (master, text="scale...", command=self.on_scale_filter).grid (column=2, row=3)
278
279 self.scale_params = Tkinter.StringVar ()
280 Tkinter.Label (master, textvariable=self.scale_params).grid (column=3, row=3)
281
282 Tkinter.Button (master, text="expand...", command=self.on_expand_filter).grid (column=2, row=4)
283
284 self.expand_params = Tkinter.StringVar ()
285 Tkinter.Label (master, textvariable=self.expand_params).grid (column=3, row=4)
286
287 Tkinter.Button (master, text="picture...", command=self.on_picture_filter).grid (column=2, row=5)
288 self.picture_params = Tkinter.StringVar ()
289 Tkinter.Label (master, textvariable=self.picture_params).grid (column=3, row=5)
290
291 Tkinter.Button (master, text="softskip", command=self.on_softskip_filter).grid (column=2, row=6)
292
293 self.harddup = Tkinter.IntVar ()
294 self.harddup.set (0)
295 Tkinter.Checkbutton (master, variable=self.harddup, text="Force duplicate frames (required for DVD-compliant MPEG-2 streams)", onvalue=1, offvalue=0).grid (column=0, row=7, columnspan=4)
296
297 self.active_filters = {}