Support for PCMA and PCMU raw audio data in RTP/RTSP.
Change-Id: Icb87bdfa7cf572c572e2a86c46fa072d9fad18f6 related-to-bug: 3084183
This commit is contained in:
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
143
media/libstagefright/rtsp/ARawAudioAssembler.cpp
Normal file
143
media/libstagefright/rtsp/ARawAudioAssembler.cpp
Normal 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> ¬ify, const char *desc, const AString ¶ms)
|
||||
: 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
|
||||
|
||||
60
media/libstagefright/rtsp/ARawAudioAssembler.h
Normal file
60
media/libstagefright/rtsp/ARawAudioAssembler.h
Normal 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> ¬ify,
|
||||
const char *desc, const AString ¶ms);
|
||||
|
||||
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_
|
||||
@@ -9,6 +9,7 @@ LOCAL_SRC_FILES:= \
|
||||
AMPEG4AudioAssembler.cpp \
|
||||
AMPEG4ElementaryAssembler.cpp \
|
||||
APacketSource.cpp \
|
||||
ARawAudioAssembler.cpp \
|
||||
ARTPAssembler.cpp \
|
||||
ARTPConnection.cpp \
|
||||
ARTPSource.cpp \
|
||||
|
||||
Reference in New Issue
Block a user