Try to recover from decoding errors, use a hack(?) to make libmpeg2 not crash.
authorWim Taymans <wim.taymans@gmail.com>
Sun, 13 Apr 2003 15:01:27 +0000 (15:01 +0000)
committerWim Taymans <wim.taymans@gmail.com>
Sun, 13 Apr 2003 15:01:27 +0000 (15:01 +0000)
Original commit message from CVS:
Try to recover from decoding errors, use a hack(?) to make libmpeg2 not
crash.

common
ext/mpeg2dec/gstmpeg2dec.c

diff --git a/common b/common
index 50879a63c4fa8f2544d4d89a9dbfa0f5720c3266..0ce4bbf0bc51c08694a8a1e0bec7624094b043d6 160000 (submodule)
--- a/common
+++ b/common
@@ -1 +1 @@
-Subproject commit 50879a63c4fa8f2544d4d89a9dbfa0f5720c3266
+Subproject commit 0ce4bbf0bc51c08694a8a1e0bec7624094b043d6
index 50c77790bd5945ef700466bb6910f50084acb658..7262da804daf0c663db4e345c4eec7f98f868350 100644 (file)
@@ -464,13 +464,16 @@ gst_mpeg2dec_chain (GstPad *pad, GstBuffer *buf)
     GST_DEBUG (GST_CAT_CLOCK, "no pts");
   }
 
+  GST_DEBUG (0, "calling _buffer");
   mpeg2_buffer (mpeg2dec->decoder, data, end);
+  GST_DEBUG (0, "calling _buffer done");
 
   while (!done) {
     gboolean slice = FALSE;
 
+    GST_DEBUG (0, "calling parse");
     state = mpeg2_parse (mpeg2dec->decoder);
-    GST_DEBUG (0, "state %d", state);
+    GST_DEBUG (0, "parse state %d", state);
     switch (state) {
       case STATE_SEQUENCE:
       {
@@ -623,8 +626,10 @@ gst_mpeg2dec_chain (GstPad *pad, GstBuffer *buf)
        break;
       /* error */
       case STATE_INVALID:
-       gst_element_error (GST_ELEMENT (mpeg2dec), "decoding error");
-       done = TRUE;
+       g_warning ("mpeg2dec: decoding error");
+       /* it looks like setting a new frame in libmpeg2 avoids a crash */
+       /* FIXME figure out how this screws up sync and buffer leakage */
+       gst_mpeg2dec_alloc_buffer (mpeg2dec, info, GST_BUFFER_OFFSET (buf));
         break;
       default:
        g_warning ("%s: unhandled state %d, FIXME",