Browse Source

Merge remote-tracking branch 'cigaes/master'

* cigaes/master:
  ffmpeg: make reading packets from thread blocking.

Merged-by: Michael Niedermayer <michaelni@gmx.at>
tags/n2.2-rc1
Michael Niedermayer 12 years ago
parent
commit
d089e9a4d1
2 changed files with 19 additions and 2 deletions
  1. +18
    -2
      ffmpeg.c
  2. +1
    -0
      ffmpeg.h

+ 18
- 2
ffmpeg.c View File

@@ -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
- 0
ffmpeg.h View File

@@ -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 */


Loading…
Cancel
Save