vdr  1.7.27
setup.c
Go to the documentation of this file.
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 }