Hello,

just a small patch: I didn't like how the fps display in luvcview was so 
jittery, so this change measures the fps value over 10 frames instead of 
just one. Also, it correctly rounds towards the nearest integer fps value, 
which further reduces fps value flicker.

Cheers,

  Richard

-- 
  __   _
  |_) /|  Richard Atterer     |  GnuPG key: 888354F7
  | \/¯|  http://atterer.net  |  08A9 7B7D 3D13 3EF2 3D25  D157 79E6 F6DC 8883 
54F7
  ¯ '` ¯

--- ./Makefile
+++ ./Makefile  2007-12-09 16:34:48.859937394 +0100
@@ -22,7 +22,7 @@
 #           -Wno-unused
 #           -Wunused
 
-CFLAGS += -DUSE_SDL -O2 -DLINUX -DVERSION=\"$(VERSION)\" -I$(SDLFLAGS) 
$(WARNINGS)
+CFLAGS += -DUSE_SDL -O2 -Wall -DLINUX -DVERSION=\"$(VERSION)\" -I$(SDLFLAGS) 
$(WARNINGS)
 CPPFLAGS = $(CFLAGS)
 
 OBJECTS= luvcview.o color.o utils.o v4l2uvc.o gui.o avilib.o
--- ./luvcview.c
+++ ./luvcview.c        2007-12-09 16:52:53.421743049 +0100
@@ -199,7 +199,28 @@
 static int eventThread(void *data);
 static Uint32 SDL_VIDEO_Flags =
     SDL_ANYFORMAT | SDL_DOUBLEBUF | SDL_RESIZABLE;
+
     
+/* Framerate will be measured over this many frames for better accuracy */
+#define FRAMERATE_FRAMES 10
+static Uint32 framerate_timestamps[FRAMERATE_FRAMES];
+static int framerate_index = 0;
+
+/* Call this when a new frame has been delivered */
+void framerate_newframe() {
+    framerate_index = (framerate_index + 1) % FRAMERATE_FRAMES;
+    framerate_timestamps[framerate_index] = SDL_GetTicks();
+}
+
+/* Returns the frames per second, or 0 if less than FRAMERATE_FRAMES
+   delivered so far. */
+unsigned framerate_get() {
+    Uint32 oldest = framerate_timestamps[(framerate_index + 1) % 
FRAMERATE_FRAMES];
+    Uint32 current = framerate_timestamps[framerate_index];
+    if (oldest == 0 || current == 0) return 0.0;
+    return 1000.0 * (FRAMERATE_FRAMES - 1) / (current - oldest) + 0.5;
+}
+
 
 int main(int argc, char *argv[])
 {
@@ -213,8 +234,6 @@
     SDL_mutex *affmutex;
 
     int status;
-    Uint32 currtime;
-    Uint32 lasttime;
     unsigned char *p = NULL;
     int hwaccel = 0;
     const char *videodevice = NULL;
@@ -465,7 +484,6 @@
                videoIn->rawFrameCapture = enableRawFrameCapture;
 initLut();
     SDL_WM_SetCaption(title_act[A_VIDEO].title, NULL);
-    lasttime = SDL_GetTicks();
     creatButt(videoIn->width, 32);
     SDL_LockYUVOverlay(overlay);
     memcpy(p + (videoIn->width * (videoIn->height) * 2), YUYVbutt,
@@ -481,11 +499,8 @@
     mythread = SDL_CreateThread(eventThread, (void *) &ptdata);
     /* main big loop */
     while (videoIn->signalquit) {
-       currtime = SDL_GetTicks();
-       if (currtime - lasttime > 0) {
-               frmrate = 1000/(currtime - lasttime);
-       }
-       lasttime = currtime;
+    framerate_newframe();
+    frmrate = framerate_get();
        if (uvcGrab(videoIn) < 0) {
            printf("Error grabbing \n");
            break;
@@ -875,10 +890,9 @@
        snprintf(videoIn->status, len,"%s 
%06d",title_act[curr_action].title,value);
        }
        } else { // mouseon
-       
-       len = strlen(title_act[curr_action].title)+9;
-       snprintf(videoIn->status, len,"%s, %02d 
Fps",title_act[curr_action].title, frmrate);
-       
+        len = strlen(title_act[curr_action].title) + 9;
+        snprintf(videoIn->status, len, "%s, %02d fps",
+                 title_act[curr_action].title, frmrate);
        }
        SDL_Delay(50);
        //printf("fp/s %d \n",frmrate);
_______________________________________________
Linux-uvc-devel mailing list
[email protected]
https://lists.berlios.de/mailman/listinfo/linux-uvc-devel

Reply via email to