bool CEGLNativeTypeRaspberryPI::ProbeResolutions(std::vector<RESOLUTION_INFO> &resolutions) { #if defined(TARGET_RASPBERRY_PI) resolutions.clear(); if(!m_DllBcmHost) return false; m_fixedMode = false; /* read initial desktop resolution before probe resolutions. * probing will replace the desktop resolution when it finds the same one. * we raplace it because probing will generate more detailed * resolution flags we don't get with vc_tv_get_state. */ if(m_initDesktopRes) { TV_DISPLAY_STATE_T tv_state; // get current display settings state memset(&tv_state, 0, sizeof(TV_DISPLAY_STATE_T)); m_DllBcmHost->vc_tv_get_display_state(&tv_state); if ((tv_state.state & ( VC_HDMI_HDMI | VC_HDMI_DVI )) != 0) // hdtv { m_desktopRes.iScreen = 0; m_desktopRes.bFullScreen = true; m_desktopRes.iWidth = tv_state.display.hdmi.width; m_desktopRes.iHeight = tv_state.display.hdmi.height; m_desktopRes.iScreenWidth = tv_state.display.hdmi.width; m_desktopRes.iScreenHeight= tv_state.display.hdmi.height; m_desktopRes.dwFlags = MAKEFLAGS(tv_state.display.hdmi.group, tv_state.display.hdmi.mode, tv_state.display.hdmi.scan_mode); m_desktopRes.fPixelRatio = get_display_aspect_ratio((HDMI_ASPECT_T)tv_state.display.hdmi.display_options.aspect) / ((float)m_desktopRes.iScreenWidth / (float)m_desktopRes.iScreenHeight); // Also add 3D flags if (tv_state.display.hdmi.format_3d == HDMI_3D_FORMAT_SBS_HALF) { m_desktopRes.dwFlags |= D3DPRESENTFLAG_MODE3DSBS; m_desktopRes.fPixelRatio *= 2.0; } else if (tv_state.display.hdmi.format_3d == HDMI_3D_FORMAT_TB_HALF) { m_desktopRes.dwFlags |= D3DPRESENTFLAG_MODE3DTB; m_desktopRes.fPixelRatio *= 0.5; } m_desktopRes.fRefreshRate = (float)tv_state.display.hdmi.frame_rate; } else // sdtv { m_desktopRes.iScreen = 0; m_desktopRes.bFullScreen = true; m_desktopRes.iWidth = tv_state.display.sdtv.width; m_desktopRes.iHeight = tv_state.display.sdtv.height; m_desktopRes.iScreenWidth = tv_state.display.sdtv.width; m_desktopRes.iScreenHeight= tv_state.display.sdtv.height; m_desktopRes.dwFlags = D3DPRESENTFLAG_INTERLACED; m_desktopRes.fRefreshRate = (float)tv_state.display.sdtv.frame_rate; m_desktopRes.fPixelRatio = get_display_aspect_ratio((SDTV_ASPECT_T)tv_state.display.sdtv.display_options.aspect) / ((float)m_desktopRes.iScreenWidth / (float)m_desktopRes.iScreenHeight); } m_desktopRes.strMode = StringUtils::Format("%dx%d", m_desktopRes.iScreenWidth, m_desktopRes.iScreenHeight); if((int)m_desktopRes.fRefreshRate > 1) { m_desktopRes.strMode = StringUtils::Format("%dx%d @ %.2f%s - Full Screen", m_desktopRes.iScreenWidth, m_desktopRes.iScreenHeight, m_desktopRes.fRefreshRate, m_desktopRes.dwFlags & D3DPRESENTFLAG_INTERLACED ? "i" : ""); } m_initDesktopRes = false; int gui_width = m_desktopRes.iWidth; int gui_height = m_desktopRes.iHeight; ClampToGUIDisplayLimits(gui_width, gui_height); m_desktopRes.iWidth = gui_width; m_desktopRes.iHeight = gui_height; m_desktopRes.iSubtitles = (int)(0.965 * m_desktopRes.iHeight); CLog::Log(LOGDEBUG, "EGL initial desktop resolution %s (%.2f)\n", m_desktopRes.strMode.c_str(), m_desktopRes.fPixelRatio); } GetSupportedModes(HDMI_RES_GROUP_CEA, resolutions); GetSupportedModes(HDMI_RES_GROUP_DMT, resolutions); if(resolutions.size() == 0) { RESOLUTION_INFO res; CLog::Log(LOGDEBUG, "EGL probe resolution %s:%x\n", m_desktopRes.strMode.c_str(), m_desktopRes.dwFlags); AddUniqueResolution(m_desktopRes, resolutions); } if(resolutions.size() < 2) m_fixedMode = true; DLOG("CEGLNativeTypeRaspberryPI::ProbeResolutions\n"); return true; #else return false; #endif }
bool CEGLNativeTypeRaspberryPI::ProbeResolutions(std::vector<RESOLUTION_INFO> &resolutions) { #if defined(TARGET_RASPBERRY_PI) resolutions.clear(); if(!m_DllBcmHost) return false; /* read initial desktop resolution before probe resolutions. * probing will replace the desktop resolution when it finds the same one. * we raplace it because probing will generate more detailed * resolution flags we don't get with vc_tv_get_state. */ if(m_initDesktopRes) { TV_DISPLAY_STATE_T tv_state; // get current display settings state memset(&tv_state, 0, sizeof(TV_DISPLAY_STATE_T)); m_DllBcmHost->vc_tv_get_display_state(&tv_state); if ((tv_state.state & ( VC_HDMI_HDMI | VC_HDMI_DVI )) != 0) // hdtv { m_desktopRes.iScreen = 0; m_desktopRes.bFullScreen = true; m_desktopRes.iWidth = tv_state.display.hdmi.width; m_desktopRes.iHeight = tv_state.display.hdmi.height; m_desktopRes.iScreenWidth = tv_state.display.hdmi.width; m_desktopRes.iScreenHeight= tv_state.display.hdmi.height; m_desktopRes.dwFlags = MAKEFLAGS(tv_state.display.hdmi.group, tv_state.display.hdmi.mode, tv_state.display.hdmi.scan_mode); m_desktopRes.fPixelRatio = tv_state.display.hdmi.display_options.aspect == 0 ? 1.0f : get_display_aspect_ratio((HDMI_ASPECT_T)tv_state.display.hdmi.display_options.aspect) / ((float)m_desktopRes.iScreenWidth / (float)m_desktopRes.iScreenHeight); HDMI_PROPERTY_PARAM_T property; property.property = HDMI_PROPERTY_PIXEL_CLOCK_TYPE; vc_tv_hdmi_get_property(&property); m_desktopRes.fRefreshRate = property.param1 == HDMI_PIXEL_CLOCK_TYPE_NTSC ? tv_state.display.hdmi.frame_rate * (1000.0f/1001.0f) : tv_state.display.hdmi.frame_rate; } else if ((tv_state.state & ( VC_SDTV_NTSC | VC_SDTV_PAL )) != 0) // sdtv { m_desktopRes.iScreen = 0; m_desktopRes.bFullScreen = true; m_desktopRes.iWidth = tv_state.display.sdtv.width; m_desktopRes.iHeight = tv_state.display.sdtv.height; m_desktopRes.iScreenWidth = tv_state.display.sdtv.width; m_desktopRes.iScreenHeight= tv_state.display.sdtv.height; m_desktopRes.dwFlags = MAKEFLAGS(HDMI_RES_GROUP_INVALID, tv_state.display.sdtv.mode, 1); m_desktopRes.fRefreshRate = (float)tv_state.display.sdtv.frame_rate; m_desktopRes.fPixelRatio = tv_state.display.hdmi.display_options.aspect == 0 ? 1.0f : get_display_aspect_ratio((SDTV_ASPECT_T)tv_state.display.sdtv.display_options.aspect) / ((float)m_desktopRes.iScreenWidth / (float)m_desktopRes.iScreenHeight); } else if ((tv_state.state & VC_LCD_ATTACHED_DEFAULT) != 0) // lcd { m_desktopRes.iScreen = 0; m_desktopRes.bFullScreen = true; m_desktopRes.iWidth = tv_state.display.sdtv.width; m_desktopRes.iHeight = tv_state.display.sdtv.height; m_desktopRes.iScreenWidth = tv_state.display.sdtv.width; m_desktopRes.iScreenHeight= tv_state.display.sdtv.height; m_desktopRes.dwFlags = MAKEFLAGS(HDMI_RES_GROUP_INVALID, 0, 0); m_desktopRes.fRefreshRate = (float)tv_state.display.sdtv.frame_rate; m_desktopRes.fPixelRatio = tv_state.display.hdmi.display_options.aspect == 0 ? 1.0f : get_display_aspect_ratio((SDTV_ASPECT_T)tv_state.display.sdtv.display_options.aspect) / ((float)m_desktopRes.iScreenWidth / (float)m_desktopRes.iScreenHeight); } SetResolutionString(m_desktopRes); m_initDesktopRes = false; m_desktopRes.iSubtitles = (int)(0.965 * m_desktopRes.iHeight); CLog::Log(LOGDEBUG, "EGL initial desktop resolution %s (%.2f)\n", m_desktopRes.strMode.c_str(), m_desktopRes.fPixelRatio); } if(GETFLAGS_GROUP(m_desktopRes.dwFlags) && GETFLAGS_MODE(m_desktopRes.dwFlags)) { GetSupportedModes(HDMI_RES_GROUP_DMT, resolutions); GetSupportedModes(HDMI_RES_GROUP_CEA, resolutions); } { AddUniqueResolution(m_desktopRes, resolutions, true); CLog::Log(LOGDEBUG, "EGL probe resolution %s:%x\n", m_desktopRes.strMode.c_str(), m_desktopRes.dwFlags); } DLOG("CEGLNativeTypeRaspberryPI::ProbeResolutions\n"); return true; #else return false; #endif }
bool CEGLNativeTypeRaspberryPI::ProbeResolutions(std::vector<RESOLUTION_INFO> &resolutions) { #if defined(TARGET_RASPBERRY_PI) resolutions.clear(); m_res.clear(); if(!m_DllBcmHost) return false; m_fixedMode = false; /* read initial desktop resolution before probe resolutions. * probing will replace the desktop resolution when it finds the same one. * we raplace it because probing will generate more detailed * resolution flags we don't get with vc_tv_get_state. */ if(m_initDesktopRes) { TV_GET_STATE_RESP_T tv_state; // get current display settings state memset(&tv_state, 0, sizeof(TV_GET_STATE_RESP_T)); m_DllBcmHost->vc_tv_get_state(&tv_state); m_desktopRes.iScreen = 0; m_desktopRes.bFullScreen = true; m_desktopRes.iWidth = tv_state.width; m_desktopRes.iHeight = tv_state.height; m_desktopRes.iScreenWidth = tv_state.width; m_desktopRes.iScreenHeight= tv_state.height; m_desktopRes.dwFlags = tv_state.scan_mode ? D3DPRESENTFLAG_INTERLACED : D3DPRESENTFLAG_PROGRESSIVE; m_desktopRes.fRefreshRate = (float)tv_state.frame_rate; m_desktopRes.strMode.Format("%dx%d", tv_state.width, tv_state.height); if((float)tv_state.frame_rate > 1) { m_desktopRes.strMode.Format("%s @ %.2f%s - Full Screen", m_desktopRes.strMode, (float)tv_state.frame_rate, m_desktopRes.dwFlags & D3DPRESENTFLAG_INTERLACED ? "i" : ""); } m_initDesktopRes = false; int gui_width = m_desktopRes.iWidth; int gui_height = m_desktopRes.iHeight; ClampToGUIDisplayLimits(gui_width, gui_height); m_desktopRes.iWidth = gui_width; m_desktopRes.iHeight = gui_height; m_desktopRes.iSubtitles = (int)(0.965 * m_desktopRes.iHeight); CLog::Log(LOGDEBUG, "EGL initial desktop resolution %s\n", m_desktopRes.strMode.c_str()); } GetSupportedModes(HDMI_RES_GROUP_CEA, resolutions); GetSupportedModes(HDMI_RES_GROUP_DMT, resolutions); GetSupportedModes(HDMI_RES_GROUP_CEA_3D, resolutions); if(resolutions.size() == 0) { TV_GET_STATE_RESP_T tv; m_DllBcmHost->vc_tv_get_state(&tv); RESOLUTION_INFO res; CLog::Log(LOGDEBUG, "EGL probe resolution %dx%d@%f %s:%x\n", m_desktopRes.iWidth, m_desktopRes.iHeight, m_desktopRes.fRefreshRate, m_desktopRes.dwFlags & D3DPRESENTFLAG_INTERLACED ? "i" : "p"); m_res.push_back(m_desktopRes); resolutions.push_back(m_desktopRes); } if(resolutions.size() < 2) m_fixedMode = true; DLOG("CEGLNativeTypeRaspberryPI::ProbeResolutions\n"); return true; #else return false; #endif }