vdr  2.2.0
setup.c
Go to the documentation of this file.
1 /*
2  * setup.c: Setup for the DVB HD Full Featured On Screen Display
3  *
4  * See the README file for copyright information and how to reach the author.
5  */
6 
7 #include "setup.h"
8 #include "hdffcmd.h"
9 
10 const int kResolution1080i = 0;
11 const int kResolution720p = 1;
12 const int kResolution576p = 2;
13 const int kResolution576i = 3;
14 
15 
17 
19 {
25  AudioDelay = 0;
27  AvSyncShift = 0;
28  OsdSize = 0;
29  CecEnabled = 1;
30  CecTvOn = 1;
31  CecTvOff = 0;
32  RemoteProtocol = 1;
33  RemoteAddress = -1;
34  HighLevelOsd = 1;
35  TrueColorOsd = 1;
36  TrueColorFormat = 0;
37  HideMainMenu = 0;
38 }
39 
40 bool cHdffSetup::SetupParse(const char *Name, const char *Value)
41 {
42  if (strcmp(Name, "Resolution") == 0) Resolution = atoi(Value);
43  else if (strcmp(Name, "VideoModeAdaption") == 0) VideoModeAdaption = atoi(Value);
44  else if (strcmp(Name, "TvFormat") == 0) TvFormat = atoi(Value);
45  else if (strcmp(Name, "VideoConversion") == 0) VideoConversion = atoi(Value);
46  else if (strcmp(Name, "AnalogueVideo") == 0) AnalogueVideo = atoi(Value);
47  else if (strcmp(Name, "AudioDelay") == 0) AudioDelay = atoi(Value);
48  else if (strcmp(Name, "AudioDownmix") == 0) AudioDownmix = atoi(Value);
49  else if (strcmp(Name, "AvSyncShift") == 0) AvSyncShift = atoi(Value);
50  else if (strcmp(Name, "OsdSize") == 0) OsdSize = atoi(Value);
51  else if (strcmp(Name, "CecEnabled") == 0) CecEnabled = atoi(Value);
52  else if (strcmp(Name, "CecTvOn") == 0) CecTvOn = atoi(Value);
53  else if (strcmp(Name, "CecTvOff") == 0) CecTvOff = atoi(Value);
54  else if (strcmp(Name, "RemoteProtocol") == 0) RemoteProtocol = atoi(Value);
55  else if (strcmp(Name, "RemoteAddress") == 0) RemoteAddress = atoi(Value);
56  else if (strcmp(Name, "HighLevelOsd") == 0) HighLevelOsd = atoi(Value);
57  else if (strcmp(Name, "TrueColorOsd") == 0) TrueColorOsd = atoi(Value);
58  else if (strcmp(Name, "TrueColorFormat") == 0) TrueColorFormat = atoi(Value);
59  else if (strcmp(Name, "HideMainMenu") == 0) HideMainMenu = atoi(Value);
60  else return false;
61  return true;
62 }
63 
64 void cHdffSetup::GetOsdSize(int &Width, int &Height, double &PixelAspect)
65 {
66  if (OsdSize == 0) {
68  Width = 1920;
69  Height = 1080;
70  }
71  else if (Resolution == kResolution720p) {
72  Width = 1280;
73  Height = 720;
74  }
75  else {
76  Width = 720;
77  Height = 576;
78  }
80  PixelAspect = 16.0 / 9.0;
81  else
82  PixelAspect = 4.0 / 3.0;
83  }
84  else if (OsdSize == 1) {
85  Width = 1920;
86  Height = 1080;
87  PixelAspect = 16.0 / 9.0;
88  }
89  else if (OsdSize == 2) {
90  Width = 1280;
91  Height = 720;
92  PixelAspect = 16.0 / 9.0;
93  }
94  else if (OsdSize == 3) {
95  Width = 1024;
96  Height = 576;
97  PixelAspect = 16.0 / 9.0;
98  }
99  else {
100  Width = 720;
101  Height = 576;
102  PixelAspect = 4.0 / 3.0;
103  }
104  PixelAspect /= double(Width) / Height;
105 }
106 
108 {
109  switch (Resolution)
110  {
111  case kResolution1080i:
112  default:
114  case kResolution720p:
115  return HDFF_VIDEO_MODE_720P50;
116  case kResolution576p:
117  return HDFF_VIDEO_MODE_576P50;
118  case kResolution576i:
119  return HDFF_VIDEO_MODE_576I50;
120  }
121 }
122 
124 {
125  int nextVideoConversion = HDFF_VIDEO_CONVERSION_AUTOMATIC;
126 
128  {
129  switch (VideoConversion)
130  {
132  nextVideoConversion = HDFF_VIDEO_CONVERSION_CENTRE_CUT_OUT;
133  break;
135  nextVideoConversion = HDFF_VIDEO_CONVERSION_ALWAYS_16_BY_9;
136  break;
138  nextVideoConversion = HDFF_VIDEO_CONVERSION_ZOOM_16_BY_9;
139  break;
141  nextVideoConversion = HDFF_VIDEO_CONVERSION_PILLARBOX;
142  break;
143  }
144  }
145  else
146  {
147  switch (VideoConversion)
148  {
150  nextVideoConversion = HDFF_VIDEO_CONVERSION_LETTERBOX_14_BY_9;
151  break;
153  nextVideoConversion = HDFF_VIDEO_CONVERSION_CENTRE_CUT_OUT;
154  break;
156  nextVideoConversion = HDFF_VIDEO_CONVERSION_LETTERBOX_16_BY_9;
157  break;
158  }
159  }
160  VideoConversion = nextVideoConversion;
161 }
162 
164 {
165  switch (VideoConversion)
166  {
168  default:
169  return tr("Automatic");
171  return tr("Letterbox 16/9");
173  return tr("Letterbox 14/9");
175  return tr("Pillarbox");
177  return tr("CentreCutOut");
179  return tr("Always 16/9");
181  return tr("Zoom 16/9");
182  }
183 }
184 
186 {
187  HdffVideoFormat_t videoFormat;
188 
189  videoFormat.AutomaticEnabled = true;
190  videoFormat.AfdEnabled = false;
191  videoFormat.TvFormat = (HdffTvFormat_t) TvFormat;
193  HdffCmdIf->CmdAvSetVideoFormat(0, &videoFormat);
194 }
195 
197 {
198  const int kResolutions = 4;
199  const int kVideoModeAdaptions = 4;
200  const int kTvFormats = 2;
201  const int kAnalogueVideos = 4;
202  const int kAudioDownmixes = 5;
203  const int kOsdSizes = 5;
204  const int kRemoteProtocols = 3;
205  const int kTrueColorFormats = 3;
206 
207  static const char * ResolutionItems[kResolutions] =
208  {
209  "1080i",
210  "720p",
211  "576p",
212  "576i",
213  };
214 
215  static const char * VideoModeAdaptionItems[kVideoModeAdaptions] =
216  {
217  tr("Off"),
218  tr("Frame rate"),
219  tr("HD Only"),
220  tr("Always")
221  };
222 
223  static const char * TvFormatItems[kTvFormats] =
224  {
225  "4/3",
226  "16/9",
227  };
228 
229  static const char * AnalogueVideoItems[kAnalogueVideos] =
230  {
231  tr("Disabled"),
232  "RGB",
233  "CVBS + YUV",
234  "YC (S-Video)",
235  };
236 
237  static const char * AudioDownmixItems[kAudioDownmixes] =
238  {
239  tr("Disabled"),
240  tr("Analogue only"),
241  tr("Always"),
242  tr("Automatic"),
243  tr("HDMI only"),
244  };
245 
246  static const char * OsdSizeItems[kOsdSizes] =
247  {
248  tr("Follow resolution"),
249  "1920x1080",
250  "1280x720",
251  "1024x576",
252  "720x576",
253  };
254 
255  static const char * RemoteProtocolItems[] =
256  {
257  tr("none"),
258  "RC5",
259  "RC6",
260  };
261 
262  static const char * TrueColorFormatItems[kTrueColorFormats] =
263  {
264  "ARGB8888",
265  "ARGB8565",
266  "ARGB4444",
267  };
268 
269  mHdffCmdIf = pHdffCmdIf;
270  mNewHdffSetup = gHdffSetup;
271 
272  Add(new cMenuEditStraItem(tr("Resolution"), &mNewHdffSetup.Resolution, kResolutions, ResolutionItems));
273  Add(new cMenuEditStraItem(tr("Video Mode Adaption"), &mNewHdffSetup.VideoModeAdaption, kVideoModeAdaptions, VideoModeAdaptionItems));
274  mTvFormatItem = new cMenuEditStraItem(tr("TV format"), &mNewHdffSetup.TvFormat, kTvFormats, TvFormatItems);
275  Add(mTvFormatItem);
276  Add(new cMenuEditStraItem(tr("Analogue Video"), &mNewHdffSetup.AnalogueVideo, kAnalogueVideos, AnalogueVideoItems));
277  Add(new cMenuEditIntItem(tr("Audio Delay (ms)"), &mNewHdffSetup.AudioDelay, 0, 500));
278  Add(new cMenuEditStraItem(tr("Audio Downmix"), &mNewHdffSetup.AudioDownmix, kAudioDownmixes, AudioDownmixItems));
279  Add(new cMenuEditIntItem(tr("A/V Sync Shift (ms)"), &mNewHdffSetup.AvSyncShift, -500, 500));
280  Add(new cMenuEditStraItem(tr("OSD Size"), &mNewHdffSetup.OsdSize, kOsdSizes, OsdSizeItems));
281  Add(new cMenuEditBoolItem(tr("HDMI CEC"), &mNewHdffSetup.CecEnabled));
282  Add(new cMenuEditBoolItem(tr("CEC: Switch TV on"), &mNewHdffSetup.CecTvOn));
283  Add(new cMenuEditBoolItem(tr("CEC: Switch TV off"), &mNewHdffSetup.CecTvOff));
284  Add(new cMenuEditStraItem(tr("Remote Control Protocol"), &mNewHdffSetup.RemoteProtocol, kRemoteProtocols, RemoteProtocolItems));
285  Add(new cMenuEditIntItem(tr("Remote Control Address"), &mNewHdffSetup.RemoteAddress, -1, 31));
286  Add(new cMenuEditBoolItem(tr("High Level OSD"), &mNewHdffSetup.HighLevelOsd));
287  Add(new cMenuEditBoolItem(tr("Allow True Color OSD"), &mNewHdffSetup.TrueColorOsd));
288  Add(new cMenuEditStraItem(tr("True Color format"), &mNewHdffSetup.TrueColorFormat, kTrueColorFormats, TrueColorFormatItems));
289  Add(new cMenuEditBoolItem(tr("Hide mainmenu entry"), &mNewHdffSetup.HideMainMenu));
290 
291  mVideoConversion = 0;
292  if (mNewHdffSetup.TvFormat == HDFF_TV_FORMAT_16_BY_9)
293  {
294  switch (mNewHdffSetup.VideoConversion)
295  {
297  mVideoConversion = 0;
298  break;
300  mVideoConversion = 1;
301  break;
303  mVideoConversion = 2;
304  break;
306  mVideoConversion = 3;
307  break;
308  }
309  }
310  else
311  {
312  switch (mNewHdffSetup.VideoConversion)
313  {
315  mVideoConversion = 0;
316  break;
318  mVideoConversion = 1;
319  break;
321  mVideoConversion = 2;
322  break;
323  }
324  }
325  BuildVideoConversionItem();
326 }
327 
329 {
330 }
331 
333 {
334  const int kVideoConversions4by3 = 3;
335  const int kVideoConversions16by9 = 4;
336 
337  static const char * VideoConversionItems4by3[kVideoConversions4by3] =
338  {
339  tr("Letterbox 16/9"),
340  tr("Letterbox 14/9"),
341  tr("CentreCutOut")
342  };
343 
344  static const char * VideoConversionItems16by9[kVideoConversions16by9] =
345  {
346  tr("Pillarbox"),
347  tr("CentreCutOut"),
348  tr("Always 16/9"),
349  tr("Zoom 16/9")
350  };
351 
352  cOsdItem * item;
353 
354  cList<cOsdItem>::Del(mTvFormatItem->Next());
355  if (mNewHdffSetup.TvFormat == HDFF_TV_FORMAT_16_BY_9)
356  {
357  item = new cMenuEditStraItem(tr("Video Conversion"), &mVideoConversion,
358  kVideoConversions16by9, VideoConversionItems16by9);
359  }
360  else
361  {
362  item = new cMenuEditStraItem(tr("Video Conversion"), &mVideoConversion,
363  kVideoConversions4by3, VideoConversionItems4by3);
364  }
365  Add(item, false, mTvFormatItem);
366 }
367 
369 {
370  if (mNewHdffSetup.TvFormat == HDFF_TV_FORMAT_16_BY_9)
371  {
372  switch (mVideoConversion)
373  {
374  case 0:
375  mNewHdffSetup.VideoConversion = HDFF_VIDEO_CONVERSION_PILLARBOX;
376  break;
377  case 1:
378  mNewHdffSetup.VideoConversion = HDFF_VIDEO_CONVERSION_CENTRE_CUT_OUT;
379  break;
380  case 2:
381  mNewHdffSetup.VideoConversion = HDFF_VIDEO_CONVERSION_ALWAYS_16_BY_9;
382  break;
383  case 3:
384  mNewHdffSetup.VideoConversion = HDFF_VIDEO_CONVERSION_ZOOM_16_BY_9;
385  break;
386  }
387  }
388  else
389  {
390  switch (mVideoConversion)
391  {
392  case 0:
393  mNewHdffSetup.VideoConversion = HDFF_VIDEO_CONVERSION_LETTERBOX_16_BY_9;
394  break;
395  case 1:
396  mNewHdffSetup.VideoConversion = HDFF_VIDEO_CONVERSION_LETTERBOX_14_BY_9;
397  break;
398  case 2:
399  mNewHdffSetup.VideoConversion = HDFF_VIDEO_CONVERSION_CENTRE_CUT_OUT;
400  break;
401  }
402  }
403  SetupStore("Resolution", mNewHdffSetup.Resolution);
404  SetupStore("VideoModeAdaption", mNewHdffSetup.VideoModeAdaption);
405  SetupStore("TvFormat", mNewHdffSetup.TvFormat);
406  SetupStore("VideoConversion", mNewHdffSetup.VideoConversion);
407  SetupStore("AnalogueVideo", mNewHdffSetup.AnalogueVideo);
408  SetupStore("AudioDelay", mNewHdffSetup.AudioDelay);
409  SetupStore("AudioDownmix", mNewHdffSetup.AudioDownmix);
410  SetupStore("AvSyncShift", mNewHdffSetup.AvSyncShift);
411  SetupStore("OsdSize", mNewHdffSetup.OsdSize);
412  SetupStore("CecEnabled", mNewHdffSetup.CecEnabled);
413  SetupStore("CecTvOn", mNewHdffSetup.CecTvOn);
414  SetupStore("CecTvOff", mNewHdffSetup.CecTvOff);
415  SetupStore("RemoteProtocol", mNewHdffSetup.RemoteProtocol);
416  SetupStore("RemoteAddress", mNewHdffSetup.RemoteAddress);
417  SetupStore("HighLevelOsd", mNewHdffSetup.HighLevelOsd);
418  SetupStore("TrueColorOsd", mNewHdffSetup.TrueColorOsd);
419  SetupStore("TrueColorFormat", mNewHdffSetup.TrueColorFormat);
420  SetupStore("HideMainMenu", mNewHdffSetup.HideMainMenu);
421 
422  if (mHdffCmdIf)
423  {
424  if (mNewHdffSetup.Resolution != gHdffSetup.Resolution)
425  {
426  mHdffCmdIf->CmdHdmiSetVideoMode(mNewHdffSetup.GetVideoMode());
427  }
428  HdffHdmiConfig_t hdmiConfig;
429 
430  mNewHdffSetup.SetVideoFormat(mHdffCmdIf);
431 
432  mHdffCmdIf->CmdAvSetAudioDelay(mNewHdffSetup.AudioDelay);
433  mHdffCmdIf->CmdAvSetAudioDownmix((HdffAudioDownmixMode_t) mNewHdffSetup.AudioDownmix);
434  mHdffCmdIf->CmdAvSetSyncShift(mNewHdffSetup.AvSyncShift);
435 
436  mHdffCmdIf->CmdMuxSetVideoOut((HdffVideoOut_t) mNewHdffSetup.AnalogueVideo);
437 
438  memset(&hdmiConfig, 0, sizeof(hdmiConfig));
439  hdmiConfig.TransmitAudio = true;
440  hdmiConfig.ForceDviMode = false;
441  hdmiConfig.CecEnabled = mNewHdffSetup.CecEnabled;
442  hdmiConfig.VideoModeAdaption = (HdffVideoModeAdaption_t) mNewHdffSetup.VideoModeAdaption;
443  mHdffCmdIf->CmdHdmiConfigure(&hdmiConfig);
444 
445  mHdffCmdIf->CmdRemoteSetProtocol((HdffRemoteProtocol_t) mNewHdffSetup.RemoteProtocol);
446  mHdffCmdIf->CmdRemoteSetAddressFilter(mNewHdffSetup.RemoteAddress >= 0, mNewHdffSetup.RemoteAddress);
447  }
448 
449  gHdffSetup = mNewHdffSetup;
450 }
451 
453 {
455 
456  if (state == osContinue)
457  {
458  cOsdItem * item;
459  switch (key)
460  {
461  case kLeft:
462  case kRight:
463  item = Get(Current());
464  if (item == mTvFormatItem)
465  {
466  mVideoConversion = 0;
467  BuildVideoConversionItem();
468  Display();
469  }
470  break;
471  default:
472  break;
473  }
474  }
475  return state;
476 }
int AudioDownmix
Definition: setup.h:29
const char * GetVideoConversionString(void)
Definition: setup.c:163
HdffVideoOut_t
Definition: hdffcmd_mux.h:28
virtual eOSState ProcessKey(eKeys Key)
Definition: setup.c:452
Definition: keys.h:23
HdffVideoMode_t
Definition: hdffcmd_hdmi.h:28
int OsdSize
Definition: setup.h:31
cHdffSetup gHdffSetup
Definition: setup.c:16
HdffVideoModeAdaption_t VideoModeAdaption
Definition: hdffcmd_hdmi.h:49
void Add(u_short Pid, u_char Tid, u_char Mask=0xFF, bool Sticky=false)
Adds the given filter data to this filter.
Definition: filter.c:142
const int kResolution720p
Definition: setup.c:11
int VideoModeAdaption
Definition: setup.h:24
virtual eOSState ProcessKey(eKeys Key)
Definition: menuitems.c:1182
int HighLevelOsd
Definition: setup.h:38
void CmdAvSetVideoFormat(uint8_t DecoderIndex, const HdffVideoFormat_t *pVideoFormat)
Definition: hdffcmd.c:116
int RemoteAddress
Definition: setup.h:36
int TrueColorOsd
Definition: setup.h:39
eOSState
Definition: osdbase.h:18
const int kResolution576i
Definition: setup.c:13
HdffVideoMode_t GetVideoMode(void)
Definition: setup.c:107
int HideMainMenu
Definition: setup.h:42
int AnalogueVideo
Definition: setup.h:27
const int kResolution576p
Definition: setup.c:12
int AvSyncShift
Definition: setup.h:30
virtual void Store(void)
Definition: setup.c:368
int CecTvOff
Definition: setup.h:34
int TvFormat
Definition: setup.h:25
void GetOsdSize(int &Width, int &Height, double &PixelAspect)
Definition: setup.c:64
HdffTvFormat_t TvFormat
Definition: hdffcmd_av.h:77
void Del(cListObject *Object, bool DeleteObject=true)
Definition: tools.c:2046
HdffTvFormat_t
Definition: hdffcmd_av.h:56
int TrueColorFormat
Definition: setup.h:40
int AudioDelay
Definition: setup.h:28
HdffAudioDownmixMode_t
Definition: hdffcmd_av.h:87
#define tr(s)
Definition: i18n.h:85
int CecTvOn
Definition: setup.h:33
HdffVideoConversion_t VideoConversion
Definition: hdffcmd_av.h:78
void BuildVideoConversionItem(void)
Definition: setup.c:332
int RemoteProtocol
Definition: setup.h:35
int CecEnabled
Definition: setup.h:32
int Resolution
Definition: setup.h:23
bool SetupParse(const char *Name, const char *Value)
Definition: setup.c:40
const int kResolution1080i
Definition: setup.c:10
virtual ~cHdffSetupPage(void)
Definition: setup.c:328
HdffVideoConversion_t
Definition: hdffcmd_av.h:62
HdffVideoModeAdaption_t
Definition: hdffcmd_hdmi.h:36
cHdffSetup(void)
Definition: setup.c:18
cHdffSetupPage(HDFF::cHdffCmdIf *pHdffCmdIf)
Definition: setup.c:196
void SetNextVideoConversion(void)
Definition: setup.c:123
int VideoConversion
Definition: setup.h:26
void SetVideoFormat(HDFF::cHdffCmdIf *HdffCmdIf)
Definition: setup.c:185
eKeys
Definition: keys.h:16
HdffRemoteProtocol_t
Definition: keys.h:22