gst/subparse/samiparse.c: Some versions of libxml seem to be very picky as to strict...
authorEdward Hervey <bilboed@bilboed.com>
Thu, 11 Dec 2008 15:49:12 +0000 (15:49 +0000)
committerEdward Hervey <bilboed@bilboed.com>
Thu, 11 Dec 2008 15:49:12 +0000 (15:49 +0000)
Original commit message from CVS:
* gst/subparse/samiparse.c: (sami_context_push_state),
(sami_context_pop_state), (start_sami_element), (end_sami_element):
Some versions of libxml seem to be very picky as to strict formatting
of the input and never 'close' the final </body> tag.
In order to fix that bad behaviour, we trigger the flushing of
remaining data on both </body> and </sami>.
Fixes #557365

ChangeLog
gst/subparse/samiparse.c

index edaa965..ee9ef4d 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,13 @@
+2008-12-11  Edward Hervey  <edward.hervey@collabora.co.uk>
+
+       * gst/subparse/samiparse.c: (sami_context_push_state),
+       (sami_context_pop_state), (start_sami_element), (end_sami_element):
+       Some versions of libxml seem to be very picky as to strict formatting
+       of the input and never 'close' the final </body> tag.
+       In order to fix that bad behaviour, we trigger the flushing of
+       remaining data on both </body> and </sami>.
+       Fixes #557365
+
 2008-12-11  Sebastian Dröge  <sebastian.droege@collabora.co.uk>
 
        Patch by: Guillaume Emont <guillaume at fluendo dot com>
index dbf069d..e8ea72a 100644 (file)
@@ -60,6 +60,7 @@ has_tag (GString * str, const gchar tag)
 static void
 sami_context_push_state (GstSamiContext * sctx, char state)
 {
+  GST_LOG ("state %c", state);
   g_string_append_c (sctx->state, state);
 }
 
@@ -70,6 +71,7 @@ sami_context_pop_state (GstSamiContext * sctx, char state)
   GString *context_state = sctx->state;
   int i;
 
+  GST_LOG ("state %c", state);
   for (i = context_state->len - 1; i >= 0; i--) {
     switch (context_state->str[i]) {
       case ITALIC_TAG:         /* <i> */
@@ -211,6 +213,8 @@ start_sami_element (void *ctx, const xmlChar * name, const xmlChar ** atts)
 {
   GstSamiContext *sctx = (GstSamiContext *) ctx;
 
+  GST_LOG ("name:%s", name);
+
   if (!xmlStrncmp ((const xmlChar *) "sync", name, 4)) {
     handle_start_sync (sctx, atts);
     sctx->in_sync = TRUE;
@@ -239,9 +243,12 @@ end_sami_element (void *ctx, const xmlChar * name)
 {
   GstSamiContext *sctx = (GstSamiContext *) ctx;
 
+  GST_LOG ("name:%s", name);
+
   if (!xmlStrncmp ((const xmlChar *) "sync", name, 4)) {
     sctx->in_sync = FALSE;
-  } else if (!xmlStrncmp ((const xmlChar *) "body", name, 4)) {
+  } else if ((!xmlStrncmp ((const xmlChar *) "body", name, 4)) ||
+      (!xmlStrncmp ((const xmlChar *) "sami", name, 4))) {
     /* We will usually have one buffer left when the body is closed
      * as we need the next sync to actually send it */
     if (sctx->buf->len != 0) {