faac: enforce sync between wrapper view of data and encoder returned data
authorMark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
Sun, 6 Sep 2009 09:44:27 +0000 (11:44 +0200)
committerMark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
Tue, 8 Sep 2009 20:32:27 +0000 (22:32 +0200)
ext/faac/gstfaac.c

index 7b81d65..66fe2b6 100644 (file)
@@ -601,6 +601,13 @@ gst_faac_push_buffers (GstFaac * faac, gboolean force)
         break;
     }
 
+    /* in case encoder returns more data than is expected (which seems possible)
+     * ignore the extra part */
+    if (G_UNLIKELY (av == 0 && faac->offset == 0)) {
+      gst_buffer_unref (outbuf);
+      continue;
+    }
+
     /* after some caching, finally some data */
     /* adapter gives time */
     timestamp = gst_adapter_prev_timestamp (faac->adapter, &distance);
@@ -635,6 +642,12 @@ gst_faac_push_buffers (GstFaac * faac, gboolean force)
     ret = gst_pad_push (faac->srcpad, outbuf);
   }
 
+  /* in case encoder returns less than expected, clear our view as well */
+  if (G_UNLIKELY (force)) {
+    gst_adapter_clear (faac->adapter);
+    faac->offset = 0;
+  }
+
   return ret;
 
   /* ERRORS */