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( 3784333e0475bc911adc16417f4ca327c975cf6c36Andreas Huber const sp<AMessage> ¬ify, 3884333e0475bc911adc16417f4ca327c975cf6c36Andreas Huber const char * /* desc */, 3984333e0475bc911adc16417f4ca327c975cf6c36Andreas Huber const AString & /* params */) 40cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Huber : mNotifyMsg(notify), 41cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Huber mNextExpectedSeqNoValid(false), 42cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Huber mNextExpectedSeqNo(0) { 43cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Huber} 44cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Huber 45cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas HuberAMPEG2TSAssembler::~AMPEG2TSAssembler() { 46cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Huber} 47cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Huber 48cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas HuberARTPAssembler::AssemblyStatus AMPEG2TSAssembler::assembleMore( 49cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Huber const sp<ARTPSource> &source) { 50cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Huber return addPacket(source); 51cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Huber} 52cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Huber 53cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas HuberARTPAssembler::AssemblyStatus AMPEG2TSAssembler::addPacket( 54cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Huber const sp<ARTPSource> &source) { 55cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Huber List<sp<ABuffer> > *queue = source->queue(); 56cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Huber 57cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Huber if (queue->empty()) { 58cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Huber return NOT_ENOUGH_DATA; 59cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Huber } 60cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Huber 61cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Huber if (mNextExpectedSeqNoValid) { 62cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Huber List<sp<ABuffer> >::iterator it = queue->begin(); 63cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Huber while (it != queue->end()) { 64cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Huber if ((uint32_t)(*it)->int32Data() >= mNextExpectedSeqNo) { 65cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Huber break; 66cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Huber } 67cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Huber 68cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Huber it = queue->erase(it); 69cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Huber } 70cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Huber 71cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Huber if (queue->empty()) { 72cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Huber return NOT_ENOUGH_DATA; 73cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Huber } 74cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Huber } 75cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Huber 76cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Huber sp<ABuffer> buffer = *queue->begin(); 77cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Huber 78cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Huber if (!mNextExpectedSeqNoValid) { 79cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Huber mNextExpectedSeqNoValid = true; 80cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Huber mNextExpectedSeqNo = (uint32_t)buffer->int32Data(); 81cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Huber } else if ((uint32_t)buffer->int32Data() != mNextExpectedSeqNo) { 82cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Huber ALOGV("Not the sequence number I expected"); 83cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Huber 84cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Huber return WRONG_SEQUENCE_NUMBER; 85cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Huber } 86cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Huber 87cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Huber // hexdump(buffer->data(), buffer->size()); 88cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Huber 89cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Huber if ((buffer->size() % 188) > 0) { 90cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Huber queue->erase(queue->begin()); 91cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Huber ++mNextExpectedSeqNo; 92cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Huber 93cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Huber ALOGV("Not a multiple of transport packet size."); 94cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Huber 95cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Huber return MALFORMED_PACKET; 96cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Huber } 97cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Huber 98cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Huber sp<AMessage> msg = mNotifyMsg->dup(); 99cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Huber msg->setBuffer("access-unit", buffer); 100cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Huber msg->post(); 101cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Huber 102cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Huber queue->erase(queue->begin()); 103cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Huber ++mNextExpectedSeqNo; 104cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Huber 105cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Huber return OK; 106cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Huber} 107cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Huber 108cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Hubervoid AMPEG2TSAssembler::packetLost() { 109cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Huber CHECK(mNextExpectedSeqNoValid); 110cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Huber ++mNextExpectedSeqNo; 111cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Huber} 112cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Huber 113cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Hubervoid AMPEG2TSAssembler::onByeReceived() { 114cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Huber sp<AMessage> msg = mNotifyMsg->dup(); 115cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Huber msg->setInt32("eos", true); 116cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Huber msg->post(); 117cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Huber} 118cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Huber 119cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Huber} // namespace android 120cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Huber 121cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Huber 122