1cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Huber/* 2cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Huber * Copyright (C) 2012 The Android Open Source Project 3cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Huber * 4cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Huber * Licensed under the Apache License, Version 2.0 (the "License"); 5cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Huber * you may not use this file except in compliance with the License. 6cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Huber * You may obtain a copy of the License at 7cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Huber * 8cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Huber * http://www.apache.org/licenses/LICENSE-2.0 9cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Huber * 10cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Huber * Unless required by applicable law or agreed to in writing, software 11cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Huber * distributed under the License is distributed on an "AS IS" BASIS, 12cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Huber * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Huber * See the License for the specific language governing permissions and 14cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Huber * limitations under the License. 15cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Huber */ 16cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Huber 17cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Huber//#define LOG_NDEBUG 0 18cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Huber#define LOG_TAG "AMPEG2TSAssembler" 19cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Huber#include <utils/Log.h> 20cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Huber 21cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Huber#include "AMPEG2TSAssembler.h" 22cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Huber 23cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Huber#include "ARTPSource.h" 24cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Huber#include "ASessionDescription.h" 25cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Huber 26cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Huber#include <media/stagefright/foundation/ABuffer.h> 27cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Huber#include <media/stagefright/foundation/ADebug.h> 28cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Huber#include <media/stagefright/foundation/AMessage.h> 29cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Huber#include <media/stagefright/foundation/hexdump.h> 30cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Huber#include <media/stagefright/MediaDefs.h> 31cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Huber#include <media/stagefright/MetaData.h> 32cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Huber#include <media/stagefright/Utils.h> 33cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Huber 34cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Hubernamespace android { 35cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Huber 36cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas HuberAMPEG2TSAssembler::AMPEG2TSAssembler( 37cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Huber const sp<AMessage> ¬ify, const char *desc, const AString ¶ms) 38cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Huber : mNotifyMsg(notify), 39cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Huber mNextExpectedSeqNoValid(false), 40cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Huber mNextExpectedSeqNo(0) { 41cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Huber} 42cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Huber 43cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas HuberAMPEG2TSAssembler::~AMPEG2TSAssembler() { 44cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Huber} 45cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Huber 46cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas HuberARTPAssembler::AssemblyStatus AMPEG2TSAssembler::assembleMore( 47cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Huber const sp<ARTPSource> &source) { 48cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Huber return addPacket(source); 49cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Huber} 50cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Huber 51cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas HuberARTPAssembler::AssemblyStatus AMPEG2TSAssembler::addPacket( 52cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Huber const sp<ARTPSource> &source) { 53cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Huber List<sp<ABuffer> > *queue = source->queue(); 54cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Huber 55cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Huber if (queue->empty()) { 56cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Huber return NOT_ENOUGH_DATA; 57cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Huber } 58cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Huber 59cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Huber if (mNextExpectedSeqNoValid) { 60cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Huber List<sp<ABuffer> >::iterator it = queue->begin(); 61cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Huber while (it != queue->end()) { 62cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Huber if ((uint32_t)(*it)->int32Data() >= mNextExpectedSeqNo) { 63cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Huber break; 64cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Huber } 65cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Huber 66cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Huber it = queue->erase(it); 67cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Huber } 68cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Huber 69cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Huber if (queue->empty()) { 70cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Huber return NOT_ENOUGH_DATA; 71cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Huber } 72cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Huber } 73cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Huber 74cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Huber sp<ABuffer> buffer = *queue->begin(); 75cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Huber 76cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Huber if (!mNextExpectedSeqNoValid) { 77cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Huber mNextExpectedSeqNoValid = true; 78cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Huber mNextExpectedSeqNo = (uint32_t)buffer->int32Data(); 79cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Huber } else if ((uint32_t)buffer->int32Data() != mNextExpectedSeqNo) { 80cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Huber ALOGV("Not the sequence number I expected"); 81cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Huber 82cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Huber return WRONG_SEQUENCE_NUMBER; 83cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Huber } 84cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Huber 85cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Huber // hexdump(buffer->data(), buffer->size()); 86cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Huber 87cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Huber if ((buffer->size() % 188) > 0) { 88cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Huber queue->erase(queue->begin()); 89cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Huber ++mNextExpectedSeqNo; 90cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Huber 91cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Huber ALOGV("Not a multiple of transport packet size."); 92cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Huber 93cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Huber return MALFORMED_PACKET; 94cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Huber } 95cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Huber 96cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Huber sp<AMessage> msg = mNotifyMsg->dup(); 97cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Huber msg->setBuffer("access-unit", buffer); 98cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Huber msg->post(); 99cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Huber 100cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Huber queue->erase(queue->begin()); 101cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Huber ++mNextExpectedSeqNo; 102cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Huber 103cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Huber return OK; 104cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Huber} 105cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Huber 106cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Hubervoid AMPEG2TSAssembler::packetLost() { 107cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Huber CHECK(mNextExpectedSeqNoValid); 108cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Huber ++mNextExpectedSeqNo; 109cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Huber} 110cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Huber 111cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Hubervoid AMPEG2TSAssembler::onByeReceived() { 112cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Huber sp<AMessage> msg = mNotifyMsg->dup(); 113cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Huber msg->setInt32("eos", true); 114cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Huber msg->post(); 115cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Huber} 116cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Huber 117cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Huber} // namespace android 118cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Huber 119cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Huber 120