diff options
Diffstat (limited to 'libmpcodecs')
-rw-r--r-- | libmpcodecs/dec_audio.c | 27 | ||||
-rw-r--r-- | libmpcodecs/dec_audio.h | 1 |
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); |