diff options
author | Michael Niedermayer <michaelni@gmx.at> | 2014-02-20 16:29:09 +0100 |
---|---|---|
committer | Michael Niedermayer <michaelni@gmx.at> | 2014-02-20 16:29:15 +0100 |
commit | d089e9a4d125269bbdc6e9e16456cd3f3a76baf8 (patch) | |
tree | d70b86a86b4c0dfdf2b5327c74370dab1dbbe9e1 | |
parent | c427b2b86e726159873eb6cc4f7153c5bd778c55 (diff) | |
parent | 299a56879d2d790ac0c40d09af18e7f03471de9e (diff) |
Merge remote-tracking branch 'cigaes/master'
* cigaes/master:
ffmpeg: make reading packets from thread blocking.
Merged-by: Michael Niedermayer <michaelni@gmx.at>
-rw-r--r-- | ffmpeg.c | 20 | ||||
-rw-r--r-- | ffmpeg.h | 1 |
2 files changed, 19 insertions, 2 deletions
@@ -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); @@ -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 */ |