Skip to content

Commit cafe667

Browse files
authored
Merge pull request #152 from rdkcentral/develop
Rebased develop
2 parents 3dff94c + 7b1dccc commit cafe667

File tree

5 files changed

+299
-5
lines changed

5 files changed

+299
-5
lines changed

AVInput/AVInput.cpp

Lines changed: 255 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,9 @@
4848
#define AVINPUT_METHOD_GET_EDID_VERSION "getEdidVersion"
4949
#define AVINPUT_METHOD_SET_EDID_ALLM_SUPPORT "setEdid2AllmSupport"
5050
#define AVINPUT_METHOD_GET_EDID_ALLM_SUPPORT "getEdid2AllmSupport"
51+
#define AVINPUT_METHOD_SET_VRR_SUPPORT "setVRRSupport"
52+
#define AVINPUT_METHOD_GET_VRR_SUPPORT "getVRRSupport"
53+
#define AVINPUT_METHOD_GET_VRR_FRAME_RATE "getVRRFrameRate"
5154
#define AVINPUT_METHOD_GET_HDMI_COMPATIBILITY_VERSION "getHdmiVersion"
5255
#define AVINPUT_METHOD_SET_MIXER_LEVELS "setMixerLevels"
5356
#define AVINPUT_METHOD_START_INPUT "startInput"
@@ -65,6 +68,12 @@
6568
#define AVINPUT_EVENT_ON_GAME_FEATURE_STATUS_CHANGED "gameFeatureStatusUpdate"
6669
#define AVINPUT_EVENT_ON_AVI_CONTENT_TYPE_CHANGED "aviContentTypeUpdate"
6770

71+
#define STR_ALLM "ALLM"
72+
#define VRR_TYPE_HDMI "VRR-HDMI"
73+
#define VRR_TYPE_FREESYNC "VRR-FREESYNC"
74+
#define VRR_TYPE_FREESYNC_PREMIUM "VRR-FREESYNC-PREMIUM"
75+
#define VRR_TYPE_FREESYNC_PREMIUM_PRO "VRR-FREESYNC-PREMIUM-PRO"
76+
6877
static bool isAudioBalanceSet = false;
6978
static int planeType = 0;
7079

