Don't use irrelevant debugging output on get_buffer calls, and fix a race in v4lsrc
authorRonald S. Bultje <rbultje@ronald.bitfreak.net>
Fri, 31 Jan 2003 23:44:40 +0000 (23:44 +0000)
committerRonald S. Bultje <rbultje@ronald.bitfreak.net>
Fri, 31 Jan 2003 23:44:40 +0000 (23:44 +0000)
Original commit message from CVS:
Don't use irrelevant debugging output on get_buffer calls, and fix a race in v4lsrc

sys/v4l/v4lmjpegsrc_calls.c
sys/v4l/v4lsrc_calls.c

index 537ebf2..4abfe62 100644 (file)
@@ -498,7 +498,7 @@ guint8 *
 gst_v4lmjpegsrc_get_buffer (GstV4lMjpegSrc *v4lmjpegsrc,
                             gint           num)
 {
-  DEBUG("gst_v4lmjpegsrc_get_buffer(), num = %d", num);
+  /*DEBUG("gst_v4lmjpegsrc_get_buffer(), num = %d", num);*/
 
   if (!GST_V4L_IS_ACTIVE(GST_V4LELEMENT(v4lmjpegsrc)) ||
       !GST_V4L_IS_OPEN(GST_V4LELEMENT(v4lmjpegsrc)))
index 0edfb95..eea55d1 100644 (file)
@@ -77,9 +77,12 @@ gst_v4lsrc_queue_frame (GstV4lSrc *v4lsrc,
 
   v4lsrc->mmap.frame = num;
 
+  g_mutex_lock(v4lsrc->mutex_queued_frames);
+
   if (v4lsrc->frame_queued[num] < 0)
   {
-    v4lsrc->frame_queued[num] = 0;
+    //v4lsrc->frame_queued[num] = 0;
+    g_mutex_unlock(v4lsrc->mutex_queued_frames);
     return TRUE;
   }
 
@@ -88,12 +91,12 @@ gst_v4lsrc_queue_frame (GstV4lSrc *v4lsrc,
     gst_element_error(GST_ELEMENT(v4lsrc),
       "Error queueing a buffer (%d): %s",
       num, g_strerror(errno));
+    g_mutex_unlock(v4lsrc->mutex_queued_frames);
     return FALSE;
   }
 
   v4lsrc->frame_queued[num] = 1;
 
-  g_mutex_lock(v4lsrc->mutex_queued_frames);
   v4lsrc->num_queued_frames++;
   g_cond_broadcast(v4lsrc->cond_queued_frames);
   g_mutex_unlock(v4lsrc->mutex_queued_frames);
@@ -128,8 +131,10 @@ gst_v4lsrc_soft_sync_thread (void *arg)
     g_mutex_lock(v4lsrc->mutex_queued_frames);
     if (v4lsrc->num_queued_frames < MIN_BUFFERS_QUEUED)
     {
-      if (v4lsrc->frame_queued[frame] < 0)
+      if (v4lsrc->frame_queued[frame] < 0) {
+        g_mutex_unlock(v4lsrc->mutex_queued_frames);
         break;
+      }
 
       DEBUG("Waiting for new frames to be queued (%d < %d)",
         v4lsrc->num_queued_frames, MIN_BUFFERS_QUEUED);
@@ -410,7 +415,7 @@ gst_v4lsrc_grab_frame (GstV4lSrc *v4lsrc, gint *num)
 guint8 *
 gst_v4lsrc_get_buffer (GstV4lSrc *v4lsrc, gint  num)
 {
-  DEBUG("gst_v4lsrc_get_buffer(), num = %d", num);
+  /*DEBUG("gst_v4lsrc_get_buffer(), num = %d", num);*/
 
   if (!GST_V4L_IS_ACTIVE(GST_V4LELEMENT(v4lsrc)) ||
       !GST_V4L_IS_OPEN(GST_V4LELEMENT(v4lsrc)))
@@ -460,8 +465,11 @@ gst_v4lsrc_capture_stop (GstV4lSrc *v4lsrc)
   GST_V4L_CHECK_ACTIVE(GST_V4LELEMENT(v4lsrc));
 
   /* we actually need to sync on all queued buffers but not on the non-queued ones */
+  g_mutex_lock(v4lsrc->mutex_queued_frames);
   for (n=0;n<v4lsrc->mbuf.frames;n++)
     v4lsrc->frame_queued[n] = -1;
+  g_cond_broadcast(v4lsrc->cond_queued_frames);
+  g_mutex_unlock(v4lsrc->mutex_queued_frames);
 
   g_thread_join(v4lsrc->thread_soft_sync);