mirror of
https://github.com/mpv-player/mpv
synced 2024-12-22 23:02:37 +00:00
improved audio delay estimation, supposed to help make the video smoother
git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@16105 b3059339-0415-0410-9bf9-f77b7e298cf2
This commit is contained in:
parent
b80670d823
commit
897390ed1e
@ -43,15 +43,12 @@ static jack_port_t *ports[MAX_CHANS];
|
|||||||
static int num_ports; ///< Number of used ports == number of channels
|
static int num_ports; ///< Number of used ports == number of channels
|
||||||
static jack_client_t *client;
|
static jack_client_t *client;
|
||||||
static float jack_latency;
|
static float jack_latency;
|
||||||
|
static int estimate;
|
||||||
static volatile int paused = 0; ///< set if paused
|
static volatile int paused = 0; ///< set if paused
|
||||||
static volatile int underrun = 0; ///< signals if an underrun occured
|
static volatile int underrun = 0; ///< signals if an underrun occured
|
||||||
|
|
||||||
//! If this is defined try to make a more precise delay estimation. Will be slower.
|
static volatile float callback_interval = 0;
|
||||||
#undef JACK_ESTIMATE_DELAY
|
static volatile float callback_time = 0;
|
||||||
#ifdef JACK_ESTIMATE_DELAY
|
|
||||||
static volatile int callback_samples = 0;
|
|
||||||
static volatile unsigned int callback_time = 0;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
//! size of one chunk, if this is too small MPlayer will start to "stutter"
|
//! size of one chunk, if this is too small MPlayer will start to "stutter"
|
||||||
//! after a short time of playback
|
//! after a short time of playback
|
||||||
@ -186,10 +183,15 @@ static int outputaudio(jack_nframes_t nframes, void *arg) {
|
|||||||
underrun = 1;
|
underrun = 1;
|
||||||
if (paused || underrun)
|
if (paused || underrun)
|
||||||
silence(bufs, nframes, num_ports);
|
silence(bufs, nframes, num_ports);
|
||||||
#ifdef JACK_ESTIMATE_DELAY
|
if (estimate) {
|
||||||
callback_samples = nframes;
|
float now = (float)GetTimer() / 1000000.0;
|
||||||
callback_time = GetTimer();
|
float diff = callback_time + callback_interval - now;
|
||||||
#endif
|
if (diff < 0.002)
|
||||||
|
callback_time += callback_interval;
|
||||||
|
else
|
||||||
|
callback_time = now;
|
||||||
|
callback_interval = (float)nframes / (float)ao_data.samplerate;
|
||||||
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -204,7 +206,9 @@ static void print_help ()
|
|||||||
" connects MPlayer to the jack ports named myout\n"
|
" connects MPlayer to the jack ports named myout\n"
|
||||||
"\nOptions:\n"
|
"\nOptions:\n"
|
||||||
" port=<port name>\n"
|
" port=<port name>\n"
|
||||||
" Connects to the given ports instead of the default physical ones\n");
|
" Connects to the given ports instead of the default physical ones\n"
|
||||||
|
" estimate\n"
|
||||||
|
" Estimates the amount of data in buffers (experimental)\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
static int init(int rate, int channels, int format, int flags) {
|
static int init(int rate, int channels, int format, int flags) {
|
||||||
@ -213,10 +217,12 @@ static int init(int rate, int channels, int format, int flags) {
|
|||||||
char client_name[40];
|
char client_name[40];
|
||||||
opt_t subopts[] = {
|
opt_t subopts[] = {
|
||||||
{"port", OPT_ARG_MSTRZ, &port_name, NULL},
|
{"port", OPT_ARG_MSTRZ, &port_name, NULL},
|
||||||
|
{"estimate", OPT_ARG_BOOL, &estimate, NULL},
|
||||||
{NULL}
|
{NULL}
|
||||||
};
|
};
|
||||||
int port_flags = JackPortIsInput;
|
int port_flags = JackPortIsInput;
|
||||||
int i;
|
int i;
|
||||||
|
estimate = 1;
|
||||||
if (subopt_parse(ao_subdevice, subopts) != 0) {
|
if (subopt_parse(ao_subdevice, subopts) != 0) {
|
||||||
print_help();
|
print_help();
|
||||||
return 0;
|
return 0;
|
||||||
@ -269,6 +275,7 @@ static int init(int rate, int channels, int format, int flags) {
|
|||||||
rate = jack_get_sample_rate(client);
|
rate = jack_get_sample_rate(client);
|
||||||
jack_latency = (float)(jack_port_get_total_latency(client, ports[0]) +
|
jack_latency = (float)(jack_port_get_total_latency(client, ports[0]) +
|
||||||
jack_get_buffer_size(client)) / (float)rate;
|
jack_get_buffer_size(client)) / (float)rate;
|
||||||
|
callback_interval = 0;
|
||||||
buffer = (unsigned char *) malloc(BUFFSIZE);
|
buffer = (unsigned char *) malloc(BUFFSIZE);
|
||||||
|
|
||||||
ao_data.channels = channels;
|
ao_data.channels = channels;
|
||||||
@ -343,11 +350,11 @@ static int play(void *data, int len, int flags) {
|
|||||||
static float get_delay() {
|
static float get_delay() {
|
||||||
int buffered = BUFFSIZE - CHUNK_SIZE - buf_free(); // could be less
|
int buffered = BUFFSIZE - CHUNK_SIZE - buf_free(); // could be less
|
||||||
float in_jack = jack_latency;
|
float in_jack = jack_latency;
|
||||||
#ifdef JACK_ESTIMATE_DELAY
|
if (estimate && callback_interval > 0) {
|
||||||
unsigned int elapsed = GetTimer() - callback_time;
|
float elapsed = (float)GetTimer() / 1000000.0 - callback_time;
|
||||||
in_jack += (float)callback_samples / (float)ao_data.samplerate - (float)elapsed / 1000.0 / 1000.0;
|
in_jack += callback_interval - elapsed;
|
||||||
if (in_jack < 0) in_jack = 0;
|
if (in_jack < 0) in_jack = 0;
|
||||||
#endif
|
}
|
||||||
return (float)buffered / (float)ao_data.bps + in_jack;
|
return (float)buffered / (float)ao_data.bps + in_jack;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user