diff options
author | Marton Balint <cus@passwd.hu> | 2016-06-09 23:56:22 +0200 |
---|---|---|
committer | Marton Balint <cus@passwd.hu> | 2016-06-19 22:54:57 +0200 |
commit | 0a065694877e7fc37aa68d37cdfa2dee3823ad76 (patch) | |
tree | 410e799e3a0c1c649992debfd2dbe19dca142461 | |
parent | 8b7b52c863f06bcf7d2fd54c78fa1390a21406e4 (diff) |
avformat/udp: do not accumulate packet_gap delay errors
Signed-off-by: Marton Balint <cus@passwd.hu>
-rw-r--r-- | libavformat/udp.c | 15 |
1 files changed, 13 insertions, 2 deletions
diff --git a/libavformat/udp.c b/libavformat/udp.c index 531e25466b..f2446c62ed 100644 --- a/libavformat/udp.c +++ b/libavformat/udp.c @@ -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); } |