Commit 19dbe89f authored by Michael Niedermayer's avatar Michael Niedermayer

Merge remote-tracking branch 'cigaes/master'

* cigaes/master:
  ffmpeg: notify when the thread message queue blocks.
  ffmpeg: allow to set the thread message queue size.
  lavd/alsa: set frame_size field.
Merged-by: 's avatarMichael Niedermayer <michaelni@gmx.at>
parents 50833c9f d92c6d82
...@@ -1158,6 +1158,12 @@ This option enables or disables accurate seeking in input files with the ...@@ -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 transcoding. Use @option{-noaccurate_seek} to disable it, which may be useful
e.g. when copying some streams and transcoding the others. 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}) @item -override_ffserver (@emph{global})
Overrides the input specifications from @command{ffserver}. Using this Overrides the input specifications from @command{ffserver}. Using this
option you can map any input stream to @command{ffserver} and control option you can map any input stream to @command{ffserver} and control
......
...@@ -3356,6 +3356,7 @@ static int check_keyboard_interaction(int64_t cur_time) ...@@ -3356,6 +3356,7 @@ static int check_keyboard_interaction(int64_t cur_time)
static void *input_thread(void *arg) static void *input_thread(void *arg)
{ {
InputFile *f = arg; InputFile *f = arg;
unsigned flags = f->non_blocking ? AV_THREAD_MESSAGE_NONBLOCK : 0;
int ret = 0; int ret = 0;
while (1) { while (1) {
...@@ -3371,7 +3372,15 @@ static void *input_thread(void *arg) ...@@ -3371,7 +3372,15 @@ static void *input_thread(void *arg)
break; break;
} }
av_dup_packet(&pkt); 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 < 0) {
if (ret != AVERROR_EOF) if (ret != AVERROR_EOF)
av_log(f->ctx, AV_LOG_ERROR, av_log(f->ctx, AV_LOG_ERROR,
...@@ -3420,7 +3429,7 @@ static int init_input_threads(void) ...@@ -3420,7 +3429,7 @@ static int init_input_threads(void)
strcmp(f->ctx->iformat->name, "lavfi")) strcmp(f->ctx->iformat->name, "lavfi"))
f->non_blocking = 1; f->non_blocking = 1;
ret = av_thread_message_queue_alloc(&f->in_thread_queue, ret = av_thread_message_queue_alloc(&f->in_thread_queue,
8, sizeof(AVPacket)); f->thread_queue_size, sizeof(AVPacket));
if (ret < 0) if (ret < 0)
return ret; return ret;
......
...@@ -111,6 +111,7 @@ typedef struct OptionsContext { ...@@ -111,6 +111,7 @@ typedef struct OptionsContext {
int64_t input_ts_offset; int64_t input_ts_offset;
int rate_emu; int rate_emu;
int accurate_seek; int accurate_seek;
int thread_queue_size;
SpecifierOpt *ts_scale; SpecifierOpt *ts_scale;
int nb_ts_scale; int nb_ts_scale;
...@@ -350,6 +351,7 @@ typedef struct InputFile { ...@@ -350,6 +351,7 @@ typedef struct InputFile {
pthread_t thread; /* thread reading from this file */ pthread_t thread; /* thread reading from this file */
int non_blocking; /* reading packets from the thread should not block */ int non_blocking; /* reading packets from the thread should not block */
int joined; /* the thread has been joined */ int joined; /* the thread has been joined */
int thread_queue_size; /* maximum number of queued packets */
#endif #endif
} InputFile; } InputFile;
......
...@@ -951,6 +951,9 @@ static int open_input_file(OptionsContext *o, const char *filename) ...@@ -951,6 +951,9 @@ static int open_input_file(OptionsContext *o, const char *filename)
f->nb_streams = ic->nb_streams; f->nb_streams = ic->nb_streams;
f->rate_emu = o->rate_emu; f->rate_emu = o->rate_emu;
f->accurate_seek = o->accurate_seek; 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 */ /* check if all codec options have been used */
unused_opts = strip_specifiers(o->g->codec_opts); unused_opts = strip_specifiers(o->g->codec_opts);
...@@ -2957,6 +2960,9 @@ const OptionDef options[] = { ...@@ -2957,6 +2960,9 @@ const OptionDef options[] = {
{ "disposition", OPT_STRING | HAS_ARG | OPT_SPEC | { "disposition", OPT_STRING | HAS_ARG | OPT_SPEC |
OPT_OUTPUT, { .off = OFFSET(disposition) }, OPT_OUTPUT, { .off = OFFSET(disposition) },
"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 */ /* video options */
{ "vframes", OPT_VIDEO | HAS_ARG | OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_video_frames }, { "vframes", OPT_VIDEO | HAS_ARG | OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_video_frames },
......
...@@ -80,6 +80,7 @@ static av_cold int audio_read_header(AVFormatContext *s1) ...@@ -80,6 +80,7 @@ static av_cold int audio_read_header(AVFormatContext *s1)
st->codec->codec_id = codec_id; st->codec->codec_id = codec_id;
st->codec->sample_rate = s->sample_rate; st->codec->sample_rate = s->sample_rate;
st->codec->channels = s->channels; 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 */ avpriv_set_pts_info(st, 64, 1, 1000000); /* 64 bits pts in us */
/* microseconds instead of seconds, MHz instead of Hz */ /* microseconds instead of seconds, MHz instead of Hz */
s->timefilter = ff_timefilter_new(1000000.0 / s->sample_rate, s->timefilter = ff_timefilter_new(1000000.0 / s->sample_rate,
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment