vdr
1.7.27
|
00001 /* 00002 * setup.c: Setup for the DVB HD Full Featured On Screen Display 00003 * 00004 * See the README file for copyright information and how to reach the author. 00005 * 00006 * $Id: setup.c 1.17 2012/02/08 15:14:01 kls Exp $ 00007 */ 00008 00009 #include "setup.h" 00010 #include "hdffcmd.h" 00011 00012 const int kResolution1080i = 0; 00013 const int kResolution720p = 1; 00014 const int kResolution576p = 2; 00015 const int kResolution576i = 3; 00016 00017 00018 cHdffSetup gHdffSetup; 00019 00020 cHdffSetup::cHdffSetup(void) 00021 { 00022 Resolution = kResolution1080i; 00023 VideoModeAdaption = HDFF_VIDEO_MODE_ADAPT_OFF; 00024 TvFormat = HDFF_TV_FORMAT_16_BY_9; 00025 VideoConversion = HDFF_VIDEO_CONVERSION_PILLARBOX; 00026 AnalogueVideo = HDFF_VIDEO_OUT_CVBS_YUV; 00027 AudioDelay = 0; 00028 AudioDownmix = HDFF_AUDIO_DOWNMIX_AUTOMATIC; 00029 OsdSize = 0; 00030 CecEnabled = 1; 00031 CecTvOn = 1; 00032 CecTvOff = 0; 00033 RemoteProtocol = 1; 00034 RemoteAddress = -1; 00035 HighLevelOsd = 1; 00036 TrueColorOsd = 1; 00037 HideMainMenu = 0; 00038 } 00039 00040 bool cHdffSetup::SetupParse(const char *Name, const char *Value) 00041 { 00042 if (strcmp(Name, "Resolution") == 0) Resolution = atoi(Value); 00043 else if (strcmp(Name, "VideoModeAdaption") == 0) VideoModeAdaption = atoi(Value); 00044 else if (strcmp(Name, "TvFormat") == 0) TvFormat = atoi(Value); 00045 else if (strcmp(Name, "VideoConversion") == 0) VideoConversion = atoi(Value); 00046 else if (strcmp(Name, "AnalogueVideo") == 0) AnalogueVideo = atoi(Value); 00047 else if (strcmp(Name, "AudioDelay") == 0) AudioDelay = atoi(Value); 00048 else if (strcmp(Name, "AudioDownmix") == 0) AudioDownmix = atoi(Value); 00049 else if (strcmp(Name, "OsdSize") == 0) OsdSize = atoi(Value); 00050 else if (strcmp(Name, "CecEnabled") == 0) CecEnabled = atoi(Value); 00051 else if (strcmp(Name, "CecTvOn") == 0) CecTvOn = atoi(Value); 00052 else if (strcmp(Name, "CecTvOff") == 0) CecTvOff = atoi(Value); 00053 else if (strcmp(Name, "RemoteProtocol") == 0) RemoteProtocol = atoi(Value); 00054 else if (strcmp(Name, "RemoteAddress") == 0) RemoteAddress = atoi(Value); 00055 else if (strcmp(Name, "HighLevelOsd") == 0) HighLevelOsd = atoi(Value); 00056 else if (strcmp(Name, "TrueColorOsd") == 0) TrueColorOsd = atoi(Value); 00057 else if (strcmp(Name, "HideMainMenu") == 0) HideMainMenu = atoi(Value); 00058 else return false; 00059 return true; 00060 } 00061 00062 void cHdffSetup::GetOsdSize(int &Width, int &Height, double &PixelAspect) 00063 { 00064 if (OsdSize == 0) { 00065 if (Resolution == kResolution1080i) { 00066 Width = 1920; 00067 Height = 1080; 00068 } 00069 else if (Resolution == kResolution720p) { 00070 Width = 1280; 00071 Height = 720; 00072 } 00073 else { 00074 Width = 720; 00075 Height = 576; 00076 } 00077 if (TvFormat == HDFF_TV_FORMAT_16_BY_9) 00078 PixelAspect = 16.0 / 9.0; 00079 else 00080 PixelAspect = 4.0 / 3.0; 00081 } 00082 else if (OsdSize == 1) { 00083 Width = 1920; 00084 Height = 1080; 00085 PixelAspect = 16.0 / 9.0; 00086 } 00087 else if (OsdSize == 2) { 00088 Width = 1280; 00089 Height = 720; 00090 PixelAspect = 16.0 / 9.0; 00091 } 00092 else if (OsdSize == 3) { 00093 Width = 1024; 00094 Height = 576; 00095 PixelAspect = 16.0 / 9.0; 00096 } 00097 else { 00098 Width = 720; 00099 Height = 576; 00100 PixelAspect = 4.0 / 3.0; 00101 } 00102 PixelAspect /= double(Width) / Height; 00103 } 00104 00105 HdffVideoMode_t cHdffSetup::GetVideoMode(void) 00106 { 00107 switch (Resolution) 00108 { 00109 case kResolution1080i: 00110 default: 00111 return HDFF_VIDEO_MODE_1080I50; 00112 case kResolution720p: 00113 return HDFF_VIDEO_MODE_720P50; 00114 case kResolution576p: 00115 return HDFF_VIDEO_MODE_576P50; 00116 case kResolution576i: 00117 return HDFF_VIDEO_MODE_576I50; 00118 } 00119 } 00120 00121 void cHdffSetup::SetNextVideoConversion(void) 00122 { 00123 int nextVideoConversion = HDFF_VIDEO_CONVERSION_AUTOMATIC; 00124 00125 if (TvFormat == HDFF_TV_FORMAT_16_BY_9) 00126 { 00127 switch (VideoConversion) 00128 { 00129 case HDFF_VIDEO_CONVERSION_PILLARBOX: 00130 nextVideoConversion = HDFF_VIDEO_CONVERSION_CENTRE_CUT_OUT; 00131 break; 00132 case HDFF_VIDEO_CONVERSION_CENTRE_CUT_OUT: 00133 nextVideoConversion = HDFF_VIDEO_CONVERSION_ALWAYS_16_BY_9; 00134 break; 00135 case HDFF_VIDEO_CONVERSION_ALWAYS_16_BY_9: 00136 nextVideoConversion = HDFF_VIDEO_CONVERSION_ZOOM_16_BY_9; 00137 break; 00138 case HDFF_VIDEO_CONVERSION_ZOOM_16_BY_9: 00139 nextVideoConversion = HDFF_VIDEO_CONVERSION_PILLARBOX; 00140 break; 00141 } 00142 } 00143 else 00144 { 00145 switch (VideoConversion) 00146 { 00147 case HDFF_VIDEO_CONVERSION_LETTERBOX_16_BY_9: 00148 nextVideoConversion = HDFF_VIDEO_CONVERSION_LETTERBOX_14_BY_9; 00149 break; 00150 case HDFF_VIDEO_CONVERSION_LETTERBOX_14_BY_9: 00151 nextVideoConversion = HDFF_VIDEO_CONVERSION_CENTRE_CUT_OUT; 00152 break; 00153 case HDFF_VIDEO_CONVERSION_CENTRE_CUT_OUT: 00154 nextVideoConversion = HDFF_VIDEO_CONVERSION_LETTERBOX_16_BY_9; 00155 break; 00156 } 00157 } 00158 VideoConversion = nextVideoConversion; 00159 } 00160 00161 const char * cHdffSetup::GetVideoConversionString(void) 00162 { 00163 switch (VideoConversion) 00164 { 00165 case HDFF_VIDEO_CONVERSION_AUTOMATIC: 00166 default: 00167 return tr("Automatic"); 00168 case HDFF_VIDEO_CONVERSION_LETTERBOX_16_BY_9: 00169 return tr("Letterbox 16/9"); 00170 case HDFF_VIDEO_CONVERSION_LETTERBOX_14_BY_9: 00171 return tr("Letterbox 14/9"); 00172 case HDFF_VIDEO_CONVERSION_PILLARBOX: 00173 return tr("Pillarbox"); 00174 case HDFF_VIDEO_CONVERSION_CENTRE_CUT_OUT: 00175 return tr("CentreCutOut"); 00176 case HDFF_VIDEO_CONVERSION_ALWAYS_16_BY_9: 00177 return tr("Always 16/9"); 00178 case HDFF_VIDEO_CONVERSION_ZOOM_16_BY_9: 00179 return tr("Zoom 16/9"); 00180 } 00181 } 00182 00183 00184 cHdffSetupPage::cHdffSetupPage(HDFF::cHdffCmdIf * pHdffCmdIf) 00185 { 00186 const int kResolutions = 4; 00187 const int kVideoModeAdaptions = 4; 00188 const int kTvFormats = 2; 00189 const int kAnalogueVideos = 4; 00190 const int kAudioDownmixes = 5; 00191 const int kOsdSizes = 5; 00192 const int kRemoteProtocols = 3; 00193 00194 static const char * ResolutionItems[kResolutions] = 00195 { 00196 "1080i", 00197 "720p", 00198 "576p", 00199 "576i", 00200 }; 00201 00202 static const char * VideoModeAdaptionItems[kVideoModeAdaptions] = 00203 { 00204 tr("Off"), 00205 tr("Frame rate"), 00206 tr("HD Only"), 00207 tr("Always") 00208 }; 00209 00210 static const char * TvFormatItems[kTvFormats] = 00211 { 00212 "4/3", 00213 "16/9", 00214 }; 00215 00216 static const char * AnalogueVideoItems[kAnalogueVideos] = 00217 { 00218 tr("Disabled"), 00219 "RGB", 00220 "CVBS + YUV", 00221 "YC (S-Video)", 00222 }; 00223 00224 static const char * AudioDownmixItems[kAudioDownmixes] = 00225 { 00226 tr("Disabled"), 00227 tr("Analogue only"), 00228 tr("Always"), 00229 tr("Automatic"), 00230 tr("HDMI only"), 00231 }; 00232 00233 static const char * OsdSizeItems[kOsdSizes] = 00234 { 00235 tr("Follow resolution"), 00236 "1920x1080", 00237 "1280x720", 00238 "1024x576", 00239 "720x576", 00240 }; 00241 00242 static const char * RemoteProtocolItems[] = 00243 { 00244 tr("none"), 00245 "RC5", 00246 "RC6", 00247 }; 00248 00249 mHdffCmdIf = pHdffCmdIf; 00250 mNewHdffSetup = gHdffSetup; 00251 00252 Add(new cMenuEditStraItem(tr("Resolution"), &mNewHdffSetup.Resolution, kResolutions, ResolutionItems)); 00253 Add(new cMenuEditStraItem(tr("Video Mode Adaption"), &mNewHdffSetup.VideoModeAdaption, kVideoModeAdaptions, VideoModeAdaptionItems)); 00254 mTvFormatItem = new cMenuEditStraItem(tr("TV format"), &mNewHdffSetup.TvFormat, kTvFormats, TvFormatItems); 00255 Add(mTvFormatItem); 00256 Add(new cMenuEditStraItem(tr("Analogue Video"), &mNewHdffSetup.AnalogueVideo, kAnalogueVideos, AnalogueVideoItems)); 00257 Add(new cMenuEditIntItem(tr("Audio Delay (ms)"), &mNewHdffSetup.AudioDelay, 0, 500)); 00258 Add(new cMenuEditStraItem(tr("Audio Downmix"), &mNewHdffSetup.AudioDownmix, kAudioDownmixes, AudioDownmixItems)); 00259 Add(new cMenuEditStraItem(tr("OSD Size"), &mNewHdffSetup.OsdSize, kOsdSizes, OsdSizeItems)); 00260 Add(new cMenuEditBoolItem(tr("HDMI CEC"), &mNewHdffSetup.CecEnabled)); 00261 Add(new cMenuEditBoolItem(tr("CEC: Switch TV on"), &mNewHdffSetup.CecTvOn)); 00262 Add(new cMenuEditBoolItem(tr("CEC: Switch TV off"), &mNewHdffSetup.CecTvOff)); 00263 Add(new cMenuEditStraItem(tr("Remote Control Protocol"), &mNewHdffSetup.RemoteProtocol, kRemoteProtocols, RemoteProtocolItems)); 00264 Add(new cMenuEditIntItem(tr("Remote Control Address"), &mNewHdffSetup.RemoteAddress, -1, 31)); 00265 Add(new cMenuEditBoolItem(tr("High Level OSD"), &mNewHdffSetup.HighLevelOsd)); 00266 Add(new cMenuEditBoolItem(tr("Allow True Color OSD"), &mNewHdffSetup.TrueColorOsd)); 00267 Add(new cMenuEditBoolItem(tr("Hide mainmenu entry"), &mNewHdffSetup.HideMainMenu)); 00268 00269 mVideoConversion = 0; 00270 if (mNewHdffSetup.TvFormat == HDFF_TV_FORMAT_16_BY_9) 00271 { 00272 switch (mNewHdffSetup.VideoConversion) 00273 { 00274 case HDFF_VIDEO_CONVERSION_PILLARBOX: 00275 mVideoConversion = 0; 00276 break; 00277 case HDFF_VIDEO_CONVERSION_CENTRE_CUT_OUT: 00278 mVideoConversion = 1; 00279 break; 00280 case HDFF_VIDEO_CONVERSION_ALWAYS_16_BY_9: 00281 mVideoConversion = 2; 00282 break; 00283 case HDFF_VIDEO_CONVERSION_ZOOM_16_BY_9: 00284 mVideoConversion = 3; 00285 break; 00286 } 00287 } 00288 else 00289 { 00290 switch (mNewHdffSetup.VideoConversion) 00291 { 00292 case HDFF_VIDEO_CONVERSION_LETTERBOX_16_BY_9: 00293 mVideoConversion = 0; 00294 break; 00295 case HDFF_VIDEO_CONVERSION_LETTERBOX_14_BY_9: 00296 mVideoConversion = 1; 00297 break; 00298 case HDFF_VIDEO_CONVERSION_CENTRE_CUT_OUT: 00299 mVideoConversion = 2; 00300 break; 00301 } 00302 } 00303 BuildVideoConversionItem(); 00304 } 00305 00306 cHdffSetupPage::~cHdffSetupPage(void) 00307 { 00308 } 00309 00310 void cHdffSetupPage::BuildVideoConversionItem(void) 00311 { 00312 const int kVideoConversions4by3 = 3; 00313 const int kVideoConversions16by9 = 4; 00314 00315 static const char * VideoConversionItems4by3[kVideoConversions4by3] = 00316 { 00317 tr("Letterbox 16/9"), 00318 tr("Letterbox 14/9"), 00319 tr("CentreCutOut") 00320 }; 00321 00322 static const char * VideoConversionItems16by9[kVideoConversions16by9] = 00323 { 00324 tr("Pillarbox"), 00325 tr("CentreCutOut"), 00326 tr("Always 16/9"), 00327 tr("Zoom 16/9") 00328 }; 00329 00330 cOsdItem * item; 00331 00332 cList<cOsdItem>::Del(mTvFormatItem->Next()); 00333 if (mNewHdffSetup.TvFormat == HDFF_TV_FORMAT_16_BY_9) 00334 { 00335 item = new cMenuEditStraItem(tr("Video Conversion"), &mVideoConversion, 00336 kVideoConversions16by9, VideoConversionItems16by9); 00337 } 00338 else 00339 { 00340 item = new cMenuEditStraItem(tr("Video Conversion"), &mVideoConversion, 00341 kVideoConversions4by3, VideoConversionItems4by3); 00342 } 00343 Add(item, false, mTvFormatItem); 00344 } 00345 00346 void cHdffSetupPage::Store(void) 00347 { 00348 if (mNewHdffSetup.TvFormat == HDFF_TV_FORMAT_16_BY_9) 00349 { 00350 switch (mVideoConversion) 00351 { 00352 case 0: 00353 mNewHdffSetup.VideoConversion = HDFF_VIDEO_CONVERSION_PILLARBOX; 00354 break; 00355 case 1: 00356 mNewHdffSetup.VideoConversion = HDFF_VIDEO_CONVERSION_CENTRE_CUT_OUT; 00357 break; 00358 case 2: 00359 mNewHdffSetup.VideoConversion = HDFF_VIDEO_CONVERSION_ALWAYS_16_BY_9; 00360 break; 00361 case 3: 00362 mNewHdffSetup.VideoConversion = HDFF_VIDEO_CONVERSION_ZOOM_16_BY_9; 00363 break; 00364 } 00365 } 00366 else 00367 { 00368 switch (mVideoConversion) 00369 { 00370 case 0: 00371 mNewHdffSetup.VideoConversion = HDFF_VIDEO_CONVERSION_LETTERBOX_16_BY_9; 00372 break; 00373 case 1: 00374 mNewHdffSetup.VideoConversion = HDFF_VIDEO_CONVERSION_LETTERBOX_14_BY_9; 00375 break; 00376 case 2: 00377 mNewHdffSetup.VideoConversion = HDFF_VIDEO_CONVERSION_CENTRE_CUT_OUT; 00378 break; 00379 } 00380 } 00381 SetupStore("Resolution", mNewHdffSetup.Resolution); 00382 SetupStore("VideoModeAdaption", mNewHdffSetup.VideoModeAdaption); 00383 SetupStore("TvFormat", mNewHdffSetup.TvFormat); 00384 SetupStore("VideoConversion", mNewHdffSetup.VideoConversion); 00385 SetupStore("AnalogueVideo", mNewHdffSetup.AnalogueVideo); 00386 SetupStore("AudioDelay", mNewHdffSetup.AudioDelay); 00387 SetupStore("AudioDownmix", mNewHdffSetup.AudioDownmix); 00388 SetupStore("OsdSize", mNewHdffSetup.OsdSize); 00389 SetupStore("CecEnabled", mNewHdffSetup.CecEnabled); 00390 SetupStore("CecTvOn", mNewHdffSetup.CecTvOn); 00391 SetupStore("CecTvOff", mNewHdffSetup.CecTvOff); 00392 SetupStore("RemoteProtocol", mNewHdffSetup.RemoteProtocol); 00393 SetupStore("RemoteAddress", mNewHdffSetup.RemoteAddress); 00394 SetupStore("HighLevelOsd", mNewHdffSetup.HighLevelOsd); 00395 SetupStore("TrueColorOsd", mNewHdffSetup.TrueColorOsd); 00396 SetupStore("HideMainMenu", mNewHdffSetup.HideMainMenu); 00397 00398 if (mHdffCmdIf) 00399 { 00400 if (mNewHdffSetup.Resolution != gHdffSetup.Resolution) 00401 { 00402 mHdffCmdIf->CmdHdmiSetVideoMode(mNewHdffSetup.GetVideoMode()); 00403 } 00404 HdffVideoFormat_t videoFormat; 00405 HdffHdmiConfig_t hdmiConfig; 00406 00407 videoFormat.AutomaticEnabled = true; 00408 videoFormat.AfdEnabled = false; 00409 videoFormat.TvFormat = (HdffTvFormat_t) mNewHdffSetup.TvFormat; 00410 videoFormat.VideoConversion = (HdffVideoConversion_t) mNewHdffSetup.VideoConversion; 00411 mHdffCmdIf->CmdAvSetVideoFormat(0, &videoFormat); 00412 00413 mHdffCmdIf->CmdAvSetAudioDelay(mNewHdffSetup.AudioDelay); 00414 mHdffCmdIf->CmdAvSetAudioDownmix((HdffAudioDownmixMode_t) mNewHdffSetup.AudioDownmix); 00415 00416 mHdffCmdIf->CmdMuxSetVideoOut((HdffVideoOut_t) mNewHdffSetup.AnalogueVideo); 00417 00418 memset(&hdmiConfig, 0, sizeof(hdmiConfig)); 00419 hdmiConfig.TransmitAudio = true; 00420 hdmiConfig.ForceDviMode = false; 00421 hdmiConfig.CecEnabled = mNewHdffSetup.CecEnabled; 00422 hdmiConfig.VideoModeAdaption = (HdffVideoModeAdaption_t) mNewHdffSetup.VideoModeAdaption; 00423 mHdffCmdIf->CmdHdmiConfigure(&hdmiConfig); 00424 00425 mHdffCmdIf->CmdRemoteSetProtocol((HdffRemoteProtocol_t) mNewHdffSetup.RemoteProtocol); 00426 mHdffCmdIf->CmdRemoteSetAddressFilter(mNewHdffSetup.RemoteAddress >= 0, mNewHdffSetup.RemoteAddress); 00427 } 00428 00429 gHdffSetup = mNewHdffSetup; 00430 } 00431 00432 eOSState cHdffSetupPage::ProcessKey(eKeys key) 00433 { 00434 eOSState state = cMenuSetupPage::ProcessKey(key); 00435 00436 if (state == osContinue) 00437 { 00438 cOsdItem * item; 00439 switch (key) 00440 { 00441 case kLeft: 00442 case kRight: 00443 item = Get(Current()); 00444 if (item == mTvFormatItem) 00445 { 00446 mVideoConversion = 0; 00447 BuildVideoConversionItem(); 00448 Display(); 00449 } 00450 break; 00451 default: 00452 break; 00453 } 00454 } 00455 return state; 00456 }