diff options
-rw-r--r-- | find_sub.c | 29 | ||||
-rw-r--r-- | input/input.c | 3 | ||||
-rw-r--r-- | input/input.h | 1 | ||||
-rw-r--r-- | mplayer.c | 5 | ||||
-rw-r--r-- | subreader.h | 1 |
5 files changed, 39 insertions, 0 deletions
diff --git a/find_sub.c b/find_sub.c index 2682b99c8c..6ee327cf48 100644 --- a/find_sub.c +++ b/find_sub.c @@ -18,6 +18,35 @@ static int current_sub=0; 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; diff --git a/input/input.c b/input/input.c index da633146eb..998d7a4d46 100644 --- a/input/input.c +++ b/input/input.c @@ -54,6 +54,7 @@ static mp_cmd_t mp_cmds[] = { { 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 @@ static mp_cmd_bind_t def_cmd_binds[] = { { { '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" }, diff --git a/input/input.h b/input/input.h index 20f22cadff..c4443fdb81 100644 --- a/input/input.h +++ b/input/input.h @@ -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 @@ -2038,6 +2038,11 @@ if (stream->type==STREAMTYPE_DVDNAV && dvd_nav_still) 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; diff --git a/subreader.h b/subreader.h index 61922d46a3..22a5cef04e 100644 --- a/subreader.h +++ b/subreader.h @@ -45,4 +45,5 @@ void dump_mpsub(subtitle* subs, float fps); 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 |