From a7c8fb0d6c42c021be900c1a43df0e0aada1af50 Mon Sep 17 00:00:00 2001 From: Mavridis Philippe Date: Wed, 30 Jun 2021 11:50:40 +0300 Subject: [PATCH] Fixed Kopete FTBFS This commit also adds initial V4L2 support for Motion AutoAway plugin. Signed-off-by: Mavridis Philippe (cherry picked from commit 7a3a7896b3c96bee076ed0da65d10eec7fc06b85) --- kopete/libkopete/avdevice/videodevice.h | 4 +- .../motionautoaway/motionawayplugin.cpp | 60 ++++++++++++++++--- 2 files changed, 55 insertions(+), 9 deletions(-) diff --git a/kopete/libkopete/avdevice/videodevice.h b/kopete/libkopete/avdevice/videodevice.h index a1ace57e..0c3cb473 100644 --- a/kopete/libkopete/avdevice/videodevice.h +++ b/kopete/libkopete/avdevice/videodevice.h @@ -92,7 +92,7 @@ typedef enum { VIDEODEV_DRIVER_NONE #if (defined(__linux__) || defined(__FreeBSD__)) && defined(ENABLE_AV) -#if defined(__LINUX_VIDEODEV2_H) /* V4L2 */ +#if defined(V4L2_CAP_VIDEO_CAPTURE) /* V4L2 */ , VIDEODEV_DRIVER_V4L2 #elif defined(__LINUX_VIDEODEV_H) /* V4L */ @@ -289,7 +289,7 @@ public: //protected: #if (defined(__linux__) || defined(__FreeBSD__)) && defined(ENABLE_AV) -#if defined(__LINUX_VIDEODEV2_H) /* V4L2 */ +#if defined(V4L2_CAP_VIDEO_CAPTURE) /* V4L2 */ struct v4l2_capability V4L2_capabilities; struct v4l2_cropcap cropcap; struct v4l2_crop crop; diff --git a/kopete/plugins/motionautoaway/motionawayplugin.cpp b/kopete/plugins/motionautoaway/motionawayplugin.cpp index cf3a62f4..fa6136ef 100644 --- a/kopete/plugins/motionautoaway/motionawayplugin.cpp +++ b/kopete/plugins/motionautoaway/motionawayplugin.cpp @@ -110,9 +110,13 @@ MotionAwayPlugin::MotionAwayPlugin( TQObject *parent, const char *name, const TQ kdDebug(14305) << k_funcinfo << "Worked! Setting Capture timers!" << endl; /* Capture first image, or we will get a alarm on start */ getImage (m_deviceHandler, m_imageRef, DEF_WIDTH, DEF_HEIGHT, IN_DEFAULT, NORM_DEFAULT, - VIDEO_PALETTE_RGB24); +#ifdef V4L2_CAP_VIDEO_CAPTURE /* V4L2 */ + V4L2_PIX_FMT_RGB24); +#else /* V4L or BSD compat layer */ + VIDEO_PALETTE_RGB24); +#endif - /* We have the first image now */ + /* We have the first image now */ m_tookFirst = true; m_wentAway = false; @@ -142,14 +146,49 @@ void MotionAwayPlugin::loadSettings(){ int MotionAwayPlugin::getImage(int _dev, TQByteArray &_image, int _width, int _height, int _input, int _norm, int _fmt) { - struct video_capability vid_caps; - struct video_channel vid_chnl; - struct video_window vid_win; struct pollfd video_fd; // Just to avoid a warning _fmt = 0; +#if defined(V4L2_CAP_VIDEO_CAPTURE) /* V4L2 */ + struct v4l2_queryctrl queryctrl; + struct v4l2_format fmt; + int newinput = _input; + + if (ioctl(_dev, VIDIOC_QUERYCTRL, &queryctrl) == -1) + { + perror("ioctl (VIDIOC_QUERYCTRL)"); + return(-1); + } + + if (_input != IN_DEFAULT) + { + newinput = -1; + if (ioctl(_dev, VIDIOC_S_INPUT, &newinput) == -1) + { + perror ("ioctl (VIDIOC_S_INPUT)"); + return EXIT_FAILURE; + } + } + + // Set image size + if (ioctl(_dev, VIDIOC_G_FMT, &fmt) == -1) + perror("ioctl (VIDIOC_G_FMT)"); + + fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE; + fmt.fmt.pix.width = _width; + fmt.fmt.pix.height = _height; + fmt.fmt.pix.field = V4L2_FIELD_ANY; + + if (ioctl(_dev, VIDIOC_S_FMT, &fmt) == -1) + perror("ioctl (VIDIOC_S_FMT)"); + +#elif defined(__LINUX_VIDEODEV_H) /* V4L */ + struct video_capability vid_caps; + struct video_channel vid_chnl; + struct video_window vid_win; + if (ioctl (_dev, VIDIOCGCAP, &vid_caps) == -1) { perror ("ioctl (VIDIOCGCAP)"); @@ -186,6 +225,8 @@ int MotionAwayPlugin::getImage(int _dev, TQByteArray &_image, int _width, int _h if (ioctl (_dev, VIDIOCSWIN, &vid_win) == -1) return (-1); +#endif + /* Check if data available on the video device */ video_fd.fd = _dev; video_fd.events = 0; @@ -206,10 +247,15 @@ void MotionAwayPlugin::slotCapture() { /* Should go on forever... emphasis on 'should' */ if ( getImage ( m_deviceHandler, m_imageNew, m_width, m_height, IN_DEFAULT, NORM_DEFAULT, - VIDEO_PALETTE_RGB24) == m_width * m_height *3 ) +#ifdef V4L2_CAP_VIDEO_CAPTURE /* V4L2 */ + V4L2_PIX_FMT_RGB24 +#else /* V4L or BSD compat layer */ + VIDEO_PALETTE_RGB24 +#endif + ) == m_width * m_height *3 ) { int diffs = 0; - if ( m_tookFirst ) + if ( m_tookFirst ) { /* Make a differences picture in image_out */ for (int i=0; i< m_width * m_height * 3 ; i++)