aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNicolas George <george@nsup.org>2015-02-25 11:50:44 +0100
committerNicolas George <george@nsup.org>2015-02-26 19:19:56 +0100
commit508d6a23b4530d0f3d31451731e5fd1fce32525f (patch)
tree1f0e2bba943e0b3b7f0cacc394834495a22404dd
parenta92193f247816a45c16c37a2f7db723a0359c24c (diff)
downloadffmpeg-508d6a23b4530d0f3d31451731e5fd1fce32525f.tar.gz
ffmpeg: allow to set the thread message queue size.
-rw-r--r--doc/ffmpeg.texi6
-rw-r--r--ffmpeg.c2
-rw-r--r--ffmpeg.h2
-rw-r--r--ffmpeg_opt.c6
4 files changed, 15 insertions, 1 deletions
diff --git a/doc/ffmpeg.texi b/doc/ffmpeg.texi
index 6e51c44f29..6772f2f685 100644
--- a/doc/ffmpeg.texi
+++ b/doc/ffmpeg.texi
@@ -1158,6 +1158,12 @@ This option enables or disables accurate seeking in input files with the
transcoding. Use @option{-noaccurate_seek} to disable it, which may be useful
e.g. when copying some streams and transcoding the others.
+@item -thread_message_queue @var{size} (@emph{input})
+This option sets the maximum number of queued packets when reading from the
+file or device. With low latency / high rate live streams, packets may be
+discarded if they are not read in a timely manner; raising this value can
+avoid it.
+
@item -override_ffserver (@emph{global})
Overrides the input specifications from @command{ffserver}. Using this
option you can map any input stream to @command{ffserver} and control
diff --git a/ffmpeg.c b/ffmpeg.c
index becd5dfc33..54ba0cbb28 100644
--- a/ffmpeg.c
+++ b/ffmpeg.c
@@ -3420,7 +3420,7 @@ static int init_input_threads(void)
strcmp(f->ctx->iformat->name, "lavfi"))
f->non_blocking = 1;
ret = av_thread_message_queue_alloc(&f->in_thread_queue,
- 8, sizeof(AVPacket));
+ f->thread_queue_size, sizeof(AVPacket));
if (ret < 0)
return ret;
diff --git a/ffmpeg.h b/ffmpeg.h
index d2e0c5c3e9..7c0c22cfad 100644
--- a/ffmpeg.h
+++ b/ffmpeg.h
@@ -111,6 +111,7 @@ typedef struct OptionsContext {
int64_t input_ts_offset;
int rate_emu;
int accurate_seek;
+ int thread_queue_size;
SpecifierOpt *ts_scale;
int nb_ts_scale;
@@ -350,6 +351,7 @@ typedef struct InputFile {
pthread_t thread; /* thread reading from this file */
int non_blocking; /* reading packets from the thread should not block */
int joined; /* the thread has been joined */
+ int thread_queue_size; /* maximum number of queued packets */
#endif
} InputFile;
diff --git a/ffmpeg_opt.c b/ffmpeg_opt.c
index 09e6e33b5c..39c5f49d67 100644
--- a/ffmpeg_opt.c
+++ b/ffmpeg_opt.c
@@ -951,6 +951,9 @@ static int open_input_file(OptionsContext *o, const char *filename)
f->nb_streams = ic->nb_streams;
f->rate_emu = o->rate_emu;
f->accurate_seek = o->accurate_seek;
+#if HAVE_PTHREADS
+ f->thread_queue_size = o->thread_queue_size > 0 ? o->thread_queue_size : 8;
+#endif
/* check if all codec options have been used */
unused_opts = strip_specifiers(o->g->codec_opts);
@@ -2957,6 +2960,9 @@ const OptionDef options[] = {
{ "disposition", OPT_STRING | HAS_ARG | OPT_SPEC |
OPT_OUTPUT, { .off = OFFSET(disposition) },
"disposition", "" },
+ { "thread_queue_size", HAS_ARG | OPT_INT | OPT_OFFSET | OPT_EXPERT | OPT_INPUT,
+ { .off = OFFSET(thread_queue_size) },
+ "set the maximum number of queued packets from the demuxer" },
/* video options */
{ "vframes", OPT_VIDEO | HAS_ARG | OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_video_frames },