Support for PCMA and PCMU raw audio data in RTP/RTSP.

Change-Id: Icb87bdfa7cf572c572e2a86c46fa072d9fad18f6
related-to-bug: 3084183
This commit is contained in:
Andreas Huber
2011-02-22 16:25:00 -08:00
parent beefeb6151
commit b6723735cf
5 changed files with 210 additions and 0 deletions

View File

@@ -20,6 +20,7 @@
#include "APacketSource.h"
#include "ARawAudioAssembler.h"
#include "ASessionDescription.h"
#include "avc_utils.h"
@@ -661,6 +662,8 @@ APacketSource::APacketSource(
mFormat->setData(
kKeyESDS, 0,
codecSpecificData->data(), codecSpecificData->size());
} else if (ARawAudioAssembler::Supports(desc.c_str())) {
ARawAudioAssembler::MakeFormat(desc.c_str(), mFormat);
} else {
mInitCheck = ERROR_UNSUPPORTED;
}

View File

@@ -25,6 +25,7 @@
#include "AH263Assembler.h"
#include "AMPEG4AudioAssembler.h"
#include "AMPEG4ElementaryAssembler.h"
#include "ARawAudioAssembler.h"
#include "ASessionDescription.h"
#include <media/stagefright/foundation/ABuffer.h>
@@ -70,6 +71,8 @@ ARTPSource::ARTPSource(
|| !strncasecmp(desc.c_str(), "mpeg4-generic/", 14)) {
mAssembler = new AMPEG4ElementaryAssembler(notify, desc, params);
mIssueFIRRequests = true;
} else if (ARawAudioAssembler::Supports(desc.c_str())) {
mAssembler = new ARawAudioAssembler(notify, desc.c_str(), params);
} else {
TRESPASS();
}

View File

@@ -0,0 +1,143 @@
/*
* Copyright (C) 2011 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
//#define LOG_NDEBUG 0
#define LOG_TAG "ARawAudioAssembler"
#include <utils/Log.h>
#include "ARawAudioAssembler.h"
#include "ARTPSource.h"
#include "ASessionDescription.h"
#include <media/stagefright/foundation/ABuffer.h>
#include <media/stagefright/foundation/ADebug.h>
#include <media/stagefright/foundation/AMessage.h>
#include <media/stagefright/foundation/hexdump.h>
#include <media/stagefright/MediaDefs.h>
#include <media/stagefright/MetaData.h>
#include <media/stagefright/Utils.h>
namespace android {
ARawAudioAssembler::ARawAudioAssembler(
const sp<AMessage> &notify, const char *desc, const AString &params)
: mNotifyMsg(notify),
mNextExpectedSeqNoValid(false),
mNextExpectedSeqNo(0) {
}
ARawAudioAssembler::~ARawAudioAssembler() {
}
ARTPAssembler::AssemblyStatus ARawAudioAssembler::assembleMore(
const sp<ARTPSource> &source) {
return addPacket(source);
}
ARTPAssembler::AssemblyStatus ARawAudioAssembler::addPacket(
const sp<ARTPSource> &source) {
List<sp<ABuffer> > *queue = source->queue();
if (queue->empty()) {
return NOT_ENOUGH_DATA;
}
if (mNextExpectedSeqNoValid) {
List<sp<ABuffer> >::iterator it = queue->begin();
while (it != queue->end()) {
if ((uint32_t)(*it)->int32Data() >= mNextExpectedSeqNo) {
break;
}
it = queue->erase(it);
}
if (queue->empty()) {
return NOT_ENOUGH_DATA;
}
}
sp<ABuffer> buffer = *queue->begin();
if (!mNextExpectedSeqNoValid) {
mNextExpectedSeqNoValid = true;
mNextExpectedSeqNo = (uint32_t)buffer->int32Data();
} else if ((uint32_t)buffer->int32Data() != mNextExpectedSeqNo) {
LOGV("Not the sequence number I expected");
return WRONG_SEQUENCE_NUMBER;
}
// hexdump(buffer->data(), buffer->size());
if (buffer->size() < 1) {
queue->erase(queue->begin());
++mNextExpectedSeqNo;
LOGV("raw audio packet too short.");
return MALFORMED_PACKET;
}
sp<AMessage> msg = mNotifyMsg->dup();
msg->setObject("access-unit", buffer);
msg->post();
queue->erase(queue->begin());
++mNextExpectedSeqNo;
return OK;
}
void ARawAudioAssembler::packetLost() {
CHECK(mNextExpectedSeqNoValid);
++mNextExpectedSeqNo;
}
void ARawAudioAssembler::onByeReceived() {
sp<AMessage> msg = mNotifyMsg->dup();
msg->setInt32("eos", true);
msg->post();
}
// static
bool ARawAudioAssembler::Supports(const char *desc) {
return !strncmp(desc, "PCMU/", 5)
|| !strncmp(desc, "PCMA/", 5);
}
// static
void ARawAudioAssembler::MakeFormat(
const char *desc, const sp<MetaData> &format) {
if (!strncmp(desc, "PCMU/", 5)) {
format->setCString(kKeyMIMEType, MEDIA_MIMETYPE_AUDIO_G711_MLAW);
} else if (!strncmp(desc, "PCMA/", 5)) {
format->setCString(kKeyMIMEType, MEDIA_MIMETYPE_AUDIO_G711_ALAW);
} else {
TRESPASS();
}
int32_t sampleRate, numChannels;
ASessionDescription::ParseFormatDesc(
desc, &sampleRate, &numChannels);
format->setInt32(kKeySampleRate, sampleRate);
format->setInt32(kKeyChannelCount, numChannels);
}
} // namespace android

View File

@@ -0,0 +1,60 @@
/*
* Copyright (C) 2011 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#ifndef A_RAW_AUDIO_ASSEMBLER_H_
#define A_RAW_AUDIO_ASSEMBLER_H_
#include "ARTPAssembler.h"
namespace android {
struct AMessage;
struct AString;
struct MetaData;
struct ARawAudioAssembler : public ARTPAssembler {
ARawAudioAssembler(
const sp<AMessage> &notify,
const char *desc, const AString &params);
static bool Supports(const char *desc);
static void MakeFormat(
const char *desc, const sp<MetaData> &format);
protected:
virtual ~ARawAudioAssembler();
virtual AssemblyStatus assembleMore(const sp<ARTPSource> &source);
virtual void onByeReceived();
virtual void packetLost();
private:
bool mIsWide;
sp<AMessage> mNotifyMsg;
bool mNextExpectedSeqNoValid;
uint32_t mNextExpectedSeqNo;
AssemblyStatus addPacket(const sp<ARTPSource> &source);
DISALLOW_EVIL_CONSTRUCTORS(ARawAudioAssembler);
};
} // namespace android
#endif // A_RAW_AUDIO_ASSEMBLER_H_

View File

@@ -9,6 +9,7 @@ LOCAL_SRC_FILES:= \
AMPEG4AudioAssembler.cpp \
AMPEG4ElementaryAssembler.cpp \
APacketSource.cpp \
ARawAudioAssembler.cpp \
ARTPAssembler.cpp \
ARTPConnection.cpp \
ARTPSource.cpp \