1cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber/*
2cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber * Copyright (C) 2010 The Android Open Source Project
3cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber *
4cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber * Licensed under the Apache License, Version 2.0 (the "License");
5cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber * you may not use this file except in compliance with the License.
6cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber * You may obtain a copy of the License at
7cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber *
8cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber *      http://www.apache.org/licenses/LICENSE-2.0
9cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber *
10cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber * Unless required by applicable law or agreed to in writing, software
11cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber * distributed under the License is distributed on an "AS IS" BASIS,
12cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber * See the License for the specific language governing permissions and
14cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber * limitations under the License.
15cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber */
16cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber
1755e26193c885b7d5acdae9978848e6587987790fAndreas Huber//#define LOG_NDEBUG 0
1855e26193c885b7d5acdae9978848e6587987790fAndreas Huber#define LOG_TAG "AMPEG4AudioAssembler"
1955e26193c885b7d5acdae9978848e6587987790fAndreas Huber
20cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber#include "AMPEG4AudioAssembler.h"
21cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber
22cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber#include "ARTPSource.h"
23cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber
24fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber#include <media/stagefright/foundation/hexdump.h>
25fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber#include <media/stagefright/foundation/ABitReader.h>
26cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber#include <media/stagefright/foundation/ABuffer.h>
27cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber#include <media/stagefright/foundation/ADebug.h>
28cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber#include <media/stagefright/foundation/AMessage.h>
29fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber#include <media/stagefright/MediaErrors.h>
30fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber
31fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber#include <ctype.h>
32cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber
33cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Hubernamespace android {
34cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber
35fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huberstatic bool GetAttribute(const char *s, const char *key, AString *value) {
36fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber    value->clear();
37fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber
38fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber    size_t keyLen = strlen(key);
39fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber
40fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber    for (;;) {
41fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber        while (isspace(*s)) {
42fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber            ++s;
43fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber        }
44fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber
45fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber        const char *colonPos = strchr(s, ';');
46fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber
47fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber        size_t len =
48fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber            (colonPos == NULL) ? strlen(s) : colonPos - s;
49fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber
50fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber        if (len >= keyLen + 1 && s[keyLen] == '=' && !strncmp(s, key, keyLen)) {
51fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber            value->setTo(&s[keyLen + 1], len - keyLen - 1);
52fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber            return true;
53fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber        }
54fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber
55fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber        if (colonPos == NULL) {
56fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber            return false;
57fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber        }
58fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber
59fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber        s = colonPos + 1;
60fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber    }
61fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber}
62fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber
63fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huberstatic sp<ABuffer> decodeHex(const AString &s) {
64fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber    if ((s.size() % 2) != 0) {
65fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber        return NULL;
66fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber    }
67fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber
68fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber    size_t outLen = s.size() / 2;
69fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber    sp<ABuffer> buffer = new ABuffer(outLen);
70fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber    uint8_t *out = buffer->data();
71fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber
72fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber    uint8_t accum = 0;
73fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber    for (size_t i = 0; i < s.size(); ++i) {
74fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber        char c = s.c_str()[i];
75fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber        unsigned value;
76fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber        if (c >= '0' && c <= '9') {
77fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber            value = c - '0';
78fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber        } else if (c >= 'a' && c <= 'f') {
79fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber            value = c - 'a' + 10;
80fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber        } else if (c >= 'A' && c <= 'F') {
81fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber            value = c - 'A' + 10;
82fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber        } else {
83fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber            return NULL;
84fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber        }
85fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber
86fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber        accum = (accum << 4) | value;
87fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber
88fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber        if (i & 1) {
89fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber            *out++ = accum;
90fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber
91fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber            accum = 0;
92fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber        }
93fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber    }
94fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber
95fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber    return buffer;
96fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber}
97fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber
98fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huberstatic status_t parseAudioObjectType(
99fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber        ABitReader *bits, unsigned *audioObjectType) {
100fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber    *audioObjectType = bits->getBits(5);
101fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber    if ((*audioObjectType) == 31) {
102fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber        *audioObjectType = 32 + bits->getBits(6);
103fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber    }
104fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber
105fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber    return OK;
106fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber}
107fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber
108fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huberstatic status_t parseGASpecificConfig(
109fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber        ABitReader *bits,
110fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber        unsigned audioObjectType, unsigned channelConfiguration) {
111b3f9759c8c9437c45b9a34519ce2ea38a8314d4eAndreas Gampe    unsigned frameLengthFlag __unused = bits->getBits(1);
112fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber    unsigned dependsOnCoreCoder = bits->getBits(1);
113fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber    if (dependsOnCoreCoder) {
114fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber        /* unsigned coreCoderDelay = */bits->getBits(1);
115fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber    }
116fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber    unsigned extensionFlag = bits->getBits(1);
117fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber
118fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber    if (!channelConfiguration) {
119fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber        // program_config_element
120fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber        return ERROR_UNSUPPORTED;  // XXX to be implemented
121fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber    }
122fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber
123fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber    if (audioObjectType == 6 || audioObjectType == 20) {
124fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber        /* unsigned layerNr = */bits->getBits(3);
125fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber    }
126fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber
127fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber    if (extensionFlag) {
128fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber        if (audioObjectType == 22) {
129fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber            /* unsigned numOfSubFrame = */bits->getBits(5);
130fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber            /* unsigned layerLength = */bits->getBits(11);
131fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber        } else if (audioObjectType == 17 || audioObjectType == 19
132fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber                || audioObjectType == 20 || audioObjectType == 23) {
133fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber            /* unsigned aacSectionDataResilienceFlag = */bits->getBits(1);
134fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber            /* unsigned aacScalefactorDataResilienceFlag = */bits->getBits(1);
135fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber            /* unsigned aacSpectralDataResilienceFlag = */bits->getBits(1);
136fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber        }
137fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber
138fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber        unsigned extensionFlag3 = bits->getBits(1);
139fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber        CHECK_EQ(extensionFlag3, 0u);  // TBD in version 3
140fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber    }
141fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber
142fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber    return OK;
143fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber}
144fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber
14555e26193c885b7d5acdae9978848e6587987790fAndreas Huberstatic status_t parseAudioSpecificConfig(ABitReader *bits, sp<ABuffer> *asc) {
14655e26193c885b7d5acdae9978848e6587987790fAndreas Huber    const uint8_t *dataStart = bits->data();
14755e26193c885b7d5acdae9978848e6587987790fAndreas Huber    size_t totalNumBits = bits->numBitsLeft();
14855e26193c885b7d5acdae9978848e6587987790fAndreas Huber
149fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber    unsigned audioObjectType;
150fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber    CHECK_EQ(parseAudioObjectType(bits, &audioObjectType), (status_t)OK);
151fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber
152fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber    unsigned samplingFreqIndex = bits->getBits(4);
153fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber    if (samplingFreqIndex == 0x0f) {
154fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber        /* unsigned samplingFrequency = */bits->getBits(24);
155fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber    }
156fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber
157fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber    unsigned channelConfiguration = bits->getBits(4);
158fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber
159fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber    unsigned extensionAudioObjectType = 0;
160fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber    unsigned sbrPresent = 0;
161fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber
162fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber    if (audioObjectType == 5) {
163fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber        extensionAudioObjectType = audioObjectType;
164fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber        sbrPresent = 1;
165fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber        unsigned extensionSamplingFreqIndex = bits->getBits(4);
166fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber        if (extensionSamplingFreqIndex == 0x0f) {
167fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber            /* unsigned extensionSamplingFrequency = */bits->getBits(24);
168fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber        }
169fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber        CHECK_EQ(parseAudioObjectType(bits, &audioObjectType), (status_t)OK);
170fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber    }
171fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber
172fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber    CHECK((audioObjectType >= 1 && audioObjectType <= 4)
173fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber        || (audioObjectType >= 6 && audioObjectType <= 7)
174fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber        || audioObjectType == 17
175fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber        || (audioObjectType >= 19 && audioObjectType <= 23));
176fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber
177fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber    CHECK_EQ(parseGASpecificConfig(
178fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber                bits, audioObjectType, channelConfiguration), (status_t)OK);
179fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber
180fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber    if (audioObjectType == 17
181fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber            || (audioObjectType >= 19 && audioObjectType <= 27)) {
182fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber        unsigned epConfig = bits->getBits(2);
183fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber        if (epConfig == 2 || epConfig == 3) {
184fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber            // ErrorProtectionSpecificConfig
185fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber            return ERROR_UNSUPPORTED;  // XXX to be implemented
186fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber
187fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber            if (epConfig == 3) {
188fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber                unsigned directMapping = bits->getBits(1);
189fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber                CHECK_EQ(directMapping, 1u);
190fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber            }
191fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber        }
192fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber    }
193fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber
194fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber    if (extensionAudioObjectType != 5 && bits->numBitsLeft() >= 16) {
19555e26193c885b7d5acdae9978848e6587987790fAndreas Huber        size_t numBitsLeftAtStart = bits->numBitsLeft();
19655e26193c885b7d5acdae9978848e6587987790fAndreas Huber
197fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber        unsigned syncExtensionType = bits->getBits(11);
198fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber        if (syncExtensionType == 0x2b7) {
199df64d15042bbd5e0e4933ac49bf3c177dd94752cSteve Block            ALOGI("found syncExtension");
20055e26193c885b7d5acdae9978848e6587987790fAndreas Huber
201fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber            CHECK_EQ(parseAudioObjectType(bits, &extensionAudioObjectType),
202fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber                     (status_t)OK);
203fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber
204fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber            sbrPresent = bits->getBits(1);
205fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber
206fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber            if (sbrPresent == 1) {
207fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber                unsigned extensionSamplingFreqIndex = bits->getBits(4);
208fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber                if (extensionSamplingFreqIndex == 0x0f) {
209fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber                    /* unsigned extensionSamplingFrequency = */bits->getBits(24);
210fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber                }
211fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber            }
21255e26193c885b7d5acdae9978848e6587987790fAndreas Huber
21355e26193c885b7d5acdae9978848e6587987790fAndreas Huber            size_t numBitsInExtension =
21455e26193c885b7d5acdae9978848e6587987790fAndreas Huber                numBitsLeftAtStart - bits->numBitsLeft();
21555e26193c885b7d5acdae9978848e6587987790fAndreas Huber
21655e26193c885b7d5acdae9978848e6587987790fAndreas Huber            if (numBitsInExtension & 7) {
21755e26193c885b7d5acdae9978848e6587987790fAndreas Huber                // Apparently an extension is always considered an even
21855e26193c885b7d5acdae9978848e6587987790fAndreas Huber                // multiple of 8 bits long.
21955e26193c885b7d5acdae9978848e6587987790fAndreas Huber
220cd8d9c6cfe5ca53f17be1ea8edac6b324e203f52Chih-Hung Hsieh                ALOGI("Skipping %zu bits after sync extension",
22155e26193c885b7d5acdae9978848e6587987790fAndreas Huber                     8 - (numBitsInExtension & 7));
22255e26193c885b7d5acdae9978848e6587987790fAndreas Huber
22355e26193c885b7d5acdae9978848e6587987790fAndreas Huber                bits->skipBits(8 - (numBitsInExtension & 7));
22455e26193c885b7d5acdae9978848e6587987790fAndreas Huber            }
22555e26193c885b7d5acdae9978848e6587987790fAndreas Huber        } else {
22655e26193c885b7d5acdae9978848e6587987790fAndreas Huber            bits->putBits(syncExtensionType, 11);
22755e26193c885b7d5acdae9978848e6587987790fAndreas Huber        }
22855e26193c885b7d5acdae9978848e6587987790fAndreas Huber    }
22955e26193c885b7d5acdae9978848e6587987790fAndreas Huber
23055e26193c885b7d5acdae9978848e6587987790fAndreas Huber    if (asc != NULL) {
23155e26193c885b7d5acdae9978848e6587987790fAndreas Huber        size_t bitpos = totalNumBits & 7;
23255e26193c885b7d5acdae9978848e6587987790fAndreas Huber
23355e26193c885b7d5acdae9978848e6587987790fAndreas Huber        ABitReader bs(dataStart, (totalNumBits + 7) / 8);
23455e26193c885b7d5acdae9978848e6587987790fAndreas Huber
23555e26193c885b7d5acdae9978848e6587987790fAndreas Huber        totalNumBits -= bits->numBitsLeft();
23655e26193c885b7d5acdae9978848e6587987790fAndreas Huber
23755e26193c885b7d5acdae9978848e6587987790fAndreas Huber        size_t numBytes = (totalNumBits + 7) / 8;
23855e26193c885b7d5acdae9978848e6587987790fAndreas Huber
23955e26193c885b7d5acdae9978848e6587987790fAndreas Huber        *asc = new ABuffer(numBytes);
24055e26193c885b7d5acdae9978848e6587987790fAndreas Huber
24155e26193c885b7d5acdae9978848e6587987790fAndreas Huber        if (bitpos & 7) {
24255e26193c885b7d5acdae9978848e6587987790fAndreas Huber            bs.skipBits(8 - (bitpos & 7));
24355e26193c885b7d5acdae9978848e6587987790fAndreas Huber        }
24455e26193c885b7d5acdae9978848e6587987790fAndreas Huber
24555e26193c885b7d5acdae9978848e6587987790fAndreas Huber        uint8_t *dstPtr = (*asc)->data();
24655e26193c885b7d5acdae9978848e6587987790fAndreas Huber        while (numBytes > 0) {
24755e26193c885b7d5acdae9978848e6587987790fAndreas Huber            *dstPtr++ = bs.getBits(8);
24855e26193c885b7d5acdae9978848e6587987790fAndreas Huber            --numBytes;
249fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber        }
250fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber    }
251fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber
252fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber    return OK;
253fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber}
254fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber
255fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huberstatic status_t parseStreamMuxConfig(
256fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber        ABitReader *bits,
257fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber        unsigned *numSubFrames,
258fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber        unsigned *frameLengthType,
25955e26193c885b7d5acdae9978848e6587987790fAndreas Huber        ssize_t *fixedFrameLength,
260fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber        bool *otherDataPresent,
261fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber        unsigned *otherDataLenBits) {
262fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber    unsigned audioMuxVersion = bits->getBits(1);
263fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber
264fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber    unsigned audioMuxVersionA = 0;
265fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber    if (audioMuxVersion == 1) {
266fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber        audioMuxVersionA = bits->getBits(1);
267fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber    }
268fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber
269fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber    CHECK_EQ(audioMuxVersionA, 0u);  // otherwise future spec
270fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber
271fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber    if (audioMuxVersion != 0) {
272fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber        return ERROR_UNSUPPORTED;  // XXX to be implemented;
273fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber    }
274fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber    CHECK_EQ(audioMuxVersion, 0u);  // XXX to be implemented
275fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber
276fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber    unsigned allStreamsSameTimeFraming = bits->getBits(1);
277fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber    CHECK_EQ(allStreamsSameTimeFraming, 1u);  // There's only one stream.
278fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber
279fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber    *numSubFrames = bits->getBits(6);
280fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber    unsigned numProgram = bits->getBits(4);
281fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber    CHECK_EQ(numProgram, 0u);  // disabled in RTP LATM
282fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber
283fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber    unsigned numLayer = bits->getBits(3);
284fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber    CHECK_EQ(numLayer, 0u);  // disabled in RTP LATM
285fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber
286fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber    if (audioMuxVersion == 0) {
287fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber        // AudioSpecificConfig
28855e26193c885b7d5acdae9978848e6587987790fAndreas Huber        CHECK_EQ(parseAudioSpecificConfig(bits, NULL /* asc */), (status_t)OK);
289fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber    } else {
290fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber        TRESPASS();  // XXX to be implemented
291fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber    }
292fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber
293fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber    *frameLengthType = bits->getBits(3);
29455e26193c885b7d5acdae9978848e6587987790fAndreas Huber    *fixedFrameLength = -1;
29555e26193c885b7d5acdae9978848e6587987790fAndreas Huber
296fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber    switch (*frameLengthType) {
297fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber        case 0:
298fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber        {
299fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber            /* unsigned bufferFullness = */bits->getBits(8);
300fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber
301fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber            // The "coreFrameOffset" does not apply since there's only
302fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber            // a single layer.
303fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber            break;
304fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber        }
305fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber
306fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber        case 1:
307fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber        {
30855e26193c885b7d5acdae9978848e6587987790fAndreas Huber            *fixedFrameLength = bits->getBits(9);
30955e26193c885b7d5acdae9978848e6587987790fAndreas Huber            break;
31055e26193c885b7d5acdae9978848e6587987790fAndreas Huber        }
31155e26193c885b7d5acdae9978848e6587987790fAndreas Huber
31255e26193c885b7d5acdae9978848e6587987790fAndreas Huber        case 2:
31355e26193c885b7d5acdae9978848e6587987790fAndreas Huber        {
314a45a600d69a5d8ab99eeb7e0dfa58c3cb99a2e61Erik Rydgren            return ERROR_UNSUPPORTED;
315fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber        }
316fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber
317fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber        case 3:
318fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber        case 4:
319fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber        case 5:
320fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber        {
321fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber            /* unsigned CELPframeLengthTableIndex = */bits->getBits(6);
322fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber            break;
323fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber        }
324fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber
325fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber        case 6:
326fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber        case 7:
327fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber        {
328fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber            /* unsigned HVXCframeLengthTableIndex = */bits->getBits(1);
329fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber            break;
330fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber        }
331fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber
332fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber        default:
333fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber            break;
334fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber    }
335fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber
336fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber    *otherDataPresent = bits->getBits(1);
337fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber    *otherDataLenBits = 0;
338fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber    if (*otherDataPresent) {
339fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber        if (audioMuxVersion == 1) {
340fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber            TRESPASS();  // XXX to be implemented
341fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber        } else {
342fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber            *otherDataLenBits = 0;
343fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber
344fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber            unsigned otherDataLenEsc;
345fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber            do {
346fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber                (*otherDataLenBits) <<= 8;
347fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber                otherDataLenEsc = bits->getBits(1);
348fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber                unsigned otherDataLenTmp = bits->getBits(8);
349fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber                (*otherDataLenBits) += otherDataLenTmp;
350fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber            } while (otherDataLenEsc);
351fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber        }
352fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber    }
353fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber
354fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber    unsigned crcCheckPresent = bits->getBits(1);
355fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber    if (crcCheckPresent) {
356fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber        /* unsigned crcCheckSum = */bits->getBits(8);
357fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber    }
358fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber
359fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber    return OK;
360fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber}
361fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber
362fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Hubersp<ABuffer> AMPEG4AudioAssembler::removeLATMFraming(const sp<ABuffer> &buffer) {
363fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber    CHECK(!mMuxConfigPresent);  // XXX to be implemented
364fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber
365fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber    sp<ABuffer> out = new ABuffer(buffer->size());
366fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber    out->setRange(0, 0);
367fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber
368fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber    size_t offset = 0;
369fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber    uint8_t *ptr = buffer->data();
370fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber
371fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber    for (size_t i = 0; i <= mNumSubFrames; ++i) {
372fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber        // parse PayloadLengthInfo
373fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber
374fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber        unsigned payloadLength = 0;
375fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber
376fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber        switch (mFrameLengthType) {
377fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber            case 0:
378fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber            {
379fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber                unsigned muxSlotLengthBytes = 0;
380fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber                unsigned tmp;
381fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber                do {
3828aa5af703ba29d7bd7b5efaefd76aac2d568f11fSunil Shah                    if (offset >= buffer->size()) {
3838aa5af703ba29d7bd7b5efaefd76aac2d568f11fSunil Shah                        ALOGW("Malformed buffer received");
3848aa5af703ba29d7bd7b5efaefd76aac2d568f11fSunil Shah                        return out;
3858aa5af703ba29d7bd7b5efaefd76aac2d568f11fSunil Shah                    }
386fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber                    tmp = ptr[offset++];
387fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber                    muxSlotLengthBytes += tmp;
388fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber                } while (tmp == 0xff);
389fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber
390fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber                payloadLength = muxSlotLengthBytes;
391fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber                break;
392fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber            }
393fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber
39455e26193c885b7d5acdae9978848e6587987790fAndreas Huber            case 2:
39555e26193c885b7d5acdae9978848e6587987790fAndreas Huber            {
39655e26193c885b7d5acdae9978848e6587987790fAndreas Huber                // reserved
39755e26193c885b7d5acdae9978848e6587987790fAndreas Huber
39855e26193c885b7d5acdae9978848e6587987790fAndreas Huber                TRESPASS();
39955e26193c885b7d5acdae9978848e6587987790fAndreas Huber                break;
40055e26193c885b7d5acdae9978848e6587987790fAndreas Huber            }
40155e26193c885b7d5acdae9978848e6587987790fAndreas Huber
402fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber            default:
40355e26193c885b7d5acdae9978848e6587987790fAndreas Huber            {
40455e26193c885b7d5acdae9978848e6587987790fAndreas Huber                CHECK_GE(mFixedFrameLength, 0);
40555e26193c885b7d5acdae9978848e6587987790fAndreas Huber
40655e26193c885b7d5acdae9978848e6587987790fAndreas Huber                payloadLength = mFixedFrameLength;
407fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber                break;
40855e26193c885b7d5acdae9978848e6587987790fAndreas Huber            }
409fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber        }
4104d46f6f18f5160b8992ec1e66ef1844212fc7d48Marco Nelissen
4114d46f6f18f5160b8992ec1e66ef1844212fc7d48Marco Nelissen        CHECK_LT(offset, buffer->size());
4124d46f6f18f5160b8992ec1e66ef1844212fc7d48Marco Nelissen        CHECK_LE(payloadLength, buffer->size() - offset);
413fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber
414fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber        memcpy(out->data() + out->size(), &ptr[offset], payloadLength);
415fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber        out->setRange(0, out->size() + payloadLength);
416fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber
417fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber        offset += payloadLength;
418fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber
419fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber        if (mOtherDataPresent) {
420fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber            // We want to stay byte-aligned.
421fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber
422fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber            CHECK((mOtherDataLenBits % 8) == 0);
423fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber            CHECK_LE(offset + (mOtherDataLenBits / 8), buffer->size());
424fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber            offset += mOtherDataLenBits / 8;
425fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber        }
426fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber    }
427fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber
4289202cca86e9017cc5ce30970c92a91ab32a0835eAndreas Huber    if (offset < buffer->size()) {
429cd8d9c6cfe5ca53f17be1ea8edac6b324e203f52Chih-Hung Hsieh        ALOGI("ignoring %zu bytes of trailing data", buffer->size() - offset);
4309202cca86e9017cc5ce30970c92a91ab32a0835eAndreas Huber    }
4319202cca86e9017cc5ce30970c92a91ab32a0835eAndreas Huber    CHECK_LE(offset, buffer->size());
432fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber
433fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber    return out;
434fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber}
435fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber
436fc9ac988e08a8b4c42e58999300265989f26f24cAndreas HuberAMPEG4AudioAssembler::AMPEG4AudioAssembler(
437fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber        const sp<AMessage> &notify, const AString &params)
438cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber    : mNotifyMsg(notify),
439fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber      mMuxConfigPresent(false),
440cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber      mAccessUnitRTPTime(0),
441cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber      mNextExpectedSeqNoValid(false),
442cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber      mNextExpectedSeqNo(0),
443cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber      mAccessUnitDamaged(false) {
444fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber    AString val;
445fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber    if (!GetAttribute(params.c_str(), "cpresent", &val)) {
446fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber        mMuxConfigPresent = true;
447fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber    } else if (val == "0") {
448fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber        mMuxConfigPresent = false;
449fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber    } else {
450fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber        CHECK(val == "1");
451fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber        mMuxConfigPresent = true;
452fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber    }
453fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber
454fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber    CHECK(GetAttribute(params.c_str(), "config", &val));
455fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber
456fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber    sp<ABuffer> config = decodeHex(val);
457fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber    CHECK(config != NULL);
458fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber
459fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber    ABitReader bits(config->data(), config->size());
460fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber    status_t err = parseStreamMuxConfig(
461fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber            &bits, &mNumSubFrames, &mFrameLengthType,
46255e26193c885b7d5acdae9978848e6587987790fAndreas Huber            &mFixedFrameLength,
463fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber            &mOtherDataPresent, &mOtherDataLenBits);
464fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber
465a45a600d69a5d8ab99eeb7e0dfa58c3cb99a2e61Erik Rydgren    if (err == ERROR_UNSUPPORTED) {
466a45a600d69a5d8ab99eeb7e0dfa58c3cb99a2e61Erik Rydgren        ALOGW("Failed to parse stream mux config, using default values for playback.");
467a45a600d69a5d8ab99eeb7e0dfa58c3cb99a2e61Erik Rydgren        mMuxConfigPresent = false;
468a45a600d69a5d8ab99eeb7e0dfa58c3cb99a2e61Erik Rydgren        mNumSubFrames = 0;
469a45a600d69a5d8ab99eeb7e0dfa58c3cb99a2e61Erik Rydgren        mFrameLengthType = 0;
470a45a600d69a5d8ab99eeb7e0dfa58c3cb99a2e61Erik Rydgren        mOtherDataPresent = false;
471a45a600d69a5d8ab99eeb7e0dfa58c3cb99a2e61Erik Rydgren        mOtherDataLenBits = 0;
472a45a600d69a5d8ab99eeb7e0dfa58c3cb99a2e61Erik Rydgren        return;
473a45a600d69a5d8ab99eeb7e0dfa58c3cb99a2e61Erik Rydgren    }
474fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber    CHECK_EQ(err, (status_t)NO_ERROR);
475cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber}
476cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber
477cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas HuberAMPEG4AudioAssembler::~AMPEG4AudioAssembler() {
478cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber}
479cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber
480cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas HuberARTPAssembler::AssemblyStatus AMPEG4AudioAssembler::assembleMore(
481cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber        const sp<ARTPSource> &source) {
482cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber    AssemblyStatus status = addPacket(source);
483cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber    if (status == MALFORMED_PACKET) {
484cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber        mAccessUnitDamaged = true;
485cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber    }
486cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber    return status;
487cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber}
488cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber
489cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas HuberARTPAssembler::AssemblyStatus AMPEG4AudioAssembler::addPacket(
490cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber        const sp<ARTPSource> &source) {
491cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber    List<sp<ABuffer> > *queue = source->queue();
492cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber
493cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber    if (queue->empty()) {
494cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber        return NOT_ENOUGH_DATA;
495cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber    }
496cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber
497cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber    if (mNextExpectedSeqNoValid) {
498cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber        List<sp<ABuffer> >::iterator it = queue->begin();
499cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber        while (it != queue->end()) {
500cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber            if ((uint32_t)(*it)->int32Data() >= mNextExpectedSeqNo) {
501cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber                break;
502cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber            }
503cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber
504cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber            it = queue->erase(it);
505cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber        }
506cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber
507cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber        if (queue->empty()) {
508cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber            return NOT_ENOUGH_DATA;
509cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber        }
510cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber    }
511cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber
512cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber    sp<ABuffer> buffer = *queue->begin();
513cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber
514cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber    if (!mNextExpectedSeqNoValid) {
515cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber        mNextExpectedSeqNoValid = true;
516cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber        mNextExpectedSeqNo = (uint32_t)buffer->int32Data();
517cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber    } else if ((uint32_t)buffer->int32Data() != mNextExpectedSeqNo) {
518cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber#if VERBOSE
519cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber        LOG(VERBOSE) << "Not the sequence number I expected";
520cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber#endif
521cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber
522cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber        return WRONG_SEQUENCE_NUMBER;
523cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber    }
524cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber
525cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber    uint32_t rtpTime;
526cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber    CHECK(buffer->meta()->findInt32("rtp-time", (int32_t *)&rtpTime));
527cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber
528cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber    if (mPackets.size() > 0 && rtpTime != mAccessUnitRTPTime) {
529cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber        submitAccessUnit();
530cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber    }
531cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber    mAccessUnitRTPTime = rtpTime;
532cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber
533cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber    mPackets.push_back(buffer);
534cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber
535cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber    queue->erase(queue->begin());
536cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber    ++mNextExpectedSeqNo;
537cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber
538cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber    return OK;
539cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber}
540cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber
541cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Hubervoid AMPEG4AudioAssembler::submitAccessUnit() {
542cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber    CHECK(!mPackets.empty());
543cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber
544cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber#if VERBOSE
545cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber    LOG(VERBOSE) << "Access unit complete (" << mPackets.size() << " packets)";
546cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber#endif
547cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber
5488647bbe4420ca487467318404127f52c567e346bAndreas Huber    sp<ABuffer> accessUnit = MakeCompoundFromPackets(mPackets);
549fc9ac988e08a8b4c42e58999300265989f26f24cAndreas Huber    accessUnit = removeLATMFraming(accessUnit);
5508d342970108926c4ea355c90d26a2a353ec0fd47Andreas Huber    CopyTimes(accessUnit, *mPackets.begin());
551cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber
552348a8eab84f4bba76c04ca83b2f5418467aa1a48Andreas Huber#if 0
553348a8eab84f4bba76c04ca83b2f5418467aa1a48Andreas Huber    printf(mAccessUnitDamaged ? "X" : ".");
554348a8eab84f4bba76c04ca83b2f5418467aa1a48Andreas Huber    fflush(stdout);
555348a8eab84f4bba76c04ca83b2f5418467aa1a48Andreas Huber#endif
556348a8eab84f4bba76c04ca83b2f5418467aa1a48Andreas Huber
557cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber    if (mAccessUnitDamaged) {
558cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber        accessUnit->meta()->setInt32("damaged", true);
559cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber    }
560cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber
561cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber    mPackets.clear();
562cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber    mAccessUnitDamaged = false;
563cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber
564cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber    sp<AMessage> msg = mNotifyMsg->dup();
5652d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Huber    msg->setBuffer("access-unit", accessUnit);
566cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber    msg->post();
567cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber}
568cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber
569cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Hubervoid AMPEG4AudioAssembler::packetLost() {
570cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber    CHECK(mNextExpectedSeqNoValid);
571cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber    ++mNextExpectedSeqNo;
572cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber
573cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber    mAccessUnitDamaged = true;
574cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber}
575cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber
57639ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Hubervoid AMPEG4AudioAssembler::onByeReceived() {
57739ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber    sp<AMessage> msg = mNotifyMsg->dup();
57839ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber    msg->setInt32("eos", true);
57939ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber    msg->post();
58039ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber}
58139ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber
582cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber}  // namespace android
583