diff --git a/AVInput/AVInput.cpp b/AVInput/AVInput.cpp index 1794343369..38cc9023e7 100644 --- a/AVInput/AVInput.cpp +++ b/AVInput/AVInput.cpp @@ -168,6 +168,10 @@ void AVInput::InitializeIARM() IARM_BUS_DSMGR_NAME, IARM_BUS_DSMGR_EVENT_COMPOSITE_IN_STATUS, dsAVStatusEventHandler)); + IARM_CHECK(IARM_Bus_RegisterEventHandler( + IARM_BUS_DSMGR_NAME, + IARM_BUS_DSMGR_EVENT_COMPOSITE_IN_VIDEO_MODE_UPDATE, + dsAVVideoModeEventHandler)); IARM_CHECK(IARM_Bus_RegisterEventHandler( IARM_BUS_DSMGR_NAME, IARM_BUS_DSMGR_EVENT_HDMI_IN_AVI_CONTENT_TYPE, @@ -204,6 +208,9 @@ void AVInput::DeinitializeIARM() IARM_BUS_DSMGR_NAME, IARM_BUS_DSMGR_EVENT_COMPOSITE_IN_STATUS, dsAVStatusEventHandler)); IARM_CHECK(IARM_Bus_RemoveEventHandler( + IARM_BUS_DSMGR_NAME, + IARM_BUS_DSMGR_EVENT_COMPOSITE_IN_VIDEO_MODE_UPDATE, dsAVVideoModeEventHandler)); + IARM_CHECK(IARM_Bus_RemoveEventHandler( IARM_BUS_DSMGR_NAME, IARM_BUS_DSMGR_EVENT_HDMI_IN_AVI_CONTENT_TYPE, dsAviContentTypeEventHandler)); } @@ -750,17 +757,18 @@ void AVInput::AVInputStatusChange( int port , bool isPresented, int type) * @param[in] port HDMI In port id. * @param[dsVideoPortResolution_t] video resolution data */ -void AVInput::AVInputVideoModeUpdate( int port , dsVideoPortResolution_t resolution) +void AVInput::AVInputVideoModeUpdate( int port , dsVideoPortResolution_t resolution, int type) { LOGWARN("AVInputVideoModeUpdate [%d]", port); JsonObject params; params["id"] = port; std::stringstream locator; - locator << "hdmiin://localhost/deviceid/" << port; - params["locator"] = locator.str(); + if(type == HDMI){ + + locator << "hdmiin://localhost/deviceid/" << port; + switch(resolution.pixelResolution) { - switch(resolution.pixelResolution) { case dsVIDEO_PIXELRES_720x480: params["width"] = 720; params["height"] = 480; @@ -776,7 +784,7 @@ void AVInput::AVInputVideoModeUpdate( int port , dsVideoPortResolution_t resolut params["height"] = 720; break; - case dsVIDEO_PIXELRES_1920x1080: + case dsVIDEO_PIXELRES_1920x1080: params["width"] = 1920; params["height"] = 1080; break; @@ -795,10 +803,31 @@ void AVInput::AVInputVideoModeUpdate( int port , dsVideoPortResolution_t resolut params["width"] = 1920; params["height"] = 1080; break; + } + params["progressive"] = (!resolution.interlaced); } + else if(type == COMPOSITE) + { + locator << "cvbsin://localhost/deviceid/" << port; + switch(resolution.pixelResolution) { + case dsVIDEO_PIXELRES_720x480: + params["width"] = 720; + params["height"] = 480; + break; + case dsVIDEO_PIXELRES_720x576: + params["width"] = 720; + params["height"] = 576; + break; + default: + params["width"] = 720; + params["height"] = 576; + break; + } - params["progressive"] = (!resolution.interlaced); + params["progressive"] = false; + } + params["locator"] = locator.str(); switch(resolution.frameRate) { case dsVIDEO_FRAMERATE_24: params["frameRateN"] = 24000; @@ -851,16 +880,17 @@ void AVInput::AVInputVideoModeUpdate( int port , dsVideoPortResolution_t resolut void AVInput::dsAviContentTypeEventHandler(const char *owner, IARM_EventId_t eventId, void *data, size_t len) { - if(!AVInput::_instance) - return; + if(!AVInput::_instance) + return; - if (IARM_BUS_DSMGR_EVENT_HDMI_IN_AVI_CONTENT_TYPE == eventId) - { - IARM_Bus_DSMgr_EventData_t *eventData = (IARM_Bus_DSMgr_EventData_t *)data; - int hdmi_in_port = eventData->data.hdmi_in_content_type.port; - int avi_content_type = eventData->data.hdmi_in_content_type.aviContentType; - LOGINFO("Received IARM_BUS_DSMGR_EVENT_HDMI_IN_AVI_CONTENT_TYPE event port: %d, Content Type : %d", hdmi_in_port,avi_content_type); -AVInput::_instance->hdmiInputAviContentTypeChange(hdmi_in_port, avi_content_type); + if (IARM_BUS_DSMGR_EVENT_HDMI_IN_AVI_CONTENT_TYPE == eventId) + { + IARM_Bus_DSMgr_EventData_t *eventData = (IARM_Bus_DSMgr_EventData_t *)data; + int hdmi_in_port = eventData->data.hdmi_in_content_type.port; + int avi_content_type = eventData->data.hdmi_in_content_type.aviContentType; + LOGINFO("Received IARM_BUS_DSMGR_EVENT_HDMI_IN_AVI_CONTENT_TYPE event port: %d, Content Type : %d", hdmi_in_port,avi_content_type); + + AVInput::_instance->hdmiInputAviContentTypeChange(hdmi_in_port, avi_content_type); } } @@ -943,7 +973,17 @@ void AVInput::dsAVVideoModeEventHandler(const char *owner, IARM_EventId_t eventI resolution.interlaced = eventData->data.hdmi_in_video_mode.resolution.interlaced; resolution.frameRate = eventData->data.hdmi_in_video_mode.resolution.frameRate; LOGWARN("Received IARM_BUS_DSMGR_EVENT_HDMI_IN_VIDEO_MODE_UPDATE event port: %d, pixelResolution: %d, interlaced : %d, frameRate: %d \n", hdmi_in_port,resolution.pixelResolution, resolution.interlaced, resolution.frameRate); - AVInput::_instance->AVInputVideoModeUpdate(hdmi_in_port, resolution); + AVInput::_instance->AVInputVideoModeUpdate(hdmi_in_port, resolution,HDMI); + } + else if (IARM_BUS_DSMGR_EVENT_COMPOSITE_IN_VIDEO_MODE_UPDATE == eventId) { + IARM_Bus_DSMgr_EventData_t *eventData = (IARM_Bus_DSMgr_EventData_t *)data; + int composite_in_port = eventData->data.composite_in_video_mode.port; + dsVideoPortResolution_t resolution = {}; + resolution.pixelResolution = eventData->data.composite_in_video_mode.resolution.pixelResolution; + resolution.interlaced = eventData->data.composite_in_video_mode.resolution.interlaced; + resolution.frameRate = eventData->data.composite_in_video_mode.resolution.frameRate; + LOGWARN("Received IARM_BUS_DSMGR_EVENT_COMPOSITE_IN_VIDEO_MODE_UPDATE event port: %d, pixelResolution: %d, interlaced : %d, frameRate: %d \n", composite_in_port,resolution.pixelResolution, resolution.interlaced, resolution.frameRate); + AVInput::_instance->AVInputVideoModeUpdate(composite_in_port, resolution,COMPOSITE); } } diff --git a/AVInput/AVInput.h b/AVInput/AVInput.h index 288cb7b2b1..22b618277f 100644 --- a/AVInput/AVInput.h +++ b/AVInput/AVInput.h @@ -107,7 +107,7 @@ class AVInput: public PluginHost::IPlugin, public PluginHost::JSONRPC void AVInputStatusChange( int port , bool isPresented, int type); static void dsAVStatusEventHandler(const char *owner, IARM_EventId_t eventId, void *data, size_t len); - void AVInputVideoModeUpdate( int port , dsVideoPortResolution_t resolution); + void AVInputVideoModeUpdate( int port , dsVideoPortResolution_t resolution,int type); static void dsAVVideoModeEventHandler(const char *owner, IARM_EventId_t eventId, void *data, size_t len); void AVInputALLMChange( int port , bool allmMode); diff --git a/AVInput/AVInput.json b/AVInput/AVInput.json index 748deebd63..1490dcfde4 100644 --- a/AVInput/AVInput.json +++ b/AVInput/AVInput.json @@ -765,7 +765,7 @@ } }, "videoStreamInfoUpdate": { - "summary": "Triggered whenever there is an update in HDMI Input video stream info", + "summary": "Triggered whenever there is an update in HDMI/Composite Input video stream info", "params": { "type": "object", "properties": { diff --git a/CompositeInput/CompositeInput.cpp b/CompositeInput/CompositeInput.cpp index 0e3a67081e..a3240d5d6d 100644 --- a/CompositeInput/CompositeInput.cpp +++ b/CompositeInput/CompositeInput.cpp @@ -42,6 +42,7 @@ #define COMPOSITEINPUT_EVENT_ON_DEVICES_CHANGED "onDevicesChanged" #define COMPOSITEINPUT_EVENT_ON_SIGNAL_CHANGED "onSignalChanged" #define COMPOSITEINPUT_EVENT_ON_STATUS_CHANGED "onInputStatusChanged" +#define COMPOSITEINPUT_EVENT_ON_VIDEO_MODE_UPDATED "videoStreamInfoUpdate" namespace WPEFramework { @@ -103,6 +104,7 @@ namespace WPEFramework IARM_CHECK( IARM_Bus_RegisterEventHandler(IARM_BUS_DSMGR_NAME,IARM_BUS_DSMGR_EVENT_COMPOSITE_IN_HOTPLUG, dsCompositeEventHandler) ); IARM_CHECK( IARM_Bus_RegisterEventHandler(IARM_BUS_DSMGR_NAME,IARM_BUS_DSMGR_EVENT_COMPOSITE_IN_SIGNAL_STATUS, dsCompositeSignalStatusEventHandler) ); IARM_CHECK( IARM_Bus_RegisterEventHandler(IARM_BUS_DSMGR_NAME,IARM_BUS_DSMGR_EVENT_COMPOSITE_IN_STATUS, dsCompositeStatusEventHandler) ); + IARM_CHECK( IARM_Bus_RegisterEventHandler(IARM_BUS_DSMGR_NAME,IARM_BUS_DSMGR_EVENT_COMPOSITE_IN_VIDEO_MODE_UPDATE,dsCompositeVideoModeEventHandler) ); } } @@ -114,6 +116,7 @@ namespace WPEFramework IARM_CHECK( IARM_Bus_RemoveEventHandler(IARM_BUS_DSMGR_NAME,IARM_BUS_DSMGR_EVENT_COMPOSITE_IN_HOTPLUG, dsCompositeEventHandler) ); IARM_CHECK( IARM_Bus_RemoveEventHandler(IARM_BUS_DSMGR_NAME,IARM_BUS_DSMGR_EVENT_COMPOSITE_IN_SIGNAL_STATUS, dsCompositeSignalStatusEventHandler) ); IARM_CHECK( IARM_Bus_RemoveEventHandler(IARM_BUS_DSMGR_NAME,IARM_BUS_DSMGR_EVENT_COMPOSITE_IN_STATUS, dsCompositeStatusEventHandler) ); + IARM_CHECK( IARM_Bus_RemoveEventHandler(IARM_BUS_DSMGR_NAME,IARM_BUS_DSMGR_EVENT_COMPOSITE_IN_VIDEO_MODE_UPDATE, dsCompositeVideoModeEventHandler) ); } } @@ -361,6 +364,89 @@ namespace WPEFramework sendNotify(COMPOSITEINPUT_EVENT_ON_STATUS_CHANGED, params); } + /** + * @brief This function is used to translate Composite input video mode change to + * videoStreamInfoUpdate event. + * + * @param[in] port Composite In port id. + * @param[dsVideoPortResolution_t] video resolution data + */ + void CompositeInput::compositeInputVideoModeUpdate( int port , dsVideoPortResolution_t resolution) + { + LOGWARN("compositeInputVideoModeUpdate [%d]", port); + + JsonObject params; + params["id"] = port; + std::stringstream locator; + locator << "cvbsin://localhost/deviceid/" << port; + params["locator"] = locator.str(); + + switch(resolution.pixelResolution) { + case dsVIDEO_PIXELRES_720x480: + params["width"] = 720; + params["height"] = 480; + break; + case dsVIDEO_PIXELRES_720x576: + params["width"] = 720; + params["height"] = 576; + break; + default: + params["width"] = 720; + params["height"] = 576; + break; + } + + params["progressive"] = false; + + switch(resolution.frameRate) { + case dsVIDEO_FRAMERATE_24: + params["frameRateN"] = 24000; + params["frameRateD"] = 1000; + break; + + case dsVIDEO_FRAMERATE_25: + params["frameRateN"] = 25000; + params["frameRateD"] = 1000; + break; + + case dsVIDEO_FRAMERATE_30: + params["frameRateN"] = 30000; + params["frameRateD"] = 1000; + break; + + case dsVIDEO_FRAMERATE_50: + params["frameRateN"] = 50000; + params["frameRateD"] = 1000; + break; + + case dsVIDEO_FRAMERATE_60: + params["frameRateN"] = 60000; + params["frameRateD"] = 1000; + break; + + case dsVIDEO_FRAMERATE_23dot98: + params["frameRateN"] = 24000; + params["frameRateD"] = 1001; + break; + + case dsVIDEO_FRAMERATE_29dot97: + params["frameRateN"] = 30000; + params["frameRateD"] = 1001; + break; + + case dsVIDEO_FRAMERATE_59dot94: + params["frameRateN"] = 60000; + params["frameRateD"] = 1001; + break; + + default: + params["frameRateN"] = 60000; + params["frameRateD"] = 1000; + break; + } + + sendNotify(COMPOSITEINPUT_EVENT_ON_VIDEO_MODE_UPDATED, params); + } void CompositeInput::dsCompositeEventHandler(const char *owner, IARM_EventId_t eventId, void *data, size_t len) { @@ -409,6 +495,25 @@ namespace WPEFramework CompositeInput::_instance->compositeInputStatusChange(composite_in_port, composite_in_status); } } + void CompositeInput::dsCompositeVideoModeEventHandler(const char *owner, IARM_EventId_t eventId, void *data, size_t len) + { + if(!CompositeInput::_instance) + return; + + if (IARM_BUS_DSMGR_EVENT_COMPOSITE_IN_VIDEO_MODE_UPDATE == eventId) + { + IARM_Bus_DSMgr_EventData_t *eventData = (IARM_Bus_DSMgr_EventData_t *)data; + int composite_in_port = eventData->data.composite_in_video_mode.port; + dsVideoPortResolution_t resolution = {}; + resolution.pixelResolution = eventData->data.composite_in_video_mode.resolution.pixelResolution; + resolution.interlaced = eventData->data.composite_in_video_mode.resolution.interlaced; + resolution.frameRate = eventData->data.composite_in_video_mode.resolution.frameRate; + LOGWARN("Received IARM_BUS_DSMGR_EVENT_COMPOSITE_IN_VIDEO_MODE_UPDATE event port: %d, pixelResolution: %d, interlaced : %d, frameRate: %d \n", composite_in_port,resolution.pixelResolution, resolution.interlaced, resolution.frameRate); + + CompositeInput::_instance->compositeInputVideoModeUpdate(composite_in_port, resolution); + + } + } } // namespace Plugin } // namespace WPEFramework diff --git a/CompositeInput/CompositeInput.h b/CompositeInput/CompositeInput.h index 19be2d10cd..3d1de60781 100644 --- a/CompositeInput/CompositeInput.h +++ b/CompositeInput/CompositeInput.h @@ -20,7 +20,7 @@ #pragma once #include "libIBus.h" - +#include "dsTypes.h" #include "Module.h" namespace WPEFramework { @@ -70,6 +70,8 @@ namespace WPEFramework { void compositeInputStatusChange( int port , bool isPresented); static void dsCompositeStatusEventHandler(const char *owner, IARM_EventId_t eventId, void *data, size_t len); + void compositeInputVideoModeUpdate( int port , dsVideoPortResolution_t resolution); + static void dsCompositeVideoModeEventHandler(const char *owner, IARM_EventId_t eventId, void *data, size_t len); public: CompositeInput(); virtual ~CompositeInput(); diff --git a/CompositeInput/CompositeInput.json b/CompositeInput/CompositeInput.json index 8e94174fb7..b4e718eb6f 100644 --- a/CompositeInput/CompositeInput.json +++ b/CompositeInput/CompositeInput.json @@ -245,6 +245,54 @@ "signalStatus" ] } + }, + "videoStreamInfoUpdate": { + "summary": "Triggered whenever there is an update in HDMI/Composite Input video stream info", + "params": { + "type": "object", + "properties": { + "id": { + "$ref": "#/definitions/id" + }, + "locator": { + "$ref": "#/definitions/locator" + }, + "width": { + "summary": "Width of the Video Stream", + "type": "integer", + "example": 3840 + }, + "height": { + "summary": "Height of the Video Stream", + "type": "integer", + "example": 2160 + }, + "progressive": { + "summary": "Whether the streaming video is progressive or not?", + "type": "boolean", + "example": true + }, + "frameRateN": { + "summary": "FrameRate Numerator", + "type": "integer", + "example": 60000 + }, + "frameRateD": { + "summary": "FrameRate Denomirator", + "type": "integer", + "example": 1001 + } + }, + "required": [ + "id", + "locator", + "width", + "height", + "progressive", + "frameRateN", + "frameRateD" + ] + } } } } diff --git a/Tests/L1Tests/tests/test_CompositeInput.cpp b/Tests/L1Tests/tests/test_CompositeInput.cpp index aa21b480e9..78c186ce16 100755 --- a/Tests/L1Tests/tests/test_CompositeInput.cpp +++ b/Tests/L1Tests/tests/test_CompositeInput.cpp @@ -55,6 +55,7 @@ class CompositeInputInitializedTest : public CompositeInputTest { IARM_EventHandler_t dsCompositeEventHandler; IARM_EventHandler_t dsCompositeStatusEventHandler; IARM_EventHandler_t dsCompositeSignalStatusEventHandler; + IARM_EventHandler_t dsCompositeVideoModeEventHandler; CompositeInputInitializedTest() : CompositeInputTest() @@ -77,6 +78,10 @@ class CompositeInputInitializedTest : public CompositeInputTest { EXPECT_TRUE(handler != nullptr); dsCompositeSignalStatusEventHandler = handler; } + if ((string(IARM_BUS_DSMGR_NAME) == string(ownerName)) && (eventId == IARM_BUS_DSMGR_EVENT_COMPOSITE_IN_VIDEO_MODE_UPDATE)) { + EXPECT_TRUE(handler != nullptr); + dsCompositeVideoModeEventHandler = handler; + } return IARM_RESULT_SUCCESS; })); @@ -364,3 +369,25 @@ TEST_F(CompositeInputInitializedEventDsTest, onSignalChangedDefault) dsCompositeSignalStatusEventHandler(IARM_BUS_DSMGR_NAME, IARM_BUS_DSMGR_EVENT_COMPOSITE_IN_SIGNAL_STATUS, &eventData , 0); handler.Unsubscribe(0, _T("onSignalChanged"), _T("client.events.onSignalChanged"), message); } +TEST_F(CompositeInputInitializedEventDsTest, videoStreamInfoUpdate) +{ + ASSERT_TRUE(dsCompositeVideoModeEventHandler != nullptr); + EXPECT_CALL(service, Submit(::testing::_, ::testing::_)) + .Times(1) + .WillOnce(::testing::Invoke( + [&](const uint32_t, const Core::ProxyType& json) { + string text; + EXPECT_TRUE(json->ToString(text)); + EXPECT_EQ(text, string(_T("{\"jsonrpc\":\"2.0\",\"method\":\"client.events.videoStreamInfoUpdate.videoStreamInfoUpdate\",\"params\":{\"id\":0,\"locator\":\"cvbsin:\\/\\/localhost\\/deviceid\\/0\",\"width\":720,\"height\":576,\"progressive\":false,\"frameRateN\":24000,\"frameRateD\":1001}}"))); + return Core::ERROR_NONE; + })); + + IARM_Bus_DSMgr_EventData_t eventData; + eventData.data.composite_in_video_mode.port =dsCOMPOSITE_IN_PORT_0; + eventData.data.composite_in_video_mode.resolution.pixelResolution = dsVIDEO_PIXELRES_720x576; + eventData.data.composite_in_video_mode.resolution.interlaced = true; + eventData.data.composite_in_video_mode.resolution.frameRate = dsVIDEO_FRAMERATE_23dot98; + handler.Subscribe(0, _T("videoStreamInfoUpdate"), _T("client.events.videoStreamInfoUpdate"), message); + dsCompositeVideoModeEventHandler(IARM_BUS_DSMGR_NAME, IARM_BUS_DSMGR_EVENT_COMPOSITE_IN_VIDEO_MODE_UPDATE, &eventData , 0); + handler.Unsubscribe(0, _T("videoStreamInfoUpdate"), _T("client.events.videoStreamInfoUpdate"), message); +} diff --git a/Tests/mocks/Iarm.h b/Tests/mocks/Iarm.h index 0b7e9310cb..59144a45fa 100644 --- a/Tests/mocks/Iarm.h +++ b/Tests/mocks/Iarm.h @@ -703,6 +703,7 @@ typedef enum _DSMgr_EventId_t { IARM_BUS_DSMGR_EVENT_COMPOSITE_IN_HOTPLUG, /*!< COMPOSITE IN HPD change event */ IARM_BUS_DSMGR_EVENT_COMPOSITE_IN_SIGNAL_STATUS, /*!< COMPOSITE IN signal status change event */ IARM_BUS_DSMGR_EVENT_COMPOSITE_IN_STATUS, /*!< COMPOSITE IN status change event */ + IARM_BUS_DSMGR_EVENT_COMPOSITE_IN_VIDEO_MODE_UPDATE, /*!< COMPOSITE IN Video Mode change event */ IARM_BUS_DSMGR_EVENT_TIME_FORMAT_CHANGE, /*!< Clock Time Format Change Event*/ IARM_BUS_DSMGR_EVENT_AUDIO_LEVEL_CHANGED, /*!< Audio Level Change Event*/ IARM_BUS_DSMGR_EVENT_AUDIO_OUT_HOTPLUG, /*!< AUDIO OUT HPD change event */ diff --git a/Tests/mocks/devicesettings.h b/Tests/mocks/devicesettings.h index 71d0fe5cd4..3a7f788867 100644 --- a/Tests/mocks/devicesettings.h +++ b/Tests/mocks/devicesettings.h @@ -380,7 +380,13 @@ typedef struct _DSMgr_EventData_t { dsCompInSignalStatus_t status; } composite_in_sig_status; /*Composite in signal change detect*/ - struct _FPD_TIME_FORMAT { + struct _COMPOSITE_IN_VIDEO_MODE_DATA{ + /* Declare COMPOSITE In Video Mode*/ + dsCompositeInPort_t port; + dsVideoPortResolution_t resolution; + }composite_in_video_mode; /*Composite in video mode update*/ + + struct _FPD_TIME_FORMAT { dsFPDTimeFormat_t eTimeFormat; } FPDTimeFormat;