From 028057cd6e98077432ab21c4c557b5c8d0de6435 Mon Sep 17 00:00:00 2001 From: venkat0907 Date: Tue, 8 Aug 2023 17:58:01 +0530 Subject: [PATCH 1/6] merged Eglrenderer into Imageviewer --- base/CMakeLists.txt | 1 + base/include/ImageViewerModule.h | 41 ++++- base/src/ImageViewerModule.cpp | 224 +++++++++++++++++++++++--- base/test/imageviewermodule_tests.cpp | 98 +++++++++++ 4 files changed, 336 insertions(+), 28 deletions(-) create mode 100644 base/test/imageviewermodule_tests.cpp diff --git a/base/CMakeLists.txt b/base/CMakeLists.txt index 4e461fb91..bb87f0c76 100755 --- a/base/CMakeLists.txt +++ b/base/CMakeLists.txt @@ -528,6 +528,7 @@ SET(UT_FILES test/jpegdecodercv_tests.cpp test/Imageresizecv_tests.cpp test/faciallandmarkscv_tests.cpp + test/imageviewermodule_tests.cpp test/ImageEncodeCV_tests.cpp test/rotatecv_tests.cpp test/affinetransform_tests.cpp diff --git a/base/include/ImageViewerModule.h b/base/include/ImageViewerModule.h index 00c89f013..c95e671eb 100755 --- a/base/include/ImageViewerModule.h +++ b/base/include/ImageViewerModule.h @@ -2,6 +2,10 @@ #include "Module.h" +class DetailRenderer; +class DetailEgl; +class DetailImageviewer; + class ImageViewerModuleProps : public ModuleProps { public: @@ -10,6 +14,28 @@ class ImageViewerModuleProps : public ModuleProps strTitle = _strTitle; } + ImageViewerModuleProps(uint32_t _x_offset,uint32_t _y_offset, uint32_t _width, uint32_t _height) : ModuleProps() + { + x_offset = _x_offset; + y_offset = _y_offset; + height = _height; + width = _width; + } + ImageViewerModuleProps(uint32_t _x_offset,uint32_t _y_offset,bool _displayOnTop = true) : ModuleProps() + { + x_offset = _x_offset; + y_offset = _y_offset; + height = 0; + width = 0; + displayOnTop = _displayOnTop ? 1 : 0; + } + + uint32_t x_offset; + uint32_t y_offset; + uint32_t height; + uint32_t width; + bool displayOnTop; + string strTitle; }; @@ -19,16 +45,15 @@ class ImageViewerModule : public Module { virtual ~ImageViewerModule(); bool init(); bool term(); + bool closeWindow(); + bool createWindow(int width, int height); protected: bool process(frame_container& frames); bool processSOS(frame_sp& frame); bool validateInputPins(); bool shouldTriggerSOS(); -private: - class Detail; - boost::shared_ptr mDetail; -}; - - - - + void addInputPin(framemetadata_sp &metadata, string &pinId); + bool handleCommand(Command::CommandType type, frame_sp& frame); + boost::shared_ptr mDetail; + ImageViewerModuleProps mProps; +}; \ No newline at end of file diff --git a/base/src/ImageViewerModule.cpp b/base/src/ImageViewerModule.cpp index dc9989889..ae60cb21e 100755 --- a/base/src/ImageViewerModule.cpp +++ b/base/src/ImageViewerModule.cpp @@ -8,13 +8,73 @@ #include "Logger.h" #include "Utils.h" -class ImageViewerModule::Detail +#if defined(__arm__) || defined(__aarch64__) +#include "ApraNvEglRenderer.h" +#include "DMAFDWrapper.h" +#include "Command.h" +#endif + +class DetailRenderer { public: - Detail(std::string& strTitle): mStrTitle(strTitle) {} + DetailRenderer(ImageViewerModuleProps& _props) : props(_props) {} + + ~DetailRenderer() + { + #if defined(__arm__) || defined(__aarch64__) + if(renderer) + { + delete renderer; + } + #endif + } - ~Detail() {} + virtual bool compute() = 0; + + bool eglInitializer(uint32_t _height, uint32_t _width , bool _displayOnTop) + { + #if defined(__arm__) || defined(__aarch64__) + uint32_t displayHeight, displayWidth; + NvEglRenderer::getDisplayResolution(displayWidth,displayHeight); + if(height!=0 && width!=0){ + x_offset += (displayWidth-width)/2; + y_offset += (displayHeight-height)/2; + renderer = NvEglRenderer::createEglRenderer(__TIMESTAMP__, width, height, x_offset, y_offset,displayOnTop); + }else{ + x_offset += (displayWidth-_width)/2; + y_offset += (displayHeight-_height)/2; + renderer = NvEglRenderer::createEglRenderer(__TIMESTAMP__, _width, _height, x_offset, y_offset, displayOnTop); + } + if (!renderer) + { + LOG_ERROR << "Failed to create EGL renderer"; + return false; + } + #endif + return true; + } + + bool destroyWindow() + { + #if defined(__arm__) || defined(__aarch64__) + if(renderer) + { + delete renderer; + } + #else + return true; + #endif + } + + bool shouldTriggerSOS() + { + #if defined(__arm__) || defined(__aarch64__) + return !renderer; + #else + return !mImg.rows; + #endif + } void setMatImg(RawImageMetadata* rawMetadata) { @@ -28,22 +88,50 @@ class ImageViewerModule::Detail cv::waitKey(1); //use 33 for linux Grrr } - bool shouldTriggerSOS() - { - return !mImg.rows; - } - -private: +public: cv::Mat mImg; std::string mStrTitle; + uint32_t x_offset,y_offset,width,height; + bool displayOnTop; + frame_sp inputFrame; + frame_sp outputFrame; + ImageViewerModuleProps props; + +#if defined(__arm__) || defined(__aarch64__) + NvEglRenderer *renderer = nullptr; +#endif }; -ImageViewerModule::ImageViewerModule(ImageViewerModuleProps _props) : Module(SINK, "ImageViewerModule", _props) { - mDetail.reset(new Detail(_props.strTitle)); -} +ImageViewerModule::ImageViewerModule(ImageViewerModuleProps _props) : Module(SINK, "ImageViewerModule", _props), mProps(_props) {} ImageViewerModule::~ImageViewerModule() {} +class DetailEgl : public DetailRenderer +{ +public: + DetailEgl(ImageViewerModuleProps &_props) : DetailRenderer(_props) {} + + bool compute() + { + #if defined(__arm__) || defined(__aarch64__) + renderer->render((static_cast(inputFrame->data()))->getFd()); + #endif + return true; + } +}; + +class DetailImageviewer : public DetailRenderer +{ +public: + DetailImageviewer(ImageViewerModuleProps &_props) : DetailRenderer(_props) {} + + bool compute() + { + showImage(inputFrame); + return true; + } +}; + bool ImageViewerModule::validateInputPins() { if (getNumberOfInputPins() != 1) @@ -51,18 +139,42 @@ bool ImageViewerModule::validateInputPins() LOG_ERROR << "<" << getId() << ">::validateInputPins size is expected to be 1. Actual<" << getNumberOfInputPins() << ">"; return false; } - framemetadata_sp metadata = getFirstInputMetadata(); FrameMetadata::FrameType frameType = metadata->getFrameType(); + FrameMetadata::MemType inputMemType = metadata->getMemType(); + +#if defined(__arm__) || defined(__aarch64__) + if (inputMemType != FrameMetadata::MemType::DMABUF) + { + LOG_ERROR << "<" << getId() << ">::validateInputPins input memType is expected to be DMABUF. Actual<" << inputMemType << ">"; + return false; + } + if (frameType != FrameMetadata::RAW_IMAGE && frameType != FrameMetadata::RAW_IMAGE_PLANAR) + { + LOG_ERROR << "<" << getId() << ">::validateInputPins input frameType is expected to be RAW_IMAGE or RAW_IMAGE_PLANAR. Actual<" << frameType << ">"; + return false; + } +#else if (frameType != FrameMetadata::RAW_IMAGE) { LOG_ERROR << "<" << getId() << ">::validateInputPins input frameType is expected to be RAW_IMAGE. Actual<" << frameType << ">"; return false; } - +#endif return true; } +void ImageViewerModule::addInputPin(framemetadata_sp &metadata, string &pinId) +{ + Module::addInputPin(metadata, pinId); + FrameMetadata::MemType inputMemType = metadata->getMemType(); +#if defined(__arm__) || defined(__aarch64__) + mDetail.reset(new DetailEgl(mProps)); +#else + mDetail.reset(new DetailImageviewer(mProps)); +#endif +} + bool ImageViewerModule::init() { if (!Module::init()) @@ -77,24 +189,96 @@ bool ImageViewerModule::term() { return Module::term(); } bool ImageViewerModule::process(frame_container& frames) { - auto frame = getFrameByType(frames, FrameMetadata::RAW_IMAGE); - if (isFrameEmpty(frame)) + mDetail->inputFrame = frames.cbegin()->second; + if (isFrameEmpty(mDetail->inputFrame)) { return true; } - - mDetail->showImage(frame); + mDetail->compute(); return true; } bool ImageViewerModule::processSOS(frame_sp& frame) { - auto metadata = frame->getMetadata(); - mDetail->setMatImg(FrameMetadataFactory::downcast(metadata)); + auto inputMetadata = frame->getMetadata(); + auto frameType = inputMetadata->getFrameType(); + FrameMetadata::MemType mInputMemType = inputMetadata->getMemType(); + #if defined(__arm__) || defined(__aarch64__) + int width = 0; + int height =0; + switch (frameType) + { + case FrameMetadata::FrameType::RAW_IMAGE: + { + auto metadata = FrameMetadataFactory::downcast(inputMetadata); + width = metadata->getWidth(); + height = metadata->getHeight(); + } + break; + case FrameMetadata::FrameType::RAW_IMAGE_PLANAR: + { + auto metadata = FrameMetadataFactory::downcast(inputMetadata); + width = metadata->getWidth(0); + height = metadata->getHeight(0); + } + break; + default: + throw AIPException(AIP_FATAL, "Unsupported FrameType<" + std::to_string(frameType) + ">"); + } + + mDetail->eglInitializer(height,width,mDetail->displayOnTop); + #else + mDetail->setMatImg(FrameMetadataFactory::downcast(inputMetadata)); + #endif return true; } bool ImageViewerModule::shouldTriggerSOS() { return mDetail->shouldTriggerSOS(); +} + +bool ImageViewerModule::handleCommand(Command::CommandType type, frame_sp &frame) +{ +#if defined(__arm__) || defined(__aarch64__) + if (type == Command::CommandType::DeleteWindow) + { + EglRendererCloseWindow cmd; + getCommand(cmd, frame); + mDetail->destroyWindow(); + return true; + } + else if (type == Command::CommandType::CreateWindow) + { + EglRendererCreateWindow cmd; + getCommand(cmd, frame); + mDetail->eglInitializer(cmd.width, cmd.height,mDetail->displayOnTop); + return true; + } + return Module::handleCommand(type, frame); +#else + return true; +#endif +} + +bool ImageViewerModule::closeWindow() +{ +#if defined(__arm__) || defined(__aarch64__) + EglRendererCloseWindow cmd; + return queueCommand(cmd); +#else + return true; +#endif +} + +bool ImageViewerModule::createWindow(int width, int height) +{ +#if defined(__arm__) || defined(__aarch64__) + EglRendererCreateWindow cmd; + cmd.width = width; + cmd.height = height; + return queueCommand(cmd); +#else + return true; +#endif } \ No newline at end of file diff --git a/base/test/imageviewermodule_tests.cpp b/base/test/imageviewermodule_tests.cpp new file mode 100644 index 000000000..08915b933 --- /dev/null +++ b/base/test/imageviewermodule_tests.cpp @@ -0,0 +1,98 @@ +#include +#include "FileReaderModule.h" +#include "Logger.h" +#include "PipeLine.h" +#include "RawImageMetadata.h" +#include "RawImagePlanarMetadata.h" +#include "ImageViewerModule.h" +#include "WebCamSource.h" + +#if defined(__arm__) || defined(__aarch64__) +#include "NvV4L2Camera.h" +#include "NvTransform.h" +#endif + +BOOST_AUTO_TEST_SUITE(imageviewermodule_tests) + +BOOST_AUTO_TEST_CASE(Dma_Renderer_Planarimage,*boost::unit_test::disabled()) +{ + #if defined(__arm__) || defined(__aarch64__) + NvV4L2CameraProps nvCamProps(640, 360, 10); + auto source = boost::shared_ptr(new NvV4L2Camera(nvCamProps)); + + auto transform = boost::shared_ptr(new NvTransform(ImageMetadata::NV12)); + source->setNext(transform); + + auto sink = boost::shared_ptr(new ImageViewerModule(ImageViewerModuleProps(0,0,0))); + transform->setNext(sink); + + PipeLine p("test"); + p.appendModule(source); + BOOST_TEST(p.init()); + + Logger::setLogLevel(boost::log::trivial::severity_level::info); + + p.run_all_threaded(); + + boost::this_thread::sleep_for(boost::chrono::seconds(20)); + Logger::setLogLevel(boost::log::trivial::severity_level::error); + + p.stop(); + p.term(); + p.wait_for_all(); + #endif +} + +BOOST_AUTO_TEST_CASE(Dma_Renderer_Rawimage,*boost::unit_test::disabled()) +{ + #if defined(__arm__) || defined(__aarch64__) + NvV4L2CameraProps nvCamProps(640, 360, 10); + auto source = boost::shared_ptr(new NvV4L2Camera(nvCamProps)); + + auto transform = boost::shared_ptr(new NvTransform(ImageMetadata::NV12)); + source->setNext(transform); + + auto sink = boost::shared_ptr(new ImageViewerModule(ImageViewerModuleProps(0,0,0))); + transform->setNext(sink); + + PipeLine p("test"); + p.appendModule(source); + BOOST_TEST(p.init()); + + Logger::setLogLevel(boost::log::trivial::severity_level::info); + + p.run_all_threaded(); + + boost::this_thread::sleep_for(boost::chrono::seconds(20)); + Logger::setLogLevel(boost::log::trivial::severity_level::error); + + p.stop(); + p.term(); + p.wait_for_all(); + #endif +} + +BOOST_AUTO_TEST_CASE(viewer_test,*boost::unit_test::disabled()) +{ + WebCamSourceProps webCamSourceprops(-1, 640, 480); + auto source = boost::shared_ptr(new WebCamSource(webCamSourceprops)); + + auto sink = boost::shared_ptr(new ImageViewerModule(ImageViewerModuleProps("imageview"))); + source->setNext(sink); + + PipeLine p("test"); + p.appendModule(source); + p.init(); + + p.run_all_threaded(); + boost::this_thread::sleep_for(boost::chrono::seconds(10)); + + LOG_INFO << "profiling done - stopping the pipeline"; + p.stop(); + p.term(); + p.wait_for_all(); + +} + +BOOST_AUTO_TEST_SUITE_END() + From e70110025c9a23797aa15c4181b6ba81f458311f Mon Sep 17 00:00:00 2001 From: venkat0907 Date: Wed, 9 Aug 2023 14:49:08 +0530 Subject: [PATCH 2/6] added moretests and did code refactoring --- base/include/ImageViewerModule.h | 2 +- base/src/ImageViewerModule.cpp | 22 +++++++------- base/test/imageviewermodule_tests.cpp | 41 +++++++++++++++++++++++++-- 3 files changed, 49 insertions(+), 16 deletions(-) diff --git a/base/include/ImageViewerModule.h b/base/include/ImageViewerModule.h index c95e671eb..9478fc7ee 100755 --- a/base/include/ImageViewerModule.h +++ b/base/include/ImageViewerModule.h @@ -41,7 +41,7 @@ class ImageViewerModuleProps : public ModuleProps class ImageViewerModule : public Module { public: - ImageViewerModule(ImageViewerModuleProps _props=ImageViewerModuleProps("")); + ImageViewerModule(ImageViewerModuleProps _props); virtual ~ImageViewerModule(); bool init(); bool term(); diff --git a/base/src/ImageViewerModule.cpp b/base/src/ImageViewerModule.cpp index ae60cb21e..297b4e90b 100755 --- a/base/src/ImageViewerModule.cpp +++ b/base/src/ImageViewerModule.cpp @@ -32,7 +32,7 @@ class DetailRenderer virtual bool compute() = 0; - bool eglInitializer(uint32_t _height, uint32_t _width , bool _displayOnTop) + bool eglInitializer(uint32_t _height, uint32_t _width) { #if defined(__arm__) || defined(__aarch64__) uint32_t displayHeight, displayWidth; @@ -40,11 +40,11 @@ class DetailRenderer if(height!=0 && width!=0){ x_offset += (displayWidth-width)/2; y_offset += (displayHeight-height)/2; - renderer = NvEglRenderer::createEglRenderer(__TIMESTAMP__, width, height, x_offset, y_offset,displayOnTop); + renderer = NvEglRenderer::createEglRenderer(__TIMESTAMP__, width, height, x_offset, y_offset,props.displayOnTop); }else{ x_offset += (displayWidth-_width)/2; y_offset += (displayHeight-_height)/2; - renderer = NvEglRenderer::createEglRenderer(__TIMESTAMP__, _width, _height, x_offset, y_offset, displayOnTop); + renderer = NvEglRenderer::createEglRenderer(__TIMESTAMP__, _width, _height, x_offset, y_offset,props.displayOnTop); } if (!renderer) { @@ -85,18 +85,16 @@ class DetailRenderer { mImg.data = (uchar *)frame->data(); cv::imshow(mStrTitle, mImg); - cv::waitKey(1); //use 33 for linux Grrr + cv::waitKey(1); } public: - cv::Mat mImg; - std::string mStrTitle; - uint32_t x_offset,y_offset,width,height; - bool displayOnTop; frame_sp inputFrame; - frame_sp outputFrame; ImageViewerModuleProps props; - +protected: + cv::Mat mImg; + std::string mStrTitle; + uint32_t x_offset, y_offset, width, height; #if defined(__arm__) || defined(__aarch64__) NvEglRenderer *renderer = nullptr; #endif @@ -226,7 +224,7 @@ bool ImageViewerModule::processSOS(frame_sp& frame) throw AIPException(AIP_FATAL, "Unsupported FrameType<" + std::to_string(frameType) + ">"); } - mDetail->eglInitializer(height,width,mDetail->displayOnTop); + mDetail->eglInitializer(height,width); #else mDetail->setMatImg(FrameMetadataFactory::downcast(inputMetadata)); #endif @@ -252,7 +250,7 @@ bool ImageViewerModule::handleCommand(Command::CommandType type, frame_sp &frame { EglRendererCreateWindow cmd; getCommand(cmd, frame); - mDetail->eglInitializer(cmd.width, cmd.height,mDetail->displayOnTop); + mDetail->eglInitializer(cmd.width, cmd.height); return true; } return Module::handleCommand(type, frame); diff --git a/base/test/imageviewermodule_tests.cpp b/base/test/imageviewermodule_tests.cpp index 08915b933..a31a837f8 100644 --- a/base/test/imageviewermodule_tests.cpp +++ b/base/test/imageviewermodule_tests.cpp @@ -49,10 +49,10 @@ BOOST_AUTO_TEST_CASE(Dma_Renderer_Rawimage,*boost::unit_test::disabled()) NvV4L2CameraProps nvCamProps(640, 360, 10); auto source = boost::shared_ptr(new NvV4L2Camera(nvCamProps)); - auto transform = boost::shared_ptr(new NvTransform(ImageMetadata::NV12)); + auto transform = boost::shared_ptr(new NvTransform(ImageMetadata::RGBA)); source->setNext(transform); - auto sink = boost::shared_ptr(new ImageViewerModule(ImageViewerModuleProps(0,0,0))); + auto sink = boost::shared_ptr(new ImageViewerModule(ImageViewerModuleProps(0,0,1))); transform->setNext(sink); PipeLine p("test"); @@ -63,7 +63,7 @@ BOOST_AUTO_TEST_CASE(Dma_Renderer_Rawimage,*boost::unit_test::disabled()) p.run_all_threaded(); - boost::this_thread::sleep_for(boost::chrono::seconds(20)); + boost::this_thread::sleep_for(boost::chrono::seconds(40)); Logger::setLogLevel(boost::log::trivial::severity_level::error); p.stop(); @@ -72,6 +72,41 @@ BOOST_AUTO_TEST_CASE(Dma_Renderer_Rawimage,*boost::unit_test::disabled()) #endif } +BOOST_AUTO_TEST_CASE(open_close_window, *boost::unit_test::disabled()) +{ + NvV4L2CameraProps nvCamProps(640,360, 10); + auto source = boost::shared_ptr(new NvV4L2Camera(nvCamProps)); + + NvTransformProps nvprops(ImageMetadata::RGBA); + auto transform = boost::shared_ptr(new NvTransform(nvprops)); + source->setNext(transform); + + auto sink = boost::shared_ptr(new ImageViewerModule(ImageViewerModuleProps(0,0,0))); + transform->setNext(sink); + + PipeLine p("test"); + p.appendModule(source); + BOOST_TEST(p.init()); + + Logger::setLogLevel(boost::log::trivial::severity_level::info); + + p.run_all_threaded(); + + boost::this_thread::sleep_for(boost::chrono::seconds(5)); + sink->closeWindow(); + + boost::this_thread::sleep_for(boost::chrono::seconds(10)); + sink->createWindow(200,200); + + boost::this_thread::sleep_for(boost::chrono::seconds(120)); + Logger::setLogLevel(boost::log::trivial::severity_level::error); + + p.stop(); + p.term(); + + p.wait_for_all(); +} + BOOST_AUTO_TEST_CASE(viewer_test,*boost::unit_test::disabled()) { WebCamSourceProps webCamSourceprops(-1, 640, 480); From 3d22ffa1edfa3ea126914e422bb8b41aa23ea99a Mon Sep 17 00:00:00 2001 From: venkat0907 Date: Wed, 9 Aug 2023 14:54:28 +0530 Subject: [PATCH 3/6] added ifdef condition --- base/test/imageviewermodule_tests.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/base/test/imageviewermodule_tests.cpp b/base/test/imageviewermodule_tests.cpp index a31a837f8..e0489fa28 100644 --- a/base/test/imageviewermodule_tests.cpp +++ b/base/test/imageviewermodule_tests.cpp @@ -74,6 +74,7 @@ BOOST_AUTO_TEST_CASE(Dma_Renderer_Rawimage,*boost::unit_test::disabled()) BOOST_AUTO_TEST_CASE(open_close_window, *boost::unit_test::disabled()) { + #if defined(__arm__) || defined(__aarch64__) NvV4L2CameraProps nvCamProps(640,360, 10); auto source = boost::shared_ptr(new NvV4L2Camera(nvCamProps)); @@ -104,7 +105,8 @@ BOOST_AUTO_TEST_CASE(open_close_window, *boost::unit_test::disabled()) p.stop(); p.term(); - p.wait_for_all(); + p.wait_for_all(); + #endif } BOOST_AUTO_TEST_CASE(viewer_test,*boost::unit_test::disabled()) From b488486f6540c3f5e7a00d22381f639ddfca0547 Mon Sep 17 00:00:00 2001 From: venkat0907 Date: Fri, 11 Aug 2023 11:56:18 +0530 Subject: [PATCH 4/6] addressed PR comments --- base/include/ImageViewerModule.h | 30 ++-- base/src/ImageViewerModule.cpp | 231 +++++++++++++------------- base/test/imageviewermodule_tests.cpp | 44 +++-- 3 files changed, 152 insertions(+), 153 deletions(-) diff --git a/base/include/ImageViewerModule.h b/base/include/ImageViewerModule.h index 9478fc7ee..61cb5938e 100755 --- a/base/include/ImageViewerModule.h +++ b/base/include/ImageViewerModule.h @@ -9,37 +9,38 @@ class DetailImageviewer; class ImageViewerModuleProps : public ModuleProps { public: - ImageViewerModuleProps(const string& _strTitle) : ModuleProps() + ImageViewerModuleProps(const string &_strTitle) : ModuleProps() { strTitle = _strTitle; } - ImageViewerModuleProps(uint32_t _x_offset,uint32_t _y_offset, uint32_t _width, uint32_t _height) : ModuleProps() + ImageViewerModuleProps(uint32_t _x_offset, uint32_t _y_offset, uint32_t _width, uint32_t _height, bool _displayOnTop = true) : ModuleProps() { - x_offset = _x_offset; - y_offset = _y_offset; + x_offset = _x_offset; + y_offset = _y_offset; height = _height; width = _width; + displayOnTop = _displayOnTop ? 1 : 0; } - ImageViewerModuleProps(uint32_t _x_offset,uint32_t _y_offset,bool _displayOnTop = true) : ModuleProps() + ImageViewerModuleProps(uint32_t _x_offset, uint32_t _y_offset, bool _displayOnTop = true) : ModuleProps() { - x_offset = _x_offset; - y_offset = _y_offset; + x_offset = _x_offset; + y_offset = _y_offset; height = 0; width = 0; displayOnTop = _displayOnTop ? 1 : 0; } - uint32_t x_offset; - uint32_t y_offset; + uint32_t x_offset; + uint32_t y_offset; uint32_t height; uint32_t width; bool displayOnTop; - string strTitle; }; -class ImageViewerModule : public Module { +class ImageViewerModule : public Module +{ public: ImageViewerModule(ImageViewerModuleProps _props); virtual ~ImageViewerModule(); @@ -47,13 +48,14 @@ class ImageViewerModule : public Module { bool term(); bool closeWindow(); bool createWindow(int width, int height); + protected: - bool process(frame_container& frames); - bool processSOS(frame_sp& frame); + bool process(frame_container &frames); + bool processSOS(frame_sp &frame); bool validateInputPins(); bool shouldTriggerSOS(); void addInputPin(framemetadata_sp &metadata, string &pinId); - bool handleCommand(Command::CommandType type, frame_sp& frame); + bool handleCommand(Command::CommandType type, frame_sp &frame); boost::shared_ptr mDetail; ImageViewerModuleProps mProps; }; \ No newline at end of file diff --git a/base/src/ImageViewerModule.cpp b/base/src/ImageViewerModule.cpp index 297b4e90b..a5d433f62 100755 --- a/base/src/ImageViewerModule.cpp +++ b/base/src/ImageViewerModule.cpp @@ -18,83 +18,85 @@ class DetailRenderer { public: - DetailRenderer(ImageViewerModuleProps& _props) : props(_props) {} + DetailRenderer(ImageViewerModuleProps &_props) : props(_props) {} - ~DetailRenderer() + ~DetailRenderer() { - #if defined(__arm__) || defined(__aarch64__) - if(renderer) - { - delete renderer; - } - #endif +#if defined(__arm__) || defined(__aarch64__) + destroyWindow(); +#endif } - virtual bool compute() = 0; + // arm:EGL Renderer , linux/windows:imshow + + virtual bool view() = 0; bool eglInitializer(uint32_t _height, uint32_t _width) { - #if defined(__arm__) || defined(__aarch64__) - uint32_t displayHeight, displayWidth; - NvEglRenderer::getDisplayResolution(displayWidth,displayHeight); - if(height!=0 && width!=0){ - x_offset += (displayWidth-width)/2; - y_offset += (displayHeight-height)/2; - renderer = NvEglRenderer::createEglRenderer(__TIMESTAMP__, width, height, x_offset, y_offset,props.displayOnTop); - }else{ - x_offset += (displayWidth-_width)/2; - y_offset += (displayHeight-_height)/2; - renderer = NvEglRenderer::createEglRenderer(__TIMESTAMP__, _width, _height, x_offset, y_offset,props.displayOnTop); - } - if (!renderer) - { - LOG_ERROR << "Failed to create EGL renderer"; - return false; - } - #endif - return true; - } - - bool destroyWindow() - { - #if defined(__arm__) || defined(__aarch64__) - if(renderer) - { - delete renderer; - } - #else - return true; - #endif - } +#if defined(__arm__) || defined(__aarch64__) + uint32_t displayHeight, displayWidth; + NvEglRenderer::getDisplayResolution(displayWidth, displayHeight); + if (props.height != 0 && props.width != 0) + { + props.x_offset += (displayWidth - props.width) / 2; + props.y_offset += (displayHeight - props.height) / 2; + renderer = NvEglRenderer::createEglRenderer(__TIMESTAMP__, props.width, props.height, props.x_offset, props.y_offset, props.displayOnTop); + } + else + { + + props.x_offset += (displayWidth - _width) / 2; + props.y_offset += (displayHeight - _height) / 2; + renderer = NvEglRenderer::createEglRenderer(__TIMESTAMP__, _width, _height, props.x_offset, props.y_offset, props.displayOnTop); + } + if (!renderer) + { + LOG_ERROR << "Failed to create EGL renderer"; + return false; + } +#endif + return true; + } + + bool destroyWindow() + { +#if defined(__arm__) || defined(__aarch64__) + if (renderer) + { + delete renderer; + } +#else + return true; +#endif + } bool shouldTriggerSOS() { - #if defined(__arm__) || defined(__aarch64__) - return !renderer; - #else - return !mImg.rows; - #endif +#if defined(__arm__) || defined(__aarch64__) + return !renderer; +#else + return !mImg.rows; +#endif } - void setMatImg(RawImageMetadata* rawMetadata) + void setMatImg(RawImageMetadata *rawMetadata) { mImg = Utils::getMatHeader(rawMetadata); } - void showImage(frame_sp& frame) + void showImage(frame_sp &frame) { mImg.data = (uchar *)frame->data(); - cv::imshow(mStrTitle, mImg); + cv::imshow(props.strTitle, mImg); cv::waitKey(1); } public: frame_sp inputFrame; ImageViewerModuleProps props; + protected: cv::Mat mImg; - std::string mStrTitle; - uint32_t x_offset, y_offset, width, height; #if defined(__arm__) || defined(__aarch64__) NvEglRenderer *renderer = nullptr; #endif @@ -109,11 +111,11 @@ class DetailEgl : public DetailRenderer public: DetailEgl(ImageViewerModuleProps &_props) : DetailRenderer(_props) {} - bool compute() + bool view() { - #if defined(__arm__) || defined(__aarch64__) +#if defined(__arm__) || defined(__aarch64__) renderer->render((static_cast(inputFrame->data()))->getFd()); - #endif +#endif return true; } }; @@ -123,7 +125,7 @@ class DetailImageviewer : public DetailRenderer public: DetailImageviewer(ImageViewerModuleProps &_props) : DetailRenderer(_props) {} - bool compute() + bool view() { showImage(inputFrame); return true; @@ -140,7 +142,7 @@ bool ImageViewerModule::validateInputPins() framemetadata_sp metadata = getFirstInputMetadata(); FrameMetadata::FrameType frameType = metadata->getFrameType(); FrameMetadata::MemType inputMemType = metadata->getMemType(); - + #if defined(__arm__) || defined(__aarch64__) if (inputMemType != FrameMetadata::MemType::DMABUF) { @@ -165,69 +167,68 @@ bool ImageViewerModule::validateInputPins() void ImageViewerModule::addInputPin(framemetadata_sp &metadata, string &pinId) { Module::addInputPin(metadata, pinId); - FrameMetadata::MemType inputMemType = metadata->getMemType(); #if defined(__arm__) || defined(__aarch64__) - mDetail.reset(new DetailEgl(mProps)); + mDetail.reset(new DetailEgl(mProps)); #else - mDetail.reset(new DetailImageviewer(mProps)); + mDetail.reset(new DetailImageviewer(mProps)); #endif } -bool ImageViewerModule::init() +bool ImageViewerModule::init() { if (!Module::init()) { return false; } - - return true; + + return true; } bool ImageViewerModule::term() { return Module::term(); } -bool ImageViewerModule::process(frame_container& frames) +bool ImageViewerModule::process(frame_container &frames) { mDetail->inputFrame = frames.cbegin()->second; if (isFrameEmpty(mDetail->inputFrame)) { return true; } - mDetail->compute(); + mDetail->view(); return true; } -bool ImageViewerModule::processSOS(frame_sp& frame) +bool ImageViewerModule::processSOS(frame_sp &frame) { auto inputMetadata = frame->getMetadata(); auto frameType = inputMetadata->getFrameType(); FrameMetadata::MemType mInputMemType = inputMetadata->getMemType(); - #if defined(__arm__) || defined(__aarch64__) - int width = 0; - int height =0; - switch (frameType) - { - case FrameMetadata::FrameType::RAW_IMAGE: - { - auto metadata = FrameMetadataFactory::downcast(inputMetadata); - width = metadata->getWidth(); - height = metadata->getHeight(); - } - break; - case FrameMetadata::FrameType::RAW_IMAGE_PLANAR: - { - auto metadata = FrameMetadataFactory::downcast(inputMetadata); - width = metadata->getWidth(0); - height = metadata->getHeight(0); - } - break; - default: - throw AIPException(AIP_FATAL, "Unsupported FrameType<" + std::to_string(frameType) + ">"); - } - - mDetail->eglInitializer(height,width); - #else - mDetail->setMatImg(FrameMetadataFactory::downcast(inputMetadata)); - #endif +#if defined(__arm__) || defined(__aarch64__) + int width = 0; + int height = 0; + switch (frameType) + { + case FrameMetadata::FrameType::RAW_IMAGE: + { + auto metadata = FrameMetadataFactory::downcast(inputMetadata); + width = metadata->getWidth(); + height = metadata->getHeight(); + } + break; + case FrameMetadata::FrameType::RAW_IMAGE_PLANAR: + { + auto metadata = FrameMetadataFactory::downcast(inputMetadata); + width = metadata->getWidth(0); + height = metadata->getHeight(0); + } + break; + default: + throw AIPException(AIP_FATAL, "Unsupported FrameType<" + std::to_string(frameType) + ">"); + } + + mDetail->eglInitializer(height, width); +#else + mDetail->setMatImg(FrameMetadataFactory::downcast(inputMetadata)); +#endif return true; } @@ -239,44 +240,42 @@ bool ImageViewerModule::shouldTriggerSOS() bool ImageViewerModule::handleCommand(Command::CommandType type, frame_sp &frame) { #if defined(__arm__) || defined(__aarch64__) - if (type == Command::CommandType::DeleteWindow) - { - EglRendererCloseWindow cmd; - getCommand(cmd, frame); - mDetail->destroyWindow(); - return true; - } - else if (type == Command::CommandType::CreateWindow) - { - EglRendererCreateWindow cmd; - getCommand(cmd, frame); - mDetail->eglInitializer(cmd.width, cmd.height); - return true; - } - return Module::handleCommand(type, frame); + if (type == Command::CommandType::DeleteWindow) + { + mDetail->destroyWindow(); + return true; + } + else if (type == Command::CommandType::CreateWindow) + { + EglRendererCreateWindow cmd; + getCommand(cmd, frame); + mDetail->eglInitializer(cmd.width, cmd.height); + return true; + } + return Module::handleCommand(type, frame); #else - return true; + return true; #endif } bool ImageViewerModule::closeWindow() { #if defined(__arm__) || defined(__aarch64__) - EglRendererCloseWindow cmd; - return queueCommand(cmd); + EglRendererCloseWindow cmd; + return queueCommand(cmd); #else - return true; + return true; #endif } bool ImageViewerModule::createWindow(int width, int height) { #if defined(__arm__) || defined(__aarch64__) - EglRendererCreateWindow cmd; - cmd.width = width; - cmd.height = height; - return queueCommand(cmd); + EglRendererCreateWindow cmd; + cmd.width = width; + cmd.height = height; + return queueCommand(cmd); #else - return true; + return true; #endif } \ No newline at end of file diff --git a/base/test/imageviewermodule_tests.cpp b/base/test/imageviewermodule_tests.cpp index e0489fa28..02b3b4ceb 100644 --- a/base/test/imageviewermodule_tests.cpp +++ b/base/test/imageviewermodule_tests.cpp @@ -14,19 +14,19 @@ BOOST_AUTO_TEST_SUITE(imageviewermodule_tests) -BOOST_AUTO_TEST_CASE(Dma_Renderer_Planarimage,*boost::unit_test::disabled()) +BOOST_AUTO_TEST_CASE(Dma_Renderer_Planarimage, *boost::unit_test::disabled()) { - #if defined(__arm__) || defined(__aarch64__) +#if defined(__arm__) || defined(__aarch64__) NvV4L2CameraProps nvCamProps(640, 360, 10); auto source = boost::shared_ptr(new NvV4L2Camera(nvCamProps)); auto transform = boost::shared_ptr(new NvTransform(ImageMetadata::NV12)); source->setNext(transform); - auto sink = boost::shared_ptr(new ImageViewerModule(ImageViewerModuleProps(0,0,0))); + auto sink = boost::shared_ptr(new ImageViewerModule(ImageViewerModuleProps(0, 0, 0))); transform->setNext(sink); - PipeLine p("test"); + PipeLine p("test"); p.appendModule(source); BOOST_TEST(p.init()); @@ -40,22 +40,22 @@ BOOST_AUTO_TEST_CASE(Dma_Renderer_Planarimage,*boost::unit_test::disabled()) p.stop(); p.term(); p.wait_for_all(); - #endif +#endif } -BOOST_AUTO_TEST_CASE(Dma_Renderer_Rawimage,*boost::unit_test::disabled()) +BOOST_AUTO_TEST_CASE(Dma_Renderer_Rawimage, *boost::unit_test::disabled()) { - #if defined(__arm__) || defined(__aarch64__) +#if defined(__arm__) || defined(__aarch64__) NvV4L2CameraProps nvCamProps(640, 360, 10); auto source = boost::shared_ptr(new NvV4L2Camera(nvCamProps)); auto transform = boost::shared_ptr(new NvTransform(ImageMetadata::RGBA)); source->setNext(transform); - auto sink = boost::shared_ptr(new ImageViewerModule(ImageViewerModuleProps(0,0,1))); + auto sink = boost::shared_ptr(new ImageViewerModule(ImageViewerModuleProps(0, 0, 1))); transform->setNext(sink); - PipeLine p("test"); + PipeLine p("test"); p.appendModule(source); BOOST_TEST(p.init()); @@ -69,20 +69,20 @@ BOOST_AUTO_TEST_CASE(Dma_Renderer_Rawimage,*boost::unit_test::disabled()) p.stop(); p.term(); p.wait_for_all(); - #endif +#endif } BOOST_AUTO_TEST_CASE(open_close_window, *boost::unit_test::disabled()) { - #if defined(__arm__) || defined(__aarch64__) - NvV4L2CameraProps nvCamProps(640,360, 10); - auto source = boost::shared_ptr(new NvV4L2Camera(nvCamProps)); +#if defined(__arm__) || defined(__aarch64__) + NvV4L2CameraProps nvCamProps(640, 360, 10); + auto source = boost::shared_ptr(new NvV4L2Camera(nvCamProps)); - NvTransformProps nvprops(ImageMetadata::RGBA); - auto transform = boost::shared_ptr(new NvTransform(nvprops)); - source->setNext(transform); + NvTransformProps nvprops(ImageMetadata::RGBA); + auto transform = boost::shared_ptr(new NvTransform(nvprops)); + source->setNext(transform); - auto sink = boost::shared_ptr(new ImageViewerModule(ImageViewerModuleProps(0,0,0))); + auto sink = boost::shared_ptr(new ImageViewerModule(ImageViewerModuleProps(0, 0, 0))); transform->setNext(sink); PipeLine p("test"); @@ -97,7 +97,7 @@ BOOST_AUTO_TEST_CASE(open_close_window, *boost::unit_test::disabled()) sink->closeWindow(); boost::this_thread::sleep_for(boost::chrono::seconds(10)); - sink->createWindow(200,200); + sink->createWindow(200, 200); boost::this_thread::sleep_for(boost::chrono::seconds(120)); Logger::setLogLevel(boost::log::trivial::severity_level::error); @@ -106,11 +106,11 @@ BOOST_AUTO_TEST_CASE(open_close_window, *boost::unit_test::disabled()) p.term(); p.wait_for_all(); - #endif +#endif } -BOOST_AUTO_TEST_CASE(viewer_test,*boost::unit_test::disabled()) -{ +BOOST_AUTO_TEST_CASE(viewer_test, *boost::unit_test::disabled()) +{ WebCamSourceProps webCamSourceprops(-1, 640, 480); auto source = boost::shared_ptr(new WebCamSource(webCamSourceprops)); @@ -128,8 +128,6 @@ BOOST_AUTO_TEST_CASE(viewer_test,*boost::unit_test::disabled()) p.stop(); p.term(); p.wait_for_all(); - } BOOST_AUTO_TEST_SUITE_END() - From c5fb8df9ed3df4a60d5f46bc80e08d61d58a655f Mon Sep 17 00:00:00 2001 From: venkat0907 Date: Fri, 11 Aug 2023 14:26:38 +0530 Subject: [PATCH 5/6] added if def condition in the constructor --- base/include/ImageViewerModule.h | 20 +++++++++++++------- base/test/imageviewermodule_tests.cpp | 5 +++-- 2 files changed, 16 insertions(+), 9 deletions(-) diff --git a/base/include/ImageViewerModule.h b/base/include/ImageViewerModule.h index 61cb5938e..4d0f07179 100755 --- a/base/include/ImageViewerModule.h +++ b/base/include/ImageViewerModule.h @@ -9,11 +9,7 @@ class DetailImageviewer; class ImageViewerModuleProps : public ModuleProps { public: - ImageViewerModuleProps(const string &_strTitle) : ModuleProps() - { - strTitle = _strTitle; - } - +#if defined(__arm__) || defined(__aarch64__) ImageViewerModuleProps(uint32_t _x_offset, uint32_t _y_offset, uint32_t _width, uint32_t _height, bool _displayOnTop = true) : ModuleProps() { x_offset = _x_offset; @@ -30,9 +26,19 @@ class ImageViewerModuleProps : public ModuleProps width = 0; displayOnTop = _displayOnTop ? 1 : 0; } + ImageViewerModuleProps(const string &_strTitle) : ModuleProps() + { + strTitle = _strTitle; + } +#else + ImageViewerModuleProps(const string &_strTitle) : ModuleProps() + { + strTitle = _strTitle; + } +#endif - uint32_t x_offset; - uint32_t y_offset; + uint32_t x_offset = 0; + uint32_t y_offset = 0; uint32_t height; uint32_t width; bool displayOnTop; diff --git a/base/test/imageviewermodule_tests.cpp b/base/test/imageviewermodule_tests.cpp index 02b3b4ceb..d8fc4be83 100644 --- a/base/test/imageviewermodule_tests.cpp +++ b/base/test/imageviewermodule_tests.cpp @@ -1,5 +1,4 @@ #include -#include "FileReaderModule.h" #include "Logger.h" #include "PipeLine.h" #include "RawImageMetadata.h" @@ -34,7 +33,7 @@ BOOST_AUTO_TEST_CASE(Dma_Renderer_Planarimage, *boost::unit_test::disabled()) p.run_all_threaded(); - boost::this_thread::sleep_for(boost::chrono::seconds(20)); + boost::this_thread::sleep_for(boost::chrono::seconds(5)); Logger::setLogLevel(boost::log::trivial::severity_level::error); p.stop(); @@ -111,6 +110,7 @@ BOOST_AUTO_TEST_CASE(open_close_window, *boost::unit_test::disabled()) BOOST_AUTO_TEST_CASE(viewer_test, *boost::unit_test::disabled()) { + #if defined(!__arm__) || defined(!__aarch64__) WebCamSourceProps webCamSourceprops(-1, 640, 480); auto source = boost::shared_ptr(new WebCamSource(webCamSourceprops)); @@ -128,6 +128,7 @@ BOOST_AUTO_TEST_CASE(viewer_test, *boost::unit_test::disabled()) p.stop(); p.term(); p.wait_for_all(); + #endif } BOOST_AUTO_TEST_SUITE_END() From 32003db6972544979a79d9ec1d8a732a0eb2132b Mon Sep 17 00:00:00 2001 From: venkat0907 Date: Fri, 11 Aug 2023 14:33:58 +0530 Subject: [PATCH 6/6] reafctoring --- base/test/imageviewermodule_tests.cpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/base/test/imageviewermodule_tests.cpp b/base/test/imageviewermodule_tests.cpp index d8fc4be83..0229ea97f 100644 --- a/base/test/imageviewermodule_tests.cpp +++ b/base/test/imageviewermodule_tests.cpp @@ -110,7 +110,6 @@ BOOST_AUTO_TEST_CASE(open_close_window, *boost::unit_test::disabled()) BOOST_AUTO_TEST_CASE(viewer_test, *boost::unit_test::disabled()) { - #if defined(!__arm__) || defined(!__aarch64__) WebCamSourceProps webCamSourceprops(-1, 640, 480); auto source = boost::shared_ptr(new WebCamSource(webCamSourceprops)); @@ -128,7 +127,6 @@ BOOST_AUTO_TEST_CASE(viewer_test, *boost::unit_test::disabled()) p.stop(); p.term(); p.wait_for_all(); - #endif } BOOST_AUTO_TEST_SUITE_END()