1a979ad6739d573b3823b0fe7321f554ef5544753Andreas Huber/* 2a979ad6739d573b3823b0fe7321f554ef5544753Andreas Huber * Copyright (C) 2010 The Android Open Source Project 3a979ad6739d573b3823b0fe7321f554ef5544753Andreas Huber * 4a979ad6739d573b3823b0fe7321f554ef5544753Andreas Huber * Licensed under the Apache License, Version 2.0 (the "License"); 5a979ad6739d573b3823b0fe7321f554ef5544753Andreas Huber * you may not use this file except in compliance with the License. 6a979ad6739d573b3823b0fe7321f554ef5544753Andreas Huber * You may obtain a copy of the License at 7a979ad6739d573b3823b0fe7321f554ef5544753Andreas Huber * 8a979ad6739d573b3823b0fe7321f554ef5544753Andreas Huber * http://www.apache.org/licenses/LICENSE-2.0 9a979ad6739d573b3823b0fe7321f554ef5544753Andreas Huber * 10a979ad6739d573b3823b0fe7321f554ef5544753Andreas Huber * Unless required by applicable law or agreed to in writing, software 11a979ad6739d573b3823b0fe7321f554ef5544753Andreas Huber * distributed under the License is distributed on an "AS IS" BASIS, 12a979ad6739d573b3823b0fe7321f554ef5544753Andreas Huber * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13a979ad6739d573b3823b0fe7321f554ef5544753Andreas Huber * See the License for the specific language governing permissions and 14a979ad6739d573b3823b0fe7321f554ef5544753Andreas Huber * limitations under the License. 15a979ad6739d573b3823b0fe7321f554ef5544753Andreas Huber */ 16a979ad6739d573b3823b0fe7321f554ef5544753Andreas Huber 176e3fa444c5b3970666707bb2b6d25e2615dafe80Andreas Huber//#define LOG_NDEBUG 0 186e3fa444c5b3970666707bb2b6d25e2615dafe80Andreas Huber#define LOG_TAG "AMPEG4ElementaryAssembler" 196e3fa444c5b3970666707bb2b6d25e2615dafe80Andreas Huber#include <utils/Log.h> 206e3fa444c5b3970666707bb2b6d25e2615dafe80Andreas Huber 21a979ad6739d573b3823b0fe7321f554ef5544753Andreas Huber#include "AMPEG4ElementaryAssembler.h" 22a979ad6739d573b3823b0fe7321f554ef5544753Andreas Huber 23a979ad6739d573b3823b0fe7321f554ef5544753Andreas Huber#include "ARTPSource.h" 24a979ad6739d573b3823b0fe7321f554ef5544753Andreas Huber 25e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber#include <media/stagefright/foundation/ABitReader.h> 26a979ad6739d573b3823b0fe7321f554ef5544753Andreas Huber#include <media/stagefright/foundation/ABuffer.h> 27a979ad6739d573b3823b0fe7321f554ef5544753Andreas Huber#include <media/stagefright/foundation/ADebug.h> 28a979ad6739d573b3823b0fe7321f554ef5544753Andreas Huber#include <media/stagefright/foundation/AMessage.h> 29a979ad6739d573b3823b0fe7321f554ef5544753Andreas Huber#include <media/stagefright/foundation/hexdump.h> 30e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber#include <media/stagefright/Utils.h> 31a979ad6739d573b3823b0fe7321f554ef5544753Andreas Huber 32e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber#include <ctype.h> 33a979ad6739d573b3823b0fe7321f554ef5544753Andreas Huber#include <stdint.h> 34a979ad6739d573b3823b0fe7321f554ef5544753Andreas Huber 35a979ad6739d573b3823b0fe7321f554ef5544753Andreas Hubernamespace android { 36a979ad6739d573b3823b0fe7321f554ef5544753Andreas Huber 37e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huberstatic bool GetAttribute(const char *s, const char *key, AString *value) { 38e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber value->clear(); 39e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber 40e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber size_t keyLen = strlen(key); 41e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber 42e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber for (;;) { 43e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber while (isspace(*s)) { 44e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber ++s; 45e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber } 46e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber 47e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber const char *colonPos = strchr(s, ';'); 48e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber 49e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber size_t len = 50e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber (colonPos == NULL) ? strlen(s) : colonPos - s; 51e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber 52e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber if (len >= keyLen + 1 && s[keyLen] == '=' 53e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber && !strncasecmp(s, key, keyLen)) { 54e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber value->setTo(&s[keyLen + 1], len - keyLen - 1); 55e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber return true; 56e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber } 57e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber 58e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber if (colonPos == NULL) { 59e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber return false; 60e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber } 61e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber 62e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber s = colonPos + 1; 63e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber } 64e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber} 65e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber 66e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huberstatic bool GetIntegerAttribute( 67e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber const char *s, const char *key, unsigned *x) { 68e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber *x = 0; 69e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber 70e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber AString val; 71e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber if (!GetAttribute(s, key, &val)) { 72e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber return false; 73e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber } 74e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber 75e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber s = val.c_str(); 76e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber char *end; 77e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber unsigned y = strtoul(s, &end, 10); 78e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber 79e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber if (end == s || *end != '\0') { 80e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber return false; 81e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber } 82e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber 83e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber *x = y; 84e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber 85e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber return true; 86e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber} 87e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber 88a979ad6739d573b3823b0fe7321f554ef5544753Andreas Huber// static 89e536f800c695bcd2ef861b9b9877b2108ed21613Andreas HuberAMPEG4ElementaryAssembler::AMPEG4ElementaryAssembler( 90e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber const sp<AMessage> ¬ify, const AString &desc, const AString ¶ms) 91a979ad6739d573b3823b0fe7321f554ef5544753Andreas Huber : mNotifyMsg(notify), 92e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber mIsGeneric(false), 93e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber mParams(params), 94e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber mSizeLength(0), 95e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber mIndexLength(0), 96e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber mIndexDeltaLength(0), 97e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber mCTSDeltaLength(0), 98e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber mDTSDeltaLength(0), 99e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber mRandomAccessIndication(false), 100e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber mStreamStateIndication(0), 101e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber mAuxiliaryDataSizeLength(0), 102e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber mHasAUHeader(false), 103a979ad6739d573b3823b0fe7321f554ef5544753Andreas Huber mAccessUnitRTPTime(0), 104a979ad6739d573b3823b0fe7321f554ef5544753Andreas Huber mNextExpectedSeqNoValid(false), 105a979ad6739d573b3823b0fe7321f554ef5544753Andreas Huber mNextExpectedSeqNo(0), 106a979ad6739d573b3823b0fe7321f554ef5544753Andreas Huber mAccessUnitDamaged(false) { 1070407269ae35e62a6aa2f6e40964970db1bd4b14aAndreas Huber mIsGeneric = !strncasecmp(desc.c_str(),"mpeg4-generic/", 14); 108e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber 109e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber if (mIsGeneric) { 110e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber AString value; 111e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber CHECK(GetAttribute(params.c_str(), "mode", &value)); 112e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber 113e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber if (!GetIntegerAttribute(params.c_str(), "sizeLength", &mSizeLength)) { 114e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber mSizeLength = 0; 115e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber } 116e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber 117e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber if (!GetIntegerAttribute( 118e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber params.c_str(), "indexLength", &mIndexLength)) { 119e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber mIndexLength = 0; 120e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber } 121e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber 122e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber if (!GetIntegerAttribute( 123e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber params.c_str(), "indexDeltaLength", &mIndexDeltaLength)) { 124e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber mIndexDeltaLength = 0; 125e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber } 126e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber 127e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber if (!GetIntegerAttribute( 128e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber params.c_str(), "CTSDeltaLength", &mCTSDeltaLength)) { 129e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber mCTSDeltaLength = 0; 130e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber } 131e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber 132e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber if (!GetIntegerAttribute( 133e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber params.c_str(), "DTSDeltaLength", &mDTSDeltaLength)) { 134e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber mDTSDeltaLength = 0; 135e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber } 136e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber 137e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber unsigned x; 138e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber if (!GetIntegerAttribute( 139e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber params.c_str(), "randomAccessIndication", &x)) { 140e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber mRandomAccessIndication = false; 141e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber } else { 142e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber CHECK(x == 0 || x == 1); 143e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber mRandomAccessIndication = (x != 0); 144e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber } 145e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber 146e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber if (!GetIntegerAttribute( 147e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber params.c_str(), "streamStateIndication", 148e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber &mStreamStateIndication)) { 149e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber mStreamStateIndication = 0; 150e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber } 151e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber 152e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber if (!GetIntegerAttribute( 153e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber params.c_str(), "auxiliaryDataSizeLength", 154e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber &mAuxiliaryDataSizeLength)) { 155e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber mAuxiliaryDataSizeLength = 0; 156e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber } 157e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber 158e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber mHasAUHeader = 159e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber mSizeLength > 0 160e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber || mIndexLength > 0 161e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber || mIndexDeltaLength > 0 162e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber || mCTSDeltaLength > 0 163e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber || mDTSDeltaLength > 0 164e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber || mRandomAccessIndication 165e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber || mStreamStateIndication > 0; 166e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber } 167a979ad6739d573b3823b0fe7321f554ef5544753Andreas Huber} 168a979ad6739d573b3823b0fe7321f554ef5544753Andreas Huber 169a979ad6739d573b3823b0fe7321f554ef5544753Andreas HuberAMPEG4ElementaryAssembler::~AMPEG4ElementaryAssembler() { 170a979ad6739d573b3823b0fe7321f554ef5544753Andreas Huber} 171a979ad6739d573b3823b0fe7321f554ef5544753Andreas Huber 172e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huberstruct AUHeader { 173e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber unsigned mSize; 174e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber unsigned mSerial; 175e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber}; 176e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber 177a979ad6739d573b3823b0fe7321f554ef5544753Andreas HuberARTPAssembler::AssemblyStatus AMPEG4ElementaryAssembler::addPacket( 178a979ad6739d573b3823b0fe7321f554ef5544753Andreas Huber const sp<ARTPSource> &source) { 179a979ad6739d573b3823b0fe7321f554ef5544753Andreas Huber List<sp<ABuffer> > *queue = source->queue(); 180a979ad6739d573b3823b0fe7321f554ef5544753Andreas Huber 181a979ad6739d573b3823b0fe7321f554ef5544753Andreas Huber if (queue->empty()) { 182a979ad6739d573b3823b0fe7321f554ef5544753Andreas Huber return NOT_ENOUGH_DATA; 183a979ad6739d573b3823b0fe7321f554ef5544753Andreas Huber } 184a979ad6739d573b3823b0fe7321f554ef5544753Andreas Huber 185a979ad6739d573b3823b0fe7321f554ef5544753Andreas Huber if (mNextExpectedSeqNoValid) { 186a979ad6739d573b3823b0fe7321f554ef5544753Andreas Huber List<sp<ABuffer> >::iterator it = queue->begin(); 187a979ad6739d573b3823b0fe7321f554ef5544753Andreas Huber while (it != queue->end()) { 188a979ad6739d573b3823b0fe7321f554ef5544753Andreas Huber if ((uint32_t)(*it)->int32Data() >= mNextExpectedSeqNo) { 189a979ad6739d573b3823b0fe7321f554ef5544753Andreas Huber break; 190a979ad6739d573b3823b0fe7321f554ef5544753Andreas Huber } 191a979ad6739d573b3823b0fe7321f554ef5544753Andreas Huber 192a979ad6739d573b3823b0fe7321f554ef5544753Andreas Huber it = queue->erase(it); 193a979ad6739d573b3823b0fe7321f554ef5544753Andreas Huber } 194a979ad6739d573b3823b0fe7321f554ef5544753Andreas Huber 195a979ad6739d573b3823b0fe7321f554ef5544753Andreas Huber if (queue->empty()) { 196a979ad6739d573b3823b0fe7321f554ef5544753Andreas Huber return NOT_ENOUGH_DATA; 197a979ad6739d573b3823b0fe7321f554ef5544753Andreas Huber } 198a979ad6739d573b3823b0fe7321f554ef5544753Andreas Huber } 199a979ad6739d573b3823b0fe7321f554ef5544753Andreas Huber 200a979ad6739d573b3823b0fe7321f554ef5544753Andreas Huber sp<ABuffer> buffer = *queue->begin(); 201a979ad6739d573b3823b0fe7321f554ef5544753Andreas Huber 202a979ad6739d573b3823b0fe7321f554ef5544753Andreas Huber if (!mNextExpectedSeqNoValid) { 203a979ad6739d573b3823b0fe7321f554ef5544753Andreas Huber mNextExpectedSeqNoValid = true; 204a979ad6739d573b3823b0fe7321f554ef5544753Andreas Huber mNextExpectedSeqNo = (uint32_t)buffer->int32Data(); 205a979ad6739d573b3823b0fe7321f554ef5544753Andreas Huber } else if ((uint32_t)buffer->int32Data() != mNextExpectedSeqNo) { 2066e3fa444c5b3970666707bb2b6d25e2615dafe80Andreas Huber LOGV("Not the sequence number I expected"); 207a979ad6739d573b3823b0fe7321f554ef5544753Andreas Huber 208a979ad6739d573b3823b0fe7321f554ef5544753Andreas Huber return WRONG_SEQUENCE_NUMBER; 209a979ad6739d573b3823b0fe7321f554ef5544753Andreas Huber } 210a979ad6739d573b3823b0fe7321f554ef5544753Andreas Huber 211a979ad6739d573b3823b0fe7321f554ef5544753Andreas Huber uint32_t rtpTime; 212a979ad6739d573b3823b0fe7321f554ef5544753Andreas Huber CHECK(buffer->meta()->findInt32("rtp-time", (int32_t *)&rtpTime)); 213a979ad6739d573b3823b0fe7321f554ef5544753Andreas Huber 214a979ad6739d573b3823b0fe7321f554ef5544753Andreas Huber if (mPackets.size() > 0 && rtpTime != mAccessUnitRTPTime) { 215a979ad6739d573b3823b0fe7321f554ef5544753Andreas Huber submitAccessUnit(); 216a979ad6739d573b3823b0fe7321f554ef5544753Andreas Huber } 217a979ad6739d573b3823b0fe7321f554ef5544753Andreas Huber mAccessUnitRTPTime = rtpTime; 218a979ad6739d573b3823b0fe7321f554ef5544753Andreas Huber 219e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber if (!mIsGeneric) { 220e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber mPackets.push_back(buffer); 221e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber } else { 222e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber // hexdump(buffer->data(), buffer->size()); 223e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber 224e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber CHECK_GE(buffer->size(), 2u); 225e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber unsigned AU_headers_length = U16_AT(buffer->data()); // in bits 226e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber 227e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber CHECK_GE(buffer->size(), 2 + (AU_headers_length + 7) / 8); 228e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber 229e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber List<AUHeader> headers; 230e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber 231e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber ABitReader bits(buffer->data() + 2, buffer->size() - 2); 232e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber unsigned numBitsLeft = AU_headers_length; 233e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber 234e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber unsigned AU_serial = 0; 235e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber for (;;) { 236e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber if (numBitsLeft < mSizeLength) { break; } 237e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber 238e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber unsigned AU_size = bits.getBits(mSizeLength); 239e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber numBitsLeft -= mSizeLength; 240e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber 241e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber size_t n = headers.empty() ? mIndexLength : mIndexDeltaLength; 242e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber if (numBitsLeft < n) { break; } 243e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber 244e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber unsigned AU_index = bits.getBits(n); 245e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber numBitsLeft -= n; 246e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber 247e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber if (headers.empty()) { 248e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber AU_serial = AU_index; 249e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber } else { 250e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber AU_serial += 1 + AU_index; 251e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber } 252e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber 253e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber if (mCTSDeltaLength > 0) { 254e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber if (numBitsLeft < 1) { 255e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber break; 256e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber } 257e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber --numBitsLeft; 258e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber if (bits.getBits(1)) { 259e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber if (numBitsLeft < mCTSDeltaLength) { 260e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber break; 261e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber } 262e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber bits.skipBits(mCTSDeltaLength); 263e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber numBitsLeft -= mCTSDeltaLength; 264e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber } 265e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber } 266e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber 267e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber if (mDTSDeltaLength > 0) { 268e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber if (numBitsLeft < 1) { 269e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber break; 270e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber } 271e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber --numBitsLeft; 272e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber if (bits.getBits(1)) { 273e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber if (numBitsLeft < mDTSDeltaLength) { 274e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber break; 275e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber } 276e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber bits.skipBits(mDTSDeltaLength); 277e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber numBitsLeft -= mDTSDeltaLength; 278e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber } 279e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber } 280e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber 281e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber if (mRandomAccessIndication) { 282e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber if (numBitsLeft < 1) { 283e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber break; 284e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber } 285e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber bits.skipBits(1); 286e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber --numBitsLeft; 287e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber } 288e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber 289e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber if (mStreamStateIndication > 0) { 290e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber if (numBitsLeft < mStreamStateIndication) { 291e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber break; 292e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber } 293e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber bits.skipBits(mStreamStateIndication); 294e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber } 295e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber 296e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber AUHeader header; 297e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber header.mSize = AU_size; 298e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber header.mSerial = AU_serial; 299e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber headers.push_back(header); 300e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber } 301e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber 302e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber size_t offset = 2 + (AU_headers_length + 7) / 8; 303e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber 304e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber if (mAuxiliaryDataSizeLength > 0) { 305e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber ABitReader bits(buffer->data() + offset, buffer->size() - offset); 306e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber 307e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber unsigned auxSize = bits.getBits(mAuxiliaryDataSizeLength); 308e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber 309e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber offset += (mAuxiliaryDataSizeLength + auxSize + 7) / 8; 310e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber } 311e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber 312e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber for (List<AUHeader>::iterator it = headers.begin(); 313e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber it != headers.end(); ++it) { 314e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber const AUHeader &header = *it; 315e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber 316e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber CHECK_LE(offset + header.mSize, buffer->size()); 317e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber 318e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber sp<ABuffer> accessUnit = new ABuffer(header.mSize); 319e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber memcpy(accessUnit->data(), buffer->data() + offset, header.mSize); 320e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber 321e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber offset += header.mSize; 322e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber 323e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber CopyTimes(accessUnit, buffer); 324e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber mPackets.push_back(accessUnit); 325e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber } 326e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber 327e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber CHECK_EQ(offset, buffer->size()); 328e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber } 329a979ad6739d573b3823b0fe7321f554ef5544753Andreas Huber 330a979ad6739d573b3823b0fe7321f554ef5544753Andreas Huber queue->erase(queue->begin()); 331a979ad6739d573b3823b0fe7321f554ef5544753Andreas Huber ++mNextExpectedSeqNo; 332a979ad6739d573b3823b0fe7321f554ef5544753Andreas Huber 333a979ad6739d573b3823b0fe7321f554ef5544753Andreas Huber return OK; 334a979ad6739d573b3823b0fe7321f554ef5544753Andreas Huber} 335a979ad6739d573b3823b0fe7321f554ef5544753Andreas Huber 336a979ad6739d573b3823b0fe7321f554ef5544753Andreas Hubervoid AMPEG4ElementaryAssembler::submitAccessUnit() { 337a979ad6739d573b3823b0fe7321f554ef5544753Andreas Huber CHECK(!mPackets.empty()); 338a979ad6739d573b3823b0fe7321f554ef5544753Andreas Huber 3396e3fa444c5b3970666707bb2b6d25e2615dafe80Andreas Huber LOGV("Access unit complete (%d nal units)", mPackets.size()); 340a979ad6739d573b3823b0fe7321f554ef5544753Andreas Huber 341a979ad6739d573b3823b0fe7321f554ef5544753Andreas Huber size_t totalSize = 0; 342a979ad6739d573b3823b0fe7321f554ef5544753Andreas Huber for (List<sp<ABuffer> >::iterator it = mPackets.begin(); 343a979ad6739d573b3823b0fe7321f554ef5544753Andreas Huber it != mPackets.end(); ++it) { 344a979ad6739d573b3823b0fe7321f554ef5544753Andreas Huber totalSize += (*it)->size(); 345a979ad6739d573b3823b0fe7321f554ef5544753Andreas Huber } 346a979ad6739d573b3823b0fe7321f554ef5544753Andreas Huber 347a979ad6739d573b3823b0fe7321f554ef5544753Andreas Huber sp<ABuffer> accessUnit = new ABuffer(totalSize); 348a979ad6739d573b3823b0fe7321f554ef5544753Andreas Huber size_t offset = 0; 349a979ad6739d573b3823b0fe7321f554ef5544753Andreas Huber for (List<sp<ABuffer> >::iterator it = mPackets.begin(); 350a979ad6739d573b3823b0fe7321f554ef5544753Andreas Huber it != mPackets.end(); ++it) { 351a979ad6739d573b3823b0fe7321f554ef5544753Andreas Huber sp<ABuffer> nal = *it; 352a979ad6739d573b3823b0fe7321f554ef5544753Andreas Huber memcpy(accessUnit->data() + offset, nal->data(), nal->size()); 353a979ad6739d573b3823b0fe7321f554ef5544753Andreas Huber offset += nal->size(); 354a979ad6739d573b3823b0fe7321f554ef5544753Andreas Huber } 355a979ad6739d573b3823b0fe7321f554ef5544753Andreas Huber 356eeb97d91b97f1fc0b26815f098515e9c06d219b8Andreas Huber CopyTimes(accessUnit, *mPackets.begin()); 357a979ad6739d573b3823b0fe7321f554ef5544753Andreas Huber 358a979ad6739d573b3823b0fe7321f554ef5544753Andreas Huber#if 0 359a979ad6739d573b3823b0fe7321f554ef5544753Andreas Huber printf(mAccessUnitDamaged ? "X" : "."); 360a979ad6739d573b3823b0fe7321f554ef5544753Andreas Huber fflush(stdout); 361a979ad6739d573b3823b0fe7321f554ef5544753Andreas Huber#endif 362a979ad6739d573b3823b0fe7321f554ef5544753Andreas Huber 363a979ad6739d573b3823b0fe7321f554ef5544753Andreas Huber if (mAccessUnitDamaged) { 364a979ad6739d573b3823b0fe7321f554ef5544753Andreas Huber accessUnit->meta()->setInt32("damaged", true); 365a979ad6739d573b3823b0fe7321f554ef5544753Andreas Huber } 366a979ad6739d573b3823b0fe7321f554ef5544753Andreas Huber 367a979ad6739d573b3823b0fe7321f554ef5544753Andreas Huber mPackets.clear(); 368a979ad6739d573b3823b0fe7321f554ef5544753Andreas Huber mAccessUnitDamaged = false; 369a979ad6739d573b3823b0fe7321f554ef5544753Andreas Huber 370a979ad6739d573b3823b0fe7321f554ef5544753Andreas Huber sp<AMessage> msg = mNotifyMsg->dup(); 371a979ad6739d573b3823b0fe7321f554ef5544753Andreas Huber msg->setObject("access-unit", accessUnit); 372a979ad6739d573b3823b0fe7321f554ef5544753Andreas Huber msg->post(); 373a979ad6739d573b3823b0fe7321f554ef5544753Andreas Huber} 374a979ad6739d573b3823b0fe7321f554ef5544753Andreas Huber 375a979ad6739d573b3823b0fe7321f554ef5544753Andreas HuberARTPAssembler::AssemblyStatus AMPEG4ElementaryAssembler::assembleMore( 376a979ad6739d573b3823b0fe7321f554ef5544753Andreas Huber const sp<ARTPSource> &source) { 377a979ad6739d573b3823b0fe7321f554ef5544753Andreas Huber AssemblyStatus status = addPacket(source); 378a979ad6739d573b3823b0fe7321f554ef5544753Andreas Huber if (status == MALFORMED_PACKET) { 379a979ad6739d573b3823b0fe7321f554ef5544753Andreas Huber mAccessUnitDamaged = true; 380a979ad6739d573b3823b0fe7321f554ef5544753Andreas Huber } 381a979ad6739d573b3823b0fe7321f554ef5544753Andreas Huber return status; 382a979ad6739d573b3823b0fe7321f554ef5544753Andreas Huber} 383a979ad6739d573b3823b0fe7321f554ef5544753Andreas Huber 384a979ad6739d573b3823b0fe7321f554ef5544753Andreas Hubervoid AMPEG4ElementaryAssembler::packetLost() { 385a979ad6739d573b3823b0fe7321f554ef5544753Andreas Huber CHECK(mNextExpectedSeqNoValid); 3866e3fa444c5b3970666707bb2b6d25e2615dafe80Andreas Huber LOGV("packetLost (expected %d)", mNextExpectedSeqNo); 387a979ad6739d573b3823b0fe7321f554ef5544753Andreas Huber 388a979ad6739d573b3823b0fe7321f554ef5544753Andreas Huber ++mNextExpectedSeqNo; 389a979ad6739d573b3823b0fe7321f554ef5544753Andreas Huber 390a979ad6739d573b3823b0fe7321f554ef5544753Andreas Huber mAccessUnitDamaged = true; 391a979ad6739d573b3823b0fe7321f554ef5544753Andreas Huber} 392a979ad6739d573b3823b0fe7321f554ef5544753Andreas Huber 393a979ad6739d573b3823b0fe7321f554ef5544753Andreas Hubervoid AMPEG4ElementaryAssembler::onByeReceived() { 394a979ad6739d573b3823b0fe7321f554ef5544753Andreas Huber sp<AMessage> msg = mNotifyMsg->dup(); 395a979ad6739d573b3823b0fe7321f554ef5544753Andreas Huber msg->setInt32("eos", true); 396a979ad6739d573b3823b0fe7321f554ef5544753Andreas Huber msg->post(); 397a979ad6739d573b3823b0fe7321f554ef5544753Andreas Huber} 398a979ad6739d573b3823b0fe7321f554ef5544753Andreas Huber 399a979ad6739d573b3823b0fe7321f554ef5544753Andreas Huber} // namespace android 400