@@ -156,7 +165,11 @@ void AVInput::InitializeIARM()
156165
IARM_BUS_DSMGR_NAME,
157166
IARM_BUS_DSMGR_EVENT_HDMI_IN_ALLM_STATUS,
158167
dsAVGameFeatureStatusEventHandler));
159-
IARM_CHECK(IARM_Bus_RegisterEventHandler(
168+
IARM_CHECK(IARM_Bus_RegisterEventHandler(
169+
IARM_BUS_DSMGR_NAME,
170+
IARM_BUS_DSMGR_EVENT_HDMI_IN_VRR_STATUS,
171+
dsAVGameFeatureStatusEventHandler));
172+
IARM_CHECK(IARM_Bus_RegisterEventHandler(
160173
IARM_BUS_DSMGR_NAME,
161174
IARM_BUS_DSMGR_EVENT_COMPOSITE_IN_HOTPLUG,
162175
dsAVEventHandler));
@@ -198,6 +211,9 @@ void AVInput::DeinitializeIARM()
198211
IARM_CHECK(IARM_Bus_RemoveEventHandler(
199212
IARM_BUS_DSMGR_NAME,
200213
IARM_BUS_DSMGR_EVENT_HDMI_IN_ALLM_STATUS, dsAVGameFeatureStatusEventHandler));
214+
IARM_CHECK(IARM_Bus_RemoveEventHandler(
215+
IARM_BUS_DSMGR_NAME,
216+
IARM_BUS_DSMGR_EVENT_HDMI_IN_VRR_STATUS, dsAVGameFeatureStatusEventHandler));
201217
IARM_CHECK(IARM_Bus_RemoveEventHandler(
202218
IARM_BUS_DSMGR_NAME,
203219
IARM_BUS_DSMGR_EVENT_COMPOSITE_IN_HOTPLUG, dsAVEventHandler));
@@ -231,6 +247,9 @@ void AVInput::RegisterAll()
231247
Register<JsonObject, JsonObject>(_T(AVINPUT_METHOD_SET_MIXER_LEVELS), &AVInput::setMixerLevels, this);
232248
Register<JsonObject, JsonObject>(_T(AVINPUT_METHOD_SET_EDID_ALLM_SUPPORT), &AVInput::setEdid2AllmSupportWrapper, this);
233249
Register<JsonObject, JsonObject>(_T(AVINPUT_METHOD_GET_EDID_ALLM_SUPPORT), &AVInput::getEdid2AllmSupportWrapper, this);
250+
Register<JsonObject, JsonObject>(_T(AVINPUT_METHOD_SET_VRR_SUPPORT), &AVInput::setVRRSupportWrapper, this);
251+
Register<JsonObject, JsonObject>(_T(AVINPUT_METHOD_GET_VRR_SUPPORT), &AVInput::getVRRSupportWrapper, this);
252+
Register<JsonObject, JsonObject>(_T(AVINPUT_METHOD_GET_VRR_FRAME_RATE), &AVInput::getVRRFrameRateWrapper, this);
234253
Register<JsonObject, JsonObject>(_T(AVINPUT_METHOD_GET_HDMI_COMPATIBILITY_VERSION), &AVInput::getHdmiVersionWrapper, this);
235254
Register<JsonObject, JsonObject>(_T(AVINPUT_METHOD_START_INPUT), &AVInput::startInput, this);
236255
Register<JsonObject, JsonObject>(_T(AVINPUT_METHOD_STOP_INPUT), &AVInput::stopInput, this);
@@ -239,6 +258,7 @@ void AVInput::RegisterAll()
239258
Register<JsonObject, JsonObject>(_T(AVINPUT_METHOD_GAME_FEATURE_STATUS), &AVInput::getGameFeatureStatusWrapper, this);
240259
m_primVolume = DEFAULT_PRIM_VOL_LEVEL;
241260
m_inputVolume = DEFAULT_INPUT_VOL_LEVEL;
261+
m_currentVrrType = dsVRR_NONE;
242262
}
243263

244264
void AVInput::UnregisterAll()
@@ -251,6 +271,9 @@ void AVInput::UnregisterAll()
251271
Unregister(_T(AVINPUT_METHOD_READ_EDID));
252272
Unregister(_T(AVINPUT_METHOD_READ_RAWSPD));
253273
Unregister(_T(AVINPUT_METHOD_READ_SPD));
274+
Unregister(_T(AVINPUT_METHOD_SET_VRR_SUPPORT));
275+
Unregister(_T(AVINPUT_METHOD_GET_VRR_SUPPORT));
276+
Unregister(_T(AVINPUT_METHOD_GET_VRR_FRAME_RATE));
254277
Unregister(_T(AVINPUT_METHOD_SET_EDID_VERSION));
255278
Unregister(_T(AVINPUT_METHOD_GET_EDID_VERSION));
256279
Unregister(_T(AVINPUT_METHOD_START_INPUT));
@@ -1024,18 +1047,71 @@ void AVInput::dsAVGameFeatureStatusEventHandler(const char *owner, IARM_EventId_
10241047

10251048
AVInput::_instance->AVInputALLMChange(hdmi_in_port, allm_mode);
10261049
}
1050+
if (IARM_BUS_DSMGR_EVENT_HDMI_IN_VRR_STATUS == eventId)
1051+
{
1052+
IARM_Bus_DSMgr_EventData_t *eventData = (IARM_Bus_DSMgr_EventData_t *)data;
1053+
int hdmi_in_port = eventData->data.hdmi_in_vrr_mode.port;
1054+
dsVRRType_t new_vrrType = eventData->data.hdmi_in_vrr_mode.vrr_type;
1055+
LOGWARN("Received IARM_BUS_DSMGR_EVENT_HDMI_IN_VRR_STATUS event port: %d, VRR Type: %d", hdmi_in_port,new_vrrType);
1056+
1057+
if(new_vrrType == dsVRR_NONE)
1058+
{
1059+
if(AVInput::_instance->m_currentVrrType != dsVRR_NONE){
1060+
AVInput::_instance->AVInputVRRChange(hdmi_in_port, AVInput::_instance->m_currentVrrType, false);
1061+
}
1062+
}
1063+
else
1064+
{
1065+
if(AVInput::_instance->m_currentVrrType != dsVRR_NONE){
1066+
AVInput::_instance->AVInputVRRChange(hdmi_in_port, AVInput::_instance->m_currentVrrType, false);
1067+
}
1068+
AVInput::_instance->AVInputVRRChange(hdmi_in_port, new_vrrType, true);
1069+
}
1070+
AVInput::_instance->m_currentVrrType = new_vrrType;
1071+
}
10271072
}
10281073

