copy raw image to output thread

master
Steffen Pohle 1 year ago
parent d2378f014f
commit 052b61e5d3

1
.gitignore vendored

@ -6,6 +6,7 @@ config.h
*.oo *.oo
simpleskycam simpleskycam
*~ *~
*.bkp
U2SM200C-AST_Cfg_A.bin U2SM200C-AST_Cfg_A.bin
U2SM200C-AST_Cfg_SAVE.bin U2SM200C-AST_Cfg_SAVE.bin
gmon.out gmon.out

@ -217,6 +217,7 @@ int ConvertStop(ConvertData *cdata, uint32_t pixelformat) {
return VDEV_STATUS_OK; return VDEV_STATUS_OK;
}; };
/* /*
* converts the video from input type to RGB24 type - 24Bit * converts the video from input type to RGB24 type - 24Bit
*/ */
@ -491,3 +492,20 @@ uint32_t convert_to_pixelformat(std::string s) {
}; };
/*
* copy part of an raw image
* destination must be pointer in case we need to align the size of the destination image.
* this function will also realloc needed memory if needed. (only if: givin size < needed size)
*/
int PixCopy(unsigned char *srcdata, uint32_t srcpixfmt, int srcw, int srch,
unsigned char **dstdataptr, int *dstsize, int *dstw, int *dsth,
int regionx, int regiony, int regionw, int regionh) {
if (srcpixfmt == 0 || srcpixfmt == V4L2_PIX_FMT_MJPEG) return 0;
if (srcdata == NULL) return 0;
return 0;
}

