summaryrefslogtreecommitdiffstats
path: root/libmpcodecs
diff options
context:
space:
mode:
authorUoti Urpala <uau@glyph.nonexistent.invalid>2010-11-13 19:27:01 +0200
committerUoti Urpala <uau@glyph.nonexistent.invalid>2010-11-13 19:46:02 +0200
commita4ce95de811698503075a5f0b513e595f11f97a4 (patch)
tree20785a9ff28439b08fb22993e25954731937bc25 /libmpcodecs
parent642ce15ef770dd5dbea7c7ee16cbf45f6e86feae (diff)
downloadmpv-a4ce95de811698503075a5f0b513e595f11f97a4.tar.bz2
mpv-a4ce95de811698503075a5f0b513e595f11f97a4.tar.xz
core: do initial A-V sync by modifying audio stream
Add code to enforce matching pts with video when (re)starting the audio stream, by either cutting away the first samples or inserting silence at the beginning. New option -noinitial-audio-sync can be used to disable this and return to old behavior.
Diffstat (limited to 'libmpcodecs')
-rw-r--r--libmpcodecs/dec_audio.c27
-rw-r--r--libmpcodecs/dec_audio.h1
2 files changed, 21 insertions, 7 deletions
diff --git a/libmpcodecs/dec_audio.c b/libmpcodecs/dec_audio.c
index 59abe398fb..7bbbdeb058 100644
--- a/libmpcodecs/dec_audio.c
+++ b/libmpcodecs/dec_audio.c
@@ -369,6 +369,16 @@ int init_audio_filters(sh_audio_t *sh_audio, int in_samplerate,
return 1;
}
+static void set_min_out_buffer_size(struct sh_audio *sh, int len)
+{
+ if (sh->a_out_buffer_size < len) {
+ mp_msg(MSGT_DECAUDIO, MSGL_V, "Increasing filtered audio buffer size "
+ "from %d to %d\n", sh->a_out_buffer_size, len);
+ sh->a_out_buffer = realloc(sh->a_out_buffer, len);
+ sh->a_out_buffer_size = len;
+ }
+}
+
static int filter_n_bytes(sh_audio_t *sh, int len)
{
assert(len-1 + sh->audio_out_minsize <= sh->a_buffer_size);
@@ -408,13 +418,7 @@ static int filter_n_bytes(sh_audio_t *sh, int len)
af_data_t *filter_output = af_play(sh->afilter, &filter_input);
if (!filter_output)
return -1;
- if (sh->a_out_buffer_size < sh->a_out_buffer_len + filter_output->len) {
- int newlen = sh->a_out_buffer_len + filter_output->len;
- mp_msg(MSGT_DECAUDIO, MSGL_V, "Increasing filtered audio buffer size "
- "from %d to %d\n", sh->a_out_buffer_size, newlen);
- sh->a_out_buffer = realloc(sh->a_out_buffer, newlen);
- sh->a_out_buffer_size = newlen;
- }
+ set_min_out_buffer_size(sh, sh->a_out_buffer_len + filter_output->len);
memcpy(sh->a_out_buffer + sh->a_out_buffer_len, filter_output->audio,
filter_output->len);
sh->a_out_buffer_len += filter_output->len;
@@ -479,6 +483,15 @@ int decode_audio(sh_audio_t *sh_audio, int minlen)
return 0;
}
+void decode_audio_prepend_bytes(struct sh_audio *sh, int count, int byte)
+{
+ set_min_out_buffer_size(sh, sh->a_out_buffer_len + count);
+ memmove(sh->a_out_buffer + count, sh->a_out_buffer, sh->a_out_buffer_len);
+ memset(sh->a_out_buffer, byte, count);
+ sh->a_out_buffer_len += count;
+}
+
+
void resync_audio_stream(sh_audio_t *sh_audio)
{
sh_audio->a_in_buffer_len = 0; // clear audio input buffer
diff --git a/libmpcodecs/dec_audio.h b/libmpcodecs/dec_audio.h
index 3ec2cef8bf..c2b92c9818 100644
--- a/libmpcodecs/dec_audio.h
+++ b/libmpcodecs/dec_audio.h
@@ -25,6 +25,7 @@
void afm_help(void);
int init_best_audio_codec(sh_audio_t *sh_audio, char** audio_codec_list, char** audio_fm_list);
int decode_audio(sh_audio_t *sh_audio, int minlen);
+void decode_audio_prepend_bytes(struct sh_audio *sh, int count, int byte);
void resync_audio_stream(sh_audio_t *sh_audio);
void skip_audio_frame(sh_audio_t *sh_audio);
void uninit_audio(sh_audio_t *sh_audio);