10291074
void AVInput::AVInputALLMChange( int port , bool allm_mode)
10301075
{
10311076
JsonObject params;
10321077
params["id"] = port;
1033-
params["gameFeature"] = "ALLM";
1078+
params["gameFeature"] = STR_ALLM;
10341079
params["mode"] = allm_mode;
10351080

10361081
sendNotify(AVINPUT_EVENT_ON_GAME_FEATURE_STATUS_CHANGED, params);
10371082
}
10381083

1084+
void AVInput::AVInputVRRChange( int port , dsVRRType_t vrr_type, bool vrr_mode)
1085+
{
1086+
JsonObject params;
1087+
switch(vrr_type)
1088+
{
1089+
case dsVRR_HDMI_VRR:
1090+
params["id"] = port;
1091+
params["gameFeature"] = VRR_TYPE_HDMI;
1092+
params["mode"] = vrr_mode;
1093+
break;
1094+
case dsVRR_AMD_FREESYNC:
1095+
params["id"] = port;
1096+
params["gameFeature"] = VRR_TYPE_FREESYNC;
1097+
params["mode"] = vrr_mode;
1098+
break;
1099+
case dsVRR_AMD_FREESYNC_PREMIUM:
1100+
params["id"] = port;
1101+
params["gameFeature"] = VRR_TYPE_FREESYNC_PREMIUM;
1102+
params["mode"] = vrr_mode;
1103+
break;
1104+
case dsVRR_AMD_FREESYNC_PREMIUM_PRO:
1105+
params["id"] = port;
1106+
params["gameFeature"] = VRR_TYPE_FREESYNC_PREMIUM_PRO;
1107+
params["mode"] = vrr_mode;
1108+
break;
1109+
default:
1110+
break;
1111+
}
1112+
sendNotify(AVINPUT_EVENT_ON_GAME_FEATURE_STATUS_CHANGED, params);
1113+
}
1114+
10391115
uint32_t AVInput::getSupportedGameFeatures(const JsonObject& parameters, JsonObject& response)
10401116
{
10411117
LOGINFOMETHOD();
@@ -1084,15 +1160,55 @@ uint32_t AVInput::getGameFeatureStatusWrapper(const JsonObject& parameters, Json
10841160
returnResponse(false);
10851161
}
10861162

1087-
if (strcmp (sGameFeature.c_str(), "ALLM") == 0)
1163+
if (strcmp (sGameFeature.c_str(), STR_ALLM) == 0)
10881164
{
10891165
bool allm = getALLMStatus(portId);
10901166
LOGWARN("AVInput::getGameFeatureStatusWrapper ALLM MODE:%d", allm);
10911167
response["mode"] = allm;
10921168
}
1169+
else if(strcmp (sGameFeature.c_str(), VRR_TYPE_HDMI) == 0)
1170+
{
1171+
bool hdmi_vrr = false;
1172+
dsHdmiInVrrStatus_t vrrStatus;
1173+
getVRRStatus(portId, &vrrStatus);
1174+
if(vrrStatus.vrrType == dsVRR_HDMI_VRR)
1175+
hdmi_vrr = true;
1176+
LOGWARN("AVInput::getGameFeatureStatusWrapper HDMI VRR MODE:%d", hdmi_vrr);
1177+
response["mode"] = hdmi_vrr;
1178+
}
1179+
else if(strcmp (sGameFeature.c_str(), VRR_TYPE_FREESYNC) == 0)
1180+
{
1181+
bool freesync = false;
1182+
dsHdmiInVrrStatus_t vrrStatus;
1183+
getVRRStatus(portId, &vrrStatus);
1184+
if(vrrStatus.vrrType == dsVRR_AMD_FREESYNC)
1185+
freesync = true;
1186+
LOGWARN("AVInput::getGameFeatureStatusWrapper FREESYNC MODE:%d", freesync);
1187+
response["mode"] = freesync;
1188+
}
1189+
else if(strcmp (sGameFeature.c_str(), VRR_TYPE_FREESYNC_PREMIUM) == 0)
1190+
{
1191+
bool freesync_premium = false;
1192+
dsHdmiInVrrStatus_t vrrStatus;
1193+
getVRRStatus(portId, &vrrStatus);
1194+
if(vrrStatus.vrrType == dsVRR_AMD_FREESYNC_PREMIUM)
1195+
freesync_premium = true;
1196+
LOGWARN("AVInput::getGameFeatureStatusWrapper FREESYNC PREMIUM MODE:%d", freesync_premium);
1197+
response["mode"] = freesync_premium;
1198+
}
1199+
else if(strcmp (sGameFeature.c_str(), VRR_TYPE_FREESYNC_PREMIUM_PRO) == 0)
1200+
{
1201+
bool freesync_premium_pro = false;
1202+
dsHdmiInVrrStatus_t vrrStatus;
1203+
getVRRStatus(portId, &vrrStatus);
1204+
if(vrrStatus.vrrType == dsVRR_AMD_FREESYNC_PREMIUM_PRO)
1205+
freesync_premium_pro = true;
1206+
LOGWARN("AVInput::getGameFeatureStatusWrapper FREESYNC PREMIUM PRO MODE:%d", freesync_premium_pro);
1207+
response["mode"] = freesync_premium_pro;
1208+
}
10931209
else
10941210
{
1095-
LOGWARN("AVInput::getGameFeatureStatusWrapper Mode is not supported. Supported mode: ALLM");
1211+
LOGWARN("AVInput::getGameFeatureStatusWrapper Mode is not supported. Supported mode: ALLM, VRR-HDMI, VRR-FREESYNC-PREMIUM");
10961212
returnResponse(false);
10971213
}
10981214
returnResponse(true);
@@ -1114,6 +1230,22 @@ bool AVInput::getALLMStatus(int iPort)
11141230
return allm;
11151231
}
11161232

