static void fetchDisplayModes() { s_hasModeApi = false; s_res_displayModes.clear(); CJNIDisplay display = CXBMCApp::getWindow().getDecorView().getDisplay(); if (display) { CJNIDisplayMode m = display.getMode(); if (m) { if (m.getPhysicalWidth() > m.getPhysicalHeight()) // Assume unusable if portrait is returned { s_hasModeApi = true; CLog::Log(LOGDEBUG, "CEGLNativeTypeAndroid: current mode: %d: %dx%d@%f", m.getModeId(), m.getPhysicalWidth(), m.getPhysicalHeight(), m.getRefreshRate()); s_res_cur_displayMode.strId = StringUtils::Format("%d", m.getModeId()); s_res_cur_displayMode.iWidth = s_res_cur_displayMode.iScreenWidth = m.getPhysicalWidth(); s_res_cur_displayMode.iHeight = s_res_cur_displayMode.iScreenHeight = m.getPhysicalHeight(); s_res_cur_displayMode.fRefreshRate = m.getRefreshRate(); s_res_cur_displayMode.dwFlags= D3DPRESENTFLAG_PROGRESSIVE; s_res_cur_displayMode.iScreen = 0; s_res_cur_displayMode.bFullScreen = true; s_res_cur_displayMode.iSubtitles = (int)(0.965 * s_res_cur_displayMode.iHeight); s_res_cur_displayMode.fPixelRatio = 1.0f; s_res_cur_displayMode.strMode = StringUtils::Format("%dx%d @ %.6f%s - Full Screen", s_res_cur_displayMode.iScreenWidth, s_res_cur_displayMode.iScreenHeight, s_res_cur_displayMode.fRefreshRate, s_res_cur_displayMode.dwFlags & D3DPRESENTFLAG_INTERLACED ? "i" : ""); std::vector<CJNIDisplayMode> modes = display.getSupportedModes(); for (auto m : modes) { CLog::Log(LOGDEBUG, "CEGLNativeTypeAndroid: available mode: %d: %dx%d@%f", m.getModeId(), m.getPhysicalWidth(), m.getPhysicalHeight(), m.getRefreshRate()); RESOLUTION_INFO res; res.strId = StringUtils::Format("%d", m.getModeId()); res.iWidth = res.iScreenWidth = m.getPhysicalWidth(); res.iHeight = res.iScreenHeight = m.getPhysicalHeight(); res.fRefreshRate = m.getRefreshRate(); res.dwFlags= D3DPRESENTFLAG_PROGRESSIVE; res.iScreen = 0; res.bFullScreen = true; res.iSubtitles = (int)(0.965 * res.iHeight); res.fPixelRatio = 1.0f; res.strMode = StringUtils::Format("%dx%d @ %.6f%s - Full Screen", res.iScreenWidth, res.iScreenHeight, res.fRefreshRate, res.dwFlags & D3DPRESENTFLAG_INTERLACED ? "i" : ""); s_res_displayModes.push_back(res); } } } } }
bool CEGLNativeTypeAndroid::ProbeResolutions(std::vector<RESOLUTION_INFO> &resolutions) { if (s_hasModeApi) { resolutions.insert(resolutions.end(), s_res_displayModes.begin(), s_res_displayModes.end()); return true; } RESOLUTION_INFO res; bool ret = GetNativeResolution(&res); if (ret && res.iWidth > 1 && res.iHeight > 1) { std::vector<float> refreshRates; CJNIWindow window = CXBMCApp::getWindow(); if (window) { CJNIView view = window.getDecorView(); if (view) { CJNIDisplay display = view.getDisplay(); if (display) { refreshRates = display.getSupportedRefreshRates(); } } if (!refreshRates.empty()) { for (unsigned int i = 0; i < refreshRates.size(); i++) { if (refreshRates[i] < 20.0 || refreshRates[i] > 70.0) continue; res.fRefreshRate = refreshRates[i]; res.strMode = StringUtils::Format("%dx%d @ %.6f%s - Full Screen", res.iScreenWidth, res.iScreenHeight, res.fRefreshRate, res.dwFlags & D3DPRESENTFLAG_INTERLACED ? "i" : ""); resolutions.push_back(res); } } } if (resolutions.empty()) { /* No valid refresh rates available, just provide the current one */ resolutions.push_back(res); } return true; } return false; }
bool CEGLNativeTypeAndroid::ProbeResolutions(std::vector<RESOLUTION_INFO> &resolutions) { RESOLUTION_INFO res; bool ret = GetNativeResolution(&res); if (ret && res.iWidth > 1 && res.iHeight > 1) { std::vector<float> refreshRates; CJNIWindow window = CXBMCApp::getWindow(); if (window) { CJNIView view = window.getDecorView(); if (view) { CJNIDisplay display = view.getDisplay(); if (display) { refreshRates = display.getSupportedRefreshRates(); } } } if (refreshRates.size()) { for (unsigned int i = 0; i < refreshRates.size(); i++) { res.fRefreshRate = refreshRates[i]; resolutions.push_back(res); } } else { /* No refresh rate list available, just provide the current one */ resolutions.push_back(res); } return true; } return false; }