diff --git a/ffmpeg.c b/ffmpeg.c index 1369fdaf64..28bebe532a 100644 --- a/ffmpeg.c +++ b/ffmpeg.c @@ -2960,11 +2960,15 @@ static void *input_thread(void *arg) av_dup_packet(&pkt); av_fifo_generic_write(f->fifo, &pkt, sizeof(pkt), NULL); + pthread_cond_signal(&f->fifo_cond); pthread_mutex_unlock(&f->fifo_lock); } + pthread_mutex_lock(&f->fifo_lock); f->finished = 1; + pthread_cond_signal(&f->fifo_cond); + pthread_mutex_unlock(&f->fifo_lock); return NULL; } @@ -3016,6 +3020,10 @@ static int init_input_threads(void) if (!(f->fifo = av_fifo_alloc(8*sizeof(AVPacket)))) return AVERROR(ENOMEM); + if (f->ctx->pb ? !f->ctx->pb->seekable : + strcmp(f->ctx->iformat->name, "lavfi")) + f->non_blocking = 1; + pthread_mutex_init(&f->fifo_lock, NULL); pthread_cond_init (&f->fifo_cond, NULL); @@ -3031,14 +3039,22 @@ static int get_input_packet_mt(InputFile *f, AVPacket *pkt) pthread_mutex_lock(&f->fifo_lock); + while (1) { if (av_fifo_size(f->fifo)) { av_fifo_generic_read(f->fifo, pkt, sizeof(*pkt), NULL); pthread_cond_signal(&f->fifo_cond); + break; } else { - if (f->finished) + if (f->finished) { ret = AVERROR_EOF; - else + break; + } + if (f->non_blocking) { ret = AVERROR(EAGAIN); + break; + } + pthread_cond_wait(&f->fifo_cond, &f->fifo_lock); + } } pthread_mutex_unlock(&f->fifo_lock); diff --git a/ffmpeg.h b/ffmpeg.h index 04e5b7274b..151667d74a 100644 --- a/ffmpeg.h +++ b/ffmpeg.h @@ -327,6 +327,7 @@ typedef struct InputFile { #if HAVE_PTHREADS pthread_t thread; /* thread reading from this file */ + int non_blocking; /* reading packets from the thread should not block */ int finished; /* the thread has exited */ int joined; /* the thread has been joined */ pthread_mutex_t fifo_lock; /* lock for access to fifo */