rtph263depay: detect frame start using Picture Start Code
authorMark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
Fri, 16 Apr 2010 15:06:11 +0000 (17:06 +0200)
committerMark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
Fri, 30 Apr 2010 11:49:54 +0000 (13:49 +0200)
So we stop dropping fragments as soon as there is a picture start (code).
In particular, this prevents dropping the first frame following
initial DISCONT.

gst/rtp/gstrtph263depay.c

index f061e97..2f49567 100644 (file)
@@ -248,15 +248,21 @@ gst_rtp_h263_depay_process (GstBaseRTPDepayload * depayload, GstBuffer * buf)
   GST_LOG ("payload_len : %d, header_len : %d , leftover : 0x%x",
       payload_len, header_len, rtph263depay->leftover);
 
-  if (G_UNLIKELY (!rtph263depay->start)) {
-    GST_DEBUG ("no frame start yet, skipping payload");
-    goto skip;
-  }
-
   /* skip header */
   payload += header_len;
   payload_len -= header_len;
 
+  if (!rtph263depay->start) {
+    /* do not skip this fragment if it is a Mode A with picture start code */
+    if (!F && payload_len > 4 && (GST_READ_UINT32_BE (payload) >> 10 == 0x20)) {
+      GST_DEBUG ("Mode A with PSC => frame start");
+      rtph263depay->start = TRUE;
+    } else {
+      GST_DEBUG ("no frame start yet, skipping payload");
+      goto skip;
+    }
+  }
+
   if (SBIT) {
     /* take the leftover and merge it at the beginning, FIXME make the buffer
      * data writable. */