{\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
{\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
#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
{\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
{\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
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
} 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();
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
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
// 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
{\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
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; }
setTVsize(ASPECT4X3);
selectVideoMode(0);
+
OMX_ERRORTYPE error;
error = OMX_Init();
if (error != OMX_ErrorNone) {
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);
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;
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;
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);
}
}
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;
}
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;
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
void selectVideoMode(int interlaced);\r
UCHAR tvsystem;\r
bool signalon;\r
+ bool pendingmodechange;\r
+ bool hdmi;\r
\r
\r
\r
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
// --- 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
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
}\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
#include "wtabbar.h"
#include "i18n.h"
#include "option.h"
+#include <vector>
class Boxx;
// 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