diff options
Diffstat (limited to 'mpvcore/player')
-rw-r--r-- | mpvcore/player/audio.c | 85 | ||||
-rw-r--r-- | mpvcore/player/command.c | 32 | ||||
-rw-r--r-- | mpvcore/player/loadfile.c | 30 | ||||
-rw-r--r-- | mpvcore/player/main.c | 2 | ||||
-rw-r--r-- | mpvcore/player/mp_core.h | 6 | ||||
-rw-r--r-- | mpvcore/player/osd.c | 4 | ||||
-rw-r--r-- | mpvcore/player/playloop.c | 36 | ||||
-rw-r--r-- | mpvcore/player/video.c | 8 |
8 files changed, 108 insertions, 95 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); } diff --git a/mpvcore/player/command.c b/mpvcore/player/command.c index be34d4e8f5..dc190adfc6 100644 --- a/mpvcore/player/command.c +++ b/mpvcore/player/command.c @@ -123,7 +123,7 @@ static int mp_property_playback_speed(m_option_t *prop, int action, opts->playback_speed = *(double *) arg; // Adjust time until next frame flip for nosound mode mpctx->time_frame *= orig_speed / opts->playback_speed; - if (mpctx->sh_audio) + if (mpctx->d_audio) reinit_audio_chain(mpctx); return M_PROPERTY_OK; } @@ -315,7 +315,7 @@ static int mp_property_length(m_option_t *prop, int action, void *arg, static int mp_property_avsync(m_option_t *prop, int action, void *arg, MPContext *mpctx) { - if (!mpctx->sh_audio || !mpctx->sh_video) + if (!mpctx->d_audio || !mpctx->sh_video) return M_PROPERTY_UNAVAILABLE; if (mpctx->last_av_difference == MP_NOPTS_VALUE) return M_PROPERTY_UNAVAILABLE; @@ -625,8 +625,8 @@ static int mp_property_angle(m_option_t *prop, int action, void *arg, if (mpctx->sh_video) resync_video_stream(mpctx->sh_video); - if (mpctx->sh_audio) - resync_audio_stream(mpctx->sh_audio); + if (mpctx->d_audio) + audio_resync_stream(mpctx->d_audio); } return M_PROPERTY_OK; case M_PROPERTY_GET_TYPE: { @@ -816,7 +816,7 @@ static int mp_property_volrestore(m_option_t *prop, int action, static int mp_property_audio_delay(m_option_t *prop, int action, void *arg, MPContext *mpctx) { - if (!(mpctx->sh_audio && mpctx->sh_video)) + if (!(mpctx->d_audio && mpctx->sh_video)) return M_PROPERTY_UNAVAILABLE; float delay = mpctx->opts->audio_delay; switch (action) { @@ -835,7 +835,7 @@ static int mp_property_audio_delay(m_option_t *prop, int action, static int mp_property_audio_format(m_option_t *prop, int action, void *arg, MPContext *mpctx) { - const char *c = mpctx->sh_audio ? mpctx->sh_audio->gsh->codec : NULL; + const char *c = mpctx->d_audio ? mpctx->d_audio->header->codec : NULL; return m_property_strdup_ro(prop, action, arg, c); } @@ -843,7 +843,7 @@ static int mp_property_audio_format(m_option_t *prop, int action, static int mp_property_audio_codec(m_option_t *prop, int action, void *arg, MPContext *mpctx) { - const char *c = mpctx->sh_audio ? mpctx->sh_audio->gsh->decoder_desc : NULL; + const char *c = mpctx->d_audio ? mpctx->d_audio->decoder_desc : NULL; return m_property_strdup_ro(prop, action, arg, c); } @@ -851,14 +851,14 @@ static int mp_property_audio_codec(m_option_t *prop, int action, static int mp_property_audio_bitrate(m_option_t *prop, int action, void *arg, MPContext *mpctx) { - if (!mpctx->sh_audio) + if (!mpctx->d_audio) return M_PROPERTY_UNAVAILABLE; switch (action) { case M_PROPERTY_PRINT: - *(char **)arg = format_bitrate(mpctx->sh_audio->i_bps); + *(char **)arg = format_bitrate(mpctx->d_audio->i_bps); return M_PROPERTY_OK; case M_PROPERTY_GET: - *(int *)arg = mpctx->sh_audio->i_bps; + *(int *)arg = mpctx->d_audio->i_bps; return M_PROPERTY_OK; } return M_PROPERTY_NOT_IMPLEMENTED; @@ -868,15 +868,15 @@ static int mp_property_audio_bitrate(m_option_t *prop, int action, static int mp_property_samplerate(m_option_t *prop, int action, void *arg, MPContext *mpctx) { - if (!mpctx->sh_audio) + if (!mpctx->d_audio) return M_PROPERTY_UNAVAILABLE; switch (action) { case M_PROPERTY_PRINT: *(char **)arg = talloc_asprintf(NULL, "%d kHz", - mpctx->sh_audio->samplerate / 1000); + mpctx->d_audio->header->audio->samplerate / 1000); return M_PROPERTY_OK; case M_PROPERTY_GET: - *(int *)arg = mpctx->sh_audio->samplerate; + *(int *)arg = mpctx->d_audio->header->audio->samplerate; return M_PROPERTY_OK; } return M_PROPERTY_NOT_IMPLEMENTED; @@ -886,14 +886,14 @@ static int mp_property_samplerate(m_option_t *prop, int action, void *arg, static int mp_property_channels(m_option_t *prop, int action, void *arg, MPContext *mpctx) { - if (!mpctx->sh_audio) + if (!mpctx->d_audio) return M_PROPERTY_UNAVAILABLE; switch (action) { case M_PROPERTY_PRINT: - *(char **) arg = mp_chmap_to_str(&mpctx->sh_audio->channels); + *(char **) arg = mp_chmap_to_str(&mpctx->d_audio->header->audio->channels); return M_PROPERTY_OK; case M_PROPERTY_GET: - *(int *)arg = mpctx->sh_audio->channels.num; + *(int *)arg = mpctx->d_audio->header->audio->channels.num; return M_PROPERTY_OK; } return M_PROPERTY_NOT_IMPLEMENTED; diff --git a/mpvcore/player/loadfile.c b/mpvcore/player/loadfile.c index f6e7f6c117..44887ae107 100644 --- a/mpvcore/player/loadfile.c +++ b/mpvcore/player/loadfile.c @@ -73,8 +73,8 @@ void uninit_player(struct MPContext *mpctx, unsigned int mask) if (mask & INITIALIZED_ACODEC) { mpctx->initialized_flags &= ~INITIALIZED_ACODEC; mixer_uninit_audio(mpctx->mixer); - if (mpctx->sh_audio) - uninit_audio(mpctx->sh_audio); + audio_uninit(mpctx->d_audio); + mpctx->d_audio = NULL; cleanup_demux_stream(mpctx, STREAM_AUDIO); } @@ -113,7 +113,7 @@ void uninit_player(struct MPContext *mpctx, unsigned int mask) mpctx->num_tracks = 0; for (int t = 0; t < STREAM_TYPE_COUNT; t++) mpctx->current_track[t] = NULL; - assert(!mpctx->sh_video && !mpctx->sh_audio && !mpctx->sh_sub); + assert(!mpctx->sh_video && !mpctx->d_audio && !mpctx->sh_sub); mpctx->master_demuxer = NULL; for (int i = 0; i < mpctx->num_sources; i++) { uninit_subs(mpctx->sources[i]); @@ -252,20 +252,21 @@ static void print_file_properties(struct MPContext *mpctx) mp_msg(MSGT_IDENTIFY, MSGL_INFO, "ID_VIDEO_ASPECT=%1.4f\n", mpctx->sh_video->aspect); } - if (mpctx->sh_audio) { + if (mpctx->d_audio) { + struct sh_audio *sh_audio = mpctx->d_audio->header->audio; /* Assume FOURCC if all bytes >= 0x20 (' ') */ - if (mpctx->sh_audio->format >= 0x20202020) + if (sh_audio->format >= 0x20202020) mp_msg(MSGT_IDENTIFY, MSGL_INFO, - "ID_AUDIO_FORMAT=%.4s\n", (char *)&mpctx->sh_audio->format); + "ID_AUDIO_FORMAT=%.4s\n", (char *)&sh_audio->format); else mp_msg(MSGT_IDENTIFY, MSGL_INFO, - "ID_AUDIO_FORMAT=%d\n", mpctx->sh_audio->format); + "ID_AUDIO_FORMAT=%d\n", sh_audio->format); mp_msg(MSGT_IDENTIFY, MSGL_INFO, - "ID_AUDIO_BITRATE=%d\n", mpctx->sh_audio->i_bps * 8); + "ID_AUDIO_BITRATE=%d\n", sh_audio->i_bps * 8); mp_msg(MSGT_IDENTIFY, MSGL_INFO, - "ID_AUDIO_RATE=%d\n", mpctx->sh_audio->samplerate); + "ID_AUDIO_RATE=%d\n", sh_audio->samplerate); mp_msg(MSGT_IDENTIFY, MSGL_INFO, - "ID_AUDIO_NCH=%d\n", mpctx->sh_audio->channels.num); + "ID_AUDIO_NCH=%d\n", sh_audio->channels.num); } mp_msg(MSGT_IDENTIFY, MSGL_INFO, "ID_LENGTH=%.2f\n", get_time_length(mpctx)); @@ -304,12 +305,12 @@ static void set_demux_field(struct MPContext *mpctx, enum stream_type type, // redundant fields for convenience access switch(type) { case STREAM_VIDEO: mpctx->sh_video = s ? s->video : NULL; break; - case STREAM_AUDIO: mpctx->sh_audio = s ? s->audio : NULL; break; case STREAM_SUB: mpctx->sh_sub = s ? s->sub : NULL; break; } } -void init_demux_stream(struct MPContext *mpctx, enum stream_type type) +struct sh_stream *init_demux_stream(struct MPContext *mpctx, + enum stream_type type) { struct track *track = mpctx->current_track[type]; set_demux_field(mpctx, type, track ? track->stream : NULL); @@ -321,6 +322,7 @@ void init_demux_stream(struct MPContext *mpctx, enum stream_type type) demux_seek(stream->demuxer, pts, SEEK_ABSOLUTE); } } + return stream; } void cleanup_demux_stream(struct MPContext *mpctx, enum stream_type type) @@ -1082,7 +1084,7 @@ static void play_current_file(struct MPContext *mpctx) assert(mpctx->stream == NULL); assert(mpctx->demuxer == NULL); - assert(mpctx->sh_audio == NULL); + assert(mpctx->d_audio == NULL); assert(mpctx->sh_video == NULL); assert(mpctx->sh_sub == NULL); @@ -1229,7 +1231,7 @@ goto_reopen_demuxer: ; //==================== START PLAYING ======================= - if (!mpctx->sh_video && !mpctx->sh_audio) { + if (!mpctx->sh_video && !mpctx->d_audio) { MP_FATAL(mpctx, "No video or audio streams selected.\n"); #if HAVE_DVBIN if (mpctx->stream->type == STREAMTYPE_DVB) { diff --git a/mpvcore/player/main.c b/mpvcore/player/main.c index 4119e244c3..81e724252d 100644 --- a/mpvcore/player/main.c +++ b/mpvcore/player/main.c @@ -194,7 +194,7 @@ static bool handle_help_options(struct MPContext *mpctx) struct MPOpts *opts = mpctx->opts; int opt_exit = 0; if (opts->audio_decoders && strcmp(opts->audio_decoders, "help") == 0) { - struct mp_decoder_list *list = mp_audio_decoder_list(); + struct mp_decoder_list *list = audio_decoder_list(); mp_print_decoders(MSGT_CPLAYER, MSGL_INFO, "Audio decoders:", list); talloc_free(list); opt_exit = 1; diff --git a/mpvcore/player/mp_core.h b/mpvcore/player/mp_core.h index 4e15f49c49..aa0728d10f 100644 --- a/mpvcore/player/mp_core.h +++ b/mpvcore/player/mp_core.h @@ -199,10 +199,11 @@ typedef struct MPContext { struct track *current_track[STREAM_TYPE_COUNT]; struct sh_stream *sh[STREAM_TYPE_COUNT]; - struct sh_audio *sh_audio; // same as sh[STREAM_AUDIO]->audio struct sh_video *sh_video; // same as sh[STREAM_VIDEO]->video struct sh_sub *sh_sub; // same as sh[STREAM_SUB]->sub + struct dec_audio *d_audio; + // Uses: accessing metadata (consider ordered chapters case, where the main // demuxer defines metadata), or special purpose demuxers like TV. struct demuxer *master_demuxer; @@ -357,7 +358,8 @@ struct track *mp_track_by_tid(struct MPContext *mpctx, enum stream_type type, int tid); bool timeline_set_part(struct MPContext *mpctx, int i, bool force); double timeline_set_from_time(struct MPContext *mpctx, double pts, bool *need_reset); -void init_demux_stream(struct MPContext *mpctx, enum stream_type type); +struct sh_stream *init_demux_stream(struct MPContext *mpctx, + enum stream_type type); void cleanup_demux_stream(struct MPContext *mpctx, enum stream_type type); void add_demuxer_tracks(struct MPContext *mpctx, struct demuxer *demuxer); bool mp_remove_track(struct MPContext *mpctx, struct track *track); diff --git a/mpvcore/player/osd.c b/mpvcore/player/osd.c index 03c7c339b7..04052c359e 100644 --- a/mpvcore/player/osd.c +++ b/mpvcore/player/osd.c @@ -108,7 +108,7 @@ void print_status(struct MPContext *mpctx) saddf(&line, "(Paused) "); } - if (mpctx->sh_audio) + if (mpctx->d_audio) saddf(&line, "A"); if (mpctx->sh_video) saddf(&line, "V"); @@ -131,7 +131,7 @@ void print_status(struct MPContext *mpctx) saddf(&line, " x%4.2f", opts->playback_speed); // A-V sync - if (mpctx->sh_audio && sh_video && mpctx->sync_audio_to_video) { + if (mpctx->d_audio && sh_video && mpctx->sync_audio_to_video) { if (mpctx->last_av_difference != MP_NOPTS_VALUE) saddf(&line, " A-V:%7.3f", mpctx->last_av_difference); else diff --git a/mpvcore/player/playloop.c b/mpvcore/player/playloop.c index d611880605..51daf03bb1 100644 --- a/mpvcore/player/playloop.c +++ b/mpvcore/player/playloop.c @@ -96,7 +96,7 @@ void pause_player(struct MPContext *mpctx) if (mpctx->video_out && mpctx->sh_video && mpctx->video_out->config_ok) vo_control(mpctx->video_out, VOCTRL_PAUSE, NULL); - if (mpctx->ao && mpctx->sh_audio) + if (mpctx->ao && mpctx->d_audio) ao_pause(mpctx->ao); // pause audio, keep data if possible // Only print status if there's actually a file being played. @@ -124,7 +124,7 @@ void unpause_player(struct MPContext *mpctx) mpctx->paused = false; mpctx->osd_function = 0; - if (mpctx->ao && mpctx->sh_audio) + if (mpctx->ao && mpctx->d_audio) ao_resume(mpctx->ao); if (mpctx->video_out && mpctx->sh_video && mpctx->video_out->config_ok) vo_control(mpctx->video_out, VOCTRL_RESUME, NULL); // resume video @@ -182,10 +182,10 @@ static void seek_reset(struct MPContext *mpctx, bool reset_ao) mpctx->time_frame = 0; } - if (mpctx->sh_audio) { - resync_audio_stream(mpctx->sh_audio); - if (mpctx->sh_audio->afilter) - af_control_all(mpctx->sh_audio->afilter, AF_CONTROL_RESET, NULL); + if (mpctx->d_audio) { + audio_resync_stream(mpctx->d_audio); + if (mpctx->d_audio->afilter) + af_control_all(mpctx->d_audio->afilter, AF_CONTROL_RESET, NULL); if (reset_ao) clear_audio_output_buffers(mpctx); clear_audio_decode_buffers(mpctx); @@ -255,7 +255,7 @@ static int mp_seek(MPContext *mpctx, struct seek_params seek, if (demuxer_amount == -1) { assert(!need_reset); mpctx->stop_play = AT_END_OF_FILE; - if (mpctx->sh_audio && !timeline_fallthrough) { + if (mpctx->d_audio && !timeline_fallthrough) { // Seek outside of the file -> clear audio from current position clear_audio_decode_buffers(mpctx); clear_audio_output_buffers(mpctx); @@ -589,7 +589,7 @@ do_seek: static void update_avsync(struct MPContext *mpctx) { - if (!mpctx->sh_audio || !mpctx->sh_video) + if (!mpctx->d_audio || !mpctx->sh_video) return; double a_pos = playing_audio_pts(mpctx); @@ -620,7 +620,7 @@ static void adjust_sync(struct MPContext *mpctx, double frame_time) { struct MPOpts *opts = mpctx->opts; - if (!mpctx->sh_audio || mpctx->syncing_audio) + if (!mpctx->d_audio || mpctx->syncing_audio) return; double a_pts = written_audio_pts(mpctx) - mpctx->delay; @@ -969,7 +969,7 @@ void run_playloop(struct MPContext *mpctx) mpctx->stop_play = PT_NEXT_ENTRY; } - if (mpctx->sh_audio && !mpctx->restart_playback && !mpctx->ao->untimed) { + if (mpctx->d_audio && !mpctx->restart_playback && !mpctx->ao->untimed) { int status = fill_audio_out_buffers(mpctx, endpts); full_audio_buffers = status >= 0; // Not at audio stream EOF yet @@ -1118,7 +1118,7 @@ void run_playloop(struct MPContext *mpctx) if (mpctx->restart_playback) { if (mpctx->sync_audio_to_video) { mpctx->syncing_audio = true; - if (mpctx->sh_audio) + if (mpctx->d_audio) fill_audio_out_buffers(mpctx, endpts); mpctx->restart_playback = false; } @@ -1135,9 +1135,9 @@ void run_playloop(struct MPContext *mpctx) video_left &= mpctx->sync_audio_to_video; // force no-video semantics - if (mpctx->sh_audio && (mpctx->restart_playback ? !video_left : - mpctx->ao->untimed && (mpctx->delay <= 0 || - !video_left))) { + if (mpctx->d_audio && (mpctx->restart_playback ? !video_left : + mpctx->ao->untimed && (mpctx->delay <= 0 || + !video_left))) { int status = fill_audio_out_buffers(mpctx, endpts); full_audio_buffers = status >= 0 && !mpctx->ao->untimed; // Not at audio stream EOF yet @@ -1145,7 +1145,7 @@ void run_playloop(struct MPContext *mpctx) } if (!video_left) mpctx->restart_playback = false; - if (mpctx->sh_audio && buffered_audio == -1) + if (mpctx->d_audio && buffered_audio == -1) buffered_audio = mpctx->paused ? 0 : ao_get_delay(mpctx->ao); update_osd_msg(mpctx); @@ -1156,7 +1156,7 @@ void run_playloop(struct MPContext *mpctx) if (!video_left && (!mpctx->paused || was_restart)) { double a_pos = 0; - if (mpctx->sh_audio) { + if (mpctx->d_audio) { a_pos = (written_audio_pts(mpctx) - mpctx->opts->playback_speed * buffered_audio); } @@ -1182,7 +1182,7 @@ void run_playloop(struct MPContext *mpctx) * should trigger after seek only, when we know there's no audio * buffered. */ - if ((mpctx->sh_audio || mpctx->sh_video) && !audio_left && !video_left + if ((mpctx->d_audio || mpctx->sh_video) && !audio_left && !video_left && (opts->gapless_audio || buffered_audio < 0.05) && (!mpctx->paused || was_restart)) { if (end_is_chapter) { @@ -1227,7 +1227,7 @@ void run_playloop(struct MPContext *mpctx) if (!mpctx->stop_play) { double audio_sleep = 9; - if (mpctx->sh_audio && !mpctx->paused) { + if (mpctx->d_audio && !mpctx->paused) { if (mpctx->ao->untimed) { if (!video_left) audio_sleep = 0; diff --git a/mpvcore/player/video.c b/mpvcore/player/video.c index 66c6216d30..d55a19e79f 100644 --- a/mpvcore/player/video.c +++ b/mpvcore/player/video.c @@ -243,8 +243,8 @@ static int check_framedrop(struct MPContext *mpctx, double frame_time) { struct MPOpts *opts = mpctx->opts; // check for frame-drop: - if (mpctx->sh_audio && !mpctx->ao->untimed && - !demux_stream_eof(mpctx->sh_audio->gsh)) + if (mpctx->d_audio && !mpctx->ao->untimed && + !demux_stream_eof(mpctx->sh[STREAM_AUDIO])) { float delay = opts->playback_speed * ao_get_delay(mpctx->ao); float d = delay - mpctx->delay; @@ -314,7 +314,7 @@ static double update_video_nocorrect_pts(struct MPContext *mpctx) struct demux_packet *pkt = video_read_frame(mpctx); if (!pkt) return -1; - if (mpctx->sh_audio) + if (mpctx->d_audio) mpctx->delay -= frame_time; // video_read_frame can change fps (e.g. for ASF video) update_fps(mpctx); @@ -469,7 +469,7 @@ double update_video(struct MPContext *mpctx, double endpts) } double frame_time = sh_video->pts - sh_video->last_pts; sh_video->last_pts = sh_video->pts; - if (mpctx->sh_audio) + if (mpctx->d_audio) mpctx->delay -= frame_time; return frame_time; } |