static void *circular_buffer_task_tx( void *_URLContext) { URLContext *h = _URLContext; UDPContext *s = h->priv_data; int old_cancelstate; pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, &old_cancelstate); for(;;) { int len; uint8_t tmp[4]; pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, &old_cancelstate); av_usleep(s->packet_gap); pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, &old_cancelstate); pthread_mutex_lock(&s->mutex); len=av_fifo_size(s->fifo); while (len<4) { if (pthread_cond_wait(&s->cond, &s->mutex) < 0) { goto end; } len=av_fifo_size(s->fifo); } av_fifo_generic_peek(s->fifo, tmp, 4, NULL); len=AV_RL32(tmp); if (len>0 && av_fifo_size(s->fifo)>=len+4) { av_fifo_drain(s->fifo, 4); /* skip packet length */ av_fifo_generic_read(s->fifo, h, len, do_udp_write); /* use function for write from fifo buffer */ if (s->circular_buffer_error == len) { /* all ok - reset error */ s->circular_buffer_error=0; } } pthread_mutex_unlock(&s->mutex); } end: pthread_mutex_unlock(&s->mutex); return NULL; }