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