1233+
bool AVInput::getVRRStatus(int iPort, dsHdmiInVrrStatus_t *vrrStatus)
1234+
{
1235+
bool ret = true;
1236+
try
1237+
{
1238+
device::HdmiInput::getInstance().getVRRStatus (iPort, vrrStatus);
1239+
LOGWARN("AVInput::getVRRStatus VRR TYPE: %d, VRR FRAMERATE: %f", vrrStatus->vrrType,vrrStatus->vrrAmdfreesyncFramerate_Hz);
1240+
}
1241+
catch (const device::Exception& err)
1242+
{
1243+
LOG_DEVICE_EXCEPTION1(std::to_string(iPort));
1244+
ret = false;
1245+
}
1246+
return ret;
1247+
}
1248+
11171249
uint32_t AVInput::getRawSPDWrapper(const JsonObject& parameters, JsonObject& response)
11181250
{
11191251
LOGINFOMETHOD();
@@ -1386,6 +1518,125 @@ uint32_t AVInput::getEdid2AllmSupportWrapper(const JsonObject& parameters, JsonO
13861518
}
13871519
}
13881520

1521+
bool AVInput::getVRRSupport(int portId,bool *vrrSupportValue)
1522+
{
1523+
bool ret = true;
1524+
try
1525+
{
1526+
device::HdmiInput::getInstance().getVRRSupport (portId, vrrSupportValue);
1527+
LOGINFO("AVInput - getVRRSupport:%d", *vrrSupportValue);
1528+
}
1529+
catch (const device::Exception& err)
1530+
{
1531+
LOG_DEVICE_EXCEPTION1(std::to_string(portId));
1532+
ret = false;
1533+
}
1534+
return ret;
1535+
}
1536+
1537+
uint32_t AVInput::getVRRSupportWrapper(const JsonObject& parameters, JsonObject& response)
1538+
{
1539+
LOGINFOMETHOD();
1540+
returnIfParamNotFound(parameters, "portId");
1541+
string sPortId = parameters["portId"].String();
1542+
1543+
int portId = 0;
1544+
bool vrrSupport = true;
1545+
1546+
try {
1547+
portId = stoi(sPortId);
1548+
}catch (const std::exception& err) {
1549+
LOGWARN("sPortId invalid paramater: %s ", sPortId.c_str());
1550+
returnResponse(false);
1551+
}
1552+
1553+
bool result = getVRRSupport(portId, &vrrSupport);
1554+
if(result == true)
1555+
{
1556+
response["vrrSupport"] = vrrSupport;
1557+
returnResponse(true);
1558+
}
1559+
else
1560+
{
1561+
returnResponse(false);
1562+
}
1563+
}
1564+
1565+
bool AVInput::setVRRSupport(int portId, bool vrrSupport)
1566+
{
1567+
bool ret = true;
1568+
try
1569+
{
1570+
device::HdmiInput::getInstance().setVRRSupport (portId, vrrSupport);
1571+
LOGWARN("AVInput - vrrSupport:%d", vrrSupport);
1572+
}
1573+
catch (const device::Exception& err)
1574+
{
1575+
LOG_DEVICE_EXCEPTION1(std::to_string(portId));
1576+
ret = false;
1577+
}
1578+
return ret;
1579+
1580+
}
1581+
1582+
uint32_t AVInput::setVRRSupportWrapper(const JsonObject& parameters, JsonObject& response)
1583+
{
1584+
LOGINFOMETHOD();
1585+
1586+
returnIfParamNotFound(parameters, "portId");
1587+
returnIfParamNotFound(parameters, "vrrSupport");
1588+
1589+
int portId = 0;
1590+
string sPortId = parameters["portId"].String();
1591+
bool vrrSupport = parameters["vrrSupport"].Boolean();
1592+
1593+
try {
1594+
portId = stoi(sPortId);
1595+
}catch (const std::exception& err) {
1596+
LOGWARN("sPortId invalid paramater: %s ", sPortId.c_str());
1597+
returnResponse(false);
1598+
}
1599+
1600+
bool result = setVRRSupport(portId, vrrSupport);
1601+
if(result == true)
1602+
{
1603+
returnResponse(true);
1604+
}
1605+
else
1606+
{
1607+
returnResponse(false);
1608+
}
1609+
}
1610+
1611+
uint32_t AVInput::getVRRFrameRateWrapper(const JsonObject& parameters, JsonObject& response)
1612+
{
1613+
LOGINFOMETHOD();
1614+
returnIfParamNotFound(parameters, "portId");
1615+
string sPortId = parameters["portId"].String();
1616+
1617+
int portId = 0;
1618+
dsHdmiInVrrStatus_t vrrStatus;
1619+
vrrStatus.vrrAmdfreesyncFramerate_Hz = 0;
1620+
1621+
try {
1622+
portId = stoi(sPortId);
1623+
}catch (const std::exception& err) {
1624+
LOGWARN("sPortId invalid paramater: %s ", sPortId.c_str());
1625+
returnResponse(false);
1626+
}
1627+
1628+
bool result = getVRRStatus(portId, &vrrStatus);
1629+
if(result == true)
1630+
{
1631+
response["currentVRRVideoFrameRate"] = vrrStatus.vrrAmdfreesyncFramerate_Hz;
1632+
returnResponse(true);
1633+
}
1634+
else
1635+
{
1636+
returnResponse(false);
1637+
}
1638+
}
1639+
13891640
uint32_t AVInput::setEdidVersionWrapper(const JsonObject& parameters, JsonObject& response)
13901641
{
13911642
LOGINFOMETHOD();

AVInput/AVInput.h

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,8 @@ class AVInput: public PluginHost::IPlugin, public PluginHost::JSONRPC
4747

4848
int m_primVolume;
4949
int m_inputVolume; //Player Volume
50+
51+
dsVRRType_t m_currentVrrType;
5052
public:
5153
// IPlugin methods
5254
// -------------------------------------------------------------------------------------------------------
@@ -79,6 +81,9 @@ class AVInput: public PluginHost::IPlugin, public PluginHost::JSONRPC
7981
uint32_t getEdidVersionWrapper(const JsonObject& parameters, JsonObject& response);
8082
uint32_t setEdid2AllmSupportWrapper(const JsonObject& parameters, JsonObject& response);
8183
uint32_t getEdid2AllmSupportWrapper(const JsonObject& parameters, JsonObject& response);
84+
uint32_t setVRRSupportWrapper(const JsonObject& parameters, JsonObject& response);
85+
uint32_t getVRRSupportWrapper(const JsonObject& parameters, JsonObject& response);
86+
uint32_t getVRRFrameRateWrapper(const JsonObject& parameters, JsonObject& response);
8287
uint32_t startInput(const JsonObject& parameters, JsonObject& response);
8388
uint32_t stopInput(const JsonObject& parameters, JsonObject& response);
8489
uint32_t setVideoRectangleWrapper(const JsonObject& parameters, JsonObject& response);
@@ -95,10 +100,14 @@ class AVInput: public PluginHost::IPlugin, public PluginHost::JSONRPC
95100
std::string getSPD(int iPort);
96101
int setEdidVersion(int iPort, int iEdidVer);
97102
int getEdidVersion(int iPort);
103+
bool setVRRSupport(int portId, bool vrrSupport);
104+
bool getVRRSupport(int portId, bool *vrrSupportValue);
98105
bool setVideoRectangle(int x, int y, int width, int height, int type);
99106
bool getALLMStatus(int iPort);
107+
bool getVRRStatus(int iPort, dsHdmiInVrrStatus_t *vrrStatus);
100108

101109
void AVInputHotplug(int input , int connect, int type);
110+
void AVInputVRRChange( int port , dsVRRType_t vrr_type, bool vrr_mode);
102111
static void dsAVEventHandler(const char *owner, IARM_EventId_t eventId, void *data, size_t len);
103112

104113
void AVInputSignalChange( int port , int signalStatus, int type);

0 commit comments

Comments
 (0)