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