diff --git a/.github/workflows/L1-tests.yml b/.github/workflows/L1-tests.yml index 259d11b7..9366eaa5 100755 --- a/.github/workflows/L1-tests.yml +++ b/.github/workflows/L1-tests.yml @@ -2,9 +2,9 @@ name: L1-tests on: push: - branches: [ main, develop, 'sprint/**', 'release/**', 'topic/RDK*' ] + branches: [ main, develop, 'sprint/**', 'release/**' ] pull_request: - branches: [ main, develop, 'sprint/**', 'release/**', 'topic/RDK*' ] + branches: [ main, develop, 'sprint/**', 'release/**' ] env: BUILD_TYPE: Debug @@ -121,6 +121,14 @@ jobs: with: path: entservices-inputoutput + - name: Checkout googletest + if: steps.cache.outputs.cache-hit != 'true' + uses: actions/checkout@v3 + with: + repository: google/googletest + path: googletest + ref: v1.15.0 + - name: Apply patches ThunderTools run: | cd $GITHUB_WORKSPACE/ThunderTools @@ -342,6 +350,22 @@ jobs: && cmake --install build/mocks + - name: Build googletest + if: steps.cache.outputs.cache-hit != 'true' + run: > + cmake -G Ninja + -S "$GITHUB_WORKSPACE/googletest" + -B build/googletest + -DCMAKE_INSTALL_PREFIX="$GITHUB_WORKSPACE/install/usr" + -DCMAKE_MODULE_PATH="$GITHUB_WORKSPACE/install/tools/cmake" + -DGENERIC_CMAKE_MODULE_PATH="$GITHUB_WORKSPACE/install/tools/cmake" + -DBUILD_TYPE=Debug + -DBUILD_GMOCK=ON + && + cmake --build build/googletest -j8 + && + cmake --install build/googletest + - name: Build entservices-inputoutput run: > cmake -G Ninja @@ -368,6 +392,8 @@ jobs: -I $GITHUB_WORKSPACE/entservices-testframework/Tests -I $GITHUB_WORKSPACE/Thunder/Source -I $GITHUB_WORKSPACE/Thunder/Source/core + -I $GITHUB_WORKSPACE/install/usr/include + -I $GITHUB_WORKSPACE/install/usr/include/WPEFramework -include $GITHUB_WORKSPACE/entservices-testframework/Tests/mocks/devicesettings.h -include $GITHUB_WORKSPACE/entservices-testframework/Tests/mocks/Iarm.h -include $GITHUB_WORKSPACE/entservices-testframework/Tests/mocks/Rfc.h @@ -406,6 +432,8 @@ jobs: -DDS_FOUND=ON -DHAS_FRONT_PANEL=ON -DRDK_SERVICES_L1_TEST=ON + -DPLUGIN_AVINPUT=ON + -DPLUGIN_HDMIINPUT=ON -DPLUGIN_HDCPPROFILE=ON -DPLUGIN_HDMICECSOURCE=ON -DPLUGIN_HDMICECSINK=ON @@ -443,6 +471,8 @@ jobs: -I $GITHUB_WORKSPACE/entservices-testframework/Tests -I $GITHUB_WORKSPACE/Thunder/Source -I $GITHUB_WORKSPACE/Thunder/Source/core + -I $GITHUB_WORKSPACE/install/usr/include + -I $GITHUB_WORKSPACE/install/usr/include/WPEFramework -include $GITHUB_WORKSPACE/entservices-testframework/Tests/mocks/devicesettings.h -include $GITHUB_WORKSPACE/entservices-testframework/Tests/mocks/Iarm.h -include $GITHUB_WORKSPACE/entservices-testframework/Tests/mocks/Rfc.h @@ -459,7 +489,7 @@ jobs: -include $GITHUB_WORKSPACE/entservices-testframework/Tests/mocks/thunder/Communicator.h --coverage -Wall -Wno-unused-result -Wno-deprecated-declarations -Wno-error=format= - -Wl,-wrap,system -Wl,-wrap,popen -Wl,-wrap,syslog + -Wl,-wrap,system -Wl,-wrap,popen -Wl,-wrap,syslog -Wl,--no-as-needed -DENABLE_TELEMETRY_LOGGING -DUSE_IARMBUS -DENABLE_SYSTEM_GET_STORE_DEMO_LINK @@ -480,6 +510,8 @@ jobs: -DCMAKE_DISABLE_FIND_PACKAGE_CEC=ON -DCMAKE_BUILD_TYPE=Debug -DDS_FOUND=ON + -DPLUGIN_AVINPUT=ON + -DPLUGIN_HDMIINPUT=ON -DPLUGIN_HDCPPROFILE=ON -DPLUGIN_HDMICECSOURCE=ON -DPLUGIN_HDMICECSINK=ON diff --git a/.github/workflows/L2-tests.yml b/.github/workflows/L2-tests.yml index 7224e70b..4d1bd361 100755 --- a/.github/workflows/L2-tests.yml +++ b/.github/workflows/L2-tests.yml @@ -1,9 +1,10 @@ name: L2-tests -#enable the workflow incase of any plugin/testcase changes -#Add "Tests/L2Tests" subdirectory in CMakeLists.txt, when enabling L2Tests on: - workflow_dispatch: + push: + branches: [ main, develop, 'sprint/**', 'release/**' ] + pull_request: + branches: [ main, develop, 'sprint/**', 'release/**' ] env: BUILD_TYPE: Debug @@ -90,6 +91,14 @@ jobs: ref: develop token: ${{ secrets.RDKCM_RDKE }} + - name: Checkout googletest + if: steps.cache.outputs.cache-hit != 'true' + uses: actions/checkout@v3 + with: + repository: google/googletest + path: googletest + ref: v1.15.0 + - name: Apply patches ThunderTools run: | cd $GITHUB_WORKSPACE/ThunderTools @@ -248,6 +257,22 @@ jobs: && cmake --install build/mocks + - name: Build googletest + if: steps.cache.outputs.cache-hit != 'true' + run: > + cmake -G Ninja + -S "$GITHUB_WORKSPACE/googletest" + -B build/googletest + -DCMAKE_INSTALL_PREFIX="$GITHUB_WORKSPACE/install/usr" + -DCMAKE_MODULE_PATH="$GITHUB_WORKSPACE/install/tools/cmake" + -DGENERIC_CMAKE_MODULE_PATH="$GITHUB_WORKSPACE/install/tools/cmake" + -DBUILD_TYPE=Debug + -DBUILD_GMOCK=ON + && + cmake --build build/googletest -j8 + && + cmake --install build/googletest + - name: Build entservices-inputoutput run: > cmake @@ -274,6 +299,8 @@ jobs: -I $GITHUB_WORKSPACE/entservices-testframework/Tests/headers/rdk/iarmmgrs-hal -I $GITHUB_WORKSPACE/entservices-testframework/Tests/headers/systemservices -I $GITHUB_WORKSPACE/entservices-testframework/Tests/headers/systemservices/proc + -I $GITHUB_WORKSPACE/install/usr/include + -I $GITHUB_WORKSPACE/install/usr/include/WPEFramework -include $GITHUB_WORKSPACE/entservices-testframework/Tests/mocks/devicesettings.h -include $GITHUB_WORKSPACE/entservices-testframework/Tests/mocks/Iarm.h -include $GITHUB_WORKSPACE/entservices-testframework/Tests/mocks/Rfc.h @@ -365,6 +392,8 @@ jobs: -I $GITHUB_WORKSPACE/entservices-testframework/Tests/headers/systemservices -I $GITHUB_WORKSPACE/entservices-testframework/Tests/headers/systemservices/proc -I $GITHUB_WORKSPACE/entservices-deviceanddisplay/helpers + -I $GITHUB_WORKSPACE/install/usr/include + -I $GITHUB_WORKSPACE/install/usr/include/WPEFramework -include $GITHUB_WORKSPACE/entservices-testframework/Tests/mocks/devicesettings.h -include $GITHUB_WORKSPACE/entservices-testframework/Tests/mocks/Iarm.h -include $GITHUB_WORKSPACE/entservices-testframework/Tests/mocks/Rfc.h @@ -384,6 +413,7 @@ jobs: -include $GITHUB_WORKSPACE/entservices-testframework/Tests/mocks/tvSettingsODM.h -include $GITHUB_WORKSPACE/entservices-testframework/Tests/mocks/tvTypes.h -Werror -Wall -Wno-unused-result -Wno-deprecated-declarations -Wno-error=format= + -Wl,--no-as-needed -DUSE_IARMBUS -DRDK_SERVICE_L2_TEST -DDISABLE_SECURITY_TOKEN diff --git a/AVInput/AVInput.cpp b/AVInput/AVInput.cpp index fccde076..c7586702 100644 --- a/AVInput/AVInput.cpp +++ b/AVInput/AVInput.cpp @@ -48,6 +48,9 @@ #define AVINPUT_METHOD_GET_EDID_VERSION "getEdidVersion" #define AVINPUT_METHOD_SET_EDID_ALLM_SUPPORT "setEdid2AllmSupport" #define AVINPUT_METHOD_GET_EDID_ALLM_SUPPORT "getEdid2AllmSupport" +#define AVINPUT_METHOD_SET_VRR_SUPPORT "setVRRSupport" +#define AVINPUT_METHOD_GET_VRR_SUPPORT "getVRRSupport" +#define AVINPUT_METHOD_GET_VRR_FRAME_RATE "getVRRFrameRate" #define AVINPUT_METHOD_GET_HDMI_COMPATIBILITY_VERSION "getHdmiVersion" #define AVINPUT_METHOD_SET_MIXER_LEVELS "setMixerLevels" #define AVINPUT_METHOD_START_INPUT "startInput" @@ -65,6 +68,12 @@ #define AVINPUT_EVENT_ON_GAME_FEATURE_STATUS_CHANGED "gameFeatureStatusUpdate" #define AVINPUT_EVENT_ON_AVI_CONTENT_TYPE_CHANGED "aviContentTypeUpdate" +#define STR_ALLM "ALLM" +#define VRR_TYPE_HDMI "VRR-HDMI" +#define VRR_TYPE_FREESYNC "VRR-FREESYNC" +#define VRR_TYPE_FREESYNC_PREMIUM "VRR-FREESYNC-PREMIUM" +#define VRR_TYPE_FREESYNC_PREMIUM_PRO "VRR-FREESYNC-PREMIUM-PRO" + static bool isAudioBalanceSet = false; static int planeType = 0; @@ -156,7 +165,11 @@ void AVInput::InitializeIARM() IARM_BUS_DSMGR_NAME, IARM_BUS_DSMGR_EVENT_HDMI_IN_ALLM_STATUS, dsAVGameFeatureStatusEventHandler)); - IARM_CHECK(IARM_Bus_RegisterEventHandler( + IARM_CHECK(IARM_Bus_RegisterEventHandler( + IARM_BUS_DSMGR_NAME, + IARM_BUS_DSMGR_EVENT_HDMI_IN_VRR_STATUS, + dsAVGameFeatureStatusEventHandler)); + IARM_CHECK(IARM_Bus_RegisterEventHandler( IARM_BUS_DSMGR_NAME, IARM_BUS_DSMGR_EVENT_COMPOSITE_IN_HOTPLUG, dsAVEventHandler)); @@ -198,6 +211,9 @@ void AVInput::DeinitializeIARM() IARM_CHECK(IARM_Bus_RemoveEventHandler( IARM_BUS_DSMGR_NAME, IARM_BUS_DSMGR_EVENT_HDMI_IN_ALLM_STATUS, dsAVGameFeatureStatusEventHandler)); + IARM_CHECK(IARM_Bus_RemoveEventHandler( + IARM_BUS_DSMGR_NAME, + IARM_BUS_DSMGR_EVENT_HDMI_IN_VRR_STATUS, dsAVGameFeatureStatusEventHandler)); IARM_CHECK(IARM_Bus_RemoveEventHandler( IARM_BUS_DSMGR_NAME, IARM_BUS_DSMGR_EVENT_COMPOSITE_IN_HOTPLUG, dsAVEventHandler)); @@ -231,6 +247,9 @@ void AVInput::RegisterAll() Register(_T(AVINPUT_METHOD_SET_MIXER_LEVELS), &AVInput::setMixerLevels, this); Register(_T(AVINPUT_METHOD_SET_EDID_ALLM_SUPPORT), &AVInput::setEdid2AllmSupportWrapper, this); Register(_T(AVINPUT_METHOD_GET_EDID_ALLM_SUPPORT), &AVInput::getEdid2AllmSupportWrapper, this); + Register(_T(AVINPUT_METHOD_SET_VRR_SUPPORT), &AVInput::setVRRSupportWrapper, this); + Register(_T(AVINPUT_METHOD_GET_VRR_SUPPORT), &AVInput::getVRRSupportWrapper, this); + Register(_T(AVINPUT_METHOD_GET_VRR_FRAME_RATE), &AVInput::getVRRFrameRateWrapper, this); Register(_T(AVINPUT_METHOD_GET_HDMI_COMPATIBILITY_VERSION), &AVInput::getHdmiVersionWrapper, this); Register(_T(AVINPUT_METHOD_START_INPUT), &AVInput::startInput, this); Register(_T(AVINPUT_METHOD_STOP_INPUT), &AVInput::stopInput, this); @@ -239,6 +258,7 @@ void AVInput::RegisterAll() Register(_T(AVINPUT_METHOD_GAME_FEATURE_STATUS), &AVInput::getGameFeatureStatusWrapper, this); m_primVolume = DEFAULT_PRIM_VOL_LEVEL; m_inputVolume = DEFAULT_INPUT_VOL_LEVEL; + m_currentVrrType = dsVRR_NONE; } void AVInput::UnregisterAll() @@ -251,6 +271,9 @@ void AVInput::UnregisterAll() Unregister(_T(AVINPUT_METHOD_READ_EDID)); Unregister(_T(AVINPUT_METHOD_READ_RAWSPD)); Unregister(_T(AVINPUT_METHOD_READ_SPD)); + Unregister(_T(AVINPUT_METHOD_SET_VRR_SUPPORT)); + Unregister(_T(AVINPUT_METHOD_GET_VRR_SUPPORT)); + Unregister(_T(AVINPUT_METHOD_GET_VRR_FRAME_RATE)); Unregister(_T(AVINPUT_METHOD_SET_EDID_VERSION)); Unregister(_T(AVINPUT_METHOD_GET_EDID_VERSION)); Unregister(_T(AVINPUT_METHOD_START_INPUT)); @@ -1024,18 +1047,71 @@ void AVInput::dsAVGameFeatureStatusEventHandler(const char *owner, IARM_EventId_ AVInput::_instance->AVInputALLMChange(hdmi_in_port, allm_mode); } + if (IARM_BUS_DSMGR_EVENT_HDMI_IN_VRR_STATUS == eventId) + { + IARM_Bus_DSMgr_EventData_t *eventData = (IARM_Bus_DSMgr_EventData_t *)data; + int hdmi_in_port = eventData->data.hdmi_in_vrr_mode.port; + dsVRRType_t new_vrrType = eventData->data.hdmi_in_vrr_mode.vrr_type; + LOGWARN("Received IARM_BUS_DSMGR_EVENT_HDMI_IN_VRR_STATUS event port: %d, VRR Type: %d", hdmi_in_port,new_vrrType); + + if(new_vrrType == dsVRR_NONE) + { + if(AVInput::_instance->m_currentVrrType != dsVRR_NONE){ + AVInput::_instance->AVInputVRRChange(hdmi_in_port, AVInput::_instance->m_currentVrrType, false); + } + } + else + { + if(AVInput::_instance->m_currentVrrType != dsVRR_NONE){ + AVInput::_instance->AVInputVRRChange(hdmi_in_port, AVInput::_instance->m_currentVrrType, false); + } + AVInput::_instance->AVInputVRRChange(hdmi_in_port, new_vrrType, true); + } + AVInput::_instance->m_currentVrrType = new_vrrType; + } } void AVInput::AVInputALLMChange( int port , bool allm_mode) { JsonObject params; params["id"] = port; - params["gameFeature"] = "ALLM"; + params["gameFeature"] = STR_ALLM; params["mode"] = allm_mode; sendNotify(AVINPUT_EVENT_ON_GAME_FEATURE_STATUS_CHANGED, params); } +void AVInput::AVInputVRRChange( int port , dsVRRType_t vrr_type, bool vrr_mode) +{ + JsonObject params; + switch(vrr_type) + { + case dsVRR_HDMI_VRR: + params["id"] = port; + params["gameFeature"] = VRR_TYPE_HDMI; + params["mode"] = vrr_mode; + break; + case dsVRR_AMD_FREESYNC: + params["id"] = port; + params["gameFeature"] = VRR_TYPE_FREESYNC; + params["mode"] = vrr_mode; + break; + case dsVRR_AMD_FREESYNC_PREMIUM: + params["id"] = port; + params["gameFeature"] = VRR_TYPE_FREESYNC_PREMIUM; + params["mode"] = vrr_mode; + break; + case dsVRR_AMD_FREESYNC_PREMIUM_PRO: + params["id"] = port; + params["gameFeature"] = VRR_TYPE_FREESYNC_PREMIUM_PRO; + params["mode"] = vrr_mode; + break; + default: + break; + } + sendNotify(AVINPUT_EVENT_ON_GAME_FEATURE_STATUS_CHANGED, params); +} + uint32_t AVInput::getSupportedGameFeatures(const JsonObject& parameters, JsonObject& response) { LOGINFOMETHOD(); @@ -1084,15 +1160,55 @@ uint32_t AVInput::getGameFeatureStatusWrapper(const JsonObject& parameters, Json returnResponse(false); } - if (strcmp (sGameFeature.c_str(), "ALLM") == 0) + if (strcmp (sGameFeature.c_str(), STR_ALLM) == 0) { bool allm = getALLMStatus(portId); LOGWARN("AVInput::getGameFeatureStatusWrapper ALLM MODE:%d", allm); response["mode"] = allm; } + else if(strcmp (sGameFeature.c_str(), VRR_TYPE_HDMI) == 0) + { + bool hdmi_vrr = false; + dsHdmiInVrrStatus_t vrrStatus; + getVRRStatus(portId, &vrrStatus); + if(vrrStatus.vrrType == dsVRR_HDMI_VRR) + hdmi_vrr = true; + LOGWARN("AVInput::getGameFeatureStatusWrapper HDMI VRR MODE:%d", hdmi_vrr); + response["mode"] = hdmi_vrr; + } + else if(strcmp (sGameFeature.c_str(), VRR_TYPE_FREESYNC) == 0) + { + bool freesync = false; + dsHdmiInVrrStatus_t vrrStatus; + getVRRStatus(portId, &vrrStatus); + if(vrrStatus.vrrType == dsVRR_AMD_FREESYNC) + freesync = true; + LOGWARN("AVInput::getGameFeatureStatusWrapper FREESYNC MODE:%d", freesync); + response["mode"] = freesync; + } + else if(strcmp (sGameFeature.c_str(), VRR_TYPE_FREESYNC_PREMIUM) == 0) + { + bool freesync_premium = false; + dsHdmiInVrrStatus_t vrrStatus; + getVRRStatus(portId, &vrrStatus); + if(vrrStatus.vrrType == dsVRR_AMD_FREESYNC_PREMIUM) + freesync_premium = true; + LOGWARN("AVInput::getGameFeatureStatusWrapper FREESYNC PREMIUM MODE:%d", freesync_premium); + response["mode"] = freesync_premium; + } + else if(strcmp (sGameFeature.c_str(), VRR_TYPE_FREESYNC_PREMIUM_PRO) == 0) + { + bool freesync_premium_pro = false; + dsHdmiInVrrStatus_t vrrStatus; + getVRRStatus(portId, &vrrStatus); + if(vrrStatus.vrrType == dsVRR_AMD_FREESYNC_PREMIUM_PRO) + freesync_premium_pro = true; + LOGWARN("AVInput::getGameFeatureStatusWrapper FREESYNC PREMIUM PRO MODE:%d", freesync_premium_pro); + response["mode"] = freesync_premium_pro; + } else { - LOGWARN("AVInput::getGameFeatureStatusWrapper Mode is not supported. Supported mode: ALLM"); + LOGWARN("AVInput::getGameFeatureStatusWrapper Mode is not supported. Supported mode: ALLM, VRR-HDMI, VRR-FREESYNC-PREMIUM"); returnResponse(false); } returnResponse(true); @@ -1114,6 +1230,22 @@ bool AVInput::getALLMStatus(int iPort) return allm; } +bool AVInput::getVRRStatus(int iPort, dsHdmiInVrrStatus_t *vrrStatus) +{ + bool ret = true; + try + { + device::HdmiInput::getInstance().getVRRStatus (iPort, vrrStatus); + LOGWARN("AVInput::getVRRStatus VRR TYPE: %d, VRR FRAMERATE: %f", vrrStatus->vrrType,vrrStatus->vrrAmdfreesyncFramerate_Hz); + } + catch (const device::Exception& err) + { + LOG_DEVICE_EXCEPTION1(std::to_string(iPort)); + ret = false; + } + return ret; +} + uint32_t AVInput::getRawSPDWrapper(const JsonObject& parameters, JsonObject& response) { LOGINFOMETHOD(); @@ -1386,6 +1518,125 @@ uint32_t AVInput::getEdid2AllmSupportWrapper(const JsonObject& parameters, JsonO } } +bool AVInput::getVRRSupport(int portId,bool *vrrSupportValue) +{ + bool ret = true; + try + { + device::HdmiInput::getInstance().getVRRSupport (portId, vrrSupportValue); + LOGINFO("AVInput - getVRRSupport:%d", *vrrSupportValue); + } + catch (const device::Exception& err) + { + LOG_DEVICE_EXCEPTION1(std::to_string(portId)); + ret = false; + } + return ret; +} + +uint32_t AVInput::getVRRSupportWrapper(const JsonObject& parameters, JsonObject& response) +{ + LOGINFOMETHOD(); + returnIfParamNotFound(parameters, "portId"); + string sPortId = parameters["portId"].String(); + + int portId = 0; + bool vrrSupport = true; + + try { + portId = stoi(sPortId); + }catch (const std::exception& err) { + LOGWARN("sPortId invalid paramater: %s ", sPortId.c_str()); + returnResponse(false); + } + + bool result = getVRRSupport(portId, &vrrSupport); + if(result == true) + { + response["vrrSupport"] = vrrSupport; + returnResponse(true); + } + else + { + returnResponse(false); + } +} + +bool AVInput::setVRRSupport(int portId, bool vrrSupport) +{ + bool ret = true; + try + { + device::HdmiInput::getInstance().setVRRSupport (portId, vrrSupport); + LOGWARN("AVInput - vrrSupport:%d", vrrSupport); + } + catch (const device::Exception& err) + { + LOG_DEVICE_EXCEPTION1(std::to_string(portId)); + ret = false; + } + return ret; + +} + +uint32_t AVInput::setVRRSupportWrapper(const JsonObject& parameters, JsonObject& response) +{ + LOGINFOMETHOD(); + + returnIfParamNotFound(parameters, "portId"); + returnIfParamNotFound(parameters, "vrrSupport"); + + int portId = 0; + string sPortId = parameters["portId"].String(); + bool vrrSupport = parameters["vrrSupport"].Boolean(); + + try { + portId = stoi(sPortId); + }catch (const std::exception& err) { + LOGWARN("sPortId invalid paramater: %s ", sPortId.c_str()); + returnResponse(false); + } + + bool result = setVRRSupport(portId, vrrSupport); + if(result == true) + { + returnResponse(true); + } + else + { + returnResponse(false); + } +} + +uint32_t AVInput::getVRRFrameRateWrapper(const JsonObject& parameters, JsonObject& response) +{ + LOGINFOMETHOD(); + returnIfParamNotFound(parameters, "portId"); + string sPortId = parameters["portId"].String(); + + int portId = 0; + dsHdmiInVrrStatus_t vrrStatus; + vrrStatus.vrrAmdfreesyncFramerate_Hz = 0; + + try { + portId = stoi(sPortId); + }catch (const std::exception& err) { + LOGWARN("sPortId invalid paramater: %s ", sPortId.c_str()); + returnResponse(false); + } + + bool result = getVRRStatus(portId, &vrrStatus); + if(result == true) + { + response["currentVRRVideoFrameRate"] = vrrStatus.vrrAmdfreesyncFramerate_Hz; + returnResponse(true); + } + else + { + returnResponse(false); + } +} + uint32_t AVInput::setEdidVersionWrapper(const JsonObject& parameters, JsonObject& response) { LOGINFOMETHOD(); diff --git a/AVInput/AVInput.h b/AVInput/AVInput.h index 22b61827..b6c86142 100644 --- a/AVInput/AVInput.h +++ b/AVInput/AVInput.h @@ -47,6 +47,8 @@ class AVInput: public PluginHost::IPlugin, public PluginHost::JSONRPC int m_primVolume; int m_inputVolume; //Player Volume + + dsVRRType_t m_currentVrrType; public: // IPlugin methods // ------------------------------------------------------------------------------------------------------- @@ -79,6 +81,9 @@ class AVInput: public PluginHost::IPlugin, public PluginHost::JSONRPC uint32_t getEdidVersionWrapper(const JsonObject& parameters, JsonObject& response); uint32_t setEdid2AllmSupportWrapper(const JsonObject& parameters, JsonObject& response); uint32_t getEdid2AllmSupportWrapper(const JsonObject& parameters, JsonObject& response); + uint32_t setVRRSupportWrapper(const JsonObject& parameters, JsonObject& response); + uint32_t getVRRSupportWrapper(const JsonObject& parameters, JsonObject& response); + uint32_t getVRRFrameRateWrapper(const JsonObject& parameters, JsonObject& response); uint32_t startInput(const JsonObject& parameters, JsonObject& response); uint32_t stopInput(const JsonObject& parameters, JsonObject& response); uint32_t setVideoRectangleWrapper(const JsonObject& parameters, JsonObject& response); @@ -95,10 +100,14 @@ class AVInput: public PluginHost::IPlugin, public PluginHost::JSONRPC std::string getSPD(int iPort); int setEdidVersion(int iPort, int iEdidVer); int getEdidVersion(int iPort); + bool setVRRSupport(int portId, bool vrrSupport); + bool getVRRSupport(int portId, bool *vrrSupportValue); bool setVideoRectangle(int x, int y, int width, int height, int type); bool getALLMStatus(int iPort); + bool getVRRStatus(int iPort, dsHdmiInVrrStatus_t *vrrStatus); void AVInputHotplug(int input , int connect, int type); + void AVInputVRRChange( int port , dsVRRType_t vrr_type, bool vrr_mode); static void dsAVEventHandler(const char *owner, IARM_EventId_t eventId, void *data, size_t len); void AVInputSignalChange( int port , int signalStatus, int type); diff --git a/CHANGELOG.md b/CHANGELOG.md index cfb49314..76faba4a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,14 +4,27 @@ All notable changes to this project will be documented in this file. Dates are d Generated by [`auto-changelog`](https://github.com/CookPete/auto-changelog). +#### [1.2.0](https://github.com/rdkcentral/entservices-inputoutput/compare/1.1.1...1.2.0) + +- RDKEMW-4135:Coverity integration with Entservices repo [`#147`](https://github.com/rdkcentral/entservices-inputoutput/pull/147) +- RDKEMW-4116 : VRR Feature Middleware changes. [`#103`](https://github.com/rdkcentral/entservices-inputoutput/pull/103) +- topic/RDK-58099: HdmiCecSink syntax error [`#142`](https://github.com/rdkcentral/entservices-inputoutput/pull/142) +- [RDKEMW-2711] RDKEMW-4650: Enabling the L1/L2 test in the Testframework [`#130`](https://github.com/rdkcentral/entservices-inputoutput/pull/130) +- Update AVInput.cpp [`78f58ff`](https://github.com/rdkcentral/entservices-inputoutput/commit/78f58ffebdd7dc34588a2202722758881503600c) +- Added L1Tests [`8986170`](https://github.com/rdkcentral/entservices-inputoutput/commit/8986170c1956a7a678b78c142cd0430bae459c58) +- Update AVInput.cpp [`dcee164`](https://github.com/rdkcentral/entservices-inputoutput/commit/dcee164f26692b92e7d7fadf9b36e1523cd84d69) + #### [1.1.1](https://github.com/rdkcentral/entservices-inputoutput/compare/1.1.0...1.1.1) +> 11 June 2025 + - RDKEMW-5124: Higher framerate support in Thunder [`#134`](https://github.com/rdkcentral/entservices-inputoutput/pull/134) - RDK-57440: Enable HdcpProfile for contract test [`#132`](https://github.com/rdkcentral/entservices-inputoutput/pull/132) - [RDKEMW-2711] RDKEMW-4232: Moving the L2 Test files to specific entservices for inputoutput repo [`#123`](https://github.com/rdkcentral/entservices-inputoutput/pull/123) - RDKEMW-4196: Cleanup and remove pwrmgr references from workflows [`#126`](https://github.com/rdkcentral/entservices-inputoutput/pull/126) - RDKEMW-4220: Fix wpeframework crash on reactivating plugin and powerstate change [`#104`](https://github.com/rdkcentral/entservices-inputoutput/pull/104) - RDKEMW-4139: Coverity integration with Entservices-inputoutput repo [`#116`](https://github.com/rdkcentral/entservices-inputoutput/pull/116) +- 1.1.1 release change log updates [`6b11c5b`](https://github.com/rdkcentral/entservices-inputoutput/commit/6b11c5b379c1bfdfc533fc090d73245d4cfe264e) - Merge tag '1.1.0' into develop [`2ce89ed`](https://github.com/rdkcentral/entservices-inputoutput/commit/2ce89edb2c300ecc3275fab6673b48823578d053) #### [1.1.0](https://github.com/rdkcentral/entservices-inputoutput/compare/1.0.12...1.1.0) diff --git a/HdmiCecSink/HdmiCecSink.cpp b/HdmiCecSink/HdmiCecSink.cpp index 26aef24c..b5150cf8 100644 --- a/HdmiCecSink/HdmiCecSink.cpp +++ b/HdmiCecSink/HdmiCecSink.cpp @@ -2500,7 +2500,7 @@ namespace WPEFramework m_audioStatusReceived = false; m_audioStatusTimerStarted = false; LOGINFO("Audio device removed, reset the audio status info. m_isAudioStatusInfoUpdated :%d, m_audioStatusReceived :%d, m_audioStatusTimerStarted:%d ", m_isAudioStatusInfoUpdated,m_audioStatusReceived,m_audioStatusTimerStarted); - sendNotify(eventString[HDMICECSINK_EVENT_AUDIO_DEVICE_CONNECTED_STATUS], params) + sendNotify(eventString[HDMICECSINK_EVENT_AUDIO_DEVICE_CONNECTED_STATUS], params); } _instance->deviceList[logicalAddress].m_isRequestRetry = 0; diff --git a/Tests/L1Tests/CMakeLists.txt b/Tests/L1Tests/CMakeLists.txt index 33773882..23762b08 100755 --- a/Tests/L1Tests/CMakeLists.txt +++ b/Tests/L1Tests/CMakeLists.txt @@ -19,7 +19,8 @@ cmake_minimum_required(VERSION 3.8) set(PLUGIN_NAME L1TestsIO) set(MODULE_NAME ${NAMESPACE}${PLUGIN_NAME}) -set(CMAKE_CXX_STANDARD 11) +set(CMAKE_CXX_STANDARD 14) +set(CMAKE_CXX_STANDARD_REQUIRED ON) find_package(${NAMESPACE}Plugins REQUIRED) @@ -27,16 +28,7 @@ set (TEST_SRC tests/test_UtilsFile.cpp ) -include(FetchContent) -FetchContent_Declare( - googletest - URL https://github.com/google/googletest/archive/e39786088138f2749d64e9e90e0f9902daa77c40.zip -) -set(CMAKE_POSITION_INDEPENDENT_CODE ON) -FetchContent_MakeAvailable(googletest) - set (TEST_LIB - gmock_main ${NAMESPACE}Plugins::${NAMESPACE}Plugins ) @@ -136,6 +128,12 @@ add_plugin_test_ex(PLUGIN_AVINPUT tests/test_AVInput.cpp "${AVINPUT_INC}" "${NAM add_library(${MODULE_NAME} SHARED ${TEST_SRC}) +set_source_files_properties( + tests/test_HdmiCec2.cpp + tests/test_HdmiCecSource.cpp + tests/test_HdmiCecSink.cpp + PROPERTIES COMPILE_FLAGS "-fexceptions") + if (RDK_SERVICES_L1_TEST) find_library(TESTMOCKLIB_LIBRARIES NAMES L1TestMocklib) if (TESTMOCKLIB_LIBRARIES) @@ -148,7 +146,7 @@ endif (RDK_SERVICES_L1_TEST) include_directories(${TEST_INC}) -target_link_directories(${MODULE_NAME} PUBLIC ${CMAKE_INSTALL_PREFIX}/lib/wpeframework/plugins) +target_link_directories(${MODULE_NAME} PUBLIC ${CMAKE_INSTALL_PREFIX}/lib ${CMAKE_INSTALL_PREFIX}/lib/wpeframework/plugins) target_link_libraries(${MODULE_NAME} ${TEST_LIB}) diff --git a/Tests/L1Tests/tests/test_AVInput.cpp b/Tests/L1Tests/tests/test_AVInput.cpp index fae90a90..a82e2d21 100644 --- a/Tests/L1Tests/tests/test_AVInput.cpp +++ b/Tests/L1Tests/tests/test_AVInput.cpp @@ -72,6 +72,9 @@ TEST_F(AVInputTest, RegisteredMethods) EXPECT_EQ(Core::ERROR_NONE, handler.Exists(_T("contentProtected"))); EXPECT_EQ(Core::ERROR_NONE, handler.Exists(_T("setEdid2AllmSupport"))); EXPECT_EQ(Core::ERROR_NONE, handler.Exists(_T("getEdid2AllmSupport"))); + EXPECT_EQ(Core::ERROR_NONE, handler.Exists(_T("setVRRSupport"))); + EXPECT_EQ(Core::ERROR_NONE, handler.Exists(_T("getVRRSupport"))); + EXPECT_EQ(Core::ERROR_NONE, handler.Exists(_T("getVRRFrameRate"))); } TEST_F(AVInputTest, contentProtected) @@ -111,3 +114,21 @@ TEST_F(AVInputDsTest, setEdid2AllmSupport) EXPECT_EQ(response, string("{\"success\":true}")); } +TEST_F(AVInputDsTest, getVRRSupport) +{ + EXPECT_EQ(Core::ERROR_NONE, handler.Invoke(connection, _T("getVRRSupport"), _T("{\"portId\": \"0\",\"vrrSupport\":true}"), response)); + EXPECT_EQ(response, string("{\"vrrSupport\":true,\"success\":true}")); +} + +TEST_F(AVInputDsTest, setVRRSupport) +{ + EXPECT_EQ(Core::ERROR_NONE, handler.Invoke(connection, _T("setVRRSupport"), _T("{\"portId\": \"0\",\"vrrSupport\":true}"), response)); + EXPECT_EQ(response, string("{\"success\":true}")); +} + +TEST_F(AVInputDsTest, getVRRFrameRate) +{ + EXPECT_EQ(Core::ERROR_NONE, handler.Invoke(connection, _T("getVRRFrameRate"), _T("{\"portId\": \"0\"}"), response)); + EXPECT_EQ(response, string("{\"currentVRRVideoFrameRate\":0,\"success\":true}")); +} + diff --git a/Tests/L1Tests/tests/test_HdcpProfile.cpp b/Tests/L1Tests/tests/test_HdcpProfile.cpp index f0f6a06f..bec5f9b9 100755 --- a/Tests/L1Tests/tests/test_HdcpProfile.cpp +++ b/Tests/L1Tests/tests/test_HdcpProfile.cpp @@ -378,6 +378,8 @@ TEST_F(HDCPProfileDsTest, getSettopHDCPSupport_Hdcp_v2x) "\\}"))); } +#if 0 + TEST_F(HDCPProfileEventIarmTest, onDisplayConnectionChanged) { ASSERT_TRUE(dsHdmiEventHandler != nullptr); @@ -447,6 +449,7 @@ TEST_F(HDCPProfileEventIarmTest, onDisplayConnectionChanged) EVENT_UNSUBSCRIBE(0, _T("onDisplayConnectionChanged"), _T("client.events"), message); } +#endif TEST_F(HDCPProfileEventIarmTest, onHdmiOutputHDCPStatusEvent) { ASSERT_TRUE(dsHdmiEventHandler != nullptr); diff --git a/Tests/L2Tests/CMakeLists.txt b/Tests/L2Tests/CMakeLists.txt index 7e852330..41cc70f7 100755 --- a/Tests/L2Tests/CMakeLists.txt +++ b/Tests/L2Tests/CMakeLists.txt @@ -19,16 +19,10 @@ set(PLUGIN_NAME L2TestsIO) set(MODULE_NAME ${NAMESPACE}${PLUGIN_NAME}) set(THUNDER_PORT 9998) -#set(CMAKE_CXX_STANDARD 11) + find_package(${NAMESPACE}Plugins REQUIRED) -include(FetchContent) -FetchContent_Declare( - googletest - URL https://github.com/google/googletest/archive/e39786088138f2749d64e9e90e0f9902daa77c40.zip -) -set(CMAKE_POSITION_INDEPENDENT_CODE ON) -FetchContent_MakeAvailable(googletest) +set(SRC_FILES tests/test_foo_IN.cpp) if(PLUGIN_AVOUTPUT) set(SRC_FILES ${SRC_FILES} tests/AVOutputTV_L2Test.cpp) @@ -37,7 +31,7 @@ endif() add_library(${MODULE_NAME} SHARED ${SRC_FILES}) set_target_properties(${MODULE_NAME} PROPERTIES - CXX_STANDARD 11 + CXX_STANDARD 14 CXX_STANDARD_REQUIRED YES) target_compile_definitions(${MODULE_NAME} @@ -45,8 +39,8 @@ target_compile_definitions(${MODULE_NAME} MODULE_NAME=Plugin_${PLUGIN_NAME} THUNDER_PORT="${THUNDER_PORT}") -target_compile_options(${MODULE_NAME} PRIVATE -Wno-error) -target_link_libraries(${MODULE_NAME} PRIVATE gmock_main ${NAMESPACE}Plugins::${NAMESPACE}Plugins) +# target_compile_options(${MODULE_NAME} PRIVATE -Wno-error) +target_link_libraries(${MODULE_NAME} PRIVATE ${NAMESPACE}Plugins::${NAMESPACE}Plugins) if (NOT L2_TEST_OOP_RPC) find_library(TESTMOCKLIB_LIBRARIES NAMES TestMocklib) diff --git a/Tests/L2Tests/tests/test_foo_IN.cpp b/Tests/L2Tests/tests/test_foo_IN.cpp new file mode 100755 index 00000000..9ce95a52 --- /dev/null +++ b/Tests/L2Tests/tests/test_foo_IN.cpp @@ -0,0 +1,10 @@ +#include +#include + +class PrintTestIO : public ::testing::Test { +}; + +// Single test with print statement +TEST_F(PrintTestIO, BasicOutputIO) { + std::cout << "this is a print statement from inputoutput" << std::endl; +} \ No newline at end of file diff --git a/build_dependencies.sh b/build_dependencies.sh index 92d10f7f..cbd25a7f 100644 --- a/build_dependencies.sh +++ b/build_dependencies.sh @@ -31,7 +31,7 @@ git clone --branch R4.4.3 https://github.com/rdkcentral/ThunderTools.git git clone --branch R4.4.1 https://github.com/rdkcentral/Thunder.git -git clone --branch main https://github.com/rdkcentral/entservices-apis.git +git clone --branch develop https://github.com/rdkcentral/entservices-apis.git git clone https://$GITHUB_TOKEN@github.com/rdkcentral/entservices-testframework.git