Find AAC frames in the input and skip invalid data.  This prepares AAC
streaming.
---

 src/inputPlugins/aac_plugin.c |   36 +++++++++++++++++++++++++++++++++++-
 1 files changed, 35 insertions(+), 1 deletions(-)

diff --git a/src/inputPlugins/aac_plugin.c b/src/inputPlugins/aac_plugin.c
index 9438eb7..8bdf224 100644
--- a/src/inputPlugins/aac_plugin.c
+++ b/src/inputPlugins/aac_plugin.c
@@ -111,6 +111,40 @@ static size_t adts_check_frame(AacBuffer * b)
                (b->buffer[5] >> 5);
 }
 
+/**
+ * Find the next AAC frame in the buffer.  Returns 0 if no frame is
+ * found or if not enough data is available.
+ */
+static size_t adts_find_frame(AacBuffer * b)
+{
+       const unsigned char *p;
+       size_t frame_length;
+
+       while ((p = memchr(b->buffer, 0xff, b->bytesIntoBuffer)) != NULL) {
+               /* discard data before 0xff */
+               if (p > b->buffer)
+                       aac_buffer_shift(b, p - b->buffer);
+
+               if (b->bytesIntoBuffer <= 7)
+                       /* not enough data yet */
+                       return 0;
+
+               /* is it a frame? */
+               frame_length = adts_check_frame(b);
+               if (frame_length > 0)
+                       /* yes, it is */
+                       return frame_length;
+
+               /* it's just some random 0xff byte; discard and and
+                  continue searching */
+               aac_buffer_shift(b, 1);
+       }
+
+       /* nothing at all; discard the whole buffer */
+       aac_buffer_shift(b, b->bytesIntoBuffer);
+       return 0;
+}
+
 static void adtsParse(AacBuffer * b, float *length)
 {
        unsigned int frames, frameLength;
@@ -121,7 +155,7 @@ static void adtsParse(AacBuffer * b, float *length)
        for (frames = 0;; frames++) {
                fillAacBuffer(b);
 
-               frameLength = adts_check_frame(b);
+               frameLength = adts_find_frame(b);
                if (frameLength > 0) {
                        if (frames == 0) {
                                sampleRate = adtsSampleRates[(b->


-------------------------------------------------------------------------
This SF.Net email is sponsored by the Moblin Your Move Developer's challenge
Build the coolest Linux based applications with Moblin SDK & win great prizes
Grand prize is a trip for two to an Open Source event anywhere in the world
http://moblin-contest.org/redirect.php?banner_id=100&url=/
_______________________________________________
Musicpd-dev-team mailing list
Musicpd-dev-team@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/musicpd-dev-team

Reply via email to