]> git.vomp.tv Git - vompclient-marten.git/commitdiff
SDTV support
authorMarten Richter <marten.richter@freenet.de>
Sun, 4 Nov 2012 12:13:24 +0000 (13:13 +0100)
committerMarten Richter <marten.richter@freenet.de>
Sun, 4 Nov 2012 12:13:24 +0000 (13:13 +0100)
command.cc
vconnect.cc
video.h
videomvp.h
videoomx.cc
videoomx.h
videowin.h
vopts.cc
vopts.h

index cbdd0a8d1ed558017566fe5f3580085fca980a97..814f0538d60282516b44d6fc71cecaf26e5ad816 100644 (file)
@@ -666,6 +666,7 @@ void Command::doJustConnected(VConnect* vconnect)
 {\r
   I18n::initialize();\r
   if (!VDR::getInstance()->isConnected()) { connectionLost(); return; }\r
+  logger->log("Command", Log::INFO, "Entering doJustConnected");\r
   \r
   Video* video = Video::getInstance();\r
   Audio* audio = Audio::getInstance();  \r
@@ -706,8 +707,11 @@ void Command::doJustConnected(VConnect* vconnect)
   {\r
     logger->log("Command", Log::DEBUG, "Override Video Format is present");\r
 \r
-    if (   (!strcmp(config, "PAL") && (video->getFormat() == Video::NTSC))\r
-        || (!strcmp(config, "NTSC") && (video->getFormat() == Video::PAL))  )\r
+    if (   (!strcmp(config, "PAL") && (video->getFormat() != Video::PAL))\r
+        || (!strcmp(config, "NTSC") && (video->getFormat() != Video::NTSC))\r
+        || (!strcmp(config, "PAL_M") && (video->getFormat() != Video::PAL_M))\r
+        || (!strcmp(config, "NTSC_J") && (video->getFormat() != Video::NTSC_J))\r
+        )\r
     {\r
       // Oh sheesh, need to switch format. Bye bye TV...\r
 \r
@@ -720,6 +724,9 @@ void Command::doJustConnected(VConnect* vconnect)
 #endif\r
       video->shutdown();\r
 \r
+      remote->shutdown(); // need on raspberry shut not do any harm, hopefully\r
+      remote->init(RemoteStartDev);\r
+\r
       // Get video and osd back up with the new mode\r
       if (!strcmp(config, "PAL"))\r
       {\r
@@ -730,6 +737,14 @@ void Command::doJustConnected(VConnect* vconnect)
       {\r
         logger->log("Command", Log::DEBUG, "Switching to NTSC");\r
         video->init(Video::NTSC);\r
+      } else if (!strcmp(config, "PAL_M"))\r
+      {\r
+        logger->log("Command", Log::DEBUG, "Switching to PAL_M");\r
+        video->init(Video::PAL_M);\r
+      } else if (!strcmp(config, "NTSC_J"))\r
+      {\r
+        logger->log("Command", Log::DEBUG, "Switching to NTSC_J");\r
+        video->init(Video::NTSC_J);\r
       }\r
 #ifndef __ANDROID__\r
       //we do not init twice\r
@@ -834,6 +849,14 @@ void Command::doJustConnected(VConnect* vconnect)
     {\r
       logger->log("Command", Log::INFO, "Switching to S-Video as Connection=%s", config);\r
       video->setConnection(Video::SVIDEO);\r
+    } else  if (!STRCASECMP(config, "HDMI"))\r
+    {\r
+      logger->log("Command", Log::INFO, "Switching to HDMI as Connection=%s", config);\r
+      video->setConnection(Video::HDMI);\r
+    } else  if (!STRCASECMP(config, "HDMI3D"))\r
+    {\r
+      logger->log("Command", Log::INFO, "Switching to HDMI3D as Connection=%s", config);\r
+      video->setConnection(Video::HDMI3D);\r
     }\r
     else\r
     {\r
@@ -963,6 +986,8 @@ void Command::doJustConnected(VConnect* vconnect)
   audio->loadOptionsfromServer(vdr);\r
   video->loadOptionsfromServer(vdr);\r
   remote->loadOptionsfromServer(vdr);\r
+\r
+  video->executePendingModeChanges();\r
   // config done\r
 \r
   // Save power state = on\r
index 7c0b66e83a7f235822cf5a2560e4eae9e8b24419..724b3fc0fdaa9a8e164f73921389685502b99703 100644 (file)
@@ -189,7 +189,7 @@ void VConnect::threadMethod()
 
   } while(!success);
 
-
+  logger->log("VConnect", Log::INFO, "Send VDR connected message");
   Message* m = new Message(); // Must be done after this thread ends
   m->from = this;
   m->to = Command::getInstance();
diff --git a/video.h b/video.h
index 2980d2c346fef178cdc9aa445161aec4c1b603a1..9c9611f1442dc655ecb1fabd4f3de53590f349eb 100644 (file)
--- a/video.h
+++ b/video.h
@@ -46,10 +46,14 @@ class Video: public DrainTarget, public AbstractOption
     virtual int shutdown()=0;\r
     virtual int setFormat(UCHAR format)=0;\r
     virtual UCHAR getSupportedFormats() { return COMPOSITERGB | SVIDEO;}; // if it returns zero there are no different formats\r
+    virtual UINT supportedTVsize() { return 0;}; // if no selection is allowed\r
+    virtual UCHAR supportedTVFormats() { return 0;}; // if no selection is allowed\r
+\r
     virtual int setConnection(UCHAR connection)=0;\r
     virtual int setAspectRatio(UCHAR aspectRatio)=0;   // This one does the pin 8 scart widescreen switching\r
     virtual int setMode(UCHAR mode)=0;\r
     virtual int setTVsize(UCHAR size)=0;               // Is the TV a widescreen?\r
+    virtual void executePendingModeChanges() {}; // This is called if you change the output mode and the device take a while for reinitialization\r
     virtual int setDefaultAspect()=0;\r
     virtual int setSource()=0;\r
     virtual int setPosition(int x, int y)=0;\r
@@ -103,12 +107,16 @@ class Video: public DrainTarget, public AbstractOption
     UINT getScreenHeight()  { return screenHeight; }\r
     UCHAR getTVsize()       { return tvsize; }\r
 \r
+\r
+\r
     //hmsf framesToHMSF(ULONG frames,double fps);\r
    // UINT getFPS(); //removed\r
 \r
     // Video formats - AV_SET_VID_DISP_FMT\r
     const static UCHAR NTSC = 0;\r
     const static UCHAR PAL = 1;\r
+    const static UCHAR PAL_M = 2;\r
+    const static UCHAR NTSC_J = 4;\r
 \r
     // Video connections - AV_SET_VID_OUTPUT\r
     const static UCHAR COMPOSITERGB = 1;\r
@@ -119,6 +127,7 @@ class Video: public DrainTarget, public AbstractOption
     // Video aspect ratios - AV_SET_VID_RATIO\r
     const static UCHAR ASPECT4X3 = 0;\r
     const static UCHAR ASPECT16X9 = 1;\r
+    const static UCHAR ASPECT14X9 = 2; //future use\r
 \r
     // Video modes - AV_SET_VID_MODE\r
     const static UCHAR NORMAL = 0;\r
index 9184bc3910e5b502fee81e05e7d80b666358126b..aabad63c2fa88c458da6ce8709a6bafe70db7c6a 100644 (file)
@@ -103,11 +103,15 @@ class VideoMVP : public Video
 {\r
   public:\r
     VideoMVP();\r
-    ~VideoMVP();\r
+    virtual ~VideoMVP();\r
 \r
     int init(UCHAR format);\r
     int shutdown();\r
 \r
+    UCHAR getSupportedFormats() { return COMPOSITERGB | SVIDEO;};\r
+    UINT supportedTVsize() { return ASPECT4X3|ASPECT16X9;};\r
+    UCHAR supportedTVFormats() { return 0;}; /* We cannot change this here\r
+\r
     int setFormat(UCHAR format);\r
     int setConnection(UCHAR connection);\r
     int setAspectRatio(UCHAR aspectRatio);   // This one does the pin 8 scart widescreen switching\r
index faae9a1a4ded5910a3e99f0eb25640f448007287..45946e8ab8367b04279999d1b7f3624279da0eae 100644 (file)
@@ -75,7 +75,7 @@ int VideoOMX::init(UCHAR tformat)
   initted = 1;
 
   if (!setFormat(tformat))           { shutdown(); return 0; }
-  if (!setConnection(COMPOSITERGB))  { shutdown(); return 0; }
+  if (!setConnection(HDMI))  { shutdown(); return 0; }
   if (!setAspectRatio(ASPECT4X3))    { shutdown(); return 0; }
   if (!setMode(NORMAL))              { shutdown(); return 0; }
   if (!setSource())                  { shutdown(); return 0; }
@@ -84,6 +84,7 @@ int VideoOMX::init(UCHAR tformat)
   setTVsize(ASPECT4X3);
   selectVideoMode(0);
 
+
   OMX_ERRORTYPE error;
        error = OMX_Init();
        if (error != OMX_ErrorNone) {
@@ -299,25 +300,24 @@ bool VideoOMX::addOptionsToPanes(int panenumber,Options *options,WOptionPane* pa
 
 int VideoOMX::setTVsize(UCHAR ttvsize)
 {
-/*  tvsize = ttvsize;
-
-  // Override the aspect ratio usage, temporarily use to set the video chip mode
-  if (!setAspectRatio(tvsize))       { shutdown(); return 0; }
-  close(fdVideo);
-  if ((fdVideo = open("/dev/vdec_dev", O_WRONLY)) < 0) return 0;
-  if (!setSource())                  { shutdown(); return 0; }
-  if (!attachFramebuffer())          { shutdown(); return 0; }
-
-  // Reopening the fd causes the scart aspect line to go back to 4:3
-  // Set this again to the same as the tv screen size
-  if (!setAspectRatio(tvsize))       { shutdown(); return 0; }
-
-  // mode == LETTERBOX is invalid if the TV is widescreen
-  if (tvsize == ASPECT16X9) setMode(NORMAL);
-*/
+  if (tvsize!=ttvsize) pendingmodechange=true;
+  tvsize=ttvsize;
   return 1;
 }
 
+void VideoOMX::executePendingModeChanges()
+{
+       if (pendingmodechange) {
+               Log::getInstance()->log("Video", Log::NOTICE, "Execute pending mode change");
+               Osd::getInstance()->shutdown();
+               selectVideoMode(0);
+               Osd::getInstance()->restore();
+               Osd::getInstance()->init((void*) "");
+               BoxStack::getInstance()->redrawAllBoxes();
+               initted = 1;
+       }
+}
+
 int VideoOMX::setDefaultAspect()
 {
   return setAspectRatio(tvsize);
@@ -328,7 +328,8 @@ int VideoOMX::setDefaultAspect()
 int VideoOMX::setFormat(UCHAR tformat)
 {
   if (!initted) return 0;
-  if ((tformat != PAL) && (tformat != NTSC)) return 0;
+  if ((tformat != PAL) && (tformat != NTSC)
+                 && (tformat != PAL_M) && (tformat != NTSC_J)) return 0;
   format = PAL;
   tvsystem = tformat;
 
@@ -345,23 +346,57 @@ int VideoOMX::setFormat(UCHAR tformat)
 
 void VideoOMX::selectVideoMode(int interlaced)
 {
-       if (/*hdmi*/ true) {
-               TV_SUPPORTED_MODE_T all_supp_modes[TV_MAX_SUPPORTED_MODES];
-               HDMI_RES_GROUP_T pref_group;
-               TV_SUPPORTED_MODE_T  *mymode=NULL;
-               TV_SUPPORTED_MODE_T  *mymode_second_best=NULL;
-               bool got_optimum=false;
-               uint32_t pref_mode;
-               int all_my_modes=vc_tv_hdmi_get_supported_modes(HDMI_RES_GROUP_CEA,
-                               all_supp_modes,TV_MAX_SUPPORTED_MODES,
-                               &pref_group,&pref_mode);
+
+       TV_SUPPORTED_MODE_T all_supp_modes[TV_MAX_SUPPORTED_MODES];
+       HDMI_RES_GROUP_T pref_group;
+       TV_SUPPORTED_MODE_T  *mymode=NULL;
+       TV_SUPPORTED_MODE_T  *mymode_second_best=NULL;
+       bool got_optimum=false;
+       uint32_t pref_mode;
+       HDMI_RES_GROUP_T group=HDMI_RES_GROUP_CEA;
+       int all_my_modes=vc_tv_hdmi_get_supported_modes(HDMI_RES_GROUP_CEA,
+                       all_supp_modes,TV_MAX_SUPPORTED_MODES,
+                       &pref_group,&pref_mode);
+       if (all_my_modes<=0) {
+               group=HDMI_RES_GROUP_DMT;
+               all_my_modes=vc_tv_hdmi_get_supported_modes(HDMI_RES_GROUP_DMT,
+                                       all_supp_modes,TV_MAX_SUPPORTED_MODES,
+                                       &pref_group,&pref_mode);
+               Log::getInstance()->log("Video", Log::NOTICE, "No CEA fall back to DMT modes ");
+       }
+
+       if (all_my_modes<=0 || connection==COMPOSITERGB ) {
+               /* analog tv case */
+               Log::getInstance()->log("Video", Log::NOTICE, "No CEA and DMT modes found analog tv case?");
+               vc_tv_power_off();
+               Remote::getInstance()->shutdown();
+               SDTV_MODE_T setmode=SDTV_MODE_PAL;
+               SDTV_OPTIONS_T options;
+
+               switch (tvsize) {
+               default:
+               case ASPECT16X9:
+                       Log::getInstance()->log("Video", Log::NOTICE, "SDTV aspect 16:9");
+                       options.aspect=SDTV_ASPECT_16_9; break;
+               case ASPECT4X3:
+                       Log::getInstance()->log("Video", Log::NOTICE, "SDTV aspect 4:3");
+                       options.aspect=SDTV_ASPECT_4_3; break;
+               case ASPECT14X9:
+                       Log::getInstance()->log("Video", Log::NOTICE, "SDTV aspect 14:9");
+                       options.aspect=SDTV_ASPECT_14_9; break;
+               };
+
+               if (format==PAL) setmode=SDTV_MODE_PAL;
+               else if (format==NTSC) setmode=SDTV_MODE_NTSC;
+               else if (format==PAL_M)setmode=SDTV_MODE_PAL_M;
+               else if (format==NTSC_J) setmode=SDTV_MODE_NTSC_J;
+               vc_tv_sdtv_power_on(setmode,&options);
+               hdmi=false;
+
+       } else {
                int target_fps=50;
                if (format==PAL)target_fps=50;
                else if (format==NTSC) target_fps=60;
-               if (all_my_modes<=0) {
-                        Log::getInstance()->log("Video", Log::NOTICE, "No CEA modes found abort");
-                       return;
-               }
 
                //Now first determine native resolution
                int native_width=1920;
@@ -380,18 +415,18 @@ void VideoOMX::selectVideoMode(int interlaced)
                for (int i=0;i<all_my_modes;i++) {
                        TV_SUPPORTED_MODE_T  *curmode=all_supp_modes+i;
                        if (curmode->width==native_width &&
-                               curmode->height==native_height &&
-                                curmode->frame_rate==target_fps) {
-                                 if(curmode->scan_mode==interlaced) {
-                                         got_optimum=true;
-                                         mymode=curmode;
-                                         Log::getInstance()->log("Video", Log::NOTICE, "Found optimum mode %dx%d %d Hz i: %d",
-                                                                                       mymode->width,mymode->height,mymode->frame_rate,mymode->scan_mode);
-                                 } else {
-                                         mymode_second_best=curmode;
-                                         Log::getInstance()->log("Video", Log::NOTICE, "Found close to optimum mode %dx%d %d Hz i: %d",
-                                                                                               mymode_second_best->width,mymode_second_best->height,
-                                                                                               mymode_second_best->frame_rate,mymode_second_best->scan_mode);
+                                       curmode->height==native_height &&
+                                       curmode->frame_rate==target_fps) {
+                               if(curmode->scan_mode==interlaced) {
+                                       got_optimum=true;
+                                       mymode=curmode;
+                                       Log::getInstance()->log("Video", Log::NOTICE, "Found optimum mode %dx%d %d Hz i: %d",
+                                                       mymode->width,mymode->height,mymode->frame_rate,mymode->scan_mode);
+                               } else {
+                                       mymode_second_best=curmode;
+                                       Log::getInstance()->log("Video", Log::NOTICE, "Found close to optimum mode %dx%d %d Hz i: %d",
+                                                       mymode_second_best->width,mymode_second_best->height,
+                                                       mymode_second_best->frame_rate,mymode_second_best->scan_mode);
                                }
 
                        }
@@ -400,20 +435,23 @@ void VideoOMX::selectVideoMode(int interlaced)
                Remote::getInstance()->shutdown();
                if (mymode) {
                        Log::getInstance()->log("Video", Log::NOTICE, "Switch to optimum mode");
-                       vc_tv_hdmi_power_on_explicit(HDMI_MODE_HDMI,HDMI_RES_GROUP_CEA,mymode->code);
+                       vc_tv_hdmi_power_on_explicit(HDMI_MODE_HDMI,group,mymode->code);
                } else if (mymode_second_best) {
                        Log::getInstance()->log("Video", Log::NOTICE, "Switch to close to optimum mode");
-                       vc_tv_hdmi_power_on_explicit(HDMI_MODE_HDMI,HDMI_RES_GROUP_CEA,mymode_second_best->code);
+                       vc_tv_hdmi_power_on_explicit(HDMI_MODE_HDMI,group,mymode_second_best->code);
                } else {
                        Log::getInstance()->log("Video", Log::NOTICE, "Switch to prefered mode");
                        vc_tv_hdmi_power_on_best(1920,1080,target_fps,interlaced?HDMI_INTERLACED:HDMI_NONINTERLACED,
                                        (EDID_MODE_MATCH_FLAG_T)(HDMI_MODE_MATCH_FRAMERATE|HDMI_MODE_MATCH_RESOLUTION|HDMI_MODE_MATCH_SCANMODE));
                }
-               Remote::getInstance()->init("");
-
+               hdmi=true;
        }
 
+       Remote::getInstance()->init("");
+
+
        signalon=true;
+       pendingmodechange=false;
 
 }
 
@@ -421,7 +459,8 @@ void VideoOMX::selectVideoMode(int interlaced)
 int VideoOMX::setConnection(UCHAR tconnection)
 {
   if (!initted) return 0;
-  if ((tconnection != COMPOSITERGB) && (tconnection != SVIDEO)) return 0;
+  if ((tconnection != COMPOSITERGB)  && (tconnection != HDMI)) return 0;
+  if (connection!=tconnection) pendingmodechange=true;
   connection = tconnection;
 
 //  if (ioctl(fdVideo, AV_SET_VID_OUTPUT, connection) != 0) return 0;
index 332c38caea1aacb6e7e586626676aef7ca49cf76..dd0ee0e864789c2acf75504ed73f340f0f9052e7 100644 (file)
@@ -72,11 +72,17 @@ class VideoOMX : public Video
     int init(UCHAR format);\r
     int shutdown();\r
 \r
+    UCHAR getSupportedFormats() { return COMPOSITERGB | HDMI;};\r
+    UINT supportedTVsize() { return ASPECT4X3|ASPECT16X9|ASPECT14X9 ;};\r
+    UCHAR supportedTVFormats() { return NTSC|PAL|PAL_M|NTSC_J;};\r
+\r
     int setFormat(UCHAR format);\r
     int setConnection(UCHAR connection);\r
     int setAspectRatio(UCHAR aspectRatio);   // This one does the pin 8 scart widescreen switching\r
     int setMode(UCHAR mode);\r
     int setTVsize(UCHAR size);               // Is the TV a widescreen?\r
+\r
+    void executePendingModeChanges();\r
     int setDefaultAspect();\r
     int setSource();\r
     int setPosition(int x, int y);\r
@@ -267,6 +273,8 @@ class VideoOMX : public Video
           void selectVideoMode(int interlaced);\r
           UCHAR tvsystem;\r
           bool signalon;\r
+          bool pendingmodechange;\r
+          bool hdmi;\r
 \r
 \r
 \r
index dc9fa77e34899fd758ecb6ff9d66902b804bae50..4293d2166ae01a3a975603e18e110a48a61aaf5d 100644 (file)
@@ -59,7 +59,10 @@ public:
        int shutdown();\r
 \r
        int setFormat(UCHAR format);\r
-       virtual UCHAR getSupportedFormats() { return 0;};\r
+       UCHAR getSupportedFormats() { return 0;};\r
+       UINT supportedTVsize() { return ASPECT4X3|ASPECT16X9;};\r
+       UCHAR supportedTVFormats() { return 0;};\r
+\r
        int setConnection(UCHAR connection);\r
        int setAspectRatio(UCHAR aspectRatio);   // This one does the pin 8 scart widescreen switching\r
        UCHAR getAspectRatio(){return aspectRatio;};\r
index 2772167024d35144c5312b61bdf143235f1dc5b8..3ea90a40c7303df9b98b9dbc6fcb68cd26b594ef 100644 (file)
--- a/vopts.cc
+++ b/vopts.cc
@@ -62,8 +62,7 @@ VOpts::VOpts()
   //  --- edit options start here\r
   \r
   static const char* options1[] = {"Old", "New"};\r
-  static const char* options3[] = {"RGB+composite", "S-Video"};\r
-  static const char* options4[] = {"4:3", "16:9"};\r
+\r
   static const char* options5[] = {"Chop sides", "Letterbox"};\r
   static const char* options6[] = {"On", "Off", "Last state"};\r
   static const char* options7[] = {"All", "FTA only"};\r
@@ -97,12 +96,85 @@ VOpts::VOpts()
   option = new Option(2, "Language",                 "General", "LangCode",              Option::TYPE_KEYED_TEXT, LangCode.size(), 0, 0, options2, options2keys);\r
   options.push_back(option);\r
   wop->addOptionLine(option);\r
-  option = new Option(3, "TV connection type",       "TV",      "Connection",            Option::TYPE_TEXT, 2, 0, 0, options3);\r
-  options.push_back(option);\r
-  wop->addOptionLine(option);\r
-  option = new Option(4, "TV aspect ratio",          "TV",      "Aspect",                Option::TYPE_TEXT, 2, 0, 0, options4);\r
-  options.push_back(option);\r
-  wop->addOptionLine(option);\r
+\r
+\r
+  UINT suppconn = Video::getInstance()->getSupportedFormats();\r
+  if (suppconn) {\r
+         int defaultch = 0;\r
+         if (suppconn & Video::COMPOSITERGB) {\r
+                 defaultch = 0;\r
+                 options3.push_back("RGB+composite");\r
+                 options3keys.push_back("RGB+composite");\r
+         }\r
+         if (Video::SVIDEO & suppconn) {\r
+                 options3.push_back("S-Video");\r
+                 options3keys.push_back("S-Video");\r
+         }\r
+         if (Video::HDMI & suppconn) {\r
+                 defaultch = options3.size();\r
+                 options3.push_back("HDMI");\r
+                 options3keys.push_back("HDMI");\r
+         }\r
+         if (Video::HDMI3D & suppconn) {\r
+                 options3.push_back("HDMI3D");\r
+                 options3keys.push_back("HDMI3D");\r
+         }\r
+         option = new Option(3, "TV connection type", "TV", "Connection",\r
+                         Option::TYPE_KEYED_TEXT, options3.size(), defaultch, 0,\r
+                         &(options3[0]), &(options3keys[0]));\r
+\r
+         options.push_back(option);\r
+         wop->addOptionLine(option);\r
+  }\r
+\r
+  UINT suppformats = Video::getInstance()->supportedTVFormats();\r
+  if (suppformats) {\r
+         int defaultch = 0;\r
+         options16.push_back("NTSC");\r
+         options16keys.push_back("NTSC");\r
+         if (suppformats & Video::PAL) {\r
+                 defaultch = 1;\r
+                 options16.push_back("PAL");\r
+                 options16keys.push_back("PAL");\r
+         }\r
+         if (Video::NTSC_J & suppformats) {\r
+                 options16.push_back("NTSC-J");\r
+                 options16keys.push_back("NTSC-J");\r
+         }\r
+         if (Video::PAL_M & suppformats) {\r
+                 options16.push_back("PAL-M");\r
+                 options16keys.push_back("PAL-M");\r
+         }\r
+\r
+         option = new Option(16, "TV standard (needs restart)", "General", "Override Video Format",\r
+                         Option::TYPE_KEYED_TEXT, options16.size(), defaultch, 0,\r
+                         &(options16[0]), &(options16keys[0]));\r
+\r
+         options.push_back(option);\r
+         wop->addOptionLine(option);\r
+  }\r
+\r
+  UINT supptvsize=Video::getInstance()->supportedTVsize();\r
+  if (supptvsize) {\r
+         int defaultch=0;\r
+         options4.push_back("4:3");\r
+         options4keys.push_back("4:3");\r
+      if (Video::ASPECT16X9 & supptvsize) {\r
+         options4.push_back("16:9");\r
+         options4keys.push_back("16:9");\r
+         defaultch=1;\r
+      }\r
+      if (Video::ASPECT14X9 & supptvsize) {\r
+         options4.push_back("14:9");\r
+         options4keys.push_back("14:9");\r
+      }\r
+         option = new Option(4, "TV aspect ratio", "TV", "Aspect",\r
+                               Option::TYPE_KEYED_TEXT, options4.size(), defaultch, 0,\r
+                               &(options4[0]), &(options4keys[0]));\r
+         options.push_back(option);\r
+         wop->addOptionLine(option);\r
+  }\r
+\r
   option = new Option(5, "16:9 on 4:3 display mode", "TV",      "Widemode",              Option::TYPE_TEXT, 2, 0, 0, options5);\r
   options.push_back(option);\r
   wop->addOptionLine(option);\r
@@ -290,30 +362,45 @@ void VOpts::doSave()
         }\r
         case 3:\r
         {\r
-          if (options[i]->userSetChoice == 1)\r
-          {\r
-            Log::getInstance()->log("Options", Log::DEBUG, "Setting S-Video");\r
-            Video::getInstance()->setConnection(Video::SVIDEO);\r
-          }\r
-          else\r
-          {\r
-            Log::getInstance()->log("Options", Log::DEBUG, "Setting RGB/Composite");\r
-            Video::getInstance()->setConnection(Video::COMPOSITERGB);\r
-          }\r
-          break;\r
+               if (STRCASECMP(options[i]->optionkeys[options[i]->userSetChoice], "RGB+composite")==0)\r
+               {\r
+                       Log::getInstance()->log("Options", Log::DEBUG, "Setting RGB/Composite");\r
+                       Video::getInstance()->setConnection(Video::COMPOSITERGB);\r
+               }\r
+               else  if (STRCASECMP(options[i]->optionkeys[options[i]->userSetChoice], "S-Video")==0)\r
+               {\r
+                       Log::getInstance()->log("Options", Log::DEBUG, "Setting S-Video");\r
+                       Video::getInstance()->setConnection(Video::SVIDEO);\r
+               }\r
+               else  if (STRCASECMP(options[i]->optionkeys[options[i]->userSetChoice], "HDMI")==0)\r
+               {\r
+                       Log::getInstance()->log("Options", Log::DEBUG, "Setting HDMI");\r
+                       Video::getInstance()->setConnection(Video::HDMI);\r
+               }\r
+               else  if (STRCASECMP(options[i]->optionkeys[options[i]->userSetChoice], "HDMI3D")==0)\r
+               {\r
+                       Log::getInstance()->log("Options", Log::DEBUG, "Setting HDMI");\r
+                       Video::getInstance()->setConnection(Video::HDMI3D);\r
+               }\r
+               break;\r
         }\r
         case 4:\r
         {\r
-          if (options[i]->userSetChoice == 1)\r
+          if (STRCASECMP(options[i]->optionkeys[options[i]->userSetChoice], "16:9")==0)\r
           {\r
             Log::getInstance()->log("Options", Log::DEBUG, "Setting 16:9 TV");\r
             Video::getInstance()->setTVsize(Video::ASPECT16X9);\r
           }\r
-          else\r
+          else  if (STRCASECMP(options[i]->optionkeys[options[i]->userSetChoice], "4:3")==0)\r
           {\r
             Log::getInstance()->log("Options", Log::DEBUG, "Setting 4:3 TV");\r
             Video::getInstance()->setTVsize(Video::ASPECT4X3);\r
           }\r
+          else  if (STRCASECMP(options[i]->optionkeys[options[i]->userSetChoice], "14:9")==0)\r
+          {\r
+                 Log::getInstance()->log("Options", Log::DEBUG, "Setting 14:9 TV");\r
+                 Video::getInstance()->setTVsize(Video::ASPECT14X9);\r
+          }\r
           break;\r
         }\r
         case 5:\r
diff --git a/vopts.h b/vopts.h
index 17ee30195e425bb18e36ee78756ee5be4f125c12..416aeb71ae91a126094beb77a38e6beb56fe505b 100644 (file)
--- a/vopts.h
+++ b/vopts.h
@@ -27,6 +27,7 @@
 #include "wtabbar.h"
 #include "i18n.h"
 #include "option.h"
+#include <vector>
 
 class Boxx;
 
@@ -56,5 +57,12 @@ class VOpts : public TBBoxx
     // Although LangCode is only used in the constructor, it has to
     // be valid for the lifetime of the VOpts instance, because we
     // create Option objects with pointers into LangCode's data.
+
+    vector<const char*> options4; // this is for tv size
+    vector<const char*> options4keys;
+    vector<const char*> options3; // this is for tv size
+    vector<const char*> options3keys;
+    vector<const char*> options16; // this is for tv standard
+    vector<const char*> options16keys;
 };
 #endif