diff options
author | iive <iive@b3059339-0415-0410-9bf9-f77b7e298cf2> | 2010-04-27 22:06:29 +0000 |
---|---|---|
committer | iive <iive@b3059339-0415-0410-9bf9-f77b7e298cf2> | 2010-04-27 22:06:29 +0000 |
commit | 3517a9b72b06aeb962487e9d0025e22cd6d0f575 (patch) | |
tree | 0ab6d41af8380b5a908b01bb425a662b6a59dbcb /vobsub.c | |
parent | 46f3b7d26327254bc471987d257bf62ad6f1eeca (diff) | |
download | mpv-3517a9b72b06aeb962487e9d0025e22cd6d0f575.tar.bz2 mpv-3517a9b72b06aeb962487e9d0025e22cd6d0f575.tar.xz |
New hack for vobsub packet merging.
It seems that if there is no padding between packets then they actually belong to one subtitle picture.
The new hack seems to work far more reliable than the (already removed) old one.
Patch by Ubitux (gmail)
git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@31104 b3059339-0415-0410-9bf9-f77b7e298cf2
Diffstat (limited to 'vobsub.c')
-rw-r--r-- | vobsub.c | 13 |
1 files changed, 13 insertions, 0 deletions
@@ -285,6 +285,8 @@ typedef struct { unsigned char *packet; unsigned int packet_reserve; unsigned int packet_size; + int padding_was_here; + int merge; } mpeg_t; static mpeg_t *mpeg_open(const char *filename) @@ -297,6 +299,8 @@ static mpeg_t *mpeg_open(const char *filename) res->packet = NULL; res->packet_size = 0; res->packet_reserve = 0; + res->padding_was_here = 1; + res->merge = 0; res->stream = rar_open(filename, "rb"); err = res->stream == NULL; if (err) @@ -368,10 +372,13 @@ static int mpeg_run(mpeg_t *mpeg) return -1; } else abort(); + if (!mpeg->padding_was_here) + mpeg->merge = 1; break; case 0xbd: /* packet */ if (rar_read(buf, 2, 1, mpeg->stream) != 1) return -1; + mpeg->padding_was_here = 0; len = buf[0] << 8 | buf[1]; idx = mpeg_tell(mpeg); c = rar_getc(mpeg->stream); @@ -454,6 +461,7 @@ static int mpeg_run(mpeg_t *mpeg) len = buf[0] << 8 | buf[1]; if (len > 0 && rar_seek(mpeg->stream, len, SEEK_CUR)) return -1; + mpeg->padding_was_here = 1; break; default: if (0xc0 <= buf[3] && buf[3] < 0xf0) { @@ -1026,6 +1034,11 @@ void *vobsub_open(const char *const name, const char *const ifo, last_pts_diff = pkt->pts100 - mpg->pts; else pkt->pts100 = mpg->pts; + if (mpg->merge) { + packet_t *last = &queue->packets[queue->current_index - 1]; + pkt->pts100 = last->pts100; + mpg->merge = 0; + } /* FIXME: should not use mpg_sub internal informations, make a copy */ pkt->data = mpg->packet; pkt->size = mpg->packet_size; |