avformat/udp: do not accumulate packet_gap delay errors
authorMarton Balint <cus@passwd.hu>
Thu, 9 Jun 2016 21:56:22 +0000 (23:56 +0200)
committerMarton Balint <cus@passwd.hu>
Sun, 19 Jun 2016 20:54:57 +0000 (22:54 +0200)
Signed-off-by: Marton Balint <cus@passwd.hu>
libavformat/udp.c

index 531e254..f2446c6 100644 (file)
@@ -552,6 +552,7 @@ static void *circular_buffer_task_tx( void *_URLContext)
     URLContext *h = _URLContext;
     UDPContext *s = h->priv_data;
     int old_cancelstate;
+    int64_t target_timestamp = 0;
 
     pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, &old_cancelstate);
     pthread_mutex_lock(&s->mutex);
@@ -566,6 +567,7 @@ static void *circular_buffer_task_tx( void *_URLContext)
         int len;
         const uint8_t *p;
         uint8_t tmp[4];
+        int64_t timestamp;
 
         len=av_fifo_size(s->fifo);
 
@@ -589,6 +591,17 @@ static void *circular_buffer_task_tx( void *_URLContext)
         pthread_mutex_unlock(&s->mutex);
         pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, &old_cancelstate);
 
+        if (s->packet_gap) {
+            timestamp = av_gettime_relative();
+            if (timestamp < target_timestamp) {
+                target_timestamp = FFMIN(target_timestamp, timestamp + s->packet_gap);
+                av_usleep(target_timestamp - timestamp);
+            } else {
+                target_timestamp = timestamp;
+            }
+            target_timestamp += s->packet_gap;
+        }
+
         p = s->tmp;
         while (len) {
             int ret;
@@ -613,8 +626,6 @@ static void *circular_buffer_task_tx( void *_URLContext)
             }
         }
 
-        av_usleep(s->packet_gap);
-
         pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, &old_cancelstate);
         pthread_mutex_lock(&s->mutex);
     }