diff options
author | wm4 <wm4@nowhere> | 2013-11-23 21:36:20 +0100 |
---|---|---|
committer | wm4 <wm4@nowhere> | 2013-11-23 21:36:20 +0100 |
commit | 3486302514db31b8086f46226d9b46d53810d1e7 (patch) | |
tree | a5b35e0a67d4cee1b5ec8bb0d489f38495d66b3c | |
parent | 057af4697cf65709012f41ff2f0d97b918c51d79 (diff) | |
download | mpv-3486302514db31b8086f46226d9b46d53810d1e7.tar.bz2 mpv-3486302514db31b8086f46226d9b46d53810d1e7.tar.xz |
video: move decoder context from sh_video into new struct
This is similar to the sh_audio commit.
This is mostly cosmetic in nature, except that it also adds automatical
freeing of the decoder driver's state struct (which was in
sh_video->context, now in dec_video->priv).
Also remove all the stheader.h fields that are not needed anymore.
-rw-r--r-- | demux/demux.c | 4 | ||||
-rw-r--r-- | demux/stheader.h | 51 | ||||
-rw-r--r-- | mpvcore/player/audio.c | 5 | ||||
-rw-r--r-- | mpvcore/player/command.c | 69 | ||||
-rw-r--r-- | mpvcore/player/loadfile.c | 20 | ||||
-rw-r--r-- | mpvcore/player/main.c | 2 | ||||
-rw-r--r-- | mpvcore/player/mp_core.h | 2 | ||||
-rw-r--r-- | mpvcore/player/osd.c | 7 | ||||
-rw-r--r-- | mpvcore/player/playloop.c | 39 | ||||
-rw-r--r-- | mpvcore/player/screenshot.c | 4 | ||||
-rw-r--r-- | mpvcore/player/sub.c | 13 | ||||
-rw-r--r-- | mpvcore/player/video.c | 202 | ||||
-rw-r--r-- | video/decode/dec_video.c | 188 | ||||
-rw-r--r-- | video/decode/dec_video.h | 53 | ||||
-rw-r--r-- | video/decode/lavc_dr1.c | 4 | ||||
-rw-r--r-- | video/decode/vd.h | 11 | ||||
-rw-r--r-- | video/decode/vd_lavc.c | 143 | ||||
-rw-r--r-- | video/decode/vdpau_old.c | 4 |
18 files changed, 410 insertions, 411 deletions
diff --git a/demux/demux.c b/demux/demux.c index 095c23fd0c..592ad1608a 100644 --- a/demux/demux.c +++ b/demux/demux.c @@ -241,7 +241,6 @@ struct sh_stream *new_sh_stream(demuxer_t *demuxer, enum stream_type type) .demuxer = demuxer, .index = demuxer->num_streams, .demuxer_id = demuxer_id, // may be overwritten by demuxer - .opts = demuxer->opts, .ds = talloc_zero(sh, struct demux_stream), }; MP_TARRAY_APPEND(demuxer, demuxer->streams, demuxer->num_streams, sh); @@ -249,21 +248,18 @@ struct sh_stream *new_sh_stream(demuxer_t *demuxer, enum stream_type type) case STREAM_VIDEO: { struct sh_video *sht = talloc_zero(demuxer, struct sh_video); sht->gsh = sh; - sht->opts = sh->opts; sh->video = sht; break; } case STREAM_AUDIO: { struct sh_audio *sht = talloc_zero(demuxer, struct sh_audio); sht->gsh = sh; - sht->opts = sh->opts; sh->audio = sht; break; } case STREAM_SUB: { struct sh_sub *sht = talloc_zero(demuxer, struct sh_sub); sht->gsh = sh; - sht->opts = sh->opts; sh->sub = sht; break; } diff --git a/demux/stheader.h b/demux/stheader.h index eb7c3d132b..1c151cda3d 100644 --- a/demux/stheader.h +++ b/demux/stheader.h @@ -63,30 +63,14 @@ struct sh_stream { // stream is a picture (such as album art) struct demux_packet *attached_picture; - // Human readable description of the running decoder, or NULL - char *decoder_desc; - - // shouldn't exist type of stuff - struct MPOpts *opts; - // Internal to demux.c struct demux_stream *ds; }; -#define SH_COMMON \ - struct sh_stream *gsh; \ - struct MPOpts *opts; \ - /* usually a FourCC, exact meaning depends on gsh->format */ \ - unsigned int format; \ - int initialized; \ - /* audio: last known pts value in output from decoder \ - * video: predicted/interpolated PTS of the current frame */ \ - double pts; \ - /* decoder context */ \ - void *context; \ - typedef struct sh_audio { - SH_COMMON + struct sh_stream *gsh; + /* usually a FourCC, exact meaning depends on gsh->codec */ + unsigned int format; int samplerate; struct mp_chmap channels; int i_bps; // == bitrate (compressed bytes/sec) @@ -98,37 +82,18 @@ typedef struct sh_audio { } sh_audio_t; typedef struct sh_video { - SH_COMMON - float next_frame_time; - double last_pts; - double buffered_pts[32]; - int num_buffered_pts; - double codec_reordered_pts; - double prev_codec_reordered_pts; - int num_reordered_pts_problems; - double sorted_pts; - double prev_sorted_pts; - int num_sorted_pts_problems; - int pts_assoc_mode; - // output format: (set by demuxer) + struct sh_stream *gsh; + /* usually a FourCC, exact meaning depends on gsh->codec */ + unsigned int format; float fps; // frames per second (set only if constant fps) float aspect; // aspect ratio stored in the file (for prescaling) - float stream_aspect; // aspect ratio in media headers (DVD IFO files) int i_bps; // == bitrate (compressed bytes/sec) - int disp_w, disp_h; // display size (filled by demuxer or decoder) - // output driver/filters: (set by libmpcodecs core) - struct vf_instance *vfilter; // video filter chain - const struct vd_functions *vd_driver; - int vf_initialized; // -1 failed, 0 not done, 1 done - long vf_reconfig_count; // incremented each mpcodecs_reconfig_vo() call - struct mp_image_params *vf_input; // video filter input params - struct mp_hwdec_info *hwdec_info; // video output hwdec handles - // win32-compatible codec parameters: + int disp_w, disp_h; // display size MP_BITMAPINFOHEADER *bih; } sh_video_t; typedef struct sh_sub { - SH_COMMON + struct sh_stream *gsh; unsigned char *extradata; // extra header data passed from demuxer int extradata_len; int frame_based; // timestamps are frame-based diff --git a/mpvcore/player/audio.c b/mpvcore/player/audio.c index ce161a58d5..377b393dfd 100644 --- a/mpvcore/player/audio.c +++ b/mpvcore/player/audio.c @@ -36,6 +36,7 @@ #include "audio/filter/af.h" #include "audio/out/ao.h" #include "demux/demux.h" +#include "video/decode/dec_video.h" #include "mp_core.h" @@ -302,7 +303,7 @@ static int audio_start_sync(struct MPContext *mpctx, int playsize) if (hrseek) ptsdiff = written_pts - mpctx->hrseek_pts; else - ptsdiff = written_pts - mpctx->sh_video->pts - mpctx->delay + ptsdiff = written_pts - mpctx->d_video->pts - mpctx->delay - mpctx->audio_delay; samples = ptsdiff * real_samplerate; @@ -376,7 +377,7 @@ int fill_audio_out_buffers(struct MPContext *mpctx, double endpts) playsize = ao_get_space(ao); // Coming here with hrseek_active still set means audio-only - if (!mpctx->sh_video || !mpctx->sync_audio_to_video) + if (!mpctx->d_video || !mpctx->sync_audio_to_video) mpctx->syncing_audio = false; if (!opts->initial_audio_sync || !modifiable_audio_format) { mpctx->syncing_audio = false; diff --git a/mpvcore/player/command.c b/mpvcore/player/command.c index cdeb11c713..c09a046cd2 100644 --- a/mpvcore/player/command.c +++ b/mpvcore/player/command.c @@ -316,7 +316,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->d_audio || !mpctx->sh_video) + if (!mpctx->d_audio || !mpctx->d_video) return M_PROPERTY_UNAVAILABLE; if (mpctx->last_av_difference == MP_NOPTS_VALUE) return M_PROPERTY_UNAVAILABLE; @@ -623,8 +623,8 @@ static int mp_property_angle(m_option_t *prop, int action, void *arg, case M_PROPERTY_SET: angle = demuxer_set_angle(demuxer, *(int *)arg); if (angle >= 0) { - if (mpctx->sh_video) - resync_video_stream(mpctx->sh_video); + if (mpctx->d_video) + video_resync_stream(mpctx->d_video); if (mpctx->d_audio) audio_resync_stream(mpctx->d_audio); @@ -817,7 +817,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->d_audio && mpctx->sh_video)) + if (!(mpctx->d_audio && mpctx->d_video)) return M_PROPERTY_UNAVAILABLE; float delay = mpctx->opts->audio_delay; switch (action) { @@ -1168,7 +1168,7 @@ static int probe_deint_filters(struct MPContext *mpctx, const char *cmd) static int get_deinterlacing(struct MPContext *mpctx) { - vf_instance_t *vf = mpctx->sh_video->vfilter; + vf_instance_t *vf = mpctx->d_video->vfilter; int enabled = 0; if (vf->control(vf, VFCTRL_GET_DEINTERLACE, &enabled) != CONTROL_OK) enabled = -1; @@ -1182,7 +1182,7 @@ static int get_deinterlacing(struct MPContext *mpctx) static void set_deinterlacing(struct MPContext *mpctx, bool enable) { - vf_instance_t *vf = mpctx->sh_video->vfilter; + vf_instance_t *vf = mpctx->d_video->vfilter; if (vf_find_by_label(vf, VF_DEINTERLACE_LABEL)) { if (!enable) edit_filters(mpctx, STREAM_VIDEO, "del", "@" VF_DEINTERLACE_LABEL); @@ -1199,7 +1199,7 @@ static void set_deinterlacing(struct MPContext *mpctx, bool enable) static int mp_property_deinterlace(m_option_t *prop, int action, void *arg, MPContext *mpctx) { - if (!mpctx->sh_video || !mpctx->sh_video->vfilter) + if (!mpctx->d_video || !mpctx->d_video->vfilter) return M_PROPERTY_UNAVAILABLE; switch (action) { case M_PROPERTY_GET: @@ -1218,7 +1218,7 @@ static int video_refresh_property_helper(m_option_t *prop, int action, { int r = mp_property_generic_option(prop, action, arg, mpctx); if (action == M_PROPERTY_SET) { - if (mpctx->sh_video) { + if (mpctx->d_video) { reinit_video_filters(mpctx); mp_force_video_refresh(mpctx); } @@ -1239,8 +1239,8 @@ static int mp_property_colormatrix(m_option_t *prop, int action, void *arg, vo_control(mpctx->video_out, VOCTRL_GET_YUV_COLORSPACE, &vo_csp); struct mp_image_params vd_csp = {0}; - if (mpctx->sh_video) - vd_control(mpctx->sh_video, VDCTRL_GET_PARAMS, &vd_csp); + if (mpctx->d_video) + video_vd_control(mpctx->d_video, VDCTRL_GET_PARAMS, &vd_csp); char *res = talloc_asprintf(NULL, "%s", mp_csp_names[opts->requested_colorspace]); @@ -1273,8 +1273,8 @@ static int mp_property_colormatrix_input_range(m_option_t *prop, int action, vo_control(mpctx->video_out, VOCTRL_GET_YUV_COLORSPACE, &vo_csp ); struct mp_image_params vd_csp = {0}; - if (mpctx->sh_video) - vd_control(mpctx->sh_video, VDCTRL_GET_PARAMS, &vd_csp); + if (mpctx->d_video) + video_vd_control(mpctx->d_video, VDCTRL_GET_PARAMS, &vd_csp); char *res = talloc_asprintf(NULL, "%s", mp_csp_levels_names[opts->requested_input_range]); @@ -1372,7 +1372,7 @@ static int mp_property_border(m_option_t *prop, int action, void *arg, static int mp_property_framedrop(m_option_t *prop, int action, void *arg, MPContext *mpctx) { - if (!mpctx->sh_video) + if (!mpctx->d_video) return M_PROPERTY_UNAVAILABLE; return mp_property_generic_option(prop, action, arg, mpctx); @@ -1381,17 +1381,17 @@ static int mp_property_framedrop(m_option_t *prop, int action, static int mp_property_video_color(m_option_t *prop, int action, void *arg, MPContext *mpctx) { - if (!mpctx->sh_video) + if (!mpctx->d_video) return M_PROPERTY_UNAVAILABLE; switch (action) { case M_PROPERTY_SET: { - if (set_video_colors(mpctx->sh_video, prop->name, *(int *) arg) <= 0) + if (video_set_colors(mpctx->d_video, prop->name, *(int *) arg) <= 0) return M_PROPERTY_UNAVAILABLE; break; } case M_PROPERTY_GET: - if (get_video_colors(mpctx->sh_video, prop->name, (int *)arg) <= 0) + if (video_get_colors(mpctx->d_video, prop->name, (int *)arg) <= 0) return M_PROPERTY_UNAVAILABLE; // Write new value to option variable mp_property_generic_option(prop, M_PROPERTY_SET, arg, mpctx); @@ -1404,7 +1404,7 @@ static int mp_property_video_color(m_option_t *prop, int action, void *arg, static int mp_property_video_format(m_option_t *prop, int action, void *arg, MPContext *mpctx) { - const char *c = mpctx->sh_video ? mpctx->sh_video->gsh->codec : NULL; + const char *c = mpctx->d_video ? mpctx->d_video->header->codec : NULL; return m_property_strdup_ro(prop, action, arg, c); } @@ -1412,7 +1412,7 @@ static int mp_property_video_format(m_option_t *prop, int action, static int mp_property_video_codec(m_option_t *prop, int action, void *arg, MPContext *mpctx) { - const char *c = mpctx->sh_video ? mpctx->sh_video->gsh->decoder_desc : NULL; + const char *c = mpctx->d_video ? mpctx->d_video->decoder_desc : NULL; return m_property_strdup_ro(prop, action, arg, c); } @@ -1421,42 +1421,44 @@ static int mp_property_video_codec(m_option_t *prop, int action, static int mp_property_video_bitrate(m_option_t *prop, int action, void *arg, MPContext *mpctx) { - if (!mpctx->sh_video) + if (!mpctx->d_video) return M_PROPERTY_UNAVAILABLE; if (action == M_PROPERTY_PRINT) { - *(char **)arg = format_bitrate(mpctx->sh_video->i_bps); + *(char **)arg = format_bitrate(mpctx->d_video->i_bps); return M_PROPERTY_OK; } - return m_property_int_ro(prop, action, arg, mpctx->sh_video->i_bps); + return m_property_int_ro(prop, action, arg, mpctx->d_video->i_bps); } /// Video display width (RO) static int mp_property_width(m_option_t *prop, int action, void *arg, MPContext *mpctx) { - struct sh_video *sh = mpctx->sh_video; - if (!sh) + struct dec_video *vd = mpctx->d_video; + if (!vd) return M_PROPERTY_UNAVAILABLE; + struct sh_video *sh = vd->header->video; return m_property_int_ro(prop, action, arg, - sh->vf_input ? sh->vf_input->w : sh->disp_w); + vd->vf_input ? vd->vf_input->w : sh->disp_w); } /// Video display height (RO) static int mp_property_height(m_option_t *prop, int action, void *arg, MPContext *mpctx) { - struct sh_video *sh = mpctx->sh_video; - if (!sh) + struct dec_video *vd = mpctx->d_video; + if (!vd) return M_PROPERTY_UNAVAILABLE; + struct sh_video *sh = vd->header->video; return m_property_int_ro(prop, action, arg, - sh->vf_input ? sh->vf_input->h : sh->disp_h); + vd->vf_input ? vd->vf_input->h : sh->disp_h); } static int property_vo_wh(m_option_t *prop, int action, void *arg, MPContext *mpctx, bool get_w) { struct vo *vo = mpctx->video_out; - if (!mpctx->sh_video && !vo || !vo->hasframe) + if (!mpctx->d_video || !vo || !vo->hasframe) return M_PROPERTY_UNAVAILABLE; return m_property_int_ro(prop, action, arg, get_w ? vo->aspdat.prew : vo->aspdat.preh); @@ -1530,18 +1532,19 @@ static int mp_property_osd_par(m_option_t *prop, int action, void *arg, static int mp_property_fps(m_option_t *prop, int action, void *arg, MPContext *mpctx) { - if (!mpctx->sh_video) + if (!mpctx->d_video) return M_PROPERTY_UNAVAILABLE; - return m_property_float_ro(prop, action, arg, mpctx->sh_video->fps); + return m_property_float_ro(prop, action, arg, mpctx->d_video->header->video->fps); } /// Video aspect (RO) static int mp_property_aspect(m_option_t *prop, int action, void *arg, MPContext *mpctx) { - struct sh_video *sh_video = mpctx->sh_video; - if (!mpctx->sh_video) + if (!mpctx->d_video) return M_PROPERTY_UNAVAILABLE; + struct dec_video *d_video = mpctx->d_video; + struct sh_video *sh_video = d_video->header->video; switch (action) { case M_PROPERTY_SET: { mpctx->opts->movie_aspect = *(float *)arg; @@ -1551,7 +1554,7 @@ static int mp_property_aspect(m_option_t *prop, int action, void *arg, } case M_PROPERTY_GET: { float aspect = -1; - struct mp_image_params *params = sh_video->vf_input; + struct mp_image_params *params = d_video->vf_input; if (params && params->d_w && params->d_h) { aspect = (float)params->d_w / params->d_h; } else if (sh_video->disp_w && sh_video->disp_h) { diff --git a/mpvcore/player/loadfile.c b/mpvcore/player/loadfile.c index 856f5469c0..51d3f2ec7e 100644 --- a/mpvcore/player/loadfile.c +++ b/mpvcore/player/loadfile.c @@ -99,8 +99,9 @@ void uninit_player(struct MPContext *mpctx, unsigned int mask) if (mask & INITIALIZED_VCODEC) { mpctx->initialized_flags &= ~INITIALIZED_VCODEC; - if (mpctx->sh_video) - uninit_video(mpctx->sh_video); + if (mpctx->d_video) + video_uninit(mpctx->d_video); + mpctx->d_video = NULL; cleanup_demux_stream(mpctx, STREAM_VIDEO); mpctx->sync_audio_to_video = false; } @@ -113,7 +114,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->d_audio && !mpctx->sh_sub); + assert(!mpctx->d_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]); @@ -269,7 +270,6 @@ static void set_demux_field(struct MPContext *mpctx, enum stream_type type, mpctx->sh[type] = s; // redundant fields for convenience access switch(type) { - case STREAM_VIDEO: mpctx->sh_video = s ? s->video : NULL; break; case STREAM_SUB: mpctx->sh_sub = s ? s->sub : NULL; break; } } @@ -348,7 +348,7 @@ bool timeline_set_part(struct MPContext *mpctx, int i, bool force) if (n->source == p->source && !force) return false; enum stop_play_reason orig_stop_play = mpctx->stop_play; - if (!mpctx->sh_video && mpctx->stop_play == KEEP_PLAYING) + if (!mpctx->d_video && mpctx->stop_play == KEEP_PLAYING) mpctx->stop_play = AT_END_OF_FILE; // let audio uninit drain data uninit_player(mpctx, INITIALIZED_VCODEC | (mpctx->opts->fixed_vo ? 0 : INITIALIZED_VO) | (mpctx->opts->gapless_audio ? 0 : INITIALIZED_AO) | INITIALIZED_ACODEC | INITIALIZED_SUB); mpctx->stop_play = orig_stop_play; @@ -1050,7 +1050,7 @@ static void play_current_file(struct MPContext *mpctx) assert(mpctx->stream == NULL); assert(mpctx->demuxer == NULL); assert(mpctx->d_audio == NULL); - assert(mpctx->sh_video == NULL); + assert(mpctx->d_video == NULL); assert(mpctx->sh_sub == NULL); char *stream_filename = mpctx->filename; @@ -1189,14 +1189,14 @@ goto_reopen_demuxer: ; //================ SETUP STREAMS ========================== - if (opts->force_fps && mpctx->sh_video) { - mpctx->sh_video->fps = opts->force_fps; - MP_INFO(mpctx, "FPS forced to be %5.3f.\n", mpctx->sh_video->fps); + if (opts->force_fps && mpctx->d_video) { + mpctx->d_video->header->video->fps = opts->force_fps; + MP_INFO(mpctx, "FPS forced to be %5.3f.\n", mpctx->d_video->header->video->fps); } //==================== START PLAYING ======================= - if (!mpctx->sh_video && !mpctx->d_audio) { + if (!mpctx->d_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 528076bc57..84b5aa2651 100644 --- a/mpvcore/player/main.c +++ b/mpvcore/player/main.c @@ -200,7 +200,7 @@ static bool handle_help_options(struct MPContext *mpctx) opt_exit = 1; } if (opts->video_decoders && strcmp(opts->video_decoders, "help") == 0) { - struct mp_decoder_list *list = mp_video_decoder_list(); + struct mp_decoder_list *list = video_decoder_list(); mp_print_decoders(MSGT_CPLAYER, MSGL_INFO, "Video decoders:", list); talloc_free(list); opt_exit = 1; diff --git a/mpvcore/player/mp_core.h b/mpvcore/player/mp_core.h index aa0728d10f..f372c4e137 100644 --- a/mpvcore/player/mp_core.h +++ b/mpvcore/player/mp_core.h @@ -199,9 +199,9 @@ typedef struct MPContext { struct track *current_track[STREAM_TYPE_COUNT]; struct sh_stream *sh[STREAM_TYPE_COUNT]; - struct sh_video *sh_video; // same as sh[STREAM_VIDEO]->video struct sh_sub *sh_sub; // same as sh[STREAM_SUB]->sub + struct dec_video *d_video; struct dec_audio *d_audio; // Uses: accessing metadata (consider ordered chapters case, where the main diff --git a/mpvcore/player/osd.c b/mpvcore/player/osd.c index 04052c359e..6f81deae2e 100644 --- a/mpvcore/player/osd.c +++ b/mpvcore/player/osd.c @@ -85,7 +85,6 @@ void write_status_line(struct MPContext *mpctx, const char *line) void print_status(struct MPContext *mpctx) { struct MPOpts *opts = mpctx->opts; - sh_video_t * const sh_video = mpctx->sh_video; update_window_title(mpctx, false); @@ -110,7 +109,7 @@ void print_status(struct MPContext *mpctx) if (mpctx->d_audio) saddf(&line, "A"); - if (mpctx->sh_video) + if (mpctx->d_video) saddf(&line, "V"); saddf(&line, ": "); @@ -131,7 +130,7 @@ void print_status(struct MPContext *mpctx) saddf(&line, " x%4.2f", opts->playback_speed); // A-V sync - if (mpctx->d_audio && sh_video && mpctx->sync_audio_to_video) { + if (mpctx->d_audio && mpctx->d_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 @@ -152,7 +151,7 @@ void print_status(struct MPContext *mpctx) #endif { // VO stats - if (sh_video && mpctx->drop_frame_cnt) + if (mpctx->d_video && mpctx->drop_frame_cnt) saddf(&line, " Late: %d", mpctx->drop_frame_cnt); } diff --git a/mpvcore/player/playloop.c b/mpvcore/player/playloop.c index 51daf03bb1..591d31fbca 100644 --- a/mpvcore/player/playloop.c +++ b/mpvcore/player/playloop.c @@ -93,7 +93,7 @@ void pause_player(struct MPContext *mpctx) mpctx->osd_function = 0; mpctx->paused_for_cache = false; - if (mpctx->video_out && mpctx->sh_video && mpctx->video_out->config_ok) + if (mpctx->video_out && mpctx->d_video && mpctx->video_out->config_ok) vo_control(mpctx->video_out, VOCTRL_PAUSE, NULL); if (mpctx->ao && mpctx->d_audio) @@ -126,7 +126,7 @@ void unpause_player(struct MPContext *mpctx) if (mpctx->ao && mpctx->d_audio) ao_resume(mpctx->ao); - if (mpctx->video_out && mpctx->sh_video && mpctx->video_out->config_ok) + if (mpctx->video_out && mpctx->d_video && mpctx->video_out->config_ok) vo_control(mpctx->video_out, VOCTRL_RESUME, NULL); // resume video (void)get_relative_time(mpctx); // ignore time that passed during pause } @@ -153,7 +153,7 @@ static bool redraw_osd(struct MPContext *mpctx) void add_step_frame(struct MPContext *mpctx, int dir) { - if (!mpctx->sh_video) + if (!mpctx->d_video) return; if (dir > 0) { mpctx->step_frames += 1; @@ -169,14 +169,14 @@ void add_step_frame(struct MPContext *mpctx, int dir) static void seek_reset(struct MPContext *mpctx, bool reset_ao) { - if (mpctx->sh_video) { - resync_video_stream(mpctx->sh_video); + if (mpctx->d_video) { + video_resync_stream(mpctx->d_video); vo_seek_reset(mpctx->video_out); - if (mpctx->sh_video->vf_initialized == 1) - vf_chain_seek_reset(mpctx->sh_video->vfilter); - mpctx->sh_video->num_buffered_pts = 0; - mpctx->sh_video->last_pts = MP_NOPTS_VALUE; - mpctx->sh_video->pts = MP_NOPTS_VALUE; + if (mpctx->d_video->vf_initialized == 1) + vf_chain_seek_reset(mpctx->d_video->vfilter); + mpctx->d_video->num_buffered_pts = 0; + mpctx->d_video->last_pts = MP_NOPTS_VALUE; + mpctx->d_video->pts = MP_NOPTS_VALUE; mpctx->video_pts = MP_NOPTS_VALUE; mpctx->delay = 0; mpctx->time_frame = 0; @@ -589,7 +589,7 @@ do_seek: static void update_avsync(struct MPContext *mpctx) { - if (!mpctx->d_audio || !mpctx->sh_video) + if (!mpctx->d_audio || !mpctx->d_video) return; double a_pos = playing_audio_pts(mpctx); @@ -624,7 +624,7 @@ static void adjust_sync(struct MPContext *mpctx, double frame_time) return; double a_pts = written_audio_pts(mpctx) - mpctx->delay; - double v_pts = mpctx->sh_video->pts; + double v_pts = mpctx->d_video->pts; double av_delay = a_pts - v_pts; // Try to sync vo_flip() so it will *finish* at given time av_delay += mpctx->last_vo_flip_duration; @@ -797,7 +797,7 @@ static void handle_backstep(struct MPContext *mpctx) double current_pts = mpctx->last_vo_pts; mpctx->backstep_active = false; bool demuxer_ok = mpctx->demuxer && mpctx->demuxer->accurate_seek; - if (demuxer_ok && mpctx->sh_video && current_pts != MP_NOPTS_VALUE) { + if (demuxer_ok && mpctx->d_video && current_pts != MP_NOPTS_VALUE) { double seek_pts = find_previous_pts(mpctx, current_pts); if (seek_pts != MP_NOPTS_VALUE) { queue_seek(mpctx, MPSEEK_ABSOLUTE, seek_pts, 1); @@ -863,7 +863,7 @@ static void handle_keep_open(struct MPContext *mpctx) void handle_force_window(struct MPContext *mpctx, bool reconfig) { // Don't interfere with real video playback - if (mpctx->sh_video) + if (mpctx->d_video) return; struct vo *vo = mpctx->video_out; @@ -982,7 +982,7 @@ void run_playloop(struct MPContext *mpctx) } double buffered_audio = -1; - while (mpctx->sh_video) { // never loops, for "break;" only + while (mpctx->d_video) { // never loops, for "break;" only struct vo *vo = mpctx->video_out; update_fps(mpctx); @@ -990,7 +990,7 @@ void run_playloop(struct MPContext *mpctx) if (!vo->frame_loaded && (!mpctx->paused || mpctx->restart_playback)) { double frame_time = update_video(mpctx, endpts); mp_dbg(MSGT_AVSYNC, MSGL_DBG2, "*** ftime=%5.3f ***\n", frame_time); - if (mpctx->sh_video->vf_initialized < 0) { + if (mpctx->d_video->vf_initialized < 0) { MP_FATAL(mpctx, "\nFATAL: Could not initialize video filters " "(-vf) or video output (-vo).\n"); int uninit = INITIALIZED_VCODEC; @@ -1016,7 +1016,7 @@ void run_playloop(struct MPContext *mpctx) } if (endpts != MP_NOPTS_VALUE) - video_left &= mpctx->sh_video->pts < endpts; + video_left &= mpctx->d_video->pts < endpts; handle_heartbeat_cmd(mpctx); @@ -1070,8 +1070,7 @@ void run_playloop(struct MPContext *mpctx) //=================== FLIP PAGE (VIDEO BLT): ====================== vo_new_frame_imminent(vo); - struct sh_video *sh_video = mpctx->sh_video; - mpctx->video_pts = sh_video->pts; + mpctx->video_pts = mpctx->d_video->pts; mpctx->last_vo_pts = mpctx->video_pts; mpctx->playback_pts = mpctx->video_pts; update_subtitles(mpctx); @@ -1182,7 +1181,7 @@ void run_playloop(struct MPContext *mpctx) * should trigger after seek only, when we know there's no audio * buffered. */ - if ((mpctx->d_audio || mpctx->sh_video) && !audio_left && !video_left + if ((mpctx->d_audio || mpctx->d_video) && !audio_left && !video_left && (opts->gapless_audio || buffered_audio < 0.05) && (!mpctx->paused || was_restart)) { if (end_is_chapter) { diff --git a/mpvcore/player/screenshot.c b/mpvcore/player/screenshot.c index aeb15c0fd7..f564b5e9d7 100644 --- a/mpvcore/player/screenshot.c +++ b/mpvcore/player/screenshot.c @@ -315,8 +315,8 @@ static struct mp_image *screenshot_get(struct MPContext *mpctx, int mode) struct voctrl_screenshot_args args = { .full_window = (mode == MODE_FULL_WINDOW) }; - if (mpctx->sh_video && mpctx->sh_video->vfilter) { - struct vf_instance *vfilter = mpctx->sh_video->vfilter; + if (mpctx->d_video && mpctx->d_video->vfilter) { + struct vf_instance *vfilter = mpctx->d_video->vfilter; vfilter->control(vfilter, VFCTRL_SCREENSHOT, &args); } diff --git a/mpvcore/player/sub.c b/mpvcore/player/sub.c index 94368435d1..d659e74851 100644 --- a/mpvcore/player/sub.c +++ b/mpvcore/player/sub.c @@ -33,6 +33,7 @@ #include "sub/dec_sub.h" #include "demux/demux.h" #include "video/mp_image.h" +#include "video/decode/dec_video.h" #include "mp_core.h" @@ -83,8 +84,8 @@ void update_subtitles(struct MPContext *mpctx) assert(track && sh_sub); struct dec_sub *dec_sub = sh_sub->dec_sub; - if (mpctx->sh_video && mpctx->sh_video->vf_input) { - struct mp_image_params params = *mpctx->sh_video->vf_input; + if (mpctx->d_video && mpctx->d_video->vf_input) { + struct mp_image_params params = *mpctx->d_video->vf_input; sub_control(dec_sub, SD_CTRL_SET_VIDEO_PARAMS, ¶ms); } @@ -194,9 +195,11 @@ void reinit_subs(struct MPContext *mpctx) assert(dec_sub); if (!sub_is_initialized(dec_sub)) { - int w = mpctx->sh_video ? mpctx->sh_video->disp_w : 0; - int h = mpctx->sh_video ? mpctx->sh_video->disp_h : 0; - float fps = mpctx->sh_video ? mpctx->sh_video->fps : 25; + struct sh_video *sh_video = + mpctx->d_video ? mpctx->d_video->header->video : NULL; + int w = sh_video ? sh_video->disp_w : 0; + int h = sh_video ? sh_video->disp_h : 0; + float fps = sh_video ? sh_video->fps : 25; set_dvdsub_fake_extradata(dec_sub, track->demuxer->stream, w, h); sub_set_video_res(dec_sub, w, h); diff --git a/mpvcore/player/video.c b/mpvcore/player/video.c index ac6406968f..333b694f9c 100644 --- a/mpvcore/player/video.c +++ b/mpvcore/player/video.c @@ -46,63 +46,64 @@ void update_fps(struct MPContext *mpctx) { #if HAVE_ENCODING - struct sh_video *sh_video = mpctx->sh_video; - if (mpctx->encode_lavc_ctx && sh_video) - encode_lavc_set_video_fps(mpctx->encode_lavc_ctx, sh_video->fps); + struct dec_video *d_video = mpctx->d_video; + if (mpctx->encode_lavc_ctx && d_video) + encode_lavc_set_video_fps(mpctx->encode_lavc_ctx, d_video->header->video->fps); #endif } static void recreate_video_filters(struct MPContext *mpctx) { struct MPOpts *opts = mpctx->opts; - struct sh_video *sh_video = mpctx->sh_video; - assert(sh_video); + struct dec_video *d_video = mpctx->d_video; + assert(d_video); - vf_uninit_filter_chain(sh_video->vfilter); + vf_uninit_filter_chain(d_video->vfilter); |