lavf/udp: switch to new FIFO API
This commit is contained in:
committed by
Andreas Rheinhardt
parent
5fe2c37734
commit
70a1774f1a
@@ -98,7 +98,7 @@ typedef struct UDPContext {
|
|||||||
|
|
||||||
/* Circular Buffer variables for use in UDP receive code */
|
/* Circular Buffer variables for use in UDP receive code */
|
||||||
int circular_buffer_size;
|
int circular_buffer_size;
|
||||||
AVFifoBuffer *fifo;
|
AVFifo *fifo;
|
||||||
int circular_buffer_error;
|
int circular_buffer_error;
|
||||||
int64_t bitrate; /* number of bits to send per second */
|
int64_t bitrate; /* number of bits to send per second */
|
||||||
int64_t burst_bits;
|
int64_t burst_bits;
|
||||||
@@ -500,7 +500,7 @@ static void *circular_buffer_task_rx( void *_URLContext)
|
|||||||
continue;
|
continue;
|
||||||
AV_WL32(s->tmp, len);
|
AV_WL32(s->tmp, len);
|
||||||
|
|
||||||
if(av_fifo_space(s->fifo) < len + 4) {
|
if (av_fifo_can_write(s->fifo) < len + 4) {
|
||||||
/* No Space left */
|
/* No Space left */
|
||||||
if (s->overrun_nonfatal) {
|
if (s->overrun_nonfatal) {
|
||||||
av_log(h, AV_LOG_WARNING, "Circular buffer overrun. "
|
av_log(h, AV_LOG_WARNING, "Circular buffer overrun. "
|
||||||
@@ -514,7 +514,7 @@ static void *circular_buffer_task_rx( void *_URLContext)
|
|||||||
goto end;
|
goto end;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
av_fifo_generic_write(s->fifo, s->tmp, len+4, NULL);
|
av_fifo_write(s->fifo, s->tmp, len + 4);
|
||||||
pthread_cond_signal(&s->cond);
|
pthread_cond_signal(&s->cond);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -548,22 +548,22 @@ static void *circular_buffer_task_tx( void *_URLContext)
|
|||||||
uint8_t tmp[4];
|
uint8_t tmp[4];
|
||||||
int64_t timestamp;
|
int64_t timestamp;
|
||||||
|
|
||||||
len = av_fifo_size(s->fifo);
|
len = av_fifo_can_read(s->fifo);
|
||||||
|
|
||||||
while (len<4) {
|
while (len<4) {
|
||||||
if (s->close_req)
|
if (s->close_req)
|
||||||
goto end;
|
goto end;
|
||||||
pthread_cond_wait(&s->cond, &s->mutex);
|
pthread_cond_wait(&s->cond, &s->mutex);
|
||||||
len = av_fifo_size(s->fifo);
|
len = av_fifo_can_read(s->fifo);
|
||||||
}
|
}
|
||||||
|
|
||||||
av_fifo_generic_read(s->fifo, tmp, 4, NULL);
|
av_fifo_read(s->fifo, tmp, 4);
|
||||||
len = AV_RL32(tmp);
|
len = AV_RL32(tmp);
|
||||||
|
|
||||||
av_assert0(len >= 0);
|
av_assert0(len >= 0);
|
||||||
av_assert0(len <= sizeof(s->tmp));
|
av_assert0(len <= sizeof(s->tmp));
|
||||||
|
|
||||||
av_fifo_generic_read(s->fifo, s->tmp, len, NULL);
|
av_fifo_read(s->fifo, s->tmp, len);
|
||||||
|
|
||||||
pthread_mutex_unlock(&s->mutex);
|
pthread_mutex_unlock(&s->mutex);
|
||||||
|
|
||||||
@@ -906,7 +906,7 @@ static int udp_open(URLContext *h, const char *uri, int flags)
|
|||||||
|
|
||||||
if ((!is_output && s->circular_buffer_size) || (is_output && s->bitrate && s->circular_buffer_size)) {
|
if ((!is_output && s->circular_buffer_size) || (is_output && s->bitrate && s->circular_buffer_size)) {
|
||||||
/* start the task going */
|
/* start the task going */
|
||||||
s->fifo = av_fifo_alloc(s->circular_buffer_size);
|
s->fifo = av_fifo_alloc2(s->circular_buffer_size, 1, 0);
|
||||||
if (!s->fifo) {
|
if (!s->fifo) {
|
||||||
ret = AVERROR(ENOMEM);
|
ret = AVERROR(ENOMEM);
|
||||||
goto fail;
|
goto fail;
|
||||||
@@ -943,7 +943,7 @@ static int udp_open(URLContext *h, const char *uri, int flags)
|
|||||||
fail:
|
fail:
|
||||||
if (udp_fd >= 0)
|
if (udp_fd >= 0)
|
||||||
closesocket(udp_fd);
|
closesocket(udp_fd);
|
||||||
av_fifo_freep(&s->fifo);
|
av_fifo_freep2(&s->fifo);
|
||||||
ff_ip_reset_filters(&s->filters);
|
ff_ip_reset_filters(&s->filters);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
@@ -970,19 +970,19 @@ static int udp_read(URLContext *h, uint8_t *buf, int size)
|
|||||||
if (s->fifo) {
|
if (s->fifo) {
|
||||||
pthread_mutex_lock(&s->mutex);
|
pthread_mutex_lock(&s->mutex);
|
||||||
do {
|
do {
|
||||||
avail = av_fifo_size(s->fifo);
|
avail = av_fifo_can_read(s->fifo);
|
||||||
if (avail) { // >=size) {
|
if (avail) { // >=size) {
|
||||||
uint8_t tmp[4];
|
uint8_t tmp[4];
|
||||||
|
|
||||||
av_fifo_generic_read(s->fifo, tmp, 4, NULL);
|
av_fifo_read(s->fifo, tmp, 4);
|
||||||
avail = AV_RL32(tmp);
|
avail = AV_RL32(tmp);
|
||||||
if(avail > size){
|
if(avail > size){
|
||||||
av_log(h, AV_LOG_WARNING, "Part of datagram lost due to insufficient buffer size\n");
|
av_log(h, AV_LOG_WARNING, "Part of datagram lost due to insufficient buffer size\n");
|
||||||
avail = size;
|
avail = size;
|
||||||
}
|
}
|
||||||
|
|
||||||
av_fifo_generic_read(s->fifo, buf, avail, NULL);
|
av_fifo_read(s->fifo, buf, avail);
|
||||||
av_fifo_drain(s->fifo, AV_RL32(tmp) - avail);
|
av_fifo_drain2(s->fifo, AV_RL32(tmp) - avail);
|
||||||
pthread_mutex_unlock(&s->mutex);
|
pthread_mutex_unlock(&s->mutex);
|
||||||
return avail;
|
return avail;
|
||||||
} else if(s->circular_buffer_error){
|
} else if(s->circular_buffer_error){
|
||||||
@@ -1043,14 +1043,14 @@ static int udp_write(URLContext *h, const uint8_t *buf, int size)
|
|||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(av_fifo_space(s->fifo) < size + 4) {
|
if (av_fifo_can_write(s->fifo) < size + 4) {
|
||||||
/* What about a partial packet tx ? */
|
/* What about a partial packet tx ? */
|
||||||
pthread_mutex_unlock(&s->mutex);
|
pthread_mutex_unlock(&s->mutex);
|
||||||
return AVERROR(ENOMEM);
|
return AVERROR(ENOMEM);
|
||||||
}
|
}
|
||||||
AV_WL32(tmp, size);
|
AV_WL32(tmp, size);
|
||||||
av_fifo_generic_write(s->fifo, tmp, 4, NULL); /* size of packet */
|
av_fifo_write(s->fifo, tmp, 4); /* size of packet */
|
||||||
av_fifo_generic_write(s->fifo, (uint8_t *)buf, size, NULL); /* the data */
|
av_fifo_write(s->fifo, buf, size); /* the data */
|
||||||
pthread_cond_signal(&s->cond);
|
pthread_cond_signal(&s->cond);
|
||||||
pthread_mutex_unlock(&s->mutex);
|
pthread_mutex_unlock(&s->mutex);
|
||||||
return size;
|
return size;
|
||||||
@@ -1112,7 +1112,7 @@ static int udp_close(URLContext *h)
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
closesocket(s->udp_fd);
|
closesocket(s->udp_fd);
|
||||||
av_fifo_freep(&s->fifo);
|
av_fifo_freep2(&s->fifo);
|
||||||
ff_ip_reset_filters(&s->filters);
|
ff_ip_reset_filters(&s->filters);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user