From bf16f6f4f329b7903ba550c458545fbdb41f5314 Mon Sep 17 00:00:00 2001 From: reimar Date: Wed, 23 Sep 2009 21:21:58 +0000 Subject: Make update_subtitles work without sh_video for text subtitles. This fixes a crash with e.g. auto-enabled subtitles and -novideo due to command.c calling update_subtitles even without video and is a step toward subtitle support for audio-only files. git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@29710 b3059339-0415-0410-9bf9-f77b7e298cf2 --- command.c | 7 ++++++- mencoder.c | 2 +- mpcommon.c | 5 ++--- mpcommon.h | 2 +- mplayer.c | 6 +++--- 5 files changed, 13 insertions(+), 9 deletions(-) diff --git a/command.c b/command.c index 5aee6ae383..3269db5949 100644 --- a/command.c +++ b/command.c @@ -1314,6 +1314,7 @@ static int mp_property_sub(m_option_t * prop, int action, void *arg, demux_stream_t *const d_sub = mpctx->d_sub; const int global_sub_size = mpctx->global_sub_size; int source = -1, reset_spu = 0; + double pts = 0; char *sub_name; if (global_sub_size <= 0) @@ -1500,7 +1501,11 @@ static int mp_property_sub(m_option_t * prop, int action, void *arg, d_sub->id = dvdsub_id; } #endif - update_subtitles(mpctx->sh_video, d_sub, 1); + if (mpctx->sh_audio) + pts = mpctx->sh_audio->pts; + if (mpctx->sh_video) + pts = mpctx->sh_video->pts; + update_subtitles(mpctx->sh_video, pts, d_sub, 1); return M_PROPERTY_OK; } diff --git a/mencoder.c b/mencoder.c index 5b569bb5fd..8d43106fde 100644 --- a/mencoder.c +++ b/mencoder.c @@ -1454,7 +1454,7 @@ if(sh_audio && !demuxer2){ } else #endif - update_subtitles(sh_video, d_dvdsub, 0); + update_subtitles(sh_video, sh_video->pts, d_dvdsub, 0); frame_data = (s_frame_data){ .start = NULL, .in_size = 0, .frame_time = 0., .already_read = 0 }; diff --git a/mpcommon.c b/mpcommon.c index 394a71461f..e28614390d 100644 --- a/mpcommon.c +++ b/mpcommon.c @@ -66,13 +66,12 @@ if (HAVE_CMOV) } -void update_subtitles(sh_video_t *sh_video, demux_stream_t *d_dvdsub, int reset) +void update_subtitles(sh_video_t *sh_video, double refpts, demux_stream_t *d_dvdsub, int reset) { unsigned char *packet=NULL; int len; char type = d_dvdsub->sh ? ((sh_sub_t *)d_dvdsub->sh)->type : 'v'; static subtitle subs; - double refpts = sh_video->pts; if (reset) { sub_clear_text(&subs, MP_NOPTS_VALUE); if (vo_sub) { @@ -86,7 +85,7 @@ void update_subtitles(sh_video_t *sh_video, demux_stream_t *d_dvdsub, int reset) } // find sub if (subdata) { - if (sub_fps==0) sub_fps = sh_video->fps; + if (sub_fps==0) sub_fps = sh_video ? sh_video->fps : 25; current_module = "find_sub"; if (refpts > sub_last_pts || refpts < sub_last_pts-1.0) { find_sub(subdata, (refpts+sub_delay) * diff --git a/mpcommon.h b/mpcommon.h index a0c6fb8ff8..98f3d4e075 100644 --- a/mpcommon.h +++ b/mpcommon.h @@ -10,7 +10,7 @@ extern struct ass_track_s *ass_track; extern subtitle *vo_sub_last; void print_version(const char* name); -void update_subtitles(sh_video_t *sh_video, demux_stream_t *d_dvdsub, int reset); +void update_subtitles(sh_video_t *sh_video, double pts, demux_stream_t *d_dvdsub, int reset); void update_teletext(sh_video_t *sh_video, demuxer_t *demuxer, int reset); int select_audio(demuxer_t* demuxer, int audio_id, char* audio_lang); diff --git a/mplayer.c b/mplayer.c index 59a0b48a7f..7064223e09 100644 --- a/mplayer.c +++ b/mplayer.c @@ -1767,7 +1767,7 @@ static int generate_video_frame(sh_video_t *sh_video, demux_stream_t *d_video) current_module = "decode video"; decoded_frame = decode_video(sh_video, start, in_size, drop_frame, pts); if (decoded_frame) { - update_subtitles(sh_video, mpctx->d_sub, 0); + update_subtitles(sh_video, sh_video->pts, mpctx->d_sub, 0); update_teletext(sh_video, mpctx->demuxer, 0); update_osd_msg(); current_module = "filter video"; @@ -2290,7 +2290,7 @@ static double update_video(int *blit_frame) // video_read_frame can change fps (e.g. for ASF video) vo_fps = sh_video->fps; drop_frame = check_framedrop(frame_time); - update_subtitles(sh_video, mpctx->d_sub, 0); + update_subtitles(sh_video, sh_video->pts, mpctx->d_sub, 0); update_teletext(sh_video, mpctx->demuxer, 0); update_osd_msg(); current_module = "decode_video"; @@ -2483,7 +2483,7 @@ static int seek(MPContext *mpctx, double amount, int style) // (which is used by at least vobsub and edl code below) may // be completely wrong (probably 0). mpctx->sh_video->pts = mpctx->d_video->pts; - update_subtitles(mpctx->sh_video, mpctx->d_sub, 1); + update_subtitles(mpctx->sh_video, mpctx->sh_video->pts, mpctx->d_sub, 1); update_teletext(mpctx->sh_video, mpctx->demuxer, 1); } -- cgit v1.2.3