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