Skip to content

Commit

Permalink
added two features create window, switch displays
Browse files Browse the repository at this point in the history
  • Loading branch information
venkat0907 committed Jul 13, 2023
1 parent a3d180f commit 7b3f375
Show file tree
Hide file tree
Showing 6 changed files with 242 additions and 15 deletions.
4 changes: 2 additions & 2 deletions base/include/ApraNvEglRenderer.h
Original file line number Diff line number Diff line change
Expand Up @@ -95,7 +95,7 @@ class NvEglRenderer
*/
static NvEglRenderer *createEglRenderer(const char *name, uint32_t width,
uint32_t height, uint32_t x_offset,
uint32_t y_offset);
uint32_t y_offset , bool displayOnTop);
~NvEglRenderer();

/**
Expand Down Expand Up @@ -213,7 +213,7 @@ class NvEglRenderer
* Constructor called by the wrapper createEglRenderer.
*/
NvEglRenderer(const char *name, uint32_t width, uint32_t height,
uint32_t x_offset, uint32_t y_offset);
uint32_t x_offset, uint32_t y_offset , bool displayOnTop);
/**
* Gets the pointers to the required EGL methods.
*/
Expand Down
49 changes: 49 additions & 0 deletions base/include/Command.h
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,8 @@ class Command
ValvePassThrough,
MultimediaQueueXform,
Seek,
DeleteWindow,
CreateWindow
};

Command()
Expand Down Expand Up @@ -196,6 +198,53 @@ class ValvePassThroughCommand : public Command
}
};

class EglRendererCloseWindow : public Command
{
public:
EglRendererCloseWindow() : Command(Command::CommandType::DeleteWindow)
{
}

size_t getSerializeSize()
{
return Command::getSerializeSize();
}


private:
friend class boost::serialization::access;
template<class Archive>
void serialize(Archive& ar, const unsigned int /* file_version */)
{
ar& boost::serialization::base_object<Command>(*this);
}
};

class EglRendererCreateWindow : public Command
{
public:
EglRendererCreateWindow() : Command(Command::CommandType::CreateWindow)
{
}

size_t getSerializeSize()
{
return Command::getSerializeSize() + sizeof(width) + sizeof(height) ;
}
int width;
int height;

private:
friend class boost::serialization::access;
template <class Archive>
void serialize(Archive &ar, const unsigned int /* file_version */)
{
ar &boost::serialization::base_object<Command>(*this);
ar &width;
ar &height;
}
};

class MultimediaQueueXformCommand : public Command
{
public:
Expand Down
7 changes: 6 additions & 1 deletion base/include/EglRenderer.h
Original file line number Diff line number Diff line change
Expand Up @@ -12,17 +12,19 @@ class EglRendererProps : public ModuleProps
height = _height;
width = _width;
}
EglRendererProps(uint32_t _x_offset,uint32_t _y_offset) : ModuleProps()
EglRendererProps(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;
};

class EglRenderer : public Module
Expand All @@ -33,11 +35,14 @@ class EglRenderer : public Module

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();
bool handleCommand(Command::CommandType type, frame_sp& frame);
private:
class Detail;
boost::shared_ptr<Detail> mDetail;
Expand Down
60 changes: 52 additions & 8 deletions base/src/EglRenderer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,13 @@
#include "EglRenderer.h"
#include "ApraNvEglRenderer.h"
#include "DMAFDWrapper.h"
#include "Command.h"

class EglRenderer::Detail
{

public:
Detail(uint32_t _x_offset, uint32_t _y_offset, uint32_t _width, uint32_t _height): x_offset(_x_offset), y_offset(_y_offset), width(_width), height(_height) {}
Detail(uint32_t _x_offset, uint32_t _y_offset, uint32_t _width, uint32_t _height , bool _displayOnTop): x_offset(_x_offset), y_offset(_y_offset), width(_width), height(_height), displayOnTop(_displayOnTop) {}

~Detail()
{
Expand All @@ -17,17 +18,17 @@ class EglRenderer::Detail
}
}

bool init(uint32_t _height, uint32_t _width){
bool init(uint32_t _height, uint32_t _width , bool _displayOnTop){
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);
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);
renderer = NvEglRenderer::createEglRenderer(__TIMESTAMP__, _width, _height, x_offset, y_offset, _displayOnTop);
}
if (!renderer)
{
Expand All @@ -38,18 +39,27 @@ class EglRenderer::Detail
return true;
}

bool destroyWindow()
{
if(renderer)
{
delete renderer;
}
}

bool shouldTriggerSOS()
{
return !renderer;
}

NvEglRenderer *renderer = nullptr;
uint32_t x_offset,y_offset,width,height;
bool displayOnTop;
};

EglRenderer::EglRenderer(EglRendererProps props) : Module(SINK, "EglRenderer", props)
{
mDetail.reset(new Detail(props.x_offset,props.y_offset, props.width, props.height));
mDetail.reset(new Detail(props.x_offset,props.y_offset, props.width, props.height,props.displayOnTop));
}

EglRenderer::~EglRenderer() {}
Expand Down Expand Up @@ -103,7 +113,7 @@ bool EglRenderer::processSOS(frame_sp& frame)
auto frameType = inputMetadata->getFrameType();
int width = 0;
int height =0;

switch (frameType)
{
case FrameMetadata::FrameType::RAW_IMAGE:
Expand All @@ -124,11 +134,45 @@ bool EglRenderer::processSOS(frame_sp& frame)
throw AIPException(AIP_FATAL, "Unsupported FrameType<" + std::to_string(frameType) + ">");
}

mDetail->init(height, width);
mDetail->init(height,width,mDetail->displayOnTop);
return true;
}

bool EglRenderer::shouldTriggerSOS()
{
return mDetail->shouldTriggerSOS();
}
}

bool EglRenderer::handleCommand(Command::CommandType type, frame_sp &frame)
{
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->init(cmd.width, cmd.height,mDetail->displayOnTop);
return true;
}
return Module::handleCommand(type, frame);
}

bool EglRenderer::closeWindow()
{
EglRendererCloseWindow cmd;
return queueCommand(cmd);
}

bool EglRenderer::createWindow(int width, int height)
{
EglRendererCreateWindow cmd;
cmd.width = width;
cmd.height = height;
return queueCommand(cmd);
}

42 changes: 38 additions & 4 deletions base/src/NvEglRenderer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@
#include "NvLogging.h"
#include "nvbuf_utils.h"
#include "NvElement.h"
#include "Logger.h"
#include <cstring>
#include <sys/time.h>

Expand All @@ -52,7 +53,7 @@ PFNGLEGLIMAGETARGETTEXTURE2DOESPROC NvEglRenderer::glEGLImageTargetTexture2D

using namespace std;

NvEglRenderer::NvEglRenderer(const char *name, uint32_t width, uint32_t height, uint32_t x_offset, uint32_t y_offset)
NvEglRenderer::NvEglRenderer(const char *name, uint32_t width, uint32_t height, uint32_t x_offset, uint32_t y_offset , bool displayOnTop)
{
int depth;
int screen_num;
Expand Down Expand Up @@ -109,7 +110,21 @@ NvEglRenderer::NvEglRenderer(const char *name, uint32_t width, uint32_t height,
window_attributes.background_pixel =
BlackPixel(x_display, DefaultScreen(x_display));

window_attributes.override_redirect = 1;
window_attributes.override_redirect = displayOnTop;
Atom WM_HINTS;
if(window_attributes.override_redirect == 0)
{
struct
{
unsigned long flags;
unsigned long functions;
unsigned long decorations;
long inputMode;
unsigned long status;
} WM_HINTS = { (1L << 1), 0, 0, 0, 0 }; // this we added to remove title bar
}

LOG_ERROR << "X_OFFSET " << x_offset << "Y_OFFSET "<< y_offset << "========================>>>>";

x_window = XCreateWindow(x_display,
DefaultRootWindow(x_display), x_offset,
Expand All @@ -120,6 +135,25 @@ NvEglRenderer::NvEglRenderer(const char *name, uint32_t width, uint32_t height,
(CWBackPixel | CWOverrideRedirect),
&window_attributes);


if(window_attributes.override_redirect == 0)
{
XStoreName(x_display, x_window, "ApraEglRenderer");
XFlush(x_display);

XSizeHints hints;
hints.x = x_offset;
hints.y = y_offset;
hints.width = width;
hints.height = height;
hints.flags = PPosition | PSize;
XSetWMNormalHints(x_display, x_window, &hints);

WM_HINTS = XInternAtom(x_display, "_MOTIF_WM_HINTS", True);
XChangeProperty(x_display, x_window, WM_HINTS, WM_HINTS, 32,
PropModeReplace, (unsigned char *)&WM_HINTS, 5);
}

XSelectInput(x_display, (int32_t) x_window, ExposureMask);
XMapWindow(x_display, (int32_t) x_window);
gc = XCreateGC(x_display, x_window, 0, NULL);
Expand Down Expand Up @@ -445,10 +479,10 @@ NvEglRenderer::setFPS(float fps)
NvEglRenderer *
NvEglRenderer::createEglRenderer(const char *name, uint32_t width,
uint32_t height, uint32_t x_offset,
uint32_t y_offset)
uint32_t y_offset , bool displayOnTop)
{
NvEglRenderer* renderer = new NvEglRenderer(name, width, height,
x_offset, y_offset);
x_offset, y_offset , displayOnTop);
return renderer;
}

Expand Down
Loading

0 comments on commit 7b3f375

Please sign in to comment.