diff options
author | Max Kellermann <max@duempel.org> | 2008-08-26 08:27:11 +0200 |
---|---|---|
committer | Eric Wong <normalperson@yhbt.net> | 2008-08-30 18:45:09 -0700 |
commit | 0db89f3e2cc7375273e32f77628ca0583d7a7026 (patch) | |
tree | 69fc3927cd8c45c38a3872014a3849d3b66845b5 /src | |
parent | 5afa07de0569e2993532b77581dd03ae04653591 (diff) | |
download | mpd-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')
-rw-r--r-- | 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 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-> |