summaryrefslogtreecommitdiffstats
path: root/spudec.c
diff options
context:
space:
mode:
authorarpi <arpi@b3059339-0415-0410-9bf9-f77b7e298cf2>2002-10-15 00:47:17 +0000
committerarpi <arpi@b3059339-0415-0410-9bf9-f77b7e298cf2>2002-10-15 00:47:17 +0000
commitd25af23a40d9b0cc98216106638ba2035ab8a3af (patch)
tree8fb6caae46070317e5dead050f9ac7ae5577f7f6 /spudec.c
parent0f27e7deafff2c6c4c91d2a7db590f797421cad1 (diff)
downloadmpv-d25af23a40d9b0cc98216106638ba2035ab8a3af.tar.bz2
mpv-d25af23a40d9b0cc98216106638ba2035ab8a3af.tar.xz
All right: The patch adresses two issues which I found, when I analyzed
the input from some DVDs with known subtitle-dropouts: 1. The packet-size at the beginning of the packet, which is used to check, whether we got all fragments, is sometimes one byte too long. It seems to be always padded to an even number, while the actual size can be odd. 2. The original algorythm used to assemble the fragments relies on the timestamps to check, whether a new packet begins. This has proven to be unrelieable on some disks. So instead, I use the timestamp only to check, whether it's been too long (defined as 0,01sec) since the last fragment, which is probably indicating a broken packet, and normaly starting a new packet when the last one has been finished. patch by Christof Buergi <christof@buergi.lugs.ch> git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@7744 b3059339-0415-0410-9bf9-f77b7e298cf2
Diffstat (limited to 'spudec.c')
-rw-r--r--spudec.c11
1 files changed, 8 insertions, 3 deletions
diff --git a/spudec.c b/spudec.c
index 7f96c57ff1..a975f4d01b 100644
--- a/spudec.c
+++ b/spudec.c
@@ -419,10 +419,11 @@ void spudec_assemble(void *this, unsigned char *packet, unsigned int len, unsign
mp_msg(MSGT_SPUDEC,MSGL_WARN,"SPUasm: packet too short\n");
return;
}
- if (spu->packet_pts < pts100) {
- spu->packet_pts = pts100;
+ if ((spu->packet_pts + 10000) < pts100) {
+ // [cb] too long since last fragment: force new packet
spu->packet_offset = 0;
}
+ spu->packet_pts = pts100;
if (spu->packet_offset == 0) {
unsigned int len2 = get_be16(packet);
// Start new fragment
@@ -456,7 +457,9 @@ void spudec_assemble(void *this, unsigned char *packet, unsigned int len, unsign
#if 1
// check if we have a complete packet (unfortunatelly packet_size is bad
// for some disks)
- if (spu->packet_offset == spu->packet_size){
+ // [cb] packet_size is padded to be even -> may be one byte too long
+ if ((spu->packet_offset == spu->packet_size) ||
+ ((spu->packet_offset + 1) == spu->packet_size)){
unsigned int x=0,y;
while(x+4<=spu->packet_offset){
y=get_be16(spu->packet+x+2); // next control pointer
@@ -475,6 +478,8 @@ void spudec_assemble(void *this, unsigned char *packet, unsigned int len, unsign
}
x=y;
}
+ // [cb] packet is done; start new packet
+ spu->packet_offset = 0;
}
#else
if (spu->packet_offset == spu->packet_size) {