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