1 from Screens.Screen import Screen
2 from Plugins.Plugin import PluginDescriptor
4 from enigma import eTimer
6 from Components.ActionMap import ActionMap
7 from Components.Label import Label
8 from Components.Pixmap import Pixmap
9 from Screens.MessageBox import MessageBox
10 from Screens.Setup import SetupSummary
11 from Components.ConfigList import ConfigListScreen
12 from Components.config import getConfigListEntry, config, ConfigNothing, ConfigSelection, ConfigSubDict
14 from Tools.CList import CList
16 # The "VideoHardware" is the interface to /proc/stb/video.
17 # It generates hotplug events, and gives you the list of
18 # available and preferred modes, as well as handling the currently
19 # selected mode. No other strict checking is done.
21 rates = { } # high-level, use selectable modes.
23 modes = { } # a list of (high-level) modes for a certain port.
25 rates["PAL"] = { "50Hz": { 50: "pal", 60: "pal"},
26 "60Hz": { 50: "pal60", 60: "pal60"},
27 "multi": { 50: "pal", 60: "pal60"} }
28 rates["NTSC"] = { "60Hz": { 50: "ntsc", 60: "ntsc"} }
29 rates["Multi"] = { "multi": { 50: "pal", 60: "ntsc"} }
30 rates["720p"] = { "50Hz": { 50: "720p50", 60: "720p50"},
31 "60Hz": { 50: "720p", 60: "720p"},
32 "multi": { 50: "720p50", 60: "720p"} }
33 rates["1080i"] = { "50Hz": { 50: "1080i50", 60: "1080i50"},
34 "60Hz": { 50: "1080i", 60: "1080i"},
35 "multi": { 50: "1080i50", 60: "1080i"} }
37 "1024x768": { 60: "1024x768"}, # not possible on DM7025
38 "800x600" : { 60: "800x600"}, # also not possible
39 "720x480" : { 60: "720x480"},
40 "720x576" : { 60: "720x576"},
41 "1280x720": { 60: "1280x720"},
42 "1280x720 multi": { 50: "1280x720_50", 60: "1280x720"},
43 "1920x1080": { 60: "1920x1080"},
44 "1920x1080 multi": { 50: "1920x1080", 60: "1920x1080_50"},
45 "1280x1024" : { 60: "1280x1024"},
46 "640x480" : { 60: "640x480"}
49 modes["Scart"] = ["PAL", "NTSC", "Multi"]
50 modes["YPrPb"] = ["720p", "1080i"]
51 modes["DVI"] = ["720p", "1080i", "PC"]
54 self.last_modes_preferred = [ ]
55 self.on_hotplug = CList()
57 self.on_hotplug.append(self.createConfig)
58 self.ignore_preferred = False # "edid override"
60 self.readAvailableModes()
61 self.readPreferredModes()
63 # until we have the hotplug poll socket
65 self.timer.timeout.get().append(self.readAvailableModes)
66 self.timer.start(1000)
68 def readAvailableModes(self):
70 modes = open("/proc/stb/video/videomode_choices").read()[:-1]
72 print "couldn't read available videomodes."
73 self.modes_available = [ ]
75 self.modes_available = modes.split(' ')
77 def readPreferredModes(self):
79 modes = open("/proc/stb/video/videomode_preferred").read()[:-1]
80 self.modes_preferred = modes.split(' ')
82 print "reading preferred modes failed, using all modes"
83 self.modes_preferred = self.modes_available
85 if self.modes_preferred != self.last_modes_preferred:
86 self.last_modes_preferred = self.modes_preferred
87 self.on_hotplug("DVI") # must be DVI
89 # check if a high-level mode with a given rate is available.
90 def isModeAvailable(self, port, mode, rate):
91 rate = self.rates[mode][rate]
92 for mode in rate.values():
93 # DVI modes must be in "modes_preferred"
95 if mode not in self.modes_preferred and not self.ignore_preferred:
97 if mode not in self.modes_available:
101 def setMode(self, port, mode, rate):
102 # we can ignore "port"
103 self.current_mode = mode
104 modes = self.rates[mode][rate]
106 mode_50 = modes.get(50)
107 mode_60 = modes.get(60)
114 open("/proc/stb/video/videomode_60hz", "w").write(mode_50)
115 open("/proc/stb/video/videomode_50hz", "w").write(mode_60)
118 # fallback if no possibility to setup 50/60 hz mode
119 open("/proc/stb/video/videomode", "w").write(mode_50)
121 print "setting videomode failed."
123 def isPortAvailable(self, port):
127 def getPortList(self):
128 return [port for port in self.modes if self.isPortAvailable(port)]
130 # get a list with all modes, with all rates, for a given port.
131 def getModeList(self, port):
133 for mode in self.modes[port]:
134 # list all rates which are completely valid
135 rates = [rate for rate in self.rates[mode] if self.isModeAvailable(port, mode, rate)]
137 # if at least one rate is ok, add this mode
139 res.append( (mode, rates) )
142 def createConfig(self, *args):
143 # create list of output ports
144 portlist = self.getPortList()
146 # create list of available modes
147 config.av.videoport = ConfigSelection(choices = [(port, _(port)) for port in portlist])
148 config.av.videomode = ConfigSubDict()
149 config.av.videorate = ConfigSubDict()
151 for port in portlist:
152 modes = self.getModeList(port)
154 config.av.videomode[port] = ConfigSelection(choices = [mode for (mode, rates) in modes])
155 for (mode, rates) in modes:
156 config.av.videorate[mode] = ConfigSelection(choices = rates)
158 video_hw = VideoHardware()