Mercurial > mplayer.hg
changeset 8365:423a19edc0a4
This patch makes it possible to navigate among the subtitles while
playing movies. It can be very useful when using desynched subtitles.
A new command 'sub_step' is added, which takes an integer argument.
'sub_step +1' will immediately display the next subtitle, adjusting
sub_delay as if one had used the 'sub_delay' command to navigate to
the subtitle. 'sub_step -1' displays the previous subtitle and
adjusts the sub_delay. By using these two commands you can navigate
among the subtitles without having to search blindly using 'sub_delay'.
patch by Oskar Liljeblad (oskar@osk.mine.nu)
author | arpi |
---|---|
date | Thu, 05 Dec 2002 00:15:56 +0000 |
parents | 137b7574c85f |
children | 3e3b30d16719 |
files | find_sub.c input/input.c input/input.h mplayer.c subreader.h |
diffstat | 5 files changed, 39 insertions(+), 0 deletions(-) [+] |
line wrap: on
line diff
--- a/find_sub.c Thu Dec 05 00:11:12 2002 +0000 +++ b/find_sub.c Thu Dec 05 00:15:56 2002 +0000 @@ -18,6 +18,35 @@ static int nosub_range_start=-1; static int nosub_range_end=-1; +extern float sub_delay; + +void step_sub(subtitle *subtitles, float pts, int movement) { + int key = sub_uses_time ? (100*(pts+sub_delay)) : ((pts+sub_delay)*sub_fps); + + if (subtitles == NULL) + return; + + /* Tell the OSD subsystem that the OSD contents will change soon */ + vo_osd_changed(OSDTYPE_SUBTITLE); + + /* If we are moving forward, don't count the next (current) subtitle + * if we haven't displayed it yet. Same when moving other direction. + */ + if (movement > 0 && key < subtitles[current_sub].start) + movement--; + if (movement < 0 && key >= subtitles[current_sub].end) + movement++; + + /* Never move beyond first or last subtitle. */ + if (current_sub+movement < 0) + movement = 0-current_sub; + if (current_sub+movement >= sub_num) + movement = sub_num-current_sub-1; + + current_sub += movement; + sub_delay = subtitles[current_sub].start/(sub_uses_time ? 100 : sub_fps) - pts; +} + void find_sub(subtitle* subtitles,int key){ int i,j;
--- a/input/input.c Thu Dec 05 00:11:12 2002 +0000 +++ b/input/input.c Thu Dec 05 00:15:56 2002 +0000 @@ -54,6 +54,7 @@ { MP_CMD_PLAY_TREE_UP_STEP, "pt_up_step",1, { { MP_CMD_ARG_INT,{0} }, { MP_CMD_ARG_INT ,{0}}, {-1,{0}} } }, { MP_CMD_PLAY_ALT_SRC_STEP, "alt_src_step",1, { { MP_CMD_ARG_INT,{0} }, {-1,{0}} } }, { MP_CMD_SUB_DELAY, "sub_delay",1, { {MP_CMD_ARG_FLOAT,{0}}, {MP_CMD_ARG_INT,{0}}, {-1,{0}} } }, + { MP_CMD_SUB_STEP, "sub_step",1, { { MP_CMD_ARG_INT,{0} }, {MP_CMD_ARG_INT,{0}}, {-1,{0}} } }, { MP_CMD_OSD, "osd",0, { {MP_CMD_ARG_INT,{-1}}, {-1,{0}} } }, { MP_CMD_VOLUME, "volume", 1, { { MP_CMD_ARG_INT,{0} }, {MP_CMD_ARG_INT,{0}}, {-1,{0}} } }, { MP_CMD_MIXER_USEMASTER, "use_master", 0, { {-1,{0}} } }, @@ -224,6 +225,8 @@ { { 'o', 0 }, "osd" }, { { 'z', 0 }, "sub_delay -0.1" }, { { 'x', 0 }, "sub_delay +0.1" }, + { { 'g', 0 }, "sub_step -1" }, + { { 'y', 0 }, "sub_step +1" }, { { '9', 0 }, "volume -1" }, { { '/', 0 }, "volume -1" }, { { '0', 0 }, "volume 1" },
--- a/input/input.h Thu Dec 05 00:11:12 2002 +0000 +++ b/input/input.h Thu Dec 05 00:15:56 2002 +0000 @@ -35,6 +35,7 @@ #define MP_CMD_SET_MENU 33 #define MP_CMD_GET_TIME_LENGTH 34 #define MP_CMD_GET_PERCENT_POS 35 +#define MP_CMD_SUB_STEP 36 #define MP_CMD_GUI_EVENTS 5000 #define MP_CMD_GUI_LOADFILE 5001
--- a/mplayer.c Thu Dec 05 00:11:12 2002 +0000 +++ b/mplayer.c Thu Dec 05 00:15:56 2002 +0000 @@ -2038,6 +2038,11 @@ sub_delay += v; osd_show_sub_delay = 9; // show the subdelay in OSD } break; + case MP_CMD_SUB_STEP : { + int movement = cmd->args[0].v.i; + step_sub(subtitles, d_video->pts, movement); + osd_show_sub_delay = 9; // show the subdelay in OSD + } break; case MP_CMD_OSD : if(sh_video) { int v = cmd->args[0].v.i;
--- a/subreader.h Thu Dec 05 00:11:12 2002 +0000 +++ b/subreader.h Thu Dec 05 00:15:56 2002 +0000 @@ -45,4 +45,5 @@ void dump_microdvd(subtitle* subs, float fps); void sub_free( subtitle * subs ); void find_sub(subtitle* subtitles,int key); +void step_sub(subtitle *subtitles, float pts, int movement); #endif