summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--input/input.c2
-rw-r--r--input/input.h1
-rw-r--r--libvo/sub.c23
-rw-r--r--libvo/sub.h1
-rw-r--r--mplayer.c17
5 files changed, 38 insertions, 6 deletions
diff --git a/input/input.c b/input/input.c
index 3b580bd06b..b6b245a0f1 100644
--- a/input/input.c
+++ b/input/input.c
@@ -69,6 +69,7 @@ static mp_cmd_t mp_cmds[] = {
{ MP_CMD_SATURATION, "saturation",1, { {MP_CMD_ARG_INT,{0}}, {MP_CMD_ARG_INT,{0}}, {-1,{0}} } },
{ MP_CMD_FRAMEDROPPING, "frame_drop",0, { { MP_CMD_ARG_INT,{-1} }, {-1,{0}} } },
{ MP_CMD_SUB_POS, "sub_pos", 1, { {MP_CMD_ARG_INT,{0}}, {MP_CMD_ARG_INT,{0}}, {-1,{0}} } },
+ { MP_CMD_SUB_ALIGNMENT, "sub_alignment",0, { {MP_CMD_ARG_INT,{-1}}, {-1,{0}} } },
{ MP_CMD_SUB_VISIBILITY, "sub_visibility", 0, { {-1,{0}} } },
{ MP_CMD_VOBSUB_LANG, "vobsub_lang", 0, { {-1,{0}} } },
{ MP_CMD_GET_PERCENT_POS, "get_percent_pos", 0, { {-1,{0}} } },
@@ -247,6 +248,7 @@ static mp_cmd_bind_t def_cmd_binds[] = {
{ { 'd', 0 }, "frame_drop" },
{ { 'r', 0 }, "sub_pos -1" },
{ { 't', 0 }, "sub_pos +1" },
+ { { 'i', 0 }, "sub_alignment" },
{ { 'v', 0 }, "sub_visibility" },
{ { 'j', 0 }, "vobsub_lang" },
#ifdef USE_EDL
diff --git a/input/input.h b/input/input.h
index b55aaa40cd..bddb5935a1 100644
--- a/input/input.h
+++ b/input/input.h
@@ -41,6 +41,7 @@
#ifdef USE_EDL
#define MP_CMD_EDL_MARK 38
#endif
+#define MP_CMD_SUB_ALIGNMENT 39
#define MP_CMD_GUI_EVENTS 5000
#define MP_CMD_GUI_LOADFILE 5001
diff --git a/libvo/sub.c b/libvo/sub.c
index 1cec860880..89dae2eefa 100644
--- a/libvo/sub.c
+++ b/libvo/sub.c
@@ -37,6 +37,7 @@ unsigned char* vo_osd_text=NULL;
int sub_unicode=0;
int sub_utf8=0;
int sub_pos=100;
+int sub_alignment=2; /* 0=top, 1=center, 2=bottom */
int sub_visibility=1;
// return the real height of a char:
@@ -418,12 +419,22 @@ inline static void vo_update_text_sub(mp_osd_obj_t* obj,int dxs,int dys){
*sfalco*
*/
if(suboverlap_enabled) obj->y -= vo_font->pic_a[vo_font->font[40]]->h - vo_font->height;
- if (obj->y >= (dys * sub_pos / 100)){
- int old=obj->y;
- obj->y = dys * sub_pos /100;
- obj->bbox.y2-=old-obj->y;
- }
-
+
+ h = dys - obj->y;
+ if (sub_alignment == 2)
+ obj->y = dys * sub_pos / 100 - h;
+ else if (sub_alignment == 1)
+ obj->y = dys * sub_pos / 100 - h / 2;
+ else
+ obj->y = dys * sub_pos / 100;
+
+ if (obj->y < 0)
+ obj->y = 0;
+ if (obj->y > dys - h)
+ obj->y = dys - h;
+
+ obj->bbox.y2 = obj->y + h;
+
// calculate bbox:
obj->bbox.x1=xmin;
obj->bbox.x2=xmax;
diff --git a/libvo/sub.h b/libvo/sub.h
index ead5a131ff..5c904c9e1c 100644
--- a/libvo/sub.h
+++ b/libvo/sub.h
@@ -97,6 +97,7 @@ extern int sub_utf8;
extern char *sub_cp;
#endif
extern int sub_pos;
+extern int sub_alignment;
extern int sub_visibility;
extern int suboverlap_enabled;
diff --git a/mplayer.c b/mplayer.c
index 5a2364a0c0..e516316ec8 100644
--- a/mplayer.c
+++ b/mplayer.c
@@ -575,6 +575,7 @@ int osd_show_av_delay = 0;
int osd_show_sub_delay = 0;
int osd_show_sub_pos = 0;
int osd_show_sub_visibility = 0;
+int osd_show_sub_alignment = 0;
int osd_show_vobsub_changed = 0;
int rtc_fd=-1;
@@ -2485,6 +2486,16 @@ if (stream->type==STREAMTYPE_DVDNAV && dvd_nav_still)
vo_osd_changed(OSDTYPE_SUBTITLE);
osd_show_sub_pos = 9;
} break;
+ case MP_CMD_SUB_ALIGNMENT:
+ {
+ if (cmd->nargs >= 1)
+ sub_alignment = cmd->args[0].v.i;
+ else
+ sub_alignment = (sub_alignment+1) % 3;
+ osd_show_sub_alignment = 9;
+ vo_osd_changed(OSDTYPE_SUBTITLE);
+ break;
+ }
case MP_CMD_SUB_VISIBILITY:
{
sub_visibility=1-sub_visibility;
@@ -2920,6 +2931,12 @@ if(rel_seek_secs || abs_seek_pos){
sprintf(osd_text_tmp, "Sub position: %d/100", sub_pos);
osd_show_sub_pos--;
} else
+ if (osd_show_sub_alignment) {
+ sprintf(osd_text_tmp, "Sub alignment: %s",
+ (sub_alignment == 2 ? "bottom" :
+ (sub_alignment == 1 ? "center" : "top")));
+ osd_show_sub_alignment--;
+ } else
if (osd_show_av_delay) {
sprintf(osd_text_tmp, "A-V delay: %d ms",(int)(audio_delay*1000));
osd_show_av_delay--;