fftools/ffmpeg: add ability to set a input burst time before readrate is enforced

Signed-off-by: Anton Khirnov <anton@khirnov.net>
pull/389/head
Davy Durham 2 years ago committed by Anton Khirnov
parent 6deaf1e409
commit 2ae16b05d6
  1. 1
      Changelog
  2. 3
      doc/ffmpeg.texi
  3. 1
      fftools/ffmpeg.h
  4. 18
      fftools/ffmpeg_demux.c
  5. 3
      fftools/ffmpeg_opt.c

@ -7,6 +7,7 @@ version <next>:
- Extend VAAPI support for libva-win32 on Windows - Extend VAAPI support for libva-win32 on Windows
- afireqsrc audio source filter - afireqsrc audio source filter
- arls filter - arls filter
- ffmpeg CLI new option: -readrate_initial_burst
version 6.0: version 6.0:
- Radiance HDR image support - Radiance HDR image support

@ -1708,6 +1708,9 @@ it may cause packet loss.
It is useful for when flow speed of output packets is important, such as live streaming. It is useful for when flow speed of output packets is important, such as live streaming.
@item -re (@emph{input}) @item -re (@emph{input})
Read input at native frame rate. This is equivalent to setting @code{-readrate 1}. Read input at native frame rate. This is equivalent to setting @code{-readrate 1}.
@item -readrate_initial_burst @var{seconds}
Set an initial read burst time, in seconds, after which @option{-re/-readrate}
will be enforced.
@item -vsync @var{parameter} (@emph{global}) @item -vsync @var{parameter} (@emph{global})
@itemx -fps_mode[:@var{stream_specifier}] @var{parameter} (@emph{output,per-stream}) @itemx -fps_mode[:@var{stream_specifier}] @var{parameter} (@emph{output,per-stream})
Set video sync method / framerate mode. vsync is applied to all output video streams Set video sync method / framerate mode. vsync is applied to all output video streams

@ -126,6 +126,7 @@ typedef struct OptionsContext {
int loop; int loop;
int rate_emu; int rate_emu;
float readrate; float readrate;
double readrate_initial_burst;
int accurate_seek; int accurate_seek;
int thread_queue_size; int thread_queue_size;
int input_sync_ref; int input_sync_ref;

@ -81,6 +81,8 @@ typedef struct Demuxer {
/* number of streams that the user was warned of */ /* number of streams that the user was warned of */
int nb_streams_warn; int nb_streams_warn;
double readrate_initial_burst;
AVThreadMessageQueue *in_thread_queue; AVThreadMessageQueue *in_thread_queue;
int thread_queue_size; int thread_queue_size;
pthread_t thread; pthread_t thread;
@ -455,6 +457,7 @@ int ifile_get_packet(InputFile *f, AVPacket **pkt)
(f->start_time != AV_NOPTS_VALUE ? f->start_time : 0) (f->start_time != AV_NOPTS_VALUE ? f->start_time : 0)
); );
float scale = f->rate_emu ? 1.0 : f->readrate; float scale = f->rate_emu ? 1.0 : f->readrate;
int64_t burst_until = AV_TIME_BASE * d->readrate_initial_burst;
for (i = 0; i < f->nb_streams; i++) { for (i = 0; i < f->nb_streams; i++) {
InputStream *ist = f->streams[i]; InputStream *ist = f->streams[i];
int64_t stream_ts_offset, pts, now; int64_t stream_ts_offset, pts, now;
@ -462,7 +465,7 @@ int ifile_get_packet(InputFile *f, AVPacket **pkt)
stream_ts_offset = FFMAX(ist->first_dts != AV_NOPTS_VALUE ? ist->first_dts : 0, file_start); stream_ts_offset = FFMAX(ist->first_dts != AV_NOPTS_VALUE ? ist->first_dts : 0, file_start);
pts = av_rescale(ist->dts, 1000000, AV_TIME_BASE); pts = av_rescale(ist->dts, 1000000, AV_TIME_BASE);
now = (av_gettime_relative() - ist->start) * scale + stream_ts_offset; now = (av_gettime_relative() - ist->start) * scale + stream_ts_offset;
if (pts > now) if (pts - burst_until > now)
return AVERROR(EAGAIN); return AVERROR(EAGAIN);
} }
} }
@ -1236,6 +1239,19 @@ int ifile_open(const OptionsContext *o, const char *filename)
f->rate_emu = 0; f->rate_emu = 0;
} }
if (f->readrate || f->rate_emu) {
d->readrate_initial_burst = o->readrate_initial_burst ? o->readrate_initial_burst : 0.0;
if (d->readrate_initial_burst < 0.0) {
av_log(d, AV_LOG_ERROR,
"Option -readrate_initial_burst is %0.3f; it must be non-negative.\n",
d->readrate_initial_burst);
exit_program(1);
}
} else if (o->readrate_initial_burst) {
av_log(d, AV_LOG_WARNING, "Option -readrate_initial_burst ignored "
"since neither -readrate nor -re were given\n");
}
d->thread_queue_size = o->thread_queue_size; d->thread_queue_size = o->thread_queue_size;
/* update the current parameters so that they match the one of the input stream */ /* update the current parameters so that they match the one of the input stream */

@ -1454,6 +1454,9 @@ const OptionDef options[] = {
{ "readrate", HAS_ARG | OPT_FLOAT | OPT_OFFSET | { "readrate", HAS_ARG | OPT_FLOAT | OPT_OFFSET |
OPT_EXPERT | OPT_INPUT, { .off = OFFSET(readrate) }, OPT_EXPERT | OPT_INPUT, { .off = OFFSET(readrate) },
"read input at specified rate", "speed" }, "read input at specified rate", "speed" },
{ "readrate_initial_burst", HAS_ARG | OPT_DOUBLE | OPT_OFFSET |
OPT_EXPERT | OPT_INPUT, { .off = OFFSET(readrate_initial_burst) },
"The initial amount of input to burst read before imposing any readrate", "seconds" },
{ "target", HAS_ARG | OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_target }, { "target", HAS_ARG | OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_target },
"specify target file type (\"vcd\", \"svcd\", \"dvd\", \"dv\" or \"dv50\" " "specify target file type (\"vcd\", \"svcd\", \"dvd\", \"dv\" or \"dv50\" "
"with optional prefixes \"pal-\", \"ntsc-\" or \"film-\")", "type" }, "with optional prefixes \"pal-\", \"ntsc-\" or \"film-\")", "type" },

Loading…
Cancel
Save