@ -21,6 +21,10 @@ int Convert (ConvertData *cdata, VideoFrame *dest, unsigned char *ptrsrc, int sr
int ConvertStart(ConvertData *cdata, uint32_t pixelformat); int ConvertStart(ConvertData *cdata, uint32_t pixelformat);
int ConvertStop(ConvertData *cdata, uint32_t pixelformat); int ConvertStop(ConvertData *cdata, uint32_t pixelformat);
int PixCopy(unsigned char *srcdata, uint32_t srcpixfmt, int srcw, int srch,
unsigned char **dstdataptr, int *dstsize, int *dstw, int *dsth,
int regionx, int regiony, int regionw, int regionh);
extern uint32_t convert_pixelformats[]; extern uint32_t convert_pixelformats[];
std::string convert_from_pixelformat (uint32_t fmt); std::string convert_from_pixelformat (uint32_t fmt);
uint32_t convert_to_pixelformat(std::string s); uint32_t convert_to_pixelformat(std::string s);

@ -9,6 +9,8 @@
#include "config.h" #include "config.h"
#include "gui.h" #include "gui.h"
#include "detect.h" #include "detect.h"
#include "convert.h"
#include "configuration.h" // needed to get V4L formats
extern Detect detect; extern Detect detect;
extern PosCtl posctl; extern PosCtl posctl;
@ -33,7 +35,7 @@ Detect::Detect() { // @suppress("Class members should be properly initialized")
inFrame.SetSize(64, 64); inFrame.SetSize(64, 64);
oldFrame.SetSize(64, 64); oldFrame.SetSize(64, 64);
image.SetSize(64, 64); image.SetSize(64, 64);
imagegtk.SetSize(64, 64); imageRGBout.SetSize(64, 64);
thread = NULL; thread = NULL;
thread = g_thread_new("Detect", _DetectThread, NULL); thread = g_thread_new("Detect", _DetectThread, NULL);
objectW = 300; objectW = 300;
@ -61,19 +63,31 @@ Detect::~Detect() {
int Detect::NewFrame(VideoFrame *newframe) { /*
* copy the framedata into the next thread. Source data must be already mutex locked.
* raw data will only be copied if the source is not an compressed stream
*/
int Detect::CopyNewFrame(VideoFrame *newframe, VideoFrameRaw *rawframe) {
if (newframe == NULL) return -1; if (newframe == NULL) return -1;
LockInMutex(); LockInMutex();
if (rawframe->pixfmt != V4L2_PIX_FMT_MJPEG)
inRawFrame.CopyFrom(rawframe);
else
inRawFrame.Delete();
inFrame.CopyFrom(newframe); inFrame.CopyFrom(newframe);
inFrameNew = 1; inFrameNew = 1;
UnLockInMutex(); UnLockInMutex();
return 0; return 0;
}; };
// /*
// NewFrame: will set new frame * NewFrame: will set new frame
// Thread: newFrame |------> Find Object --- not found ---> send gui information * Thread: newFrame |------> Find Object --- not found ---> send gui information
*/
void Detect::Thread() { void Detect::Thread() {
DetectOutput doutput; DetectOutput doutput;
struct timeval timestamp; struct timeval timestamp;
@ -140,12 +154,15 @@ void Detect::Thread() {
// copy output image for gtk // copy output image for gtk
LockImageMutex(); LockImageMutex();
imagegtk.CopyFrom(&image); imageRGBout.CopyFrom(&image);
if (imageRawout.RectCopyFrom(&inRawFrame, (objectX-objectW/2), (objectY-objectH/2), objectW, objectH) == 0)
imageRawout.CopyFrom(&imageRGBout);
UnLockImageMutex(); UnLockImageMutex();
doutput.posx = objectX; doutput.posx = objectX;
doutput.posy = objectY; doutput.posy = objectY;
doutput.image = &imagegtk; doutput.image = &imageRGBout;
doutput.rawimage = &imageRawout;
if (detmatrix != NULL) if (detmatrix != NULL)
memcpy (doutput.detmatrix, detmatrix, sizeof(uint32_t) * DET_MAXSHIFT * DET_MAXSHIFT); memcpy (doutput.detmatrix, detmatrix, sizeof(uint32_t) * DET_MAXSHIFT * DET_MAXSHIFT);

@ -170,6 +170,8 @@ class PosCtl {
struct { struct {
VideoFrame *image; // detected image VideoFrame *image; // detected image
VideoFrameRaw *rawimage; // detected rawimage
uint32_t *detmatrix; uint32_t *detmatrix;
int posx; // position of the detected object int posx; // position of the detected object
int posy; // position of the detected object int posy; // position of the detected object
@ -181,10 +183,12 @@ class Detect {
private: private:
int running; int running;
VideoFrame inFrame; // input frame VideoFrame inFrame; // input frame
VideoFrameRaw inRawFrame; // input RawFrame
VideoFrame oldFrame; // oldinput frame VideoFrame oldFrame; // oldinput frame
int inFrameNew; // new input frame; int inFrameNew; // new input frame;
VideoFrame image; // output image VideoFrame image; // output image
VideoFrame imagegtk; // output image -- send to gtk VideoFrame imageRGBout; // output image -- send to gtk
VideoFrameRaw imageRawout; // output raw image
GMutex muteximage; GMutex muteximage;
GMutex mutexin; GMutex mutexin;
GMutex mutex; // general mutex for changing settings GMutex mutex; // general mutex for changing settings
@ -214,7 +218,7 @@ public:
Detect(); Detect();
~Detect(); ~Detect();
int NewFrame(VideoFrame *newframe); int CopyNewFrame(VideoFrame *newframe, VideoFrameRaw *rawframe); // set new frame data
// //
// Thread Releated Functions (maybe soon private?) // Thread Releated Functions (maybe soon private?)

@ -663,7 +663,7 @@ void posctl_gui_update() {
gtk_entry_set_text_nofocus (dec_kd, txt); gtk_entry_set_text_nofocus (dec_kd, txt);
strfromd (txt, sizeof(txt-1), (char *)"%f", posctl.GetFilter()); strfromd (txt, sizeof(txt-1), (char *)"%f", posctl.GetFilter());
gtk_entry_set_text (GTK_ENTRY(pos_filter), txt); gtk_entry_set_text_nofocus(pos_filter, txt);
const gchar *txtptr = gtk_entry_get_text(GTK_ENTRY(e_posdevice)); const gchar *txtptr = gtk_entry_get_text(GTK_ENTRY(e_posdevice));
if (strncmp(txtptr, "SIMULATION", 11) == 0) gtk_widget_show (btnsimreset); if (strncmp(txtptr, "SIMULATION", 11) == 0) gtk_widget_show (btnsimreset);

@ -1 +1 @@
<mxfile host="Electron" modified="2023-01-12T22:13:11.243Z" agent="5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) draw.io/20.3.0 Chrome/104.0.5112.114 Electron/20.1.3 Safari/537.36" etag="_SiuOE6-C8IGEgRJWGvy" version="20.3.0" type="device"><diagram id="C5RBs43oDa-KdzZeNtuy" name="Page-1">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</diagram></mxfile> <mxfile host="Electron" modified="2024-04-04T17:50:32.413Z" agent="5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) draw.io/20.3.0 Chrome/104.0.5112.114 Electron/20.1.3 Safari/537.36" etag="RaccqhXgUPgrDxD3-wkT" version="20.3.0" type="device"><diagram id="C5RBs43oDa-KdzZeNtuy" name="Page-1">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</diagram></mxfile>

@ -528,6 +528,7 @@ gboolean cb_thread_video (gpointer data) {
GtkWidget *btnstop = GTK_WIDGET(gtk_builder_get_object (GTK_BUILDER(_builder_), "btn-video-stop")); GtkWidget *btnstop = GTK_WIDGET(gtk_builder_get_object (GTK_BUILDER(_builder_), "btn-video-stop"));
VideoDevThreadData *cbdata = (VideoDevThreadData*) data; VideoDevThreadData *cbdata = (VideoDevThreadData*) data;
VideoFrame *vf = NULL; VideoFrame *vf = NULL;
VideoFrameRaw *vfr = NULL;
if (videodev == NULL) return false; if (videodev == NULL) return false;
@ -536,11 +537,13 @@ gboolean cb_thread_video (gpointer data) {
// read out all controls // read out all controls
if (cbdata != NULL) { if (cbdata != NULL) {
vf = &cbdata->vf; vf = &cbdata->vf;
vfr = &cbdata->vfr;
if (cbdata->running == 1) { if (cbdata->running == 1) {
videoctrl_grid_build(); videoctrl_grid_build();
cbdata->running = 2; cbdata->running = 2;
} }
if (vf->w <= 0 || vf->h <= 0 || vf->data == NULL) vf = NULL; if (vf->w <= 0 || vf->h <= 0 || vf->data == NULL) vf = NULL;
if (vfr->w <= 0 || vfr->h <= 0 || vfr->data == NULL) vfr = NULL;
} }
// //
@ -589,7 +592,7 @@ gboolean cb_thread_video (gpointer data) {
vf->ToPixbuf(video_pixbuf); // convert Frame to pixeldata vf->ToPixbuf(video_pixbuf); // convert Frame to pixeldata
histogram_update(vf); // update histogram histogram_update(vf); // update histogram
detect.NewFrame(vf); // push new data to detect object detect.CopyNewFrame(vf, vfr); // push new data to detect object
videodev->UnLockMutex(); videodev->UnLockMutex();

@ -263,8 +263,7 @@ int VideoDev_V4L2::InitMMap() {
if (-1 == xioctl(fd, VIDIOC_REQBUFS, &bufreq)) { if (-1 == xioctl(fd, VIDIOC_REQBUFS, &bufreq)) {
if (EINVAL == errno) { if (EINVAL == errno) {
printf("%s does not support " printf("%s does not support memory mapping", conf_device.c_str());
"memory mappingn", conf_device.c_str());
return VDEV_STATUS_ERROR; return VDEV_STATUS_ERROR;
} else { } else {
printf ("%s:%d %s Error %s\n", __FILE__, __LINE__, __FUNCTION__, strerror(errno)); printf ("%s:%d %s Error %s\n", __FILE__, __LINE__, __FUNCTION__, strerror(errno));
@ -425,9 +424,9 @@ int VideoDev_V4L2::CaptureStop() {
/* /*
* try to grab one frame and convert it into RGB32.
* If something goes wrong return an error code. * If something goes wrong return an error code.
* Return code VDEV_STATUS_AGAIN is not an error. There was no video image ready to read. * Return code VDEV_STATUS_AGAIN is not an error. There was no video image ready to read.
* To reduce the time of malloc/free reuse the destination buffer.
*/ */
int VideoDev_V4L2::Grab(VideoFrameRaw *vf) { int VideoDev_V4L2::Grab(VideoFrameRaw *vf) {
struct v4l2_buffer buf; struct v4l2_buffer buf;
@ -467,6 +466,8 @@ int VideoDev_V4L2::Grab(VideoFrameRaw *vf) {
case EIO: case EIO:
printf ( "%s:%d error on VIDIOC_DQBUF EIO %s\n", __FILE__, __LINE__, strerror(errno)); printf ( "%s:%d error on VIDIOC_DQBUF EIO %s\n", __FILE__, __LINE__, strerror(errno));
return VDEV_STATUS_ERROR;
default: default:
printf ( "%s:%d error on VIDIOC_DQBUF %s\n", __FILE__, __LINE__, strerror(errno)); printf ( "%s:%d error on VIDIOC_DQBUF %s\n", __FILE__, __LINE__, strerror(errno));
return VDEV_STATUS_ERROR; return VDEV_STATUS_ERROR;

@ -190,6 +190,7 @@ void VideoDev::ThreadProcess() {
running = 0; running = 0;
break; break;
} }
// //
// keep 25fps, write every second a message // keep 25fps, write every second a message
cycle_time = get_cycletime(&cycle_timestamp); cycle_time = get_cycletime(&cycle_timestamp);

@ -5,6 +5,8 @@
#include "config.h" #include "config.h"
#include "gui.h" #include "gui.h"
#include "error.h" #include "error.h"
#include "convert.h"
#include "videodev.h"
VideoFrameRaw::VideoFrameRaw() { VideoFrameRaw::VideoFrameRaw() {
size = 0; size = 0;
@ -40,7 +42,19 @@ int VideoFrameRaw::CopyFrom(int spixfmt, int sw, int sh, int ssize, unsigned cha
pixfmt = spixfmt; pixfmt = spixfmt;
memcpy (data, sdata, size); memcpy (data, sdata, size);
return 0; return 1;
}
int VideoFrameRaw::CopyFrom(VideoFrameRaw *src) {
if (src == NULL) return 0;
return CopyFrom(src->pixfmt, src->w, src->h, src->size, src->data);
}
int VideoFrameRaw::CopyFrom(VideoFrame *src) {
if (src == NULL) return 0;
return CopyFrom(V4L2_PIX_FMT_RGB32, src->w, src->h, src->size, src->data);
} }
@ -68,6 +82,13 @@ int VideoFrameRaw::ReAlloc(int newsize) {
} }
int VideoFrameRaw::RectCopyFrom(VideoFrameRaw *src, int rectx, int recty, int rectw, int recth) {
return PixCopy (src->data, src->pixfmt, src->w, src->h,
&data, &size, &w, &h,
rectx, recty, rectw, recth);
}
#define VIDEOFRAME_DEPTH_BYTES 3 #define VIDEOFRAME_DEPTH_BYTES 3
VideoFrame::VideoFrame() { VideoFrame::VideoFrame() {
data = NULL; data = NULL;
@ -169,6 +190,9 @@ void VideoFrame::CopyTo(FloatImage *dest) {
void VideoFrame::ToPixbuf(GdkPixbuf* dest) { void VideoFrame::ToPixbuf(GdkPixbuf* dest) {
int destw, desth; int destw, desth;
unsigned char *destpixel; unsigned char *destpixel;
@ -188,10 +212,6 @@ void VideoFrame::ToPixbuf(GdkPixbuf* dest) {
} }
FloatImage::FloatImage() { FloatImage::FloatImage() {
data = NULL; data = NULL;
w = 0; w = 0;

@ -4,21 +4,6 @@
#include "gui.h" #include "gui.h"
#include "config.h" #include "config.h"
class VideoFrameRaw {
private:
public:
unsigned char *data;
int size;
int w;
int h;
uint32_t pixfmt;
VideoFrameRaw();
~VideoFrameRaw();
int ReAlloc(int newsize);
int CopyFrom(int spixfmt, int sw, int sh, int ssize, unsigned char *sdata);
};
class FloatImage { class FloatImage {
public: public:
@ -36,9 +21,13 @@ public:
void SetW(int nw) { SetSize(nw, h); }; void SetW(int nw) { SetSize(nw, h); };
void SetH(int nh) { SetSize(w, nh); }; void SetH(int nh) { SetSize(w, nh); };
void CopyFrom(FloatImage *source); void CopyFrom(FloatImage *source);
void Delete() { w = 0; h = 0; };
}; };
/*
* contains RGB data
*/
class VideoFrame { class VideoFrame {
private: private:
public: public:
@ -59,6 +48,26 @@ public:
void CopyFrom(FloatImage *source); void CopyFrom(FloatImage *source);
void CopyTo(FloatImage *dest); void CopyTo(FloatImage *dest);
void ToPixbuf(GdkPixbuf* dest); void ToPixbuf(GdkPixbuf* dest);
void Delete() { w = 0; h = 0; };
};
class VideoFrameRaw {
private:
public:
unsigned char *data;
int size;
int w;
int h;
uint32_t pixfmt;
VideoFrameRaw();
~VideoFrameRaw();
int ReAlloc(int newsize);
int CopyFrom(VideoFrame *src);
int CopyFrom(VideoFrameRaw *src);
int CopyFrom(int spixfmt, int sw, int sh, int ssize, unsigned char *sdata);
int RectCopyFrom(VideoFrameRaw *src, int rectx, int recty, int rectw, int recth);
void Delete() { w = 0; h = 0; pixfmt = 0;};
}; };

Loading…
Cancel
Save