Skip to content

Commit 033454b

Browse files
committed
RDKEMW-4116 : VRR Feature Middleware changes.
1 parent 668cc7c commit 033454b

File tree

2 files changed

+222
-2
lines changed

2 files changed

+222
-2
lines changed

AVInput/AVInput.cpp

Lines changed: 214 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,8 @@
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"
5153
#define AVINPUT_METHOD_GET_HDMI_COMPATIBILITY_VERSION "getHdmiVersion"
5254
#define AVINPUT_METHOD_SET_MIXER_LEVELS "setMixerLevels"
5355
#define AVINPUT_METHOD_START_INPUT "startInput"
@@ -156,7 +158,11 @@ void AVInput::InitializeIARM()
156158
IARM_BUS_DSMGR_NAME,
157159
IARM_BUS_DSMGR_EVENT_HDMI_IN_ALLM_STATUS,
158160
dsAVGameFeatureStatusEventHandler));
159-
IARM_CHECK(IARM_Bus_RegisterEventHandler(
161+
IARM_CHECK(IARM_Bus_RegisterEventHandler(
162+
IARM_BUS_DSMGR_NAME,
163+
IARM_BUS_DSMGR_EVENT_HDMI_IN_VRR_STATUS,
164+
dsAVGameFeatureStatusEventHandler));
165+
IARM_CHECK(IARM_Bus_RegisterEventHandler(
160166
IARM_BUS_DSMGR_NAME,
161167
IARM_BUS_DSMGR_EVENT_COMPOSITE_IN_HOTPLUG,
162168
dsAVEventHandler));
@@ -198,6 +204,9 @@ void AVInput::DeinitializeIARM()
198204
IARM_CHECK(IARM_Bus_RemoveEventHandler(
199205
IARM_BUS_DSMGR_NAME,
200206
IARM_BUS_DSMGR_EVENT_HDMI_IN_ALLM_STATUS, dsAVGameFeatureStatusEventHandler));
207+
IARM_CHECK(IARM_Bus_RemoveEventHandler(
208+
IARM_BUS_DSMGR_NAME,
209+
IARM_BUS_DSMGR_EVENT_HDMI_IN_VRR_STATUS, dsAVGameFeatureStatusEventHandler));
201210
IARM_CHECK(IARM_Bus_RemoveEventHandler(
202211
IARM_BUS_DSMGR_NAME,
203212
IARM_BUS_DSMGR_EVENT_COMPOSITE_IN_HOTPLUG, dsAVEventHandler));
@@ -231,6 +240,8 @@ void AVInput::RegisterAll()
231240
Register<JsonObject, JsonObject>(_T(AVINPUT_METHOD_SET_MIXER_LEVELS), &AVInput::setMixerLevels, this);
232241
Register<JsonObject, JsonObject>(_T(AVINPUT_METHOD_SET_EDID_ALLM_SUPPORT), &AVInput::setEdid2AllmSupportWrapper, this);
233242
Register<JsonObject, JsonObject>(_T(AVINPUT_METHOD_GET_EDID_ALLM_SUPPORT), &AVInput::getEdid2AllmSupportWrapper, this);
243+
Register<JsonObject, JsonObject>(_T(AVINPUT_METHOD_SET_VRR_SUPPORT), &AVInput::setVRRSupportWrapper, this);
244+
Register<JsonObject, JsonObject>(_T(AVINPUT_METHOD_GET_VRR_SUPPORT), &AVInput::getVRRSupportWrapper, this);
234245
Register<JsonObject, JsonObject>(_T(AVINPUT_METHOD_GET_HDMI_COMPATIBILITY_VERSION), &AVInput::getHdmiVersionWrapper, this);
235246
Register<JsonObject, JsonObject>(_T(AVINPUT_METHOD_START_INPUT), &AVInput::startInput, this);
236247
Register<JsonObject, JsonObject>(_T(AVINPUT_METHOD_STOP_INPUT), &AVInput::stopInput, this);
@@ -239,6 +250,7 @@ void AVInput::RegisterAll()
239250
Register<JsonObject, JsonObject>(_T(AVINPUT_METHOD_GAME_FEATURE_STATUS), &AVInput::getGameFeatureStatusWrapper, this);
240251
m_primVolume = DEFAULT_PRIM_VOL_LEVEL;
241252
m_inputVolume = DEFAULT_INPUT_VOL_LEVEL;
253+
m_currentVrrType = dsVRR_NONE;
242254
}
243255

244256
void AVInput::UnregisterAll()
@@ -251,6 +263,8 @@ void AVInput::UnregisterAll()
251263
Unregister(_T(AVINPUT_METHOD_READ_EDID));
252264
Unregister(_T(AVINPUT_METHOD_READ_RAWSPD));
253265
Unregister(_T(AVINPUT_METHOD_READ_SPD));
266+
Unregister(_T(AVINPUT_METHOD_SET_VRR_SUPPORT));
267+
Unregister(_T(AVINPUT_METHOD_GET_VRR_SUPPORT));
254268
Unregister(_T(AVINPUT_METHOD_SET_EDID_VERSION));
255269
Unregister(_T(AVINPUT_METHOD_GET_EDID_VERSION));
256270
Unregister(_T(AVINPUT_METHOD_START_INPUT));
@@ -1001,6 +1015,28 @@ void AVInput::dsAVGameFeatureStatusEventHandler(const char *owner, IARM_EventId_
10011015

10021016
AVInput::_instance->AVInputALLMChange(hdmi_in_port, allm_mode);
10031017
}
1018+
if (IARM_BUS_DSMGR_EVENT_HDMI_IN_VRR_STATUS == eventId)
1019+
{
1020+
IARM_Bus_DSMgr_EventData_t *eventData = (IARM_Bus_DSMgr_EventData_t *)data;
1021+
int hdmi_in_port = eventData->data.hdmi_in_vrr_mode.port;
1022+
dsVRRType_t new_vrrType = eventData->data.hdmi_in_vrr_mode.vrr_type;
1023+
LOGWARN("Received IARM_BUS_DSMGR_EVENT_HDMI_IN_VRR_STATUS event port: %d, VRR Type: %d", hdmi_in_port,new_vrrType);
1024+
1025+
if(new_vrrType == dsVRR_NONE)
1026+
{
1027+
if(AVInput::_instance->m_currentVrrType != dsVRR_NONE){
1028+
AVInput::_instance->AVInputVRRChange(hdmi_in_port, AVInput::_instance->m_currentVrrType, false);
1029+
}
1030+
}
1031+
else
1032+
{
1033+
if(AVInput::_instance->m_currentVrrType != dsVRR_NONE){
1034+
AVInput::_instance->AVInputVRRChange(hdmi_in_port, AVInput::_instance->m_currentVrrType, false);
1035+
}
1036+
AVInput::_instance->AVInputVRRChange(hdmi_in_port, new_vrrType, true);
1037+
}
1038+
AVInput::_instance->m_currentVrrType = new_vrrType;
1039+
}
10041040
}
10051041

