You've already forked FFmpeg
mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2025-08-15 14:13:16 +02:00
Merge remote-tracking branch 'cigaes/master'
* cigaes/master: ffmpeg: make reading packets from thread blocking. Merged-by: Michael Niedermayer <michaelni@gmx.at>
This commit is contained in:
20
ffmpeg.c
20
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);
|
||||
|
1
ffmpeg.h
1
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 */
|
||||
|
Reference in New Issue
Block a user