[Ekiga-list] [PATCH] Fix building pwlib HEAD VideoInputDevice class



Nearly all video plugins was break by this patch:
http://openh323.cvs.sourceforge.net/openh323/pwlib/include/ptlib/videoio.h?r1=1.50&r2=1.51&pathrev=MAIN

  * Revision 1.24  2007/04/14 07:08:55  rjongbloed
  * Major update of video subsystem:
  *   Abstracted video frame info (width, height etc) into separate class.
  *   Changed devices, converter and video file to use above.
  *   Enhanced video file hint detection for frame rate and more
  *     flexible formats.
  *   Fixed issue if need to convert both colour format and size, had to do
  *     colour format first or it didn't convert size.
  *   Win32 video output device can be selected by "MSWIN" alone.

Only the v4l plugin was fixed, the fix can be found at:
http://openh323.cvs.sourceforge.net/openh323/pwlib/plugins/vidinput_v4l/vidinput_v4l.h?r1=1.5&r2=1.6&pathrev=MAIN
http://openh323.cvs.sourceforge.net/openh323/pwlib/plugins/vidinput_v4l/vidinput_v4l.cxx?r1=1.23&r2=1.24&pathrev=MAIN

I've made patch to fix the remaining driver in pwlib (V4L2, DC, AVC, BSD)

Luc

diff -r f44ab44b54b6 plugins/vidinput_avc/vidinput_avc.cxx
--- a/plugins/vidinput_avc/vidinput_avc.cxx	Fri Apr 27 18:19:31 2007 +0200
+++ b/plugins/vidinput_avc/vidinput_avc.cxx	Fri Apr 27 18:29:12 2007 +0200
@@ -465,19 +465,7 @@ BOOL PVideoInputDevice_1394AVC::GetFrame
 
 BOOL PVideoInputDevice_1394AVC::GetFrameData(BYTE * buffer, PINDEX * bytesReturned)
 {
-  int capturing_duration = 10000; // FIXME: what is it for?
-  // notice: funny things happen when it is set too low!
-  
-  if(frameRate>0) {
-    if(msBetweenFrames > capturing_duration)
-      PThread::Current()->Sleep(msBetweenFrames - capturing_duration);
-    PTime start;
-    if(!GetFrameDataNoDelay(buffer, bytesReturned))
-      return FALSE;
-    PTime end;
-    capturing_duration = (int)((end-start).GetMilliSeconds());
-    return TRUE;
-  }
+  m_pacing.Delay(1000/GetFrameRate());
   return GetFrameDataNoDelay(buffer, bytesReturned);
 }
 
diff -r f44ab44b54b6 plugins/vidinput_avc/vidinput_avc.h
--- a/plugins/vidinput_avc/vidinput_avc.h	Fri Apr 27 18:19:31 2007 +0200
+++ b/plugins/vidinput_avc/vidinput_avc.h	Fri Apr 27 18:29:57 2007 +0200
@@ -96,6 +96,7 @@
 #if !P_USE_INLINES
 #include <ptlib/contain.inl>
 #endif
