AAMRAssembler.cpp revision 8d342970108926c4ea355c90d26a2a353ec0fd47
139ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber/* 239ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber * Copyright (C) 2010 The Android Open Source Project 339ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber * 439ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber * Licensed under the Apache License, Version 2.0 (the "License"); 539ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber * you may not use this file except in compliance with the License. 639ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber * You may obtain a copy of the License at 739ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber * 839ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber * http://www.apache.org/licenses/LICENSE-2.0 939ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber * 1039ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber * Unless required by applicable law or agreed to in writing, software 1139ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber * distributed under the License is distributed on an "AS IS" BASIS, 1239ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1339ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber * See the License for the specific language governing permissions and 1439ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber * limitations under the License. 1539ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber */ 1639ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber 1739ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber#include "AAMRAssembler.h" 1839ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber 1939ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber#include "ARTPSource.h" 2039ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber 2139ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber#include <media/stagefright/foundation/ABuffer.h> 2239ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber#include <media/stagefright/foundation/ADebug.h> 2339ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber#include <media/stagefright/foundation/AMessage.h> 2439ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber#include <media/stagefright/foundation/hexdump.h> 2539ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber#include <media/stagefright/Utils.h> 2639ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber 2739ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Hubernamespace android { 2839ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber 2939ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huberstatic bool GetAttribute(const char *s, const char *key, AString *value) { 3039ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber value->clear(); 3139ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber 3239ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber size_t keyLen = strlen(key); 3339ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber 3439ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber for (;;) { 3539ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber const char *colonPos = strchr(s, ';'); 3639ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber 3739ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber size_t len = 3839ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber (colonPos == NULL) ? strlen(s) : colonPos - s; 3939ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber 4039ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber if (len >= keyLen + 1 && s[keyLen] == '=' && !strncmp(s, key, keyLen)) { 4139ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber value->setTo(&s[keyLen + 1], len - keyLen - 1); 4239ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber return true; 4339ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber } 4439ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber if (len == keyLen && !strncmp(s, key, keyLen)) { 4539ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber value->setTo("1"); 4639ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber return true; 4739ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber } 4839ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber 4939ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber if (colonPos == NULL) { 5039ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber return false; 5139ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber } 5239ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber 5339ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber s = colonPos + 1; 5439ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber } 5539ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber} 5639ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber 5739ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas HuberAAMRAssembler::AAMRAssembler( 5839ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber const sp<AMessage> ¬ify, bool isWide, const AString ¶ms) 5939ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber : mIsWide(isWide), 6039ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber mNotifyMsg(notify), 6139ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber mNextExpectedSeqNoValid(false), 6239ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber mNextExpectedSeqNo(0) { 6339ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber AString value; 6439ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber CHECK(GetAttribute(params.c_str(), "octet-align", &value) && value == "1"); 6539ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber CHECK(!GetAttribute(params.c_str(), "crc", &value) || value == "0"); 6639ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber CHECK(!GetAttribute(params.c_str(), "interleaving", &value)); 6739ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber} 6839ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber 6939ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas HuberAAMRAssembler::~AAMRAssembler() { 7039ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber} 7139ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber 7239ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas HuberARTPAssembler::AssemblyStatus AAMRAssembler::assembleMore( 7339ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber const sp<ARTPSource> &source) { 7439ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber return addPacket(source); 7539ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber} 7639ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber 7739ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huberstatic size_t getFrameSize(bool isWide, unsigned FT) { 7839ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber static const size_t kFrameSizeNB[8] = { 7939ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber 95, 103, 118, 134, 148, 159, 204, 244 8039ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber }; 8139ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber static const size_t kFrameSizeWB[9] = { 8239ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber 132, 177, 253, 285, 317, 365, 397, 461, 477 8339ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber }; 8439ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber 8539ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber size_t frameSize = isWide ? kFrameSizeWB[FT] : kFrameSizeNB[FT]; 8639ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber 8739ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber // Round up bits to bytes and add 1 for the header byte. 8839ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber frameSize = (frameSize + 7) / 8 + 1; 8939ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber 9039ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber return frameSize; 9139ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber} 9239ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber 9339ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas HuberARTPAssembler::AssemblyStatus AAMRAssembler::addPacket( 9439ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber const sp<ARTPSource> &source) { 9539ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber List<sp<ABuffer> > *queue = source->queue(); 9639ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber 9739ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber if (queue->empty()) { 9839ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber return NOT_ENOUGH_DATA; 9939ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber } 10039ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber 10139ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber if (mNextExpectedSeqNoValid) { 10239ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber List<sp<ABuffer> >::iterator it = queue->begin(); 10339ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber while (it != queue->end()) { 10439ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber if ((uint32_t)(*it)->int32Data() >= mNextExpectedSeqNo) { 10539ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber break; 10639ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber } 10739ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber 10839ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber it = queue->erase(it); 10939ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber } 11039ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber 11139ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber if (queue->empty()) { 11239ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber return NOT_ENOUGH_DATA; 11339ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber } 11439ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber } 11539ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber 11639ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber sp<ABuffer> buffer = *queue->begin(); 11739ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber 11839ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber if (!mNextExpectedSeqNoValid) { 11939ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber mNextExpectedSeqNoValid = true; 12039ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber mNextExpectedSeqNo = (uint32_t)buffer->int32Data(); 12139ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber } else if ((uint32_t)buffer->int32Data() != mNextExpectedSeqNo) { 12239ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber#if VERBOSE 12339ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber LOG(VERBOSE) << "Not the sequence number I expected"; 12439ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber#endif 12539ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber 12639ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber return WRONG_SEQUENCE_NUMBER; 12739ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber } 12839ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber 12939ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber // hexdump(buffer->data(), buffer->size()); 13039ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber 13139ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber if (buffer->size() < 1) { 13239ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber queue->erase(queue->begin()); 13339ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber ++mNextExpectedSeqNo; 13439ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber 13539ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber LOG(VERBOSE) << "AMR packet too short."; 13639ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber 13739ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber return MALFORMED_PACKET; 13839ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber } 13939ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber 14039ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber unsigned payloadHeader = buffer->data()[0]; 14139ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber unsigned CMR = payloadHeader >> 4; 14239ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber CHECK_EQ(payloadHeader & 0x0f, 0u); // RR 14339ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber 14439ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber Vector<uint8_t> tableOfContents; 14539ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber 14639ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber size_t offset = 1; 14739ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber size_t totalSize = 0; 14839ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber for (;;) { 14939ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber if (offset >= buffer->size()) { 15039ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber queue->erase(queue->begin()); 15139ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber ++mNextExpectedSeqNo; 15239ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber 15339ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber LOG(VERBOSE) << "Unable to parse TOC."; 15439ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber 15539ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber return MALFORMED_PACKET; 15639ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber } 15739ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber 15839ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber uint8_t toc = buffer->data()[offset++]; 15939ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber 16039ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber unsigned FT = (toc >> 3) & 0x0f; 16139ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber if ((toc & 3) != 0 16239ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber || (mIsWide && FT > 8) 16339ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber || (!mIsWide && FT > 7)) { 16439ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber queue->erase(queue->begin()); 16539ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber ++mNextExpectedSeqNo; 16639ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber 16739ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber LOG(VERBOSE) << "Illegal TOC entry."; 16839ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber 16939ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber return MALFORMED_PACKET; 17039ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber } 17139ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber 17239ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber totalSize += getFrameSize(mIsWide, (toc >> 3) & 0x0f); 17339ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber 17439ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber tableOfContents.push(toc); 17539ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber 17639ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber if (0 == (toc & 0x80)) { 17739ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber break; 17839ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber } 17939ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber } 18039ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber 18139ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber sp<ABuffer> accessUnit = new ABuffer(totalSize); 1828d342970108926c4ea355c90d26a2a353ec0fd47Andreas Huber CopyTimes(accessUnit, buffer); 18339ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber 18439ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber size_t dstOffset = 0; 18539ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber for (size_t i = 0; i < tableOfContents.size(); ++i) { 18639ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber uint8_t toc = tableOfContents[i]; 18739ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber 18839ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber size_t frameSize = getFrameSize(mIsWide, (toc >> 3) & 0x0f); 18939ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber 19039ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber if (offset + frameSize - 1 > buffer->size()) { 19139ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber queue->erase(queue->begin()); 19239ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber ++mNextExpectedSeqNo; 19339ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber 19439ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber LOG(VERBOSE) << "AMR packet too short."; 19539ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber 19639ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber return MALFORMED_PACKET; 19739ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber } 19839ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber 19939ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber accessUnit->data()[dstOffset++] = toc; 20039ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber memcpy(accessUnit->data() + dstOffset, 20139ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber buffer->data() + offset, frameSize - 1); 20239ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber 20339ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber offset += frameSize - 1; 20439ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber dstOffset += frameSize - 1; 20539ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber } 20639ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber 20739ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber sp<AMessage> msg = mNotifyMsg->dup(); 20839ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber msg->setObject("access-unit", accessUnit); 20939ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber msg->post(); 21039ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber 21139ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber queue->erase(queue->begin()); 21239ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber ++mNextExpectedSeqNo; 21339ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber 21439ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber return OK; 21539ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber} 21639ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber 21739ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Hubervoid AAMRAssembler::packetLost() { 21839ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber CHECK(mNextExpectedSeqNoValid); 21939ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber ++mNextExpectedSeqNo; 22039ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber} 22139ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber 22239ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Hubervoid AAMRAssembler::onByeReceived() { 22339ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber sp<AMessage> msg = mNotifyMsg->dup(); 22439ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber msg->setInt32("eos", true); 22539ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber msg->post(); 22639ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber} 22739ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber 22839ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber} // namespace android 229