[MPlayer-dev-eng] [PATCH] vobsub missing subs

ubitux ubitux at gmail.com
Sun Apr 18 17:53:12 CEST 2010


According to what Uoti Urpala said to me on IRC, it would be a problem to
keep static state variable in case of having many instances of the parser
in parallel.

So here is a second version of the patch using the mpeg context struct.

Regards,

-- 
ubitux
-------------- next part --------------
Index: vobsub.c
===================================================================
--- vobsub.c	(revision 31044)
+++ vobsub.c	(working copy)
@@ -285,6 +285,8 @@
     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 @@
         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 @@
                 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 @@
         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 @@
                                             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-dev-eng mailing list