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> &notify,
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