diff --git a/.gitignore b/.gitignore index 2d0f019..136e0eb 100644 --- a/.gitignore +++ b/.gitignore @@ -6,6 +6,7 @@ config.h *.oo simpleskycam *~ +*.bkp U2SM200C-AST_Cfg_A.bin U2SM200C-AST_Cfg_SAVE.bin gmon.out diff --git a/convert.cc b/convert.cc index 146742a..508d899 100644 --- a/convert.cc +++ b/convert.cc @@ -217,6 +217,7 @@ int ConvertStop(ConvertData *cdata, uint32_t pixelformat) { return VDEV_STATUS_OK; }; + /* * 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; +} + + + diff --git a/convert.h b/convert.h index aa7f36b..4b45805 100644 --- a/convert.h +++ b/convert.h @@ -21,6 +21,10 @@ int Convert (ConvertData *cdata, VideoFrame *dest, unsigned char *ptrsrc, int sr int ConvertStart(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[]; std::string convert_from_pixelformat (uint32_t fmt); uint32_t convert_to_pixelformat(std::string s); diff --git a/detect.cc b/detect.cc index 2d94879..6a7c574 100644 --- a/detect.cc +++ b/detect.cc @@ -9,6 +9,8 @@ #include "config.h" #include "gui.h" #include "detect.h" +#include "convert.h" +#include "configuration.h" // needed to get V4L formats extern Detect detect; extern PosCtl posctl; @@ -33,7 +35,7 @@ Detect::Detect() { // @suppress("Class members should be properly initialized") inFrame.SetSize(64, 64); oldFrame.SetSize(64, 64); image.SetSize(64, 64); - imagegtk.SetSize(64, 64); + imageRGBout.SetSize(64, 64); thread = NULL; thread = g_thread_new("Detect", _DetectThread, NULL); 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; LockInMutex(); + + if (rawframe->pixfmt != V4L2_PIX_FMT_MJPEG) + inRawFrame.CopyFrom(rawframe); + else + inRawFrame.Delete(); + inFrame.CopyFrom(newframe); inFrameNew = 1; + UnLockInMutex(); return 0; }; -// -// NewFrame: will set new frame -// Thread: newFrame |------> Find Object --- not found ---> send gui information +/* + * NewFrame: will set new frame + * Thread: newFrame |------> Find Object --- not found ---> send gui information + */ void Detect::Thread() { DetectOutput doutput; struct timeval timestamp; @@ -140,12 +154,15 @@ void Detect::Thread() { // copy output image for gtk LockImageMutex(); - imagegtk.CopyFrom(&image); + imageRGBout.CopyFrom(&image); + if (imageRawout.RectCopyFrom(&inRawFrame, (objectX-objectW/2), (objectY-objectH/2), objectW, objectH) == 0) + imageRawout.CopyFrom(&imageRGBout); UnLockImageMutex(); doutput.posx = objectX; doutput.posy = objectY; - doutput.image = &imagegtk; + doutput.image = &imageRGBout; + doutput.rawimage = &imageRawout; if (detmatrix != NULL) memcpy (doutput.detmatrix, detmatrix, sizeof(uint32_t) * DET_MAXSHIFT * DET_MAXSHIFT); diff --git a/detect.h b/detect.h index b2fc5ba..6d2afc2 100644 --- a/detect.h +++ b/detect.h @@ -169,7 +169,9 @@ class PosCtl { struct { - VideoFrame *image; // detected image + VideoFrame *image; // detected image + VideoFrameRaw *rawimage; // detected rawimage + uint32_t *detmatrix; int posx; // position of the detected object int posy; // position of the detected object @@ -181,10 +183,12 @@ class Detect { private: int running; VideoFrame inFrame; // input frame + VideoFrameRaw inRawFrame; // input RawFrame VideoFrame oldFrame; // oldinput frame int inFrameNew; // new input frame; 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 mutexin; GMutex mutex; // general mutex for changing settings @@ -214,7 +218,7 @@ public: Detect(); ~Detect(); - int NewFrame(VideoFrame *newframe); + int CopyNewFrame(VideoFrame *newframe, VideoFrameRaw *rawframe); // set new frame data // // Thread Releated Functions (maybe soon private?) diff --git a/posctl.cc b/posctl.cc index 0389e58..bb9928c 100644 --- a/posctl.cc +++ b/posctl.cc @@ -663,7 +663,7 @@ void posctl_gui_update() { gtk_entry_set_text_nofocus (dec_kd, txt); 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)); if (strncmp(txtptr, "SIMULATION", 11) == 0) gtk_widget_show (btnsimreset); diff --git a/process-image.drawio b/process-image.drawio index 204b7f1..7e91e93 100644 --- a/process-image.drawio +++ b/process-image.drawio @@ -1 +1 @@ -7Vzbcto6FP0aZs55CGPLGMxjgSS9pE1KepqkLx1hC3BjLGpEgH59JSwb64JjboZyOtMmlpB1W3utvXUhFas9ml9HcDz8iD0UVIDhzStWpwKAWQOgwv4Z3iLOaRp2nDGIfI8XWmXc+78QzzR47tT30EQoSDAOiD8WM10chsglQh6MIjwTi/VxILY6hgOkZNy7MFBzH3yPDONcBzRW+W+RPxgmLZv1ZvzJCCaF+UgmQ+jhWSbLuqxY7QhjEj+N5m0UsMlL5uXh3eIhuHmuX7//PPkJ/2t9+PLp60Vc2dUmr6RDiFBItq76sf3z9vFp+i64u4Lh5w/kG0Dggs/CCwymfL74WMkimcAIT0MPsUrMitUaklHAH38gQhYccDglmGbhiAzxAIcwuMF4zMv1cUh4MZOlUei9YcDSdC/A7nOcdeUHrGIjTvHyDk1NSISfU+wslpMAwQoHsIeCFnSfB8uOtnGAI/pRiEPEqvKoMfCxrDp3ucptoblPHlldVZunnni/2XNnnvSJJRY80ad9TRqqAMuzkePV0q5mPnFAz6rXl0Mi0SLTDEs+pcOliVVDy9Qim7pDkT9CBEU8s6A5cLOZ4Gnkopxy3AYIjAaI13f/IWjddNs/7+/6Nxa8uLhu300vanE5NqUZanFju0aYdjFa0AIRCiDxX0T+QU7jQVouffUO+3QcwOCSAyxQ5RLDJce0DLGSeEj8vazJS1XVHEOoCNSkiuIxKxXRh8yIVllLRunZBbpuZ3Y7dh/nwdh77nUvb28+Jghk2OX2vpNhhKD3/YXKIv6nWv1XIRyb4Btm1SLdYOAPQvrsUtSZKbReUER8KnRv+Acj3/OWJh2hif8L9pb1MXsZs/EtR2y3KnYnoSRv0eKdpLWhuYAZl2Re00oIs5a3XlVUw+C1G1XqReoCMMlM7Wg6F2ZTfAX3+xO0K7TaIZqqcnYprDTnKwOW/u5AAhVsJzN/FMClNA1x5P+iOMBE9mRVgcjpuzpVqbsO6vU3FgIF4bUImSJt6jw5W/nPlEnDrO9sGK8i1mUGFQ7ofKStNcXWbLU1bWO21BgMKC1CSFCL+YHJjqBrFTCNBESy5jsY0X/+mI7GSXnuo7ROU+NcM1qQdak1rSHkGu2rLsFSXUKe69ifSxAQy4Enr9cZSrbhqALqAR1CqxfRpwF74jztvnlYx1IRstnQJ+h+DJczNqNR8nos6NhbgwBOJpzSYuxiyrHLhrAVJ7AtOlBLpZSZFMlySnaPe0NGFcs2DtlwlqsB+sOh/1s+S3avW2ePh2mUCIh+CI6CSIdGmC5DgNUMjCscBHRikuQdnvjExyF9pNDRaQzOw7eBhgpFo6nxN5bsb4o5N7k5jS89Fe9mmgqkm3q3LVzZVusvyf0deHWVy6CsL9UWbKq+VD/9xrGcaV63NQJx4uKcKFtxcQYCRZtA1ea6hqKH02Z12Sh5y6sAwzMEAsjL9YatQgEOBMVD50vnEb913r43Z++eze6o8+0b31HLIqHzg3KAeX7I2JaEjC6AORRJ9Gpp7+ys9rMUS/xX8vwk+DK9/2IJ2e1s68O2XQpq3Ffert+r7utoS0H9Sl3V0KfLe63JlLHVlotPrn0X3pZby90Lo2rULHEBwl3ctttte91ey7O6DHxfKShediFiXSlwivIIRFCpUo5ZudF8wE66qn26vHGHMCJVD7n+ZFmlVpt3ZNgGSxPZ/2lE1tKIbP1gIgt2FtltFHWf0bwMnkb0962YRc9Tjhfw53U7Q7lkC+Dcohk5ziwz4tdbgnUqwUxKPYF4Kx4eKQhJqCJsSOcE7CdCqXS//ei4nnmQqrOP3LX1iRgIUI8s/rAwdd1W+DZhKttkPfXA1FS3BP6HkanZPHpoWjsxaTXOVFo16/+8/eJTEVag0PTT7Z+kq8kCeGddNapmo+EI7N31tk0Jt2vU0wcFvDO/l5i9orX1OVlp9xRVsy56JTE3THtVdUq7kyjdiDIlv1b0RqK8kd4o+UaiGm+mxxer04s4w08ylncW2ZVFb3kAGN9ZjMvQPvjyezSvt/YkpATF3VA4i/jK5qsK6zQFWE9pf1U7JKCGsVTo2NzT1kMWzd5OyXiqHjL+IZc85BuMmng1vWiYe+9if6e66pZ2MsWG36c/QoSYOzvx3bbUcApj0QACFAlTyjjT1YdWjjLHx95sKyXiTy+vvuZ8i0b85t6d704EU/mVKNqZM0p3THQoRmmDCnXm/wbrZQTrWvrtMwqvHSSYtuqic7ab9nbBNKiJRGiCcoNpW2P3hYPp/lKczjqYXi8WJcbS6VeDGuIre4mt9d/6Uu+eqNCt5MtlHsV3RQxXemlk5WSDPcY9ioN+lEAPZMYL6QLsJG9XDZEvpG37FcG0Q8f6iqC6UTkgz2zS6DIs8MOBYjqUiUQ0FsVD9By7Zmt8St9xketuJBG68Eg0zrUSUczU1kqBJV+dNzVxjqExMdkU9hbnmLrdk/Mj9hqFLofYNYmPdXlBXpTYskIoFR2a2GpU/JfYMTKNNcgcj9i6SO78iF0/qseWiO3IXxYu7LEl83Gckold/0vsNcSWJNc5ILFpcvWXV2JoV3+/xrr8DQ== \ No newline at end of file +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 \ No newline at end of file diff --git a/video.cc b/video.cc index b4b4b1c..d776900 100644 --- a/video.cc +++ b/video.cc @@ -528,6 +528,7 @@ gboolean cb_thread_video (gpointer data) { GtkWidget *btnstop = GTK_WIDGET(gtk_builder_get_object (GTK_BUILDER(_builder_), "btn-video-stop")); VideoDevThreadData *cbdata = (VideoDevThreadData*) data; VideoFrame *vf = NULL; + VideoFrameRaw *vfr = NULL; if (videodev == NULL) return false; @@ -536,11 +537,13 @@ gboolean cb_thread_video (gpointer data) { // read out all controls if (cbdata != NULL) { vf = &cbdata->vf; + vfr = &cbdata->vfr; if (cbdata->running == 1) { videoctrl_grid_build(); cbdata->running = 2; } 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 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(); diff --git a/videodev-v4l2.cc b/videodev-v4l2.cc index bf1f684..e1dd477 100644 --- a/videodev-v4l2.cc +++ b/videodev-v4l2.cc @@ -263,8 +263,7 @@ int VideoDev_V4L2::InitMMap() { if (-1 == xioctl(fd, VIDIOC_REQBUFS, &bufreq)) { if (EINVAL == errno) { - printf("%s does not support " - "memory mappingn", conf_device.c_str()); + printf("%s does not support memory mapping", conf_device.c_str()); return VDEV_STATUS_ERROR; } else { 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. * 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) { struct v4l2_buffer buf; @@ -467,6 +466,8 @@ int VideoDev_V4L2::Grab(VideoFrameRaw *vf) { case EIO: printf ( "%s:%d error on VIDIOC_DQBUF EIO %s\n", __FILE__, __LINE__, strerror(errno)); + return VDEV_STATUS_ERROR; + default: printf ( "%s:%d error on VIDIOC_DQBUF %s\n", __FILE__, __LINE__, strerror(errno)); return VDEV_STATUS_ERROR; diff --git a/videodev.cc b/videodev.cc index ae0d00e..29ba340 100644 --- a/videodev.cc +++ b/videodev.cc @@ -190,6 +190,7 @@ void VideoDev::ThreadProcess() { running = 0; break; } + // // keep 25fps, write every second a message cycle_time = get_cycletime(&cycle_timestamp); diff --git a/videoframe.cc b/videoframe.cc index 88c7a9e..96a7776 100644 --- a/videoframe.cc +++ b/videoframe.cc @@ -5,6 +5,8 @@ #include "config.h" #include "gui.h" #include "error.h" +#include "convert.h" +#include "videodev.h" VideoFrameRaw::VideoFrameRaw() { size = 0; @@ -40,7 +42,19 @@ int VideoFrameRaw::CopyFrom(int spixfmt, int sw, int sh, int ssize, unsigned cha pixfmt = spixfmt; 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 VideoFrame::VideoFrame() { data = NULL; @@ -169,6 +190,9 @@ void VideoFrame::CopyTo(FloatImage *dest) { + + + void VideoFrame::ToPixbuf(GdkPixbuf* dest) { int destw, desth; unsigned char *destpixel; @@ -188,10 +212,6 @@ void VideoFrame::ToPixbuf(GdkPixbuf* dest) { } - - - - FloatImage::FloatImage() { data = NULL; w = 0; diff --git a/videoframe.h b/videoframe.h index f87a3dc..55e6677 100644 --- a/videoframe.h +++ b/videoframe.h @@ -4,21 +4,6 @@ #include "gui.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 { public: @@ -36,9 +21,13 @@ public: void SetW(int nw) { SetSize(nw, h); }; void SetH(int nh) { SetSize(w, nh); }; void CopyFrom(FloatImage *source); + void Delete() { w = 0; h = 0; }; }; +/* + * contains RGB data + */ class VideoFrame { private: public: @@ -59,6 +48,26 @@ public: void CopyFrom(FloatImage *source); void CopyTo(FloatImage *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;}; };