diff options
Diffstat (limited to 'mpvcore/player/audio.c')
-rw-r--r-- | mpvcore/player/audio.c | 85 |
1 files changed, 47 insertions, 38 deletions
diff --git a/mpvcore/player/audio.c b/mpvcore/player/audio.c index 3bf338c21d..ce161a58d5 100644 --- a/mpvcore/player/audio.c +++ b/mpvcore/player/audio.c @@ -41,18 +41,18 @@ static int build_afilter_chain(struct MPContext *mpctx) { - struct sh_audio *sh_audio = mpctx->sh_audio; + struct dec_audio *d_audio = mpctx->d_audio; struct ao *ao = mpctx->ao; struct MPOpts *opts = mpctx->opts; - if (!sh_audio->initialized) + if (!d_audio) return 0; struct mp_audio in_format; - mp_audio_buffer_get_format(mpctx->sh_audio->decode_buffer, &in_format); + mp_audio_buffer_get_format(d_audio->decode_buffer, &in_format); int new_srate; - if (af_control_any_rev(sh_audio->afilter, AF_CONTROL_SET_PLAYBACK_SPEED, + if (af_control_any_rev(d_audio->afilter, AF_CONTROL_SET_PLAYBACK_SPEED, &opts->playback_speed)) new_srate = in_format.rate; else { @@ -66,13 +66,13 @@ static int build_afilter_chain(struct MPContext *mpctx) opts->playback_speed = new_srate / (double)in_format.rate; } } - return init_audio_filters(sh_audio, new_srate, + return audio_init_filters(d_audio, new_srate, &ao->samplerate, &ao->channels, &ao->format); } static int recreate_audio_filters(struct MPContext *mpctx) { - assert(mpctx->sh_audio); + assert(mpctx->d_audio); // init audio filters: if (!build_afilter_chain(mpctx)) { @@ -80,19 +80,19 @@ static int recreate_audio_filters(struct MPContext *mpctx) return -1; } - mixer_reinit_audio(mpctx->mixer, mpctx->ao, mpctx->sh_audio->afilter); + mixer_reinit_audio(mpctx->mixer, mpctx->ao, mpctx->d_audio->afilter); return 0; } int reinit_audio_filters(struct MPContext *mpctx) { - struct sh_audio *sh_audio = mpctx->sh_audio; - if (!sh_audio) + struct dec_audio *d_audio = mpctx->d_audio; + if (!d_audio) return -2; - af_uninit(mpctx->sh_audio->afilter); - if (af_init(mpctx->sh_audio->afilter) < 0) + af_uninit(mpctx->d_audio->afilter); + if (af_init(mpctx->d_audio->afilter) < 0) return -1; if (recreate_audio_filters(mpctx) < 0) return -1; @@ -103,20 +103,25 @@ int reinit_audio_filters(struct MPContext *mpctx) void reinit_audio_chain(struct MPContext *mpctx) { struct MPOpts *opts = mpctx->opts; - init_demux_stream(mpctx, STREAM_AUDIO); - if (!mpctx->sh_audio) { + struct sh_stream *sh = init_demux_stream(mpctx, STREAM_AUDIO); + if (!sh) { uninit_player(mpctx, INITIALIZED_AO); goto no_audio; } if (!(mpctx->initialized_flags & INITIALIZED_ACODEC)) { - if (!init_best_audio_codec(mpctx->sh_audio, opts->audio_decoders)) - goto init_error; mpctx->initialized_flags |= INITIALIZED_ACODEC; + assert(!mpctx->d_audio); + mpctx->d_audio = talloc_zero(NULL, struct dec_audio); + mpctx->d_audio->opts = opts; + mpctx->d_audio->header = sh; + if (!audio_init_best_codec(mpctx->d_audio, opts->audio_decoders)) + goto init_error; } + assert(mpctx->d_audio); struct mp_audio in_format; - mp_audio_buffer_get_format(mpctx->sh_audio->decode_buffer, &in_format); + mp_audio_buffer_get_format(mpctx->d_audio->decode_buffer, &in_format); int ao_srate = opts->force_srate; int ao_format = opts->audio_output_format; @@ -137,7 +142,7 @@ void reinit_audio_chain(struct MPContext *mpctx) // Determine what the filter chain outputs. build_afilter_chain() also // needs this for testing whether playback speed is changed by resampling // or using a special filter. - if (!init_audio_filters(mpctx->sh_audio, // preliminary init + if (!audio_init_filters(mpctx->d_audio, // preliminary init // input: in_format.rate, // output: @@ -188,31 +193,31 @@ no_audio: // ao so far. double written_audio_pts(struct MPContext *mpctx) { - sh_audio_t *sh_audio = mpctx->sh_audio; - if (!sh_audio || !sh_audio->initialized) + struct dec_audio *d_audio = mpctx->d_audio; + if (!d_audio) return MP_NOPTS_VALUE; struct mp_audio in_format; - mp_audio_buffer_get_format(mpctx->sh_audio->decode_buffer, &in_format); + mp_audio_buffer_get_format(d_audio->decode_buffer, &in_format); // first calculate the end pts of audio that has been output by decoder - double a_pts = sh_audio->pts; + double a_pts = d_audio->pts; if (a_pts == MP_NOPTS_VALUE) return MP_NOPTS_VALUE; - // sh_audio->pts is the timestamp of the latest input packet with - // known pts that the decoder has decoded. sh_audio->pts_bytes is + // d_audio->pts is the timestamp of the latest input packet with + // known pts that the decoder has decoded. d_audio->pts_bytes is // the amount of bytes the decoder has written after that timestamp. - a_pts += sh_audio->pts_offset / (double)in_format.rate; + a_pts += d_audio->pts_offset / (double)in_format.rate; // Now a_pts hopefully holds the pts for end of audio from decoder. // Subtract data in buffers between decoder and audio out. // Decoded but not filtered - a_pts -= mp_audio_buffer_seconds(sh_audio->decode_buffer); + a_pts -= mp_audio_buffer_seconds(d_audio->decode_buffer); // Data buffered in audio filters, measured in seconds of "missing" output - double buffered_output = af_calc_delay(sh_audio->afilter); + double buffered_output = af_calc_delay(d_audio->afilter); // Data that was ready for ao but was buffered because ao didn't fully // accept everything to internal buffers yet @@ -275,11 +280,13 @@ static int audio_start_sync(struct MPContext *mpctx, int playsize) { struct ao *ao = mpctx->ao; struct MPOpts *opts = mpctx->opts; - sh_audio_t * const sh_audio = mpctx->sh_audio; + struct dec_audio *d_audio = mpctx->d_audio; int res; + assert(d_audio); + // Timing info may not be set without - res = decode_audio(sh_audio, ao->buffer, 1); + res = audio_decode(d_audio, ao->buffer, 1); if (res < 0) return res; @@ -300,10 +307,10 @@ static int audio_start_sync(struct MPContext *mpctx, int playsize) samples = ptsdiff * real_samplerate; // ogg demuxers give packets without timing - if (written_pts <= 1 && sh_audio->pts == MP_NOPTS_VALUE) { + if (written_pts <= 1 && d_audio->pts == MP_NOPTS_VALUE) { if (!did_retry) { // Try to read more data to see packets that have pts - res = decode_audio(sh_audio, ao->buffer, ao->samplerate); + res = audio_decode(d_audio, ao->buffer, ao->samplerate); if (res < 0) return res; did_retry = true; @@ -321,12 +328,12 @@ static int audio_start_sync(struct MPContext *mpctx, int playsize) mpctx->syncing_audio = false; int skip_samples = -samples; int a = MPMIN(skip_samples, MPMAX(playsize, 2500)); - res = decode_audio(sh_audio, ao->buffer, a); + res = audio_decode(d_audio, ao->buffer, a); if (skip_samples <= mp_audio_buffer_samples(ao->buffer)) { mp_audio_buffer_skip(ao->buffer, skip_samples); if (res < 0) return res; - return decode_audio(sh_audio, ao->buffer, playsize); + return audio_decode(d_audio, ao->buffer, playsize); } mp_audio_buffer_clear(ao->buffer); if (res < 0) @@ -346,7 +353,7 @@ static int audio_start_sync(struct MPContext *mpctx, int playsize) } mpctx->syncing_audio = false; mp_audio_buffer_prepend_silence(ao->buffer, samples); - return decode_audio(sh_audio, ao->buffer, playsize); + return audio_decode(d_audio, ao->buffer, playsize); } int fill_audio_out_buffers(struct MPContext *mpctx, double endpts) @@ -358,9 +365,11 @@ int fill_audio_out_buffers(struct MPContext *mpctx, double endpts) bool audio_eof = false; bool signal_eof = false; bool partial_fill = false; - sh_audio_t * const sh_audio = mpctx->sh_audio; + struct dec_audio *d_audio = mpctx->d_audio; bool modifiable_audio_format = !(ao->format & AF_FORMAT_SPECIAL_MASK); + assert(d_audio); + if (mpctx->paused) playsize = 1; // just initialize things (audio pts at least) else @@ -378,7 +387,7 @@ int fill_audio_out_buffers(struct MPContext *mpctx, double endpts) if (mpctx->syncing_audio || mpctx->hrseek_active) res = audio_start_sync(mpctx, playsize); else - res = decode_audio(sh_audio, ao->buffer, playsize); + res = audio_decode(d_audio, ao->buffer, playsize); if (res < 0) { // EOF, error or format change if (res == -2) { @@ -392,7 +401,7 @@ int fill_audio_out_buffers(struct MPContext *mpctx, double endpts) return -1; } else if (res == ASYNC_PLAY_DONE) return 0; - else if (demux_stream_eof(mpctx->sh_audio->gsh)) + else if (demux_stream_eof(d_audio->header)) audio_eof = true; } @@ -455,6 +464,6 @@ void clear_audio_output_buffers(struct MPContext *mpctx) // Drop decoded data queued for filtering. void clear_audio_decode_buffers(struct MPContext *mpctx) { - if (mpctx->sh_audio && mpctx->sh_audio->decode_buffer) - mp_audio_buffer_clear(mpctx->sh_audio->decode_buffer); + if (mpctx->d_audio) + mp_audio_buffer_clear(mpctx->d_audio->decode_buffer); } |