]> git.plutz.net Git - viper/blob - plugins/v_x264.py
be10c127dab2cf6ab7b544db2a54fbd4d61c2900
[viper] / plugins / v_x264.py
1 #encoding: utf-8
2 #Copyright 2011 Paul Hänsch
3
4 #This file is part of Viper.
5
6 #Viper is free software: you can redistribute it and/or modify
7 #it under the terms of the GNU General Public License as published by
8 #the Free Software Foundation, either version 3 of the License, or
9 #(at your option) any later version.
10
11 #Viper is distributed in the hope that it will be useful,
12 #but WITHOUT ANY WARRANTY; without even the implied warranty of
13 #MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14 #GNU General Public License for more details.
15
16 #You should have received a copy of the GNU General Public License
17 #along with Viper.  If not, see <http://www.gnu.org/licenses/>
18
19 from plugin import *
20
21 class V_x264(V_Plugin):
22     def build_dialog(self):
23         self.subgets['l_profile'] = Label(self, text = 'Profile:')
24         self.subgets['l_profile'].grid(row = 0, column = 0)
25         self.subgets['o_profile'] = Pmw.OptionMenu(self, initialitem = 2,
26                                                 items = ['baseline', 'main', 'high'])
27         self.subgets['o_profile'].grid(row = 1, column = 0)
28
29         self.subgets['l_preset'] = Label(self, text = 'Preset:')
30         self.subgets['l_preset'].grid(row = 0, column = 1)
31         self.subgets['o_preset'] = Pmw.OptionMenu(self, initialitem = 5,
32                                                 items = ['ultrafast', 'superfast', 'veryfast', 'faster',
33                                                          'fast', 'medium', 'slow', 'slower', 'veryslow',
34                                                          'placebo'])
35         self.subgets['o_preset'].grid(row = 1, column = 1)
36
37         self.subgets['l_keyint'] = Label(self, text = 'Keyframe\nInterval:')
38         self.subgets['l_keyint'].grid(row = 0, column = 2)
39         self.subgets['s_keyint'] = Spinbox(self, from_ = 1, to = 2000, increment = 25, width = 5)
40         self.subgets['s_keyint'].delete(0, END)
41         self.subgets['s_keyint'].insert(END, 250)
42         self.subgets['s_keyint'].grid(row = 1, column = 2)
43
44         self.subgets['psy'] = False
45         self.subgets['c_psy'] = Checkbutton(self, text = 'Psychovisual\nOptimization:', command = self.c_psy)
46         self.subgets['c_psy'].deselect()
47         self.subgets['c_psy'].grid(row = 0, column = 3)
48         self.subgets['o_psy'] = Pmw.OptionMenu(self, initialitem = 0, items = ['          '])
49         self.subgets['o_psy'].grid(row = 1, column = 3)
50
51         self.subgets['bitrate'] = False
52         self.subgets['c_bitrate'] = Checkbutton(self, text = 'Force avg.\nBitrate:', command = self.c_bitrate)
53         self.subgets['c_bitrate'].deselect()
54         self.subgets['c_bitrate'].grid(row = 0, column = 4)
55         self.subgets['s_bitrate'] = Spinbox(self, from_ = 0, to = 20000, increment = 100, width = 6)
56         self.subgets['s_bitrate'].delete(0, END)
57         self.subgets['s_bitrate'].insert(END, 4000)
58         self.subgets['s_bitrate'].config(state = 'disabled')
59         self.subgets['s_bitrate'].grid(row = 1, column = 4)
60
61         self.subgets['fastdecode'] = False
62         self.subgets['c_fastdecode'] = Checkbutton(self, text = 'Fastdecode', command = self.c_fastdecode)
63         self.subgets['c_fastdecode'].deselect()
64         self.subgets['c_fastdecode'].grid(row = 2, column = 1, columnspan = 2)
65
66         self.subgets['zerolatency'] = False
67         self.subgets['c_zerolatency'] = Checkbutton(self, text = 'Zerolatency', command = self.c_zerolatency)
68         self.subgets['c_zerolatency'].deselect()
69         self.subgets['c_zerolatency'].grid(row = 2, column = 3, columnspan = 2)
70
71     def c_psy(self):
72         if self.subgets['psy']:
73             self.subgets['o_psy'].setitems(['          '])
74         else:
75             self.subgets['o_psy'].setitems(['film', 'animation', 'grain', 'stillimage', 'psnr', 'ssim'])
76         self.subgets['psy'] = not self.subgets['psy']
77
78     def c_bitrate(self):
79         if self.subgets['bitrate']:
80             self.subgets['s_bitrate'].config(state = 'disabled')
81         else:
82             self.subgets['s_bitrate'].config(state = 'normal')
83         self.subgets['bitrate'] = not self.subgets['bitrate']
84
85     def c_fastdecode(self):
86         self.subgets['fastdecode'] = not self.subgets['fastdecode']
87
88     def c_zerolatency(self):
89         self.subgets['zerolatency'] = not self.subgets['zerolatency']
90
91     def name(self):
92         return 'h264 (via x264)'
93
94     def subcommand(self):
95         opts = ('profile=' + self.subgets['o_profile'].getvalue() + 
96                 ':preset=' + self.subgets['o_preset'].getvalue() + 
97                 ':keyint=' + self.subgets['s_keyint'].get())
98         if self.subgets['psy']:
99             opts += ':tune=' + self.subgets['o_psy'].getvalue()
100             if self.subgets['fastdecode']:
101                 opts += ',fastdecode'
102             if self.subgets['zerolatency']:
103                 opts += ',zerolatency'
104         elif self.subgets['fastdecode'] and self.subgets['zerolatency']:
105             opts += ':tune=fastdecode,zerolatency'
106         elif self.subgets['fastdecode']:
107             opts += ':tune=fastdecode'
108         elif self.subgets['zerolatency']:
109             opts += ':tune=zerolatency'
110         
111         return ['-ovc', 'x264', '-x264encopts', opts]
112
113     def is_available(self):
114         result = False
115         slave = os.popen2(['mencoder', '-ovc', 'help'])
116         line = '#'
117         while line != '':
118             line = slave[1].readline()
119             if line.lstrip().find('x264') == 0:
120                 result = True
121         return result