summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorarpi <arpi@b3059339-0415-0410-9bf9-f77b7e298cf2>2002-12-05 00:15:56 +0000
committerarpi <arpi@b3059339-0415-0410-9bf9-f77b7e298cf2>2002-12-05 00:15:56 +0000
commit05802842c9d8f1d3ff5296c1d5962f24f3ee5807 (patch)
tree263932e3e624a328606900e604597ab4d6c24977
parent1d94bbed7dc5ddb213c2e12c551051ebe6742813 (diff)
downloadmpv-05802842c9d8f1d3ff5296c1d5962f24f3ee5807.tar.bz2
mpv-05802842c9d8f1d3ff5296c1d5962f24f3ee5807.tar.xz
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) git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@8366 b3059339-0415-0410-9bf9-f77b7e298cf2
-rw-r--r--find_sub.c29
-rw-r--r--input/input.c3
-rw-r--r--input/input.h1
-rw-r--r--mplayer.c5
-rw-r--r--subreader.h1
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
diff --git a/mplayer.c b/mplayer.c
index 73bfaa60a3..744a33da62 100644
--- a/mplayer.c
+++ b/mplayer.c
@@ -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