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( 3784333e0475bc911adc16417f4ca327c975cf6c36Andreas Huber const sp<AMessage> ¬ify, 3884333e0475bc911adc16417f4ca327c975cf6c36Andreas Huber const char * /* desc */, 3984333e0475bc911adc16417f4ca327c975cf6c36Andreas Huber const AString & /* params */) 40fcea8f7a7d178e5426aa06586cff54726e18d1f6Andreas Huber : mNotifyMsg(notify), 41fcea8f7a7d178e5426aa06586cff54726e18d1f6Andreas Huber mNextExpectedSeqNoValid(false), 42fcea8f7a7d178e5426aa06586cff54726e18d1f6Andreas Huber mNextExpectedSeqNo(0) { 43fcea8f7a7d178e5426aa06586cff54726e18d1f6Andreas Huber} 44fcea8f7a7d178e5426aa06586cff54726e18d1f6Andreas Huber 45fcea8f7a7d178e5426aa06586cff54726e18d1f6Andreas HuberARawAudioAssembler::~ARawAudioAssembler() { 46fcea8f7a7d178e5426aa06586cff54726e18d1f6Andreas Huber} 47fcea8f7a7d178e5426aa06586cff54726e18d1f6Andreas Huber 48fcea8f7a7d178e5426aa06586cff54726e18d1f6Andreas HuberARTPAssembler::AssemblyStatus ARawAudioAssembler::assembleMore( 49fcea8f7a7d178e5426aa06586cff54726e18d1f6Andreas Huber const sp<ARTPSource> &source) { 50fcea8f7a7d178e5426aa06586cff54726e18d1f6Andreas Huber return addPacket(source); 51fcea8f7a7d178e5426aa06586cff54726e18d1f6Andreas Huber} 52fcea8f7a7d178e5426aa06586cff54726e18d1f6Andreas Huber 53fcea8f7a7d178e5426aa06586cff54726e18d1f6Andreas HuberARTPAssembler::AssemblyStatus ARawAudioAssembler::addPacket( 54fcea8f7a7d178e5426aa06586cff54726e18d1f6Andreas Huber const sp<ARTPSource> &source) { 55fcea8f7a7d178e5426aa06586cff54726e18d1f6Andreas Huber List<sp<ABuffer> > *queue = source->queue(); 56fcea8f7a7d178e5426aa06586cff54726e18d1f6Andreas Huber 57fcea8f7a7d178e5426aa06586cff54726e18d1f6Andreas Huber if (queue->empty()) { 58fcea8f7a7d178e5426aa06586cff54726e18d1f6Andreas Huber return NOT_ENOUGH_DATA; 59fcea8f7a7d178e5426aa06586cff54726e18d1f6Andreas Huber } 60fcea8f7a7d178e5426aa06586cff54726e18d1f6Andreas Huber 61fcea8f7a7d178e5426aa06586cff54726e18d1f6Andreas Huber if (mNextExpectedSeqNoValid) { 62fcea8f7a7d178e5426aa06586cff54726e18d1f6Andreas Huber List<sp<ABuffer> >::iterator it = queue->begin(); 63fcea8f7a7d178e5426aa06586cff54726e18d1f6Andreas Huber while (it != queue->end()) { 64fcea8f7a7d178e5426aa06586cff54726e18d1f6Andreas Huber if ((uint32_t)(*it)->int32Data() >= mNextExpectedSeqNo) { 65fcea8f7a7d178e5426aa06586cff54726e18d1f6Andreas Huber break; 66fcea8f7a7d178e5426aa06586cff54726e18d1f6Andreas Huber } 67fcea8f7a7d178e5426aa06586cff54726e18d1f6Andreas Huber 68fcea8f7a7d178e5426aa06586cff54726e18d1f6Andreas Huber it = queue->erase(it); 69fcea8f7a7d178e5426aa06586cff54726e18d1f6Andreas Huber } 70fcea8f7a7d178e5426aa06586cff54726e18d1f6Andreas Huber 71fcea8f7a7d178e5426aa06586cff54726e18d1f6Andreas Huber if (queue->empty()) { 72fcea8f7a7d178e5426aa06586cff54726e18d1f6Andreas Huber return NOT_ENOUGH_DATA; 73fcea8f7a7d178e5426aa06586cff54726e18d1f6Andreas Huber } 74fcea8f7a7d178e5426aa06586cff54726e18d1f6Andreas Huber } 75fcea8f7a7d178e5426aa06586cff54726e18d1f6Andreas Huber 76fcea8f7a7d178e5426aa06586cff54726e18d1f6Andreas Huber sp<ABuffer> buffer = *queue->begin(); 77fcea8f7a7d178e5426aa06586cff54726e18d1f6Andreas Huber 78fcea8f7a7d178e5426aa06586cff54726e18d1f6Andreas Huber if (!mNextExpectedSeqNoValid) { 79fcea8f7a7d178e5426aa06586cff54726e18d1f6Andreas Huber mNextExpectedSeqNoValid = true; 80fcea8f7a7d178e5426aa06586cff54726e18d1f6Andreas Huber mNextExpectedSeqNo = (uint32_t)buffer->int32Data(); 81fcea8f7a7d178e5426aa06586cff54726e18d1f6Andreas Huber } else if ((uint32_t)buffer->int32Data() != mNextExpectedSeqNo) { 823856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("Not the sequence number I expected"); 83fcea8f7a7d178e5426aa06586cff54726e18d1f6Andreas Huber 84fcea8f7a7d178e5426aa06586cff54726e18d1f6Andreas Huber return WRONG_SEQUENCE_NUMBER; 85fcea8f7a7d178e5426aa06586cff54726e18d1f6Andreas Huber } 86fcea8f7a7d178e5426aa06586cff54726e18d1f6Andreas Huber 87fcea8f7a7d178e5426aa06586cff54726e18d1f6Andreas Huber // hexdump(buffer->data(), buffer->size()); 88fcea8f7a7d178e5426aa06586cff54726e18d1f6Andreas Huber 89fcea8f7a7d178e5426aa06586cff54726e18d1f6Andreas Huber if (buffer->size() < 1) { 90fcea8f7a7d178e5426aa06586cff54726e18d1f6Andreas Huber queue->erase(queue->begin()); 91fcea8f7a7d178e5426aa06586cff54726e18d1f6Andreas Huber ++mNextExpectedSeqNo; 92fcea8f7a7d178e5426aa06586cff54726e18d1f6Andreas Huber 933856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("raw audio packet too short."); 94fcea8f7a7d178e5426aa06586cff54726e18d1f6Andreas Huber 95fcea8f7a7d178e5426aa06586cff54726e18d1f6Andreas Huber return MALFORMED_PACKET; 96fcea8f7a7d178e5426aa06586cff54726e18d1f6Andreas Huber } 97fcea8f7a7d178e5426aa06586cff54726e18d1f6Andreas Huber 98fcea8f7a7d178e5426aa06586cff54726e18d1f6Andreas Huber sp<AMessage> msg = mNotifyMsg->dup(); 992d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Huber msg->setBuffer("access-unit", buffer); 100fcea8f7a7d178e5426aa06586cff54726e18d1f6Andreas Huber msg->post(); 101fcea8f7a7d178e5426aa06586cff54726e18d1f6Andreas Huber 102fcea8f7a7d178e5426aa06586cff54726e18d1f6Andreas Huber queue->erase(queue->begin()); 103fcea8f7a7d178e5426aa06586cff54726e18d1f6Andreas Huber ++mNextExpectedSeqNo; 104fcea8f7a7d178e5426aa06586cff54726e18d1f6Andreas Huber 105fcea8f7a7d178e5426aa06586cff54726e18d1f6Andreas Huber return OK; 106fcea8f7a7d178e5426aa06586cff54726e18d1f6Andreas Huber} 107fcea8f7a7d178e5426aa06586cff54726e18d1f6Andreas Huber 108fcea8f7a7d178e5426aa06586cff54726e18d1f6Andreas Hubervoid ARawAudioAssembler::packetLost() { 109fcea8f7a7d178e5426aa06586cff54726e18d1f6Andreas Huber CHECK(mNextExpectedSeqNoValid); 110fcea8f7a7d178e5426aa06586cff54726e18d1f6Andreas Huber ++mNextExpectedSeqNo; 111fcea8f7a7d178e5426aa06586cff54726e18d1f6Andreas Huber} 112fcea8f7a7d178e5426aa06586cff54726e18d1f6Andreas Huber 113fcea8f7a7d178e5426aa06586cff54726e18d1f6Andreas Hubervoid ARawAudioAssembler::onByeReceived() { 114fcea8f7a7d178e5426aa06586cff54726e18d1f6Andreas Huber sp<AMessage> msg = mNotifyMsg->dup(); 115fcea8f7a7d178e5426aa06586cff54726e18d1f6Andreas Huber msg->setInt32("eos", true); 116fcea8f7a7d178e5426aa06586cff54726e18d1f6Andreas Huber msg->post(); 117fcea8f7a7d178e5426aa06586cff54726e18d1f6Andreas Huber} 118fcea8f7a7d178e5426aa06586cff54726e18d1f6Andreas Huber 119fcea8f7a7d178e5426aa06586cff54726e18d1f6Andreas Huber// static 120fcea8f7a7d178e5426aa06586cff54726e18d1f6Andreas Huberbool ARawAudioAssembler::Supports(const char *desc) { 121fcea8f7a7d178e5426aa06586cff54726e18d1f6Andreas Huber return !strncmp(desc, "PCMU/", 5) 122fcea8f7a7d178e5426aa06586cff54726e18d1f6Andreas Huber || !strncmp(desc, "PCMA/", 5); 123fcea8f7a7d178e5426aa06586cff54726e18d1f6Andreas Huber} 124fcea8f7a7d178e5426aa06586cff54726e18d1f6Andreas Huber 125fcea8f7a7d178e5426aa06586cff54726e18d1f6Andreas Huber// static 126fcea8f7a7d178e5426aa06586cff54726e18d1f6Andreas Hubervoid ARawAudioAssembler::MakeFormat( 127fcea8f7a7d178e5426aa06586cff54726e18d1f6Andreas Huber const char *desc, const sp<MetaData> &format) { 128fcea8f7a7d178e5426aa06586cff54726e18d1f6Andreas Huber if (!strncmp(desc, "PCMU/", 5)) { 129fcea8f7a7d178e5426aa06586cff54726e18d1f6Andreas Huber format->setCString(kKeyMIMEType, MEDIA_MIMETYPE_AUDIO_G711_MLAW); 130fcea8f7a7d178e5426aa06586cff54726e18d1f6Andreas Huber } else if (!strncmp(desc, "PCMA/", 5)) { 131fcea8f7a7d178e5426aa06586cff54726e18d1f6Andreas Huber format->setCString(kKeyMIMEType, MEDIA_MIMETYPE_AUDIO_G711_ALAW); 132fcea8f7a7d178e5426aa06586cff54726e18d1f6Andreas Huber } else { 133fcea8f7a7d178e5426aa06586cff54726e18d1f6Andreas Huber TRESPASS(); 134fcea8f7a7d178e5426aa06586cff54726e18d1f6Andreas Huber } 135fcea8f7a7d178e5426aa06586cff54726e18d1f6Andreas Huber 136fcea8f7a7d178e5426aa06586cff54726e18d1f6Andreas Huber int32_t sampleRate, numChannels; 137fcea8f7a7d178e5426aa06586cff54726e18d1f6Andreas Huber ASessionDescription::ParseFormatDesc( 138fcea8f7a7d178e5426aa06586cff54726e18d1f6Andreas Huber desc, &sampleRate, &numChannels); 139fcea8f7a7d178e5426aa06586cff54726e18d1f6Andreas Huber 140fcea8f7a7d178e5426aa06586cff54726e18d1f6Andreas Huber format->setInt32(kKeySampleRate, sampleRate); 141fcea8f7a7d178e5426aa06586cff54726e18d1f6Andreas Huber format->setInt32(kKeyChannelCount, numChannels); 142fcea8f7a7d178e5426aa06586cff54726e18d1f6Andreas Huber} 143fcea8f7a7d178e5426aa06586cff54726e18d1f6Andreas Huber 144fcea8f7a7d178e5426aa06586cff54726e18d1f6Andreas Huber} // namespace android 145fcea8f7a7d178e5426aa06586cff54726e18d1f6Andreas Huber 146