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> ¬ify, const AString ¶ms) 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