summaryrefslogtreecommitdiff
path: root/libavformat/udp.c
diff options
context:
space:
mode:
authorMarton Balint <cus@passwd.hu>2016-06-09 23:56:22 +0200
committerMarton Balint <cus@passwd.hu>2016-06-19 22:54:57 +0200
commit0a065694877e7fc37aa68d37cdfa2dee3823ad76 (patch)
tree410e799e3a0c1c649992debfd2dbe19dca142461 /libavformat/udp.c
parent8b7b52c863f06bcf7d2fd54c78fa1390a21406e4 (diff)
downloadffmpeg-0a065694877e7fc37aa68d37cdfa2dee3823ad76.tar.gz
avformat/udp: do not accumulate packet_gap delay errors
Signed-off-by: Marton Balint <cus@passwd.hu>
Diffstat (limited to 'libavformat/udp.c')
-rw-r--r--libavformat/udp.c15
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);
}