aboutsummaryrefslogtreecommitdiffstats
path: root/src/inputPlugins/aac_plugin.c
diff options
context:
space:
mode:
authorMax Kellermann <max@duempel.org>2008-08-26 08:27:11 +0200
committerEric Wong <normalperson@yhbt.net>2008-08-30 18:45:09 -0700
commit0db89f3e2cc7375273e32f77628ca0583d7a7026 (patch)
tree69fc3927cd8c45c38a3872014a3849d3b66845b5 /src/inputPlugins/aac_plugin.c
parent5afa07de0569e2993532b77581dd03ae04653591 (diff)
downloadmpd-0db89f3e2cc7375273e32f77628ca0583d7a7026.tar.gz
mpd-0db89f3e2cc7375273e32f77628ca0583d7a7026.tar.xz
mpd-0db89f3e2cc7375273e32f77628ca0583d7a7026.zip
find AAC frames
Find AAC frames in the input and skip invalid data. This prepares AAC streaming.
Diffstat (limited to 'src/inputPlugins/aac_plugin.c')
-rw-r--r--src/inputPlugins/aac_plugin.c36
1 files changed, 35 insertions, 1 deletions
diff --git a/src/inputPlugins/aac_plugin.c b/src/inputPlugins/aac_plugin.c
index 82ebecafc..f6f731332 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->