From a92193f247816a45c16c37a2f7db723a0359c24c Mon Sep 17 00:00:00 2001 From: Nicolas George Date: Mon, 16 Feb 2015 21:52:03 +0100 Subject: [PATCH 1/3] lavd/alsa: set frame_size field. The value tells the typical size of a packet from the demuxer. --- libavdevice/alsa-audio-dec.c | 1 + 1 file changed, 1 insertion(+) diff --git a/libavdevice/alsa-audio-dec.c b/libavdevice/alsa-audio-dec.c index 7f8f8cdd59..efa6747678 100644 --- a/libavdevice/alsa-audio-dec.c +++ b/libavdevice/alsa-audio-dec.c @@ -80,6 +80,7 @@ static av_cold int audio_read_header(AVFormatContext *s1) st->codec->codec_id = codec_id; st->codec->sample_rate = s->sample_rate; st->codec->channels = s->channels; + st->codec->frame_size = s->frame_size; avpriv_set_pts_info(st, 64, 1, 1000000); /* 64 bits pts in us */ /* microseconds instead of seconds, MHz instead of Hz */ s->timefilter = ff_timefilter_new(1000000.0 / s->sample_rate, From 508d6a23b4530d0f3d31451731e5fd1fce32525f Mon Sep 17 00:00:00 2001 From: Nicolas George Date: Wed, 25 Feb 2015 11:50:44 +0100 Subject: [PATCH 2/3] ffmpeg: allow to set the thread message queue size. --- doc/ffmpeg.texi | 6 ++++++ ffmpeg.c | 2 +- ffmpeg.h | 2 ++ ffmpeg_opt.c | 6 ++++++ 4 files changed, 15 insertions(+), 1 deletion(-) 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 }, From d92c6d82c03b89d565f70e7a8e5b03b25f78f70c Mon Sep 17 00:00:00 2001 From: Nicolas George Date: Mon, 16 Feb 2015 21:53:27 +0100 Subject: [PATCH 3/3] ffmpeg: notify when the thread message queue blocks. This can help finding the source of A-V desync with live input. --- ffmpeg.c | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/ffmpeg.c b/ffmpeg.c index 54ba0cbb28..c6f3dcdbde 100644 --- a/ffmpeg.c +++ b/ffmpeg.c @@ -3356,6 +3356,7 @@ static int check_keyboard_interaction(int64_t cur_time) static void *input_thread(void *arg) { InputFile *f = arg; + unsigned flags = f->non_blocking ? AV_THREAD_MESSAGE_NONBLOCK : 0; int ret = 0; while (1) { @@ -3371,7 +3372,15 @@ static void *input_thread(void *arg) break; } av_dup_packet(&pkt); - ret = av_thread_message_queue_send(f->in_thread_queue, &pkt, 0); + ret = av_thread_message_queue_send(f->in_thread_queue, &pkt, flags); + if (flags && ret == AVERROR(EAGAIN)) { + flags = 0; + ret = av_thread_message_queue_send(f->in_thread_queue, &pkt, flags); + av_log(f->ctx, AV_LOG_WARNING, + "Thread message queue blocking; consider raising the " + "thread_queue_size option (current value: %d)\n", + f->thread_queue_size); + } if (ret < 0) { if (ret != AVERROR_EOF) av_log(f->ctx, AV_LOG_ERROR,