Mercurial > mplayer.hg
changeset 35031:135b1ef31668
Clamp bitmap subtitles into visible areas.
This avoids subtitles disappearing completely if we detect the
original resolution the subtitles were created for incorrectly.
author | reimar |
---|---|
date | Mon, 27 Aug 2012 20:46:06 +0000 |
parents | 97470e8b352f |
children | 5dcaa3aa2c7b |
files | sub/spudec.c |
diffstat | 1 files changed, 15 insertions(+), 0 deletions(-) [+] |
line wrap: on
line diff
--- a/sub/spudec.c Mon Aug 27 20:15:39 2012 +0000 +++ b/sub/spudec.c Mon Aug 27 20:46:06 2012 +0000 @@ -748,10 +748,24 @@ } } +static void validate_dimensions(spudec_handle_t *spu, unsigned dxs, unsigned dys) +{ + if (spu->orig_frame_width == 0 || spu->orig_frame_height == 0) { + spu->width = FFMIN(spu->width, dxs); + spu->height = FFMIN(spu->height, dys); + spu->start_col = FFMIN(spu->start_col, dxs - spu->width); + spu->start_row = FFMIN(spu->start_row, dys - spu->height); + return; + } + spu->orig_frame_width = FFMAX(spu->orig_frame_width, spu->start_col + spu->width); + spu->orig_frame_height = FFMAX(spu->orig_frame_height, spu->start_row + spu->height); +} + /* calc the bbox for spudec subs */ void spudec_calc_bbox(void *me, unsigned int dxs, unsigned int dys, unsigned int* bbox) { spudec_handle_t *spu = me; + validate_dimensions(spu, dxs, dys); if (spu->orig_frame_width == 0 || spu->orig_frame_height == 0 || (spu->orig_frame_width == dxs && spu->orig_frame_height == dys)) { // unscaled @@ -896,6 +910,7 @@ return; } + validate_dimensions(spu, dxs, dys); if (!(spu_aamode&16) && (spu->orig_frame_width == 0 || spu->orig_frame_height == 0 || (spu->orig_frame_width == dxs && spu->orig_frame_height == dys))) { spudec_draw(spu, draw_alpha);