AVIOInterruptCB interrupt_callback;
} Context;
-static int async_interrupt_callback(void *arg)
+static int async_check_interrupt(void *arg)
{
URLContext *h = arg;
Context *c = h->priv_data;
while (1) {
int fifo_space, to_copy;
- if (async_interrupt_callback(h)) {
+ pthread_mutex_lock(&c->mutex);
+ if (async_check_interrupt(h)) {
c->io_eof_reached = 1;
c->io_error = AVERROR_EXIT;
+ pthread_cond_signal(&c->cond_wakeup_main);
+ pthread_mutex_unlock(&c->mutex);
break;
}
if (c->seek_request) {
- pthread_mutex_lock(&c->mutex);
-
ret = ffurl_seek(c->inner, c->seek_pos, c->seek_whence);
if (ret < 0) {
c->io_eof_reached = 1;
fifo_space = av_fifo_space(fifo);
if (c->io_eof_reached || fifo_space <= 0) {
- pthread_mutex_lock(&c->mutex);
pthread_cond_signal(&c->cond_wakeup_main);
pthread_cond_wait(&c->cond_wakeup_background, &c->mutex);
pthread_mutex_unlock(&c->mutex);
continue;
}
+ pthread_mutex_unlock(&c->mutex);
to_copy = FFMIN(4096, fifo_space);
ret = av_fifo_generic_write(fifo, c->inner, to_copy, (void *)ffurl_read);
+
+ pthread_mutex_lock(&c->mutex);
if (ret <= 0) {
c->io_eof_reached = 1;
if (ret < 0) {
}
}
- pthread_mutex_lock(&c->mutex);
pthread_cond_signal(&c->cond_wakeup_main);
pthread_mutex_unlock(&c->mutex);
}
{
Context *c = h->priv_data;
int ret;
- AVIOInterruptCB interrupt_callback = {.callback = async_interrupt_callback, .opaque = h};
+ AVIOInterruptCB interrupt_callback = {.callback = async_check_interrupt, .opaque = h};
av_strstart(arg, "async:", &arg);
while (to_read > 0) {
int fifo_size, to_copy;
- if (async_interrupt_callback(h)) {
+ if (async_check_interrupt(h)) {
ret = AVERROR_EXIT;
break;
}
c->seek_ret = 0;
while (1) {
- if (async_interrupt_callback(h)) {
+ if (async_check_interrupt(h)) {
ret = AVERROR_EXIT;
break;
}