dc3449095800aeeb45642c940610f7a7fedc1d07
[vuplus_dvbapp] / lib / python / Plugins / SystemPlugins / TransCodingSetup / plugin.py
1 from Screens.Screen import Screen
2 from Components.ConfigList import ConfigListScreen
3 from Components.config import config, getConfigListEntry, ConfigSubsection, ConfigSelection, ConfigInteger, integer_limits
4 from Components.ActionMap import ActionMap
5 from Screens.MessageBox import MessageBox
6 from Components.Sources.StaticText import StaticText
7 from Plugins.Plugin import PluginDescriptor
8 from Tools.Directories import fileExists
9 from enigma import eTimer, getDesktop
10 from os import system as os_system, path as os_path, listdir as os_listdir
11 from __init__ import _
12
13 class TconfigSelection(ConfigSelection):
14         def __init__(self, encoder, choices, default = None):
15                 self.encoder = encoder
16                 ConfigSelection.__init__(self, choices, default)
17
18 class TconfigInteger(ConfigInteger):
19         def __init__(self, encoder, default, limits = integer_limits):
20                 self.encoder = encoder
21                 ConfigInteger.__init__(self, default, limits)
22
23 def getModel():
24         filename = "/proc/stb/info/vumodel"
25         if fileExists(filename):
26                 return file(filename).read().strip()
27         return ""
28
29 def getProcValue(procPath):
30         fd = open(procPath,'r')
31         curValue = fd.read().strip(' ').strip('\n')
32         fd.close()
33 #       print "[TranscodingSetup] get %s from %s" % (curValue, procPath)
34         return curValue
35
36 def setProcValue(procPath, value):
37 #       print "[TranscodingSetup] set %s to %s" % (procPath, value)
38         fd = open(procPath,'w')
39         fd.write(value)
40         fd.close()
41
42 def getProcPath(encoder, configName):
43         _configName = {
44                 "bitrate"               :       "bitrate",
45                 "framerate"             :       "framerate",
46                 "resolution"    :       "display_format",
47                 "aspectratio"   :       "aspectratio",
48                 "audiocodec"    :       "audio_codec",
49                 "videocodec"    :       "video_codec",
50                 "gopframeb"     :       "gop_frameb",
51                 "gopframep"     :       "gop_framep",
52                 "level"                 :       "level",
53                 "profile"               :       "profile",
54                 "width"                 :       "width",
55                 "height"                :       "height",
56         }.get(configName)
57         return "/proc/stb/encoder/%s/%s" % (encoder, _configName)
58
59 def checkSupportAdvanced():
60         if fileExists( getProcPath(0, "aspectratio") ):
61                 return True
62         return False
63
64 config.plugins.transcodingsetup = ConfigSubsection()
65 config.plugins.transcodingsetup.transcoding = ConfigSelection(default = "enable", choices = [ ("enable", _("enable")), ("disable", _("disable"))] )
66 config.plugins.transcodingsetup.port = ConfigSelection(default = "8002", choices = [ ("8001", "8001"), ("8002", "8002")] )
67
68 def getAttr(attr, encoder):
69         return getattr(config.plugins.transcodingsetup, encoder == '0' and attr or "%s_%s"%(attr, encoder))
70
71 def hasAttr(attr, encoder):
72         return hasattr(config.plugins.transcodingsetup, encoder == '0' and attr or "%s_%s"%(attr, encoder))
73
74 def setAttr(attr, encoder, value):
75         setattr(config.plugins.transcodingsetup, encoder == '0' and attr or "%s_%s"%(attr, encoder), value)
76
77 def createTransCodingConfig(encoder):
78         if fileExists( getProcPath(encoder ,"bitrate") ):
79                 vumodel = getModel()
80                 if vumodel in ("solo2", "solose"):
81                         choice = TconfigInteger(encoder, default = 400000, limits = (50000, 1000000))
82                 else:
83                         choice = TconfigInteger(encoder, default = 2000000, limits = (100000, 10000000))
84                 setAttr("bitrate", encoder, choice)
85
86         if fileExists( getProcPath(encoder ,"framerate") ):
87                 choice = TconfigSelection(encoder, default = "30000", choices = [ ("23976", _("23976")), ("24000", _("24000")), ("25000", _("25000")), ("29970", _("29970")), ("30000", _("30000")), ("50000", _("50000")), ("59940", _("59940")), ("60000", _("60000"))] )
88                 setAttr("framerate", encoder, choice)
89
90         if checkSupportAdvanced() and (hasAttr("bitrate", encoder) or hasAttr("framerate", encoder)):
91                 choice = TconfigSelection(encoder, default = "Off", choices = [ ("On", _("On")), ("Off", _("Off")) ] )
92                 setAttr("automode", encoder, choice)
93
94         if fileExists( getProcPath(encoder, "resolution") ):
95                 resolutaion_choices = [ ("480p", _("480p")), ("576p", _("576p")), ("720p", _("720p")), ("320x240", _("320x240")), ("160x120", _("160x120")) ]
96                 if vumodel in ("solo4k"):
97                         resolutaion_choices.insert(3, ("1080p", _("1080p")))
98
99                 choice = TconfigSelection(encoder, default = "480p", choices = resolutaion_choices )
100                 setAttr("resolution", encoder, choice)
101
102         if fileExists( getProcPath(encoder, "aspectratio") ):
103                 choice = TconfigSelection(encoder, default = "1", choices = [ ("0", _("auto")), ("1", _("4x3")), ("2", _("16x9")) ] )
104                 setAttr("aspectratio", encoder, choice)
105
106         if fileExists( getProcPath(encoder, "audiocodec") ):
107                 choice = TconfigSelection(encoder, default = "aac", choices = [("mpg", _("mpg")), ("mp3", _("mp3")), ("aac", _("aac")), ("aac+", _("aac+")), ("aac+loas", _("aac+loas")), ("aac+adts", _("aac+adts")), ("ac3", _("ac3"))] )
108                 setAttr("audiocodec", encoder, choice)
109
110         if fileExists( getProcPath(encoder, "videocodec") ):
111                 choice = TconfigSelection(encoder, default = "h264", choices = [ ("h264", _("h264")) ] )
112                 setAttr("videocodec", encoder, choice)
113
114         if fileExists( getProcPath(encoder, "gopframeb") ):
115                 choice = TconfigInteger(encoder, default = 0, limits = (0, 60))
116                 setAttr("gopframeb", encoder, choice)
117
118         if fileExists( getProcPath(encoder, "gopframep") ):
119                 choice = TconfigInteger(encoder, default = 29, limits = (0, 60))
120                 setAttr("gopframep", encoder, choice)
121
122         if fileExists( getProcPath(encoder, "level") ):
123                 choice = TconfigSelection(encoder, default = "3.1", choices = [("1.0", _("1.0")), ("2.0", _("2.0")),
124                         ("2.1", _("2.1")), ("2.2", _("2.2")), ("3.0", _("3.0")), ("3.1", _("3.1")),
125                         ("3.2", _("3.2")), ("4.0", _("4.0")), ("4.1", _("4.1")), ("4.2", _("4.2")),
126                         ("5.0", _("5.0")), ("low", _("low")), ("main", _("main")), ("high", _("high"))] )
127                 setAttr("level", encoder, choice)
128
129         if fileExists( getProcPath(encoder, "profile") ):
130                 choice = TconfigSelection(encoder, default = "baseline", choices = [("baseline", _("baseline")), ("simple", _("simple")), ("main", _("main")), ("high", _("high")), ("advanced simple", _("advancedsimple"))] )
131                 setAttr("profile", encoder, choice)
132
133 # check encoders
134 encoders = []
135 encoderPath = "/proc/stb/encoder"
136 for encoder in os_listdir(encoderPath):
137         encPath = os_path.join(encoderPath, encoder)
138         if not os_path.isdir(encPath):
139                 continue
140         if fileExists(os_path.join(encPath, "bitrate")):
141                 encoders.append(encoder)
142                 createTransCodingConfig(encoder)
143
144 if len(encoders) > 1:
145         encoders.sort()
146         choices = []
147         for encoder in encoders:
148                 choices.append((encoder, encoder))
149         config.plugins.transcodingsetup.encoder = ConfigSelection(default = '0', choices = choices )
150
151 transcodingsetupinit = None
152 class TranscodingSetupInit:
153         def __init__(self):
154                 self.pluginsetup = None
155                 config.plugins.transcodingsetup.port.addNotifier(self.setPort)
156
157                 for encoder in encoders:
158                         if hasAttr("automode", encoder):
159                                 if getAttr("automode", encoder).value == "On":
160                                         getAttr("automode", encoder).addNotifier(self.setAutomode)
161
162                                         if hasAttr("bitrate", encoder):
163                                                 getAttr("bitrate", encoder).addNotifier(self.setBitrate, False)
164
165                                         if hasAttr("framerate", encoder):
166                                                 getAttr("framerate", encoder).addNotifier(self.setFramerate, False)
167
168                                 else: # autoMode Off
169                                         getAttr("automode", encoder).addNotifier(self.setAutomode, False)
170                                         if hasAttr("bitrate", encoder):
171                                                 getAttr("bitrate", encoder).addNotifier(self.setBitrate)
172
173                                         if hasAttr("framerate", encoder):
174                                                 getAttr("framerate", encoder).addNotifier(self.setFramerate)
175
176                         else:
177                                 if hasAttr("bitrate", encoder):
178                                         getAttr("bitrate", encoder).addNotifier(self.setBitrate)
179
180                                 if hasAttr("framerate", encoder):
181                                         getAttr("framerate", encoder).addNotifier(self.setFramerate)
182
183                         if hasAttr("resolution", encoder):
184                                 getAttr("resolution", encoder).addNotifier(self.setResolution)
185
186                         if hasAttr("aspectratio", encoder):
187                                 getAttr("aspectratio", encoder).addNotifier(self.setAspectRatio)
188
189                         if hasAttr("audiocodec", encoder):
190                                 getAttr("audiocodec", encoder).addNotifier(self.setAudioCodec)
191
192                         if hasAttr("videocodec", encoder):
193                                 getAttr("videocodec", encoder).addNotifier(self.setVideoCodec)
194
195                         if hasAttr("gopframeb", encoder):
196                                 getAttr("gopframeb", encoder).addNotifier(self.setGopFrameB)
197
198                         if hasAttr("gopframep", encoder):
199                                 getAttr("gopframep", encoder).addNotifier(self.setGopFrameP)
200
201                         if hasAttr("level", encoder):
202                                 getAttr("level", encoder).addNotifier(self.setLevel)
203
204                         if hasAttr("profile", encoder):
205                                 getAttr("profile", encoder).addNotifier(self.setProfile)
206
207         def setConfig(self, procPath, value):
208                 if not fileExists(procPath):
209                         return -1
210                 if isinstance(value, str):
211                         value = value.strip(' ').strip('\n')
212                 else:
213                         value = str(value)
214                 try:
215                         oldValue = getProcValue(procPath)
216                         if oldValue != value:
217 #                               print "[TranscodingSetup] set %s "%procPath, value
218                                 setProcValue(procPath, value)
219                                 setValue = getProcValue(procPath)
220                                 if value != setValue:
221                                         print "[TranscodingSetup] set failed. (%s > %s)" % ( value, procPath )
222                                         return -1
223
224                         # Set bitrate "-1" when automode is "ON" and display_format is changed.
225                         # At custom mode, set display_format -> width -> height -> bitrate (-1)
226                         setname = procPath.split('/')[-1]
227                         encoder = procPath.split('/')[-2]
228                         if (setname == "display_format" and value != "custom") or (setname == "height"):
229                                 if hasAttr("automode", encoder) and getAttr("automode", encoder).value == "On":
230                                         if hasAttr("bitrate", encoder):
231                                                 setProcValue(getProcPath(encoder ,"bitrate"), str(-1))
232                                         elif hasAttr("framerate", encoder):
233                                                 setProcValue(getProcPath(encoder ,"framerate"), str(-1))
234
235                         return 0
236
237                 except:
238                         print "setConfig exception error (%s > %s)" % ( value, procPath )
239                         return -1
240                 return 0
241
242         def setPort(self, configElement):
243                 port = configElement.value
244                 port2 = (port == "8001") and "8002" or "8001"
245
246 #               print "[TranscodingSetup] set port ",port
247                 try:
248                         newConfigData = ""
249                         oldConfigData = file('/etc/inetd.conf').read()
250                         for L in oldConfigData.splitlines():
251                                 try:
252                                         if L[0] == '#':
253                                                 newConfigData += L + '\n'
254                                                 continue
255                                 except: continue
256                                 LL = L.split()
257                                 if LL[5] == '/usr/bin/streamproxy':
258                                         LL[0] = port2
259                                 elif LL[5] == '/usr/bin/transtreamproxy':
260                                         LL[0] = port
261                                 newConfigData += ''.join(str(X) + " " for X in LL) + '\n'
262
263                         if newConfigData.find("transtreamproxy") == -1:
264                                 newConfigData += port + " stream tcp nowait root /usr/bin/transtreamproxy transtreamproxy\n"
265                         file('/etc/inetd.conf', 'w').write(newConfigData)
266                 except:
267                         self.showMessage("Set port failed.", MessageBox.TYPE_ERROR)
268                         return
269
270                 self.inetdRestart()
271                 if port == "8001":
272                         msg = "Set port OK.\nPC Streaming is replaced with mobile streaming."
273                         self.showMessage(msg, MessageBox.TYPE_INFO)
274
275         def setupConfig(self, configElement, procPath):
276 #               print "[TranscodingSetup] set %s to %s" % ( procPath, configElement.value )
277                 configValue = configElement.value
278                 if self.setConfig(procPath, configValue):
279                         # set config failed, reset to current proc value
280                         self.getConfigFromProc(procPath, configElement)
281                         self.showMessage("Set %s failed." % (procPath), MessageBox.TYPE_ERROR)
282
283         def getConfigFromProc(self, procPath, configElement):
284                 curValue = getProcValue(procPath)
285                 if isinstance(configElement.value, int): # is int ?
286                         curValue = int(curValue)
287                 configElement.value = curValue
288                 configElement.save()
289
290         def setAutomode(self, configElement):
291                 configName = "AutoMode"
292 #               print "[TranscodingSetup]  setAutomode, configName %s, value %s" % ( configName, configElement.value )
293                 if configElement.value == "On":
294                         autoValue = str(-1)
295                         if ((hasAttr("bitrate", configElement.encoder) and
296                                         self.setConfig(getProcPath(configElement.encoder ,"bitrate"), autoValue) ) or
297                                         (hasAttr("framerate", configElement.encoder) and
298                                         self.setConfig(getProcPath(configElement.encoder ,"framerate"), autoValue) ) ):
299                                 configElement.value = "Off" # set config failed, reset to previous value
300                                 configElement.save()
301                                 self.showMessage("Set %s failed." % (configName), MessageBox.TYPE_ERROR)
302                 else: # Off
303                         if hasAttr("bitrate", configElement.encoder):
304                                 self.setBitrate(getAttr("bitrate", configElement.encoder))
305                         if hasAttr("framerate", configElement.encoder):
306                                 self.setFramerate(getAttr("framerate", configElement.encoder))
307
308         def setBitrate(self, configElement):
309                 self.setupConfig(configElement, getProcPath(configElement.encoder ,"bitrate"))
310
311         def setFramerate(self, configElement):
312                 self.setupConfig(configElement, getProcPath(configElement.encoder ,"framerate"))
313
314         def setResolution(self, configElement):
315                 resolution = configElement.value
316                 if resolution in [ "320x240", "160x120" ]:
317                         (width, height) = tuple(resolution.split('x'))
318                         self.setConfig(getProcPath(configElement.encoder ,"resolution"), "custom")
319                         self.setConfig(getProcPath(configElement.encoder ,"width"), width)
320                         self.setConfig(getProcPath(configElement.encoder ,"height"), height)
321                 else:
322                         self.setupConfig(configElement, getProcPath(configElement.encoder ,"resolution"))
323
324         def setAspectRatio(self, configElement):
325                 self.setupConfig(configElement, getProcPath(configElement.encoder ,"aspectratio"))
326
327         def setAudioCodec(self, configElement):
328                 self.setupConfig(configElement, getProcPath(configElement.encoder ,"audiocodec"))
329
330         def setVideoCodec(self, configElement):
331                 self.setupConfig(configElement, getProcPath(configElement.encoder ,"videocodec"))
332
333         def setGopFrameB(self, configElement):
334                 self.setupConfig(configElement, getProcPath(configElement.encoder ,"gopframeb"))
335
336         def setGopFrameP(self, configElement):
337                 self.setupConfig(configElement, getProcPath(configElement.encoder ,"gopframep"))
338
339         def setLevel(self, configElement):
340                 self.setupConfig(configElement, getProcPath(configElement.encoder ,"level"))
341
342         def setProfile(self, configElement):
343                 self.setupConfig(configElement, getProcPath(configElement.encoder ,"profile"))
344
345         def inetdRestart(self):
346                 if fileExists("/etc/init.d/inetd"):
347                         os_system("/etc/init.d/inetd restart")
348                 elif fileExists("/etc/init.d/inetd.busybox"):
349                         os_system("/etc/init.d/inetd.busybox restart")
350
351         def showMessage(self, msg, msgType):
352                 if self.pluginsetup:
353                         self.pluginsetup.showMessage(msg, msgType)
354
355 class TranscodingSetup(Screen, ConfigListScreen):
356         size = getDesktop(0).size()
357         if checkSupportAdvanced():
358                 if size.width() > 750:
359                         size_h = 450
360                 else:
361                         size_h = 370
362         else:
363                 size_h = 280
364
365         pos_h = ( size_h , size_h - 150 , (size_h - 150) + 70, (size_h - 150) + 70 + 60 )
366         skin_advanced =  """
367                 <screen position="center,center" size="600,%d">
368                         <ePixmap pixmap="skin_default/buttons/red.png" position="5,0" size="140,40" alphatest="on" />
369                         <ePixmap pixmap="skin_default/buttons/green.png" position="155,0" size="140,40" alphatest="on" />
370                         <ePixmap pixmap="skin_default/buttons/yellow.png" position="305,0" size="140,40" alphatest="on" />
371                         <ePixmap pixmap="skin_default/buttons/blue.png" position="455,0" size="140,40" alphatest="on" />
372                         <widget source="key_red" render="Label" position="5,0" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" backgroundColor="#9f1313" foregroundColor="#ffffff" transparent="1" />
373                         <widget source="key_green" render="Label" position="155,0" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" backgroundColor="#1f771f" foregroundColor="#ffffff" transparent="1" />
374                         <widget source="key_yellow" render="Label" position="305,0" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" backgroundColor="#a08500" foregroundColor="#ffffff" transparent="1" />
375                         <widget source="key_blue" render="Label" position="455,0" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" backgroundColor="#18188b" foregroundColor="#ffffff" transparent="1" />
376                         <widget name="config" zPosition="2" position="25,70" size="560,%d" scrollbarMode="showOnDemand" transparent="1" />
377                         <widget source="description" render="Label" position="20,%d" size="540,60" font="Regular;20" halign="center" valign="center" />
378                         <widget source="text" render="Label" position="20,%d" size="540,20" font="Regular;22" halign="center" valign="center" />
379                 </screen>
380                 """ % pos_h
381
382         skin_normal =  """
383                 <screen position="center,center" size="600,%d">
384                         <ePixmap pixmap="skin_default/buttons/red.png" position="40,0" size="140,40" alphatest="on" />
385                         <ePixmap pixmap="skin_default/buttons/green.png" position="230,0" size="140,40" alphatest="on" />
386                         <ePixmap pixmap="skin_default/buttons/yellow.png" position="420,0" size="140,40" alphatest="on" />
387                         <widget source="key_red" render="Label" position="40,0" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" backgroundColor="#9f1313" foregroundColor="#ffffff" transparent="1" />
388                         <widget source="key_green" render="Label" position="230,0" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" backgroundColor="#1f771f" foregroundColor="#ffffff" transparent="1" />
389                         <widget source="key_yellow" render="Label" position="420,0" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" backgroundColor="#a08500" foregroundColor="#ffffff" transparent="1" />
390                         <widget name="config" zPosition="2" position="25,70" size="560,%d" scrollbarMode="showOnDemand" transparent="1" />
391                         <widget source="description" render="Label" position="20,%d" size="540,60" font="Regular;20" halign="center" valign="center" />
392                         <widget source="text" render="Label" position="20,%d" size="540,20" font="Regular;22" halign="center" valign="center" />
393                 </screen>
394                 """ % pos_h
395
396         def __init__(self,session):
397                 Screen.__init__(self,session)
398                 self.session = session
399                 self.setTitle(_("Transcoding Setup"))
400
401                 if checkSupportAdvanced():
402                         self.skin = TranscodingSetup.skin_advanced
403                 else:
404                         self.skin = TranscodingSetup.skin_normal
405
406                 vumodel = getModel()
407                 if vumodel in ("solo2", "solose", "solo4k"):
408                         TEXT = _("Transcoding and PIP are mutually exclusive.")
409                 elif vumodel == "duo2":
410                         TEXT = _("2nd transcoding and PIP are mutually exclusive.")
411                 else:
412                         TEXT = _(" ")
413
414                 self["text"] = StaticText(_("%s")%TEXT)
415
416                 self["key_red"] = StaticText(_("Cancel"))
417                 self["key_green"] = StaticText(_("Save"))
418                 self["key_yellow"] = StaticText(_("Default"))
419                 self["key_blue"] = StaticText(_("Advanced"))
420                 self["description"] = StaticText(_("Transcoding Setup"))
421
422                 self["shortcuts"] = ActionMap(["ShortcutActions", "SetupActions" ],
423                 {
424                         "cancel"        : self.keyCancel,
425                         "red"           : self.keyCancel,
426                         "green"         : self.keySave,
427                         "yellow"        : self.KeyDefault,
428                         "blue"          : self.keyBlue,
429                 }, -2)
430
431                 self.list = []
432                 ConfigListScreen.__init__(self, self.list,session = self.session)
433                 self.setupMode = "Normal" # Normal / Advanced
434                 self.encoder = None
435                 self.automode = None
436                 self.createSetup()
437                 self.onLayoutFinish.append(self.checkEncoder)
438                 self.invaliedModelTimer = eTimer()
439                 self.invaliedModelTimer.callback.append(self.invalidmodel)
440                 global transcodingsetupinit
441                 transcodingsetupinit.pluginsetup = self
442                 self.onClose.append(self.onClosed)
443
444         def onClosed(self):
445                 transcodingsetupinit.pluginsetup = None
446
447         def checkEncoder(self):
448                 if not fileExists("/proc/stb/encoder/enable"):
449                         self.invaliedModelTimer.start(100,True)
450
451         def invalidmodel(self):
452                 self.session.openWithCallback(self.close, MessageBox, _("This model is not support transcoding."), MessageBox.TYPE_ERROR)
453
454         def createSetup(self):
455                 self.list = []
456                 self.list.append(getConfigListEntry(_("Port"), config.plugins.transcodingsetup.port))
457
458                 encoder = None
459                 if len(encoders) == 1:
460                         encoder = encoders[0]
461                 elif len(encoders) > 1:
462                         self.encoder = getConfigListEntry(_("Encoder"), config.plugins.transcodingsetup.encoder)
463                         self.list.append( self.encoder )
464                         encoder = config.plugins.transcodingsetup.encoder.value                 
465
466                 if encoder is not None:
467                         self.automode = None
468                         if checkSupportAdvanced() and hasAttr('automode', encoder):
469                                 self.automode = getConfigListEntry(_("Auto set Framerate / Bitrate"), getAttr('automode', encoder))
470
471                         if self.automode is not None:
472                                 self.list.append( self.automode )
473
474                         if not ( hasAttr('automode', encoder) and getAttr('automode', encoder).value == "On" ):
475                                 if hasAttr('bitrate', encoder):
476                                         self.list.append(getConfigListEntry(_("Bitrate"), getAttr('bitrate', encoder)))
477                                 if hasAttr('framerate', encoder):
478                                         self.list.append(getConfigListEntry(_("Framerate"), getAttr('framerate', encoder)))
479
480                         if hasAttr('resolution', encoder):
481                                         self.list.append(getConfigListEntry(_("Resolution"), getAttr('resolution', encoder)))
482
483                         if checkSupportAdvanced() and self.setupMode != "Normal":
484                                 if hasAttr('aspectratio', encoder):
485                                         self.list.append(getConfigListEntry(_("Aspect Ratio"), getAttr('aspectratio', encoder)))
486
487                                 if hasAttr('audiocodec', encoder):
488                                         self.list.append(getConfigListEntry(_("Audio codec"), getAttr('audiocodec', encoder)))
489
490                                 if hasAttr('videocodec', encoder):
491                                         self.list.append(getConfigListEntry(_("Video codec"), getAttr('videocodec', encoder)))
492
493                                 if hasAttr('gopframe', encoder):
494                                         self.list.append(getConfigListEntry(_("GOP Frame B"), getAttr('gopframeb', encoder)))
495
496                                 if hasAttr('gopframep', encoder):
497                                         self.list.append(getConfigListEntry(_("GOP Frame P"), getAttr('gopframep', encoder)))
498
499                                 if hasAttr('level', encoder):
500                                         self.list.append(getConfigListEntry(_("Level"), getAttr('level', encoder)))
501
502                                 if hasAttr('profile', encoder):
503                                         self.list.append(getConfigListEntry(_("Profile"), getAttr('profile', encoder)))
504
505                 self["config"].list = self.list
506                 self["config"].l.setList(self.list)
507                 if not self.showDescription in self["config"].onSelectionChanged:
508                         self["config"].onSelectionChanged.append(self.showDescription)
509
510         def showDescription(self):
511                 configName = "<%s>\n"%self["config"].getCurrent()[0]
512                 current = self["config"].getCurrent()[1]
513                 className = self["config"].getCurrent()[1].__class__.__name__
514                 text = ""
515                 if className == "ConfigSelection" or className == "TconfigSelection":
516                         text = configName
517                         for choice in current.choices.choices:
518                                 if text == configName:  
519                                         text += choice[1]
520                                 else:
521                                         text += ', ' + choice[1]
522                 elif className == "ConfigInteger" or className == "TconfigInteger":
523                         limits = current.limits[0]
524                         text = configName
525                         text += "%s : %d, %s : %d" % (_("Min"), limits[0], _("Max"), limits[1])
526                 self["description"].setText(text)
527
528         def showMessage(self, msg, msgType = MessageBox.TYPE_ERROR):
529                 self.session.open(MessageBox, _(msg), msgType)
530
531         def saveAll(self):
532                 configs = config.plugins.transcodingsetup.dict()
533                 for (configName, configElement) in configs.items():
534                         configElement.save()
535
536         def keySave(self):
537                 self.saveAll()
538                 self.close()
539
540         def KeyDefault(self):
541                 configs = config.plugins.transcodingsetup.dict()
542                 for (configName, configElement) in configs.items():
543                         if configName.startswith("automode"):
544                                 continue
545                         configElement.value = configElement.default
546
547                 for (configName, configElement) in configs.items():
548                         if configName.startswith("automode"):
549                                 configElement.value = configElement.default
550
551                 self.createSetup()
552
553         def keyBlue(self):
554                 if not checkSupportAdvanced():
555                         return
556                 if self.setupMode == "Normal":
557                         self.setupMode = "Advanced"
558                         self["key_blue"].setText( _("Normal") )
559                 else:
560                         self.setupMode = "Normal"
561                         self["key_blue"].setText( _("Advanced") )
562                 self.createSetup()
563
564         def resetConfig(self):
565                 for x in self["config"].list:
566                         x[1].cancel()
567
568         def keyLeft(self):
569                 ConfigListScreen.keyLeft(self)
570                 if self.encoder is not None and (self["config"].getCurrent() == self.encoder) or self.automode is not None and (self["config"].getCurrent() == self.automode):
571                         self.createSetup()
572
573         def keyRight(self):
574                 ConfigListScreen.keyRight(self)
575                 if self.encoder is not None and (self["config"].getCurrent() == self.encoder) or self.automode is not None and (self["config"].getCurrent() == self.automode):
576                         self.createSetup()
577
578         def cancelConfirm(self, result):
579                 if not result:
580                         return
581
582                 configs = config.plugins.transcodingsetup.dict()
583
584                 for (configName, configElement) in configs.items():
585                         if configName.startswith("automode"):
586                                 continue
587                         configElement.cancel()
588
589                 for (configName, configElement) in configs.items():
590                         if configName.startswith("automode"):
591                                 configElement.cancel()
592
593                 self.close()
594
595         def keyCancel(self):
596                 transcodingsetupinit.pluginsetup = None
597                 if self["config"].isChanged():
598                         self.session.openWithCallback(self.cancelConfirm, MessageBox, _("Really close without saving settings?"))
599                 else:
600                         self.close()
601
602 def main(session, **kwargs):
603         session.open(TranscodingSetup)
604
605 def Plugins(**kwargs):
606         return [PluginDescriptor(name=_("TranscodingSetup"), description=_("Transcoding Setup"), where = PluginDescriptor.WHERE_PLUGINMENU, needsRestart = False, fnc=main)]
607
608 transcodingsetupinit = TranscodingSetupInit()
609