10061042
void AVInput::AVInputALLMChange( int port , bool allm_mode)
@@ -1013,6 +1049,37 @@ void AVInput::AVInputALLMChange( int port , bool allm_mode)
10131049
sendNotify(AVINPUT_EVENT_ON_GAME_FEATURE_STATUS_CHANGED, params);
10141050
}
10151051

1052+
void AVInput::AVInputVRRChange( int port , dsVRRType_t vrr_type, bool vrr_mode)
1053+
{
1054+
JsonObject params;
1055+
switch(vrr_type)
1056+
{
1057+
case dsVRR_HDMI_VRR:
1058+
params["id"] = port;
1059+
params["gameFeature"] = "VRR-HDMI";
1060+
params["mode"] = vrr_mode;
1061+
break;
1062+
case dsVRR_AMD_FREESYNC:
1063+
params["id"] = port;
1064+
params["gameFeature"] = "VRR-FREESYNC";
1065+
params["mode"] = vrr_mode;
1066+
break;
1067+
case dsVRR_AMD_FREESYNC_PREMIUM:
1068+
params["id"] = port;
1069+
params["gameFeature"] = "VRR-FREESYNC-PREMIUM";
1070+
params["mode"] = vrr_mode;
1071+
break;
1072+
case dsVRR_AMD_FREESYNC_PREMIUM_PRO:
1073+
params["id"] = port;
1074+
params["gameFeature"] = "VRR-FREESYNC-PREMIUM-PRO";
1075+
params["mode"] = vrr_mode;
1076+
break;
1077+
default:
1078+
break;
1079+
}
1080+
sendNotify(AVINPUT_EVENT_ON_GAME_FEATURE_STATUS_CHANGED, params);
1081+
}
1082+
10161083
uint32_t AVInput::getSupportedGameFeatures(const JsonObject& parameters, JsonObject& response)
10171084
{
10181085
LOGINFOMETHOD();
@@ -1067,9 +1134,49 @@ uint32_t AVInput::getGameFeatureStatusWrapper(const JsonObject& parameters, Json
10671134
LOGWARN("AVInput::getGameFeatureStatusWrapper ALLM MODE:%d", allm);
10681135
response["mode"] = allm;
10691136
}
1137+
else if(strcmp (sGameFeature.c_str(), "VRR-HDMI") == 0)
1138+
{
1139+
bool hdmi_vrr = false;
1140+
dsVRRType_t vrrType;
1141+
getVRRStatus(portId, &vrrType);
1142+
if(vrrType == dsVRR_HDMI_VRR)
1143+
hdmi_vrr = true;
1144+
LOGWARN("AVInput::getGameFeatureStatusWrapper HDMI VRR MODE:%d", hdmi_vrr);
1145+
response["mode"] = hdmi_vrr;
1146+
}
1147+
else if(strcmp (sGameFeature.c_str(), "VRR-FREESYNC") == 0)
1148+
{
1149+
bool freesync = false;
1150+
dsVRRType_t vrrType;
1151+
getVRRStatus(portId, &vrrType);
1152+
if(vrrType == dsVRR_AMD_FREESYNC)
1153+
freesync = true;
1154+
LOGWARN("AVInput::getGameFeatureStatusWrapper FREESYNC MODE:%d", freesync);
1155+
response["mode"] = freesync;
1156+
}
1157+
else if(strcmp (sGameFeature.c_str(), "VRR-FREESYNC-PREMIUM") == 0)
1158+
{
1159+
bool freesync_premium = false;
1160+
dsVRRType_t vrrType;
1161+
getVRRStatus(portId, &vrrType);
1162+
if(vrrType == dsVRR_AMD_FREESYNC_PREMIUM)
1163+
freesync_premium = true;
1164+
LOGWARN("AVInput::getGameFeatureStatusWrapper FREESYNC PREMIUM MODE:%d", freesync_premium);
1165+
response["mode"] = freesync_premium;
1166+
}
1167+
else if(strcmp (sGameFeature.c_str(), "VRR-FREESYNC-PREMIUM-PRO") == 0)
1168+
{
1169+
bool freesync_premium_pro = false;
1170+
dsVRRType_t vrrType;
1171+
getVRRStatus(portId, &vrrType);
1172+
if(vrrType == dsVRR_AMD_FREESYNC_PREMIUM_PRO)
1173+
freesync_premium_pro = true;
1174+
LOGWARN("AVInput::getGameFeatureStatusWrapper FREESYNC PREMIUM PRO MODE:%d", freesync_premium_pro);
1175+
response["mode"] = freesync_premium_pro;
1176+
}
10701177
else
10711178
{
1072-
LOGWARN("AVInput::getGameFeatureStatusWrapper Mode is not supported. Supported mode: ALLM");
1179+
LOGWARN("AVInput::getGameFeatureStatusWrapper Mode is not supported. Supported mode: ALLM, VRR-HDMI, VRR-FREESYNC-PREMIUM");
10731180
returnResponse(false);
10741181
}
10751182
returnResponse(true);
@@ -1091,6 +1198,21 @@ bool AVInput::getALLMStatus(int iPort)
10911198
return allm;
10921199
}
10931200

1201+
void AVInput::getVRRStatus(int iPort, dsVRRType_t *vrrType)
1202+
{
1203+
1204+
try
1205+
{
1206+
device::HdmiInput::getInstance().getVRRStatus (iPort, vrrType);
1207+
LOGWARN("AVInput::getVRRStatus VRR TYPE: %d", *vrrType);
1208+
}
1209+
catch (const device::Exception& err)
1210+
{
1211+
LOG_DEVICE_EXCEPTION1(std::to_string(iPort));
1212+
}
1213+
1214+
}
1215+
10941216
uint32_t AVInput::getRawSPDWrapper(const JsonObject& parameters, JsonObject& response)
10951217
{
10961218
LOGINFOMETHOD();
@@ -1363,6 +1485,96 @@ uint32_t AVInput::getEdid2AllmSupportWrapper(const JsonObject& parameters, JsonO
13631485
}
13641486
}
13651487

1488+
bool AVInput::getVRRSupport(int portId,bool *vrrSupportValue)
1489+
{
1490+
bool ret = true;
1491+
try
1492+
{
1493+
device::HdmiInput::getInstance().getVRRSupport (portId, vrrSupportValue);
1494+
LOGINFO("AVInput - getVRRSupport:%d", *vrrSupportValue);
1495+
}
1496+
catch (const device::Exception& err)
1497+
{
1498+
LOG_DEVICE_EXCEPTION1(std::to_string(portId));
1499+
ret = false;
1500+
}
1501+
return ret;
1502+
}
1503+
1504+
uint32_t AVInput::getVRRSupportWrapper(const JsonObject& parameters, JsonObject& response)
1505+
{
1506+
LOGINFOMETHOD();
1507+
string sPortId = parameters["portId"].String();
1508+
1509+
int portId = 0;
1510+
bool vrrSupport = true;
1511+
returnIfParamNotFound(parameters, "portId");
1512+
1513+
try {
1514+
portId = stoi(sPortId);
1515+
}catch (const std::exception& err) {
1516+
LOGWARN("sPortId invalid paramater: %s ", sPortId.c_str());
1517+
returnResponse(false);
1518+
}
1519+
1520+
bool result = getVRRSupport(portId, &vrrSupport);
1521+
if(result == true)
1522+
{
1523+
response["vrrSupport"] = vrrSupport;
1524+
returnResponse(true);
1525+
}
1526+
else
1527+
{
1528+
returnResponse(false);
1529+
}
1530+
}
1531+
1532+
bool AVInput::setVRRSupport(int portId, bool vrrSupport)
1533+
{
1534+
bool ret = true;
1535+
try
1536+
{
1537+
device::HdmiInput::getInstance().setVRRSupport (portId, vrrSupport);
1538+
LOGWARN("AVInput - vrrSupport:%d", vrrSupport);
1539+
}
1540+
catch (const device::Exception& err)
1541+
{
1542+
LOG_DEVICE_EXCEPTION1(std::to_string(portId));
1543+
ret = false;
1544+
}
1545+
return ret;
1546+
1547+
}
1548+
1549+
uint32_t AVInput::setVRRSupportWrapper(const JsonObject& parameters, JsonObject& response)
1550+
{
1551+
LOGINFOMETHOD();
1552+
1553+
returnIfParamNotFound(parameters, "portId");
1554+
returnIfParamNotFound(parameters, "vrrSupport");
1555+
1556+
int portId = 0;
1557+
string sPortId = parameters["portId"].String();
1558+
bool vrrSupport = parameters["vrrSupport"].Boolean();
1559+
1560+
try {
1561+
portId = stoi(sPortId);
1562+
}catch (const std::exception& err) {
1563+
LOGWARN("sPortId invalid paramater: %s ", sPortId.c_str());
1564+
returnResponse(false);
1565+
}
1566+
1567+
bool result = setVRRSupport(portId, vrrSupport);
1568+
if(result == true)
1569+
{
1570+
returnResponse(true);
1571+
}
1572+
else
1573+
{
1574+
returnResponse(false);
1575+
}
1576+
}
1577+
13661578
uint32_t AVInput::setEdidVersionWrapper(const JsonObject& parameters, JsonObject& response)
13671579
{
13681580
LOGINFOMETHOD();

AVInput/AVInput.h

Lines changed: 8 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,8 @@ 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);
8286
uint32_t startInput(const JsonObject& parameters, JsonObject& response);
8387
uint32_t stopInput(const JsonObject& parameters, JsonObject& response);
8488
uint32_t setVideoRectangleWrapper(const JsonObject& parameters, JsonObject& response);
@@ -95,10 +99,14 @@ class AVInput: public PluginHost::IPlugin, public PluginHost::JSONRPC
9599
std::string getSPD(int iPort);
96100
int setEdidVersion(int iPort, int iEdidVer);
97101
int getEdidVersion(int iPort);
102+
bool setVRRSupport(int portId, bool vrrSupport);
103+
bool getVRRSupport(int portId, bool *vrrSupportValue);
98104
bool setVideoRectangle(int x, int y, int width, int height, int type);
99105
bool getALLMStatus(int iPort);
106+
void getVRRStatus(int iPort, dsVRRType_t *vrrType);
100107

101108
void AVInputHotplug(int input , int connect, int type);
109+
void AVInputVRRChange( int port , dsVRRType_t vrr_type, bool vrr_mode);
102110
static void dsAVEventHandler(const char *owner, IARM_EventId_t eventId, void *data, size_t len);
103111

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

0 commit comments

Comments
 (0)