You need to sign in or sign up before continuing.
Commit 00c47b3c authored by Max Kellermann's avatar Max Kellermann

find AAC frames

Find AAC frames in the input and skip invalid data. This prepares AAC streaming.
parent f43e3904
...@@ -111,6 +111,40 @@ static size_t adts_check_frame(AacBuffer * b) ...@@ -111,6 +111,40 @@ static size_t adts_check_frame(AacBuffer * b)
(b->buffer[5] >> 5); (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) static void adtsParse(AacBuffer * b, float *length)
{ {
unsigned int frames, frameLength; unsigned int frames, frameLength;
...@@ -121,7 +155,7 @@ static void adtsParse(AacBuffer * b, float *length) ...@@ -121,7 +155,7 @@ static void adtsParse(AacBuffer * b, float *length)
for (frames = 0;; frames++) { for (frames = 0;; frames++) {
fillAacBuffer(b); fillAacBuffer(b);
frameLength = adts_check_frame(b); frameLength = adts_find_frame(b);
if (frameLength > 0) { if (frameLength > 0) {
if (frames == 0) { if (frames == 0) {
sampleRate = adtsSampleRates[(b-> sampleRate = adtsSampleRates[(b->
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment