[MPlayer-cvslog] r31104 - trunk/vobsub.c

iive subversion at mplayerhq.hu
Wed Apr 28 00:06:29 CEST 2010


Author: iive
Date: Wed Apr 28 00:06:29 2010
New Revision: 31104

Log:
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)

Modified:
   trunk/vobsub.c

Modified: trunk/vobsub.c
==============================================================================
--- trunk/vobsub.c	Tue Apr 27 21:04:23 2010	(r31103)
+++ trunk/vobsub.c	Wed Apr 28 00:06:29 2010	(r31104)
@@ -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 *fil
         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
                                             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;


More information about the MPlayer-cvslog mailing list