8 #include "interface/vmcs_host/vc_dispmanx_types.h"
11 #define LOC QString("DisplayRPI: ")
12 #define MAX_MODE_ID (127)
33 display->
Callback(Reason, Param1, Param2);
40 case DISPMANX_ID_MAIN_LCD:
return "MainLCD";
41 case DISPMANX_ID_AUX_LCD:
return "AuxLCD";
42 case DISPMANX_ID_HDMI0:
return "HDMI1";
43 case DISPMANX_ID_SDTV:
return "SDTV";
44 case DISPMANX_ID_FORCE_LCD:
return "ForceLCD";
45 case DISPMANX_ID_FORCE_TV:
return "ForceTV";
46 case DISPMANX_ID_FORCE_OTHER:
return "ForceOther";
47 case DISPMANX_ID_HDMI1:
return "HDMI2";
48 case DISPMANX_ID_FORCE_TV2:
return "ForceTV2";
61 LOG(VB_GENERAL, LOG_ERR,
LOC +
"Failed to initialise VCHI");
67 LOG(VB_GENERAL, LOG_ERR,
LOC +
"Failed to create VCHI connection");
71 VCHI_CONNECTION_T *vchiconnection;
79 TV_ATTACHED_DEVICES_T devices;
80 if (vc_tv_get_attached_devices(&devices) == 0)
84 if (devices.num_attached > 1)
85 LOG(VB_GENERAL, LOG_WARNING,
LOC + QString(
"%1 connected displays - this may not work")
86 .arg(devices.num_attached));
92 LOG(VB_GENERAL, LOG_INFO,
LOC + QString(
"Connected to display '%1'")
106 if (Reason == VC_HDMI_DVI || Reason == VC_HDMI_HDMI)
112 TV_DISPLAY_STATE_T tvstate;
114 vc_tv_get_display_state(&tvstate);
124 m_refreshRate =
static_cast<double>(tvstate.display.hdmi.frame_rate);
125 m_resolution = QSize(tvstate.display.hdmi.width, tvstate.display.hdmi.height);
140 vc_tv_hdmi_ddc_read(offset, 128, buffer);
147 result.append(
reinterpret_cast<const char *
>(buffer), 128);
148 int extensions = buffer[0x7e];
150 if (extensions > 10) extensions = 10;
151 for (
int i = 0; i < extensions; ++i)
155 vc_tv_hdmi_ddc_read(offset, 128, buffer);
157 result.append(
reinterpret_cast<const char *
>(buffer), 128);
179 const HDMI_RES_GROUP_T groups[2] = { HDMI_RES_GROUP_CEA, HDMI_RES_GROUP_DMT };
181 for (
int i = 0; i < 2; ++i)
183 HDMI_RES_GROUP_T group = groups[i];
185 memset(modes, 0,
sizeof(modes));
186 HDMI_RES_GROUP_T preferredgroup;
192 count = vc_tv_hdmi_get_supported_modes_new_id(
m_deviceId, group, modes,
198 count = vc_tv_hdmi_get_supported_modes_new(group, modes,
MAX_MODE_ID,
199 &preferredgroup, &preferred);
202 for (
int j = 0; j < count; ++j)
206 LOG(VB_PLAYBACK, LOG_INFO,
LOC + QString(
"Ignoring mode %1x%2 %3 - cannot resize framebuffer")
207 .arg(modes[j].width).arg(modes[j].height).arg(modes[j].frame_rate));
211 if (modes[j].scan_mode)
213 LOG(VB_PLAYBACK, LOG_INFO,
LOC + QString(
"Ignoring interlaced mode %1x%2 %3")
214 .arg(modes[j].width).arg(modes[j].height).arg(modes[j].frame_rate));
218 double rate =
static_cast<double>(modes[j].frame_rate);
219 QSize resolution(modes[j].width, modes[j].height);
221 if (screenmap.find(key) == screenmap.end())
224 screenmap[key].AddRefreshRate(rate);
226 QPair<uint32_t,uint32_t>(modes[j].code, modes[j].group));
230 for (
auto it = screenmap.begin(); screenmap.end() != it; ++it)
239 auto rate =
static_cast<double>(NAN);
246 LOG(VB_GENERAL, LOG_ERR,
LOC +
"Desired resolution and frame rate not found.");
253 LOG(VB_GENERAL, LOG_ERR,
LOC +
"Failed to find mode");
257 HDMI_RES_GROUP_T group =
static_cast<HDMI_RES_GROUP_T
>(
m_modeMap.value(mode).second);
258 uint32_t modeid =
m_modeMap.value(mode).first;
262 int ret = (
m_deviceId != -1) ? vc_tv_hdmi_power_on_explicit_new_id(
m_deviceId, modetype, group, modeid) :
263 vc_tv_hdmi_power_on_explicit_new(modetype, group, modeid);
271 LOG(VB_GENERAL, LOG_WARNING,
LOC +
"Timed out waiting for mode switch");