+#include <ptclib/delaychan.h>
 
 
 /** This class defines a video input device that
@@ -263,6 +264,7 @@ class PVideoInputDevice_1394AVC : public
     dv_decoder_t * dv_decoder;
     PINDEX frameBytes;
     int port;
+    PAdaptiveDelay m_pacing;
 
     BOOL SetupHandle();
 };
diff -r f44ab44b54b6 plugins/vidinput_bsd/vidinput_bsd.cxx
--- a/plugins/vidinput_bsd/vidinput_bsd.cxx	Fri Apr 27 18:19:31 2007 +0200
+++ b/plugins/vidinput_bsd/vidinput_bsd.cxx	Fri Apr 27 18:20:46 2007 +0200
@@ -369,20 +369,7 @@ PINDEX PVideoInputDevice_BSDCAPTURE::Get
 
 BOOL PVideoInputDevice_BSDCAPTURE::GetFrameData(BYTE * buffer, PINDEX * bytesReturned)
 {
-  if(frameRate>0) {
-    frameTimeError += msBetweenFrames;
-
-    do {
-      if ( !GetFrameDataNoDelay(buffer, bytesReturned))
-        return FALSE;
-      PTime now;
-      PTimeInterval delay = now - previousFrameTime;
-      frameTimeError -= (int)delay.GetMilliSeconds();
-      previousFrameTime = now;
-    }  while(frameTimeError > 0) ;
-
-    return TRUE;
-  }
+  m_pacing.Delay(1000/GetFrameRate());
   return GetFrameDataNoDelay(buffer,bytesReturned);
 }
 
diff -r f44ab44b54b6 plugins/vidinput_bsd/vidinput_bsd.h
--- a/plugins/vidinput_bsd/vidinput_bsd.h	Fri Apr 27 18:19:31 2007 +0200
+++ b/plugins/vidinput_bsd/vidinput_bsd.h	Fri Apr 27 18:26:01 2007 +0200
@@ -11,6 +11,7 @@
 #include <ptlib.h>
 #include <ptlib/videoio.h>
 #include <ptlib/vconvert.h>
+#include <ptclib/delaychan.h>
 
 #if defined(P_FREEBSD)
 #include <sys/param.h>
@@ -126,6 +127,7 @@ public:
   BYTE * videoBuffer;
   PINDEX frameBytes;
   int    mmap_size;
+  PAdaptiveDelay m_pacing;
  
 };
 
diff -r f44ab44b54b6 plugins/vidinput_dc/video4dc1394.cxx
--- a/plugins/vidinput_dc/video4dc1394.cxx	Fri Apr 27 18:19:31 2007 +0200
+++ b/plugins/vidinput_dc/video4dc1394.cxx	Fri Apr 27 18:24:56 2007 +0200
@@ -257,7 +257,6 @@ static int num_captured;
 
 PVideoInputDevice_1394DC::PVideoInputDevice_1394DC()
 {
-  msBetweenFrames = 1000 / frameRate;
   handle = NULL;
   is_capturing = FALSE;
   capturing_duration = 10000; // arbitrary large value suffices
@@ -681,8 +680,6 @@ BOOL PVideoInputDevice_1394DC::SetFrameR
   if (!PVideoDevice::SetFrameRate(rate))
     return FALSE;
 
-  msBetweenFrames = 1000/rate;
-
   return TRUE;
 }
 
@@ -742,16 +739,7 @@ BOOL PVideoInputDevice_1394DC::GetFrameD
 
 BOOL PVideoInputDevice_1394DC::GetFrameData(BYTE * buffer, PINDEX * bytesReturned)
 {
-  if (frameRate > 0) {
-    if (msBetweenFrames > capturing_duration)
-      PThread::Current()->Sleep(msBetweenFrames - capturing_duration);
-    PTime start;
-    if ( !GetFrameDataNoDelay(buffer, bytesReturned))
-      return FALSE;
-    PTime end;
-    capturing_duration = (int)((end-start).GetMilliSeconds());
-    return TRUE;
-  }
+  m_pacing.Delay(1000/GetFrameRate());
   return GetFrameDataNoDelay(buffer,bytesReturned);
 }
 
diff -r f44ab44b54b6 plugins/vidinput_dc/videoio1394dc.h
--- a/plugins/vidinput_dc/videoio1394dc.h	Fri Apr 27 18:19:31 2007 +0200
+++ b/plugins/vidinput_dc/videoio1394dc.h	Fri Apr 27 18:25:20 2007 +0200
@@ -79,6 +79,7 @@
 
 #include <libraw1394/raw1394.h>
 #include <libdc1394/dc1394_control.h>
+#include <ptclib/delaychan.h>
 
 /** This class defines a video input device that
     generates fictitous image data.
@@ -246,7 +247,7 @@ class PVideoInputDevice_1394DC : public 
     dc1394_cameracapture camera;
     int capturing_duration;
     int supportedFormat;
-    int msBetweenFrames;
+    PAdaptiveDelay m_pacing;
 #define DC1394_FORMAT_160x120	1
 #define DC1394_FORMAT_320x240	2
 };
diff -r f44ab44b54b6 plugins/vidinput_v4l2/vidinput_v4l2.cxx
--- a/plugins/vidinput_v4l2/vidinput_v4l2.cxx	Fri Apr 27 18:19:31 2007 +0200
+++ b/plugins/vidinput_v4l2/vidinput_v4l2.cxx	Fri Apr 27 18:22:36 2007 +0200
@@ -729,21 +729,7 @@ BOOL PVideoInputDevice_V4L2::GetFrameDat
 {
   PTRACE(1,"PVidInDev\tGetFrameData()");
 
-  if (frameRate>0) {
-    PTimeInterval delay;
-
-    do {
-      if (!GetFrameDataNoDelay(buffer, bytesReturned))
-        return FALSE;
-
-      delay = PTime() - previousFrameTime;
-    } while (delay.GetMilliSeconds() < msBetweenFrames);
-
-    previousFrameTime = PTime();
-
-    return TRUE;
-  }
-
+  m_pacing.Delay(1000/GetFrameRate());
   return GetFrameDataNoDelay(buffer, bytesReturned);
 }
 
diff -r f44ab44b54b6 plugins/vidinput_v4l2/vidinput_v4l2.h
--- a/plugins/vidinput_v4l2/vidinput_v4l2.h	Fri Apr 27 18:19:31 2007 +0200
+++ b/plugins/vidinput_v4l2/vidinput_v4l2.h	Fri Apr 27 18:25:26 2007 +0200
@@ -75,6 +75,7 @@
 #include <ptlib.h>
 #include <ptlib/videoio.h>
 #include <ptlib/vconvert.h>
+#include <ptclib/delaychan.h>
 
 #ifdef SOLARIS
 #include <sys/videodev2.h>
@@ -172,6 +173,7 @@ public:
   int    videoFd;
   int    frameBytes;
   BOOL   started;
+  PAdaptiveDelay m_pacing;
 };
 
 #endif



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]