avformat/udp: do not accumulate packet_gap delay errors

Signed-off-by: Marton Balint <cus@passwd.hu>
This commit is contained in:
Marton Balint 2016-06-09 23:56:22 +02:00
parent 8b7b52c863
commit 0a06569487
1 changed files with 13 additions and 2 deletions

View 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);
}