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");
bool GetBoolSetting(const QString &key, bool defaultval=false)
static int FindBestMatch(const MythDisplayModes &Modes, const MythDisplayMode &Mode, double &TargetRate)
static uint64_t CalcKey(QSize Size, double Rate)
void UpdateCurrentMode(void) override
Retrieve screen details.
void Callback(uint32_t Reason, uint32_t, uint32_t)
const MythDisplayModes & GetVideoModes(void) override
QWaitCondition m_modeChangeWait
QMap< uint64_t, QPair< uint32_t, uint32_t > > m_modeMap
bool SwitchToVideoMode(QSize Size, double Framerate) override
bool UsingVideoModes(void) override
VCHI_INSTANCE_T m_vchiInstance
~MythDisplayRPI() override
virtual void UpdateCurrentMode()
Retrieve screen details.
MythDisplayModes m_videoModes
bool m_waitForModeChanges
QSize DisplaySize() const
MythCoreContext * gCoreContext
This global variable contains the MythCoreContext instance for the app.
std::map< uint64_t, MythDisplayMode > DisplayModeMap
std::vector< MythDisplayMode > MythDisplayModes
static void MythTVServiceCallback(void *Context, uint32_t Reason, uint32_t Param1, uint32_t Param2)
static QString DisplayToString(int Id)
#define LOG(_MASK_, _LEVEL_, _QSTRING_)