1 # Video filter dialogs for the BiaMovE application
8 class FilterPictureDialog (tkSimpleDialog
.Dialog
):
9 """Implements a picture dialog box for adjusting brightness, contrast etc."""
12 self
.result
= self
.gamma
.get () + ":" + self
.contrast
.get () + ":" + self
.brightness
.get() + ":" + self
.saturation
.get ()
14 def body (self
, master
):
15 Tkinter
.Label (master
, text
="Picture adjustments (simplified)", fg
="darkblue").grid (column
=0, row
=0, columnspan
=2)
17 Tkinter
.Label (master
, text
="Gamma correction").grid (column
=0, row
=1)
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)
24 Tkinter
.Label (master
, text
="Contrast").grid (column
=0, row
=2)
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)
32 Tkinter
.Label (master
, text
="Brightness").grid (column
=0, row
=3)
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)
40 Tkinter
.Label (master
, text
="Saturation").grid (column
=0,row
=4)
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)
48 class FilterCropDialog (tkSimpleDialog
.Dialog
):
49 """Implements the crop dialog box for cropping parts of the video"""
51 self
.result
= self
.crop_width
.get() + ":" + self
.crop_height
.get()
55 if self
.center_width
.get() == 0:
56 self
.result
+= self
.horizontal
.get ()
58 if self
.center_height
.get() == 0:
59 self
.result
+= self
.vertical
.get ()
61 self
.result
= self
.result
.strip (":")
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)
67 self
.crop_width
= Tkinter
.StringVar ()
68 Tkinter
.Entry (master
, textvariable
=self
.crop_width
).grid (column
=1, row
=1)
70 Tkinter
.Label (master
, text
="Height").grid (column
=0, row
=2)
72 self
.crop_height
= Tkinter
.StringVar ()
73 Tkinter
.Entry (master
, textvariable
=self
.crop_height
).grid (column
=1, row
=2)
75 Tkinter
.Label (master
, text
="Position of video in cropped frame", fg
="darkblue").grid (column
=0, row
=3, columnspan
=2)
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)
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)
85 Tkinter
.Label (master
, text
="Horizontal position").grid (column
=0, row
=5)
87 self
.horizontal
= Tkinter
.StringVar ()
88 Tkinter
.Entry (master
, textvariable
=self
.horizontal
).grid (column
=1, row
=5)
90 Tkinter
.Label (master
, text
="Vertical position").grid (column
=0, row
=6)
92 self
.vertical
= Tkinter
.StringVar ()
93 Tkinter
.Entry (master
, textvariable
=self
.vertical
).grid (column
=1, row
=6)
95 class FilterExpandDialog (tkSimpleDialog
.Dialog
):
96 """Implements the expand dialog box for expanding the video"""
98 if self
.relative_width
.get() == 1:
99 self
.result
= "-" + self
.expand_width
.get()
101 self
.result
= self
.expand_width
.get()
102 if self
.relative_height
.get() == 1:
103 self
.result
+= ":-" + self
.expand_height
.get()
105 self
.result
+= ":" + self
.expand_height
.get()
108 if self
.center_width
.get() == 0:
109 self
.result
+= self
.horizontal
.get()
111 if self
.center_height
.get() == 0:
112 self
.result
+= self
.vertical
.get()
114 self
.result
+= ":" + str (self
.osdsubtitle
.get())
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)
121 self
.expand_width
= Tkinter
.StringVar ()
122 Tkinter
.Entry (master
, textvariable
=self
.expand_width
).grid (column
=1, row
=1)
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)
128 Tkinter
.Label (master
, text
="Height").grid (column
=0, row
=2)
130 self
.expand_height
= Tkinter
.StringVar ()
131 Tkinter
.Entry (master
, textvariable
=self
.expand_height
).grid (column
=1, row
=2)
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)
137 Tkinter
.Label (master
, text
="Position of video in expanded frame", fg
="darkblue").grid (column
=0, row
=3, columnspan
=3)
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)
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)
147 Tkinter
.Label (master
, text
="Horizontal position").grid (column
=0, row
=5)
149 self
.horizontal
= Tkinter
.StringVar ()
150 self
.horizontal
.set (0)
151 Tkinter
.Entry (master
, textvariable
=self
.horizontal
).grid (column
=1, row
=5)
153 Tkinter
.Label (master
, text
="Vertical position").grid (column
=0, row
=6)
155 self
.vertical
= Tkinter
.StringVar ()
156 self
.vertical
.set (0)
157 Tkinter
.Entry (master
, textvariable
=self
.vertical
).grid (column
=1, row
=6)
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)
163 class FilterScaleDialog (tkSimpleDialog
.Dialog
):
164 """Implements the dialog box for scaling the video"""
166 if self
.width_mode
.get() == "(specify manually)":
167 self
.result
= self
.width_value
.get()
169 self
.result
= self
.width_mode
.get().split()[0]
170 if self
.height_mode
.get() == "(specify manually)":
171 self
.result
+= ":" + self
.height_value
.get()
173 self
.result
+= ":" + self
.height_mode
.get().split()[0]
174 self
.result
+= ":" + str(self
.interlacing
.get())
176 def body (self
, master
):
177 Tkinter
.Label (master
, text
="Video scale parameters (simplified)", fg
="darkblue").grid (column
=0, row
=0, columnspan
=3)
179 Tkinter
.Label (master
, text
="Width").grid (column
=0, row
=1)
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)
185 self
.width_value
= Tkinter
.StringVar ()
186 Tkinter
.Entry (master
, textvariable
=self
.width_value
).grid (column
=2, row
=1)
188 Tkinter
.Label (master
, text
="Height").grid (column
=0, row
=2)
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)
194 self
.height_value
= Tkinter
.StringVar ()
195 Tkinter
.Entry (master
, textvariable
=self
.height_value
).grid (column
=2, row
=2)
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)
201 class VideoFiltersDialog (tkSimpleDialog
.Dialog
):
202 """ Implement a dialog box to implement video filter
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
214 if "crop" not in self
.filterlist
.get(0, Tkinter
.END
):
215 self
.filterlist
.insert (Tkinter
.END
, "crop")
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
223 if "scale" not in self
.filterlist
.get(0, Tkinter
.END
):
224 self
.filterlist
.insert (Tkinter
.END
, "scale")
226 def on_remove (self
):
227 self
.filterlist
.delete (Tkinter
.ANCHOR
)
229 def on_softskip_filter (self
):
230 if "softskip" not in self
.filterlist
.get (0, Tkinter
.END
):
231 self
.filterlist
.insert (Tkinter
.END
, "softskip")
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
239 if "expand" not in self
.filterlist
.get (0, Tkinter
.END
):
240 self
.filterlist
.insert (Tkinter
.END
, "expand")
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
248 if "eq2" not in self
.filterlist
.get (0, Tkinter
.END
):
249 self
.filterlist
.insert (Tkinter
.END
, "eq2")
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
]
260 if self
.harddup
.get () == 1:
261 self
.result
+= "harddup"
262 self
.result
= self
.result
.strip (",")
264 def body (self
, master
):
265 Tkinter
.Label (master
, text
="Setup video filters (simplified)", fg
="darkblue").grid (column
=0, row
=0, columnspan
=4)
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)
272 Tkinter
.Button (master
, text
="crop...", command
=self
.on_crop_filter
).grid (column
=2, row
=2)
274 self
.crop_params
= Tkinter
.StringVar ()
275 Tkinter
.Label (master
, textvariable
=self
.crop_params
).grid (column
=3, row
=2)
277 Tkinter
.Button (master
, text
="scale...", command
=self
.on_scale_filter
).grid (column
=2, row
=3)
279 self
.scale_params
= Tkinter
.StringVar ()
280 Tkinter
.Label (master
, textvariable
=self
.scale_params
).grid (column
=3, row
=3)
282 Tkinter
.Button (master
, text
="expand...", command
=self
.on_expand_filter
).grid (column
=2, row
=4)
284 self
.expand_params
= Tkinter
.StringVar ()
285 Tkinter
.Label (master
, textvariable
=self
.expand_params
).grid (column
=3, row
=4)
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)
291 Tkinter
.Button (master
, text
="softskip", command
=self
.on_softskip_filter
).grid (column
=2, row
=6)
293 self
.harddup
= Tkinter
.IntVar ()
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)
297 self
.active_filters
= {}