gst/mpeg1videoparse/gstmp1videoparse.c: Committed wrong version last week... Grr...
authorRonald S. Bultje <rbultje@ronald.bitfreak.net>
Thu, 29 Jan 2004 16:00:55 +0000 (16:00 +0000)
committerRonald S. Bultje <rbultje@ronald.bitfreak.net>
Thu, 29 Jan 2004 16:00:55 +0000 (16:00 +0000)
Original commit message from CVS:
2004-01-29  Ronald Bultje  <rbultje@ronald.bitfreak.net>

* gst/mpeg1videoparse/gstmp1videoparse.c:
(gst_mp1videoparse_real_chain):
Committed wrong version last week... Grr... Didn't notice until now.

ChangeLog
gst/mpeg1videoparse/gstmp1videoparse.c

index 6aec007f2947981e7073f2a096392d159b8d101f..3d4234ff6a5cb5d8cdabbd748c21abba8283fd97 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+2004-01-29  Ronald Bultje  <rbultje@ronald.bitfreak.net>
+
+       * gst/mpeg1videoparse/gstmp1videoparse.c:
+       (gst_mp1videoparse_real_chain):
+         Committed wrong version last week... Grr... Didn't notice until now.
+
 2004-01-29  Julien MOUTTE <julien@moutte.net>
 
        * sys/ximage/ximagesink.c: (gst_ximagesink_xwindow_new):
index a90ed36ecf9ce227b37fc774637c7c905a84435b..1e993ef31db9cac34066c1bb87c8192dafa73c7a 100644 (file)
@@ -376,148 +376,154 @@ gst_mp1videoparse_real_chain (Mp1VideoParse *mp1videoparse, GstBuffer *buf, GstP
 
   GST_DEBUG ("mp1videoparse: received buffer of %ld bytes %" G_GINT64_FORMAT,size, GST_BUFFER_TIMESTAMP(buf));
 
-  head = GUINT32_FROM_BE(*((guint32 *)data));
-
-  GST_DEBUG ("mp1videoparse: head is %08x", (unsigned int)head);
-
-  if (!mp1videoparse_valid_sync(mp1videoparse, head,
-                               mp1videoparse->partialbuf) ||
-      mp1videoparse->need_resync) {
-    sync_pos = mp1videoparse_find_next_gop(mp1videoparse, mp1videoparse->partialbuf);
-    if (sync_pos >= 0) {
-      mp1videoparse->need_resync = FALSE;
-      GST_DEBUG ("mp1videoparse: found new gop at %d", sync_pos);
-
-      if (sync_pos != 0) {
-        temp = gst_buffer_create_sub(mp1videoparse->partialbuf, sync_pos, size-sync_pos);
-       g_assert(temp != NULL);
-       gst_buffer_unref(mp1videoparse->partialbuf);
-       mp1videoparse->partialbuf = temp;
-        data = GST_BUFFER_DATA(mp1videoparse->partialbuf);
-        size = GST_BUFFER_SIZE(mp1videoparse->partialbuf);
-       offset = 0;
+  do {
+    data = GST_BUFFER_DATA(mp1videoparse->partialbuf);
+    size = GST_BUFFER_SIZE(mp1videoparse->partialbuf);
+
+    head = GUINT32_FROM_BE(*((guint32 *)data));
+
+    GST_DEBUG ("mp1videoparse: head is %08x", (unsigned int)head);
+
+    if (!mp1videoparse_valid_sync(mp1videoparse, head,
+                                 mp1videoparse->partialbuf) ||
+        mp1videoparse->need_resync) {
+      sync_pos = mp1videoparse_find_next_gop(mp1videoparse, mp1videoparse->partialbuf);
+      if (sync_pos >= 0) {
+        mp1videoparse->need_resync = FALSE;
+        GST_DEBUG ("mp1videoparse: found new gop at %d", sync_pos);
+
+        if (sync_pos != 0) {
+          temp = gst_buffer_create_sub(mp1videoparse->partialbuf, sync_pos, size-sync_pos);
+         g_assert(temp != NULL);
+         gst_buffer_unref(mp1videoparse->partialbuf);
+         mp1videoparse->partialbuf = temp;
+          data = GST_BUFFER_DATA(mp1videoparse->partialbuf);
+          size = GST_BUFFER_SIZE(mp1videoparse->partialbuf);
+         offset = 0;
+        }
+
+        head = GUINT32_FROM_BE(*((guint32 *)data));
+        /* re-call this function so that if we hadn't already, we can
+         * now read the sequence header and parse video properties,
+         * set caps, stream data, be happy, bla, bla, bla... */
+        if (!mp1videoparse_valid_sync (mp1videoparse, head,
+                                      mp1videoparse->partialbuf))
+          g_error ("Found sync but no valid sync point at pos 0x0");
+      }
+      else {
+        GST_DEBUG ("mp1videoparse: could not sync");
+        gst_buffer_unref(mp1videoparse->partialbuf);
+        mp1videoparse->partialbuf = NULL;
+        return;
       }
-
-      head = GUINT32_FROM_BE(*((guint32 *)data));
-      /* re-call this function so that if we hadn't already, we can
-       * now read the sequence header and parse video properties,
-       * set caps, stream data, be happy, bla, bla, bla... */
-      if (!mp1videoparse_valid_sync (mp1videoparse, head,
-                                    mp1videoparse->partialbuf))
-        g_error ("Found sync but no valid sync point at pos 0x0");
-    }
-    else {
-      GST_DEBUG ("mp1videoparse: could not sync");
-      gst_buffer_unref(mp1videoparse->partialbuf);
-      mp1videoparse->partialbuf = NULL;
-      return;
     }
-  }
 
-  if (mp1videoparse->picture_in_buffer == 1 &&
-      time_stamp != GST_CLOCK_TIME_NONE) {
-    mp1videoparse->last_pts = time_stamp;
-  }
+    if (mp1videoparse->picture_in_buffer == 1 &&
+        time_stamp != GST_CLOCK_TIME_NONE) {
+      mp1videoparse->last_pts = time_stamp;
+    }
 
-  sync_state = 0;
-  have_sync = FALSE;
+    sync_state = 0;
+    have_sync = FALSE;
 
-  GST_DEBUG ("mp1videoparse: searching sync");
+    GST_DEBUG ("mp1videoparse: searching sync");
 
-  while (offset < size-1) {
-    sync_byte = *(data + offset);
-    if (sync_byte == 0) {
-      sync_state++;
-    }
-    else if ((sync_byte == 1) && (sync_state >=2)) {
-      GST_DEBUG ("mp1videoparse: code 0x000001%02x",data[offset+1]);
-      if (data[offset+1] == (PICTURE_START_CODE & 0xff)) {
-       mp1videoparse->picture_in_buffer++;
-       if (mp1videoparse->picture_in_buffer == 1) {
-         if (time_stamp != GST_CLOCK_TIME_NONE) {
-            mp1videoparse->last_pts = time_stamp;
-         }
-         sync_state = 0;
-       }
-       else if (mp1videoparse->picture_in_buffer == 2) {
-          have_sync = TRUE;
-          break;
-       }
-       else {
-          GST_DEBUG ("mp1videoparse: %d in buffer", mp1videoparse->picture_in_buffer);
-          g_assert_not_reached();
-       }
+    while (offset < size-1) {
+      sync_byte = *(data + offset);
+      if (sync_byte == 0) {
+        sync_state++;
       }
-      /* A new sequence (or GOP) is a valid sync too. Note that the
-       * sequence header should be put in the next buffer, not here. */
-      else if (data[offset+1] == (SEQ_START_CODE & 0xFF) ||
-              data[offset+1] == (GOP_START_CODE & 0xFF)) {
-        if (mp1videoparse->picture_in_buffer == 0 &&
-           data[offset+1] == (GOP_START_CODE & 0xFF)) {
-         mp1videoparse->last_pts = gst_mp1videoparse_time_code (&data[2],
+      else if ((sync_byte == 1) && (sync_state >=2)) {
+        GST_DEBUG ("mp1videoparse: code 0x000001%02x",data[offset+1]);
+        if (data[offset+1] == (PICTURE_START_CODE & 0xff)) {
+         mp1videoparse->picture_in_buffer++;
+         if (mp1videoparse->picture_in_buffer == 1) {
+           if (time_stamp != GST_CLOCK_TIME_NONE) {
+              mp1videoparse->last_pts = time_stamp;
+           }
+           sync_state = 0;
+         }
+         else if (mp1videoparse->picture_in_buffer == 2) {
+            have_sync = TRUE;
+            break;
+         }
+         else {
+            GST_DEBUG ("mp1videoparse: %d in buffer", mp1videoparse->picture_in_buffer);
+            g_assert_not_reached();
+         }
+        }
+        /* A new sequence (or GOP) is a valid sync too. Note that the
+         * sequence header should be put in the next buffer, not here. */
+        else if (data[offset+1] == (SEQ_START_CODE & 0xFF) ||
+                data[offset+1] == (GOP_START_CODE & 0xFF)) {
+          if (mp1videoparse->picture_in_buffer == 0 &&
+             data[offset+1] == (GOP_START_CODE & 0xFF)) {
+           mp1videoparse->last_pts = gst_mp1videoparse_time_code (&data[2],
                                                mp1videoparse->fps);
-       }
-        else if (mp1videoparse->picture_in_buffer == 1) {
-         have_sync = TRUE;
-         break;
-       } else {
-         g_assert (mp1videoparse->picture_in_buffer == 0);
-       }
-      }
-      /* end-of-sequence is a valid sync point and should be included
-       * in the current picture, not the next. */
-      else if (data[offset+1] == (SEQ_END_CODE & 0xFF)) {
-        if (mp1videoparse->picture_in_buffer == 1) {
-          offset += 4;
-         have_sync = TRUE;
-         break;
-       } else {
-         g_assert (mp1videoparse->picture_in_buffer == 0);
-       }
+         }
+          else if (mp1videoparse->picture_in_buffer == 1) {
+           have_sync = TRUE;
+           break;
+         } else {
+           g_assert (mp1videoparse->picture_in_buffer == 0);
+         }
+        }
+        /* end-of-sequence is a valid sync point and should be included
+         * in the current picture, not the next. */
+        else if (data[offset+1] == (SEQ_END_CODE & 0xFF)) {
+          if (mp1videoparse->picture_in_buffer == 1) {
+            offset += 4;
+           have_sync = TRUE;
+           break;
+         } else {
+           g_assert (mp1videoparse->picture_in_buffer == 0);
+         }
+        }
+        else sync_state = 0;
       }
+      /* something else... */
       else sync_state = 0;
+      /* go down the buffer */
+      offset++;
     }
-    /* something else... */
-    else sync_state = 0;
-    /* go down the buffer */
-    offset++;
-  }
 
-  if (have_sync) {
-    offset -= 2;
-    outbuf = gst_buffer_create_sub(mp1videoparse->partialbuf, 0, offset);
-    g_assert(outbuf != NULL);
-    GST_BUFFER_TIMESTAMP(outbuf) = mp1videoparse->last_pts;
-    GST_BUFFER_DURATION(outbuf) = GST_SECOND / mp1videoparse->fps;
-    mp1videoparse->last_pts += GST_BUFFER_DURATION (outbuf);
-
-    if (mp1videoparse->in_flush) {
-      /* FIXME, send a flush event here */
-      mp1videoparse->in_flush = FALSE;
-    }
+    if (have_sync) {
+      offset -= 2;
+      GST_DEBUG ("mp1videoparse: synced at %ld code 0x000001%02x",offset,data[offset+3]);
 
-    if (GST_PAD_CAPS (outpad) != NULL) {
-      GST_DEBUG ("mp1videoparse: pushing  %d bytes %" G_GUINT64_FORMAT, GST_BUFFER_SIZE(outbuf), GST_BUFFER_TIMESTAMP(outbuf));
-      gst_pad_push(outpad, GST_DATA (outbuf));
-      GST_DEBUG ("mp1videoparse: pushing  done");
-    } else {
-      GST_DEBUG ("No capsnego yet, delaying buffer push");
-      gst_buffer_unref (outbuf);
-    }
-    mp1videoparse->picture_in_buffer = 0;
+      outbuf = gst_buffer_create_sub(mp1videoparse->partialbuf, 0, offset+4);
+      g_assert(outbuf != NULL);
+      GST_BUFFER_TIMESTAMP(outbuf) = mp1videoparse->last_pts;
+      GST_BUFFER_DURATION(outbuf) = GST_SECOND / mp1videoparse->fps;
+      mp1videoparse->last_pts += GST_BUFFER_DURATION (outbuf);
+
+      if (mp1videoparse->in_flush) {
+        /* FIXME, send a flush event here */
+        mp1videoparse->in_flush = FALSE;
+      }
+
+      if (GST_PAD_CAPS (outpad) != NULL) {
+        GST_DEBUG ("mp1videoparse: pushing  %d bytes %" G_GUINT64_FORMAT, GST_BUFFER_SIZE(outbuf), GST_BUFFER_TIMESTAMP(outbuf));
+       gst_pad_push(outpad, GST_DATA (outbuf));
+        GST_DEBUG ("mp1videoparse: pushing  done");
+      } else {
+        GST_DEBUG ("No capsnego yet, delaying buffer push");
+        gst_buffer_unref (outbuf);
+      }
+      mp1videoparse->picture_in_buffer = 0;
 
-    if (size > offset)
       temp = gst_buffer_create_sub(mp1videoparse->partialbuf, offset, size-offset);
-    else
-      temp = NULL;
-    gst_buffer_unref(mp1videoparse->partialbuf);
-    mp1videoparse->partialbuf = temp;
-  }
-  else {
-    if (time_stamp != GST_CLOCK_TIME_NONE) {
-      mp1videoparse->last_pts = time_stamp;
+      gst_buffer_unref(mp1videoparse->partialbuf);
+      mp1videoparse->partialbuf = temp;
+      offset = 0;
     }
-  }
+    else {
+      if (time_stamp != GST_CLOCK_TIME_NONE) {
+        mp1videoparse->last_pts = time_stamp;
+       break;
+      }
+    }
+  } while (1);
 }
 
 static GstElementStateReturn