1a979ad6739d573b3823b0fe7321f554ef5544753Andreas Huber/*
2a979ad6739d573b3823b0fe7321f554ef5544753Andreas Huber * Copyright (C) 2010 The Android Open Source Project
3a979ad6739d573b3823b0fe7321f554ef5544753Andreas Huber *
4a979ad6739d573b3823b0fe7321f554ef5544753Andreas Huber * Licensed under the Apache License, Version 2.0 (the "License");
5a979ad6739d573b3823b0fe7321f554ef5544753Andreas Huber * you may not use this file except in compliance with the License.
6a979ad6739d573b3823b0fe7321f554ef5544753Andreas Huber * You may obtain a copy of the License at
7a979ad6739d573b3823b0fe7321f554ef5544753Andreas Huber *
8a979ad6739d573b3823b0fe7321f554ef5544753Andreas Huber *      http://www.apache.org/licenses/LICENSE-2.0
9a979ad6739d573b3823b0fe7321f554ef5544753Andreas Huber *
10a979ad6739d573b3823b0fe7321f554ef5544753Andreas Huber * Unless required by applicable law or agreed to in writing, software
11a979ad6739d573b3823b0fe7321f554ef5544753Andreas Huber * distributed under the License is distributed on an "AS IS" BASIS,
12a979ad6739d573b3823b0fe7321f554ef5544753Andreas Huber * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13a979ad6739d573b3823b0fe7321f554ef5544753Andreas Huber * See the License for the specific language governing permissions and
14a979ad6739d573b3823b0fe7321f554ef5544753Andreas Huber * limitations under the License.
15a979ad6739d573b3823b0fe7321f554ef5544753Andreas Huber */
16a979ad6739d573b3823b0fe7321f554ef5544753Andreas Huber
176e3fa444c5b3970666707bb2b6d25e2615dafe80Andreas Huber//#define LOG_NDEBUG 0
186e3fa444c5b3970666707bb2b6d25e2615dafe80Andreas Huber#define LOG_TAG "AMPEG4ElementaryAssembler"
196e3fa444c5b3970666707bb2b6d25e2615dafe80Andreas Huber#include <utils/Log.h>
206e3fa444c5b3970666707bb2b6d25e2615dafe80Andreas Huber
21a979ad6739d573b3823b0fe7321f554ef5544753Andreas Huber#include "AMPEG4ElementaryAssembler.h"
22a979ad6739d573b3823b0fe7321f554ef5544753Andreas Huber
23a979ad6739d573b3823b0fe7321f554ef5544753Andreas Huber#include "ARTPSource.h"
24a979ad6739d573b3823b0fe7321f554ef5544753Andreas Huber
25e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber#include <media/stagefright/foundation/ABitReader.h>
26a979ad6739d573b3823b0fe7321f554ef5544753Andreas Huber#include <media/stagefright/foundation/ABuffer.h>
27a979ad6739d573b3823b0fe7321f554ef5544753Andreas Huber#include <media/stagefright/foundation/ADebug.h>
28a979ad6739d573b3823b0fe7321f554ef5544753Andreas Huber#include <media/stagefright/foundation/AMessage.h>
29a979ad6739d573b3823b0fe7321f554ef5544753Andreas Huber#include <media/stagefright/foundation/hexdump.h>
30e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber#include <media/stagefright/Utils.h>
31a979ad6739d573b3823b0fe7321f554ef5544753Andreas Huber
32e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber#include <ctype.h>
33a979ad6739d573b3823b0fe7321f554ef5544753Andreas Huber#include <stdint.h>
34a979ad6739d573b3823b0fe7321f554ef5544753Andreas Huber
35a979ad6739d573b3823b0fe7321f554ef5544753Andreas Hubernamespace android {
36a979ad6739d573b3823b0fe7321f554ef5544753Andreas Huber
37e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huberstatic bool GetAttribute(const char *s, const char *key, AString *value) {
38e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber    value->clear();
39e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber
40e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber    size_t keyLen = strlen(key);
41e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber
42e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber    for (;;) {
43e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber        while (isspace(*s)) {
44e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber            ++s;
45e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber        }
46e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber
47e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber        const char *colonPos = strchr(s, ';');
48e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber
49e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber        size_t len =
50e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber            (colonPos == NULL) ? strlen(s) : colonPos - s;
51e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber
52e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber        if (len >= keyLen + 1 && s[keyLen] == '='
53e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber                && !strncasecmp(s, key, keyLen)) {
54e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber            value->setTo(&s[keyLen + 1], len - keyLen - 1);
55e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber            return true;
56e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber        }
57e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber
58e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber        if (colonPos == NULL) {
59e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber            return false;
60e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber        }
61e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber
62e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber        s = colonPos + 1;
63e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber    }
64e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber}
65e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber
66e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huberstatic bool GetIntegerAttribute(
67e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber        const char *s, const char *key, unsigned *x) {
68e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber    *x = 0;
69e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber
70e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber    AString val;
71e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber    if (!GetAttribute(s, key, &val)) {
72e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber        return false;
73e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber    }
74e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber
75e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber    s = val.c_str();
76e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber    char *end;
77e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber    unsigned y = strtoul(s, &end, 10);
78e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber
79e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber    if (end == s || *end != '\0') {
80e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber        return false;
81e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber    }
82e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber
83e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber    *x = y;
84e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber
85e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber    return true;
86e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber}
87e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber
88a979ad6739d573b3823b0fe7321f554ef5544753Andreas Huber// static
89e536f800c695bcd2ef861b9b9877b2108ed21613Andreas HuberAMPEG4ElementaryAssembler::AMPEG4ElementaryAssembler(
90e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber        const sp<AMessage> &notify, const AString &desc, const AString &params)
91a979ad6739d573b3823b0fe7321f554ef5544753Andreas Huber    : mNotifyMsg(notify),
92e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber      mIsGeneric(false),
93e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber      mParams(params),
94e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber      mSizeLength(0),
95e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber      mIndexLength(0),
96e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber      mIndexDeltaLength(0),
97e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber      mCTSDeltaLength(0),
98e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber      mDTSDeltaLength(0),
99e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber      mRandomAccessIndication(false),
100e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber      mStreamStateIndication(0),
101e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber      mAuxiliaryDataSizeLength(0),
102e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber      mHasAUHeader(false),
103a979ad6739d573b3823b0fe7321f554ef5544753Andreas Huber      mAccessUnitRTPTime(0),
104a979ad6739d573b3823b0fe7321f554ef5544753Andreas Huber      mNextExpectedSeqNoValid(false),
105a979ad6739d573b3823b0fe7321f554ef5544753Andreas Huber      mNextExpectedSeqNo(0),
106a979ad6739d573b3823b0fe7321f554ef5544753Andreas Huber      mAccessUnitDamaged(false) {
1070407269ae35e62a6aa2f6e40964970db1bd4b14aAndreas Huber    mIsGeneric = !strncasecmp(desc.c_str(),"mpeg4-generic/", 14);
108e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber
109e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber    if (mIsGeneric) {
110e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber        AString value;
111e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber        CHECK(GetAttribute(params.c_str(), "mode", &value));
112e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber
113e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber        if (!GetIntegerAttribute(params.c_str(), "sizeLength", &mSizeLength)) {
114e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber            mSizeLength = 0;
115e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber        }
116e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber
117e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber        if (!GetIntegerAttribute(
118e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber                    params.c_str(), "indexLength", &mIndexLength)) {
119e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber            mIndexLength = 0;
120e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber        }
121e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber
122e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber        if (!GetIntegerAttribute(
123e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber                    params.c_str(), "indexDeltaLength", &mIndexDeltaLength)) {
124e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber            mIndexDeltaLength = 0;
125e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber        }
126e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber
127e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber        if (!GetIntegerAttribute(
128e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber                    params.c_str(), "CTSDeltaLength", &mCTSDeltaLength)) {
129e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber            mCTSDeltaLength = 0;
130e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber        }
131e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber
132e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber        if (!GetIntegerAttribute(
133e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber                    params.c_str(), "DTSDeltaLength", &mDTSDeltaLength)) {
134e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber            mDTSDeltaLength = 0;
135e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber        }
136e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber
137e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber        unsigned x;
138e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber        if (!GetIntegerAttribute(
139e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber                    params.c_str(), "randomAccessIndication", &x)) {
140e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber            mRandomAccessIndication = false;
141e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber        } else {
142e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber            CHECK(x == 0 || x == 1);
143e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber            mRandomAccessIndication = (x != 0);
144e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber        }
145e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber
146e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber        if (!GetIntegerAttribute(
147e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber                    params.c_str(), "streamStateIndication",
148e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber                    &mStreamStateIndication)) {
149e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber            mStreamStateIndication = 0;
150e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber        }
151e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber
152e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber        if (!GetIntegerAttribute(
153e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber                    params.c_str(), "auxiliaryDataSizeLength",
154e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber                    &mAuxiliaryDataSizeLength)) {
155e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber            mAuxiliaryDataSizeLength = 0;
156e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber        }
157e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber
158e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber        mHasAUHeader =
159e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber            mSizeLength > 0
160e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber            || mIndexLength > 0
161e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber            || mIndexDeltaLength > 0
162e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber            || mCTSDeltaLength > 0
163e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber            || mDTSDeltaLength > 0
164e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber            || mRandomAccessIndication
165e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber            || mStreamStateIndication > 0;
166e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber    }
167a979ad6739d573b3823b0fe7321f554ef5544753Andreas Huber}
168a979ad6739d573b3823b0fe7321f554ef5544753Andreas Huber
169a979ad6739d573b3823b0fe7321f554ef5544753Andreas HuberAMPEG4ElementaryAssembler::~AMPEG4ElementaryAssembler() {
170a979ad6739d573b3823b0fe7321f554ef5544753Andreas Huber}
171a979ad6739d573b3823b0fe7321f554ef5544753Andreas Huber
172e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huberstruct AUHeader {
173e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber    unsigned mSize;
174e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber    unsigned mSerial;
175e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber};
176e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber
177a979ad6739d573b3823b0fe7321f554ef5544753Andreas HuberARTPAssembler::AssemblyStatus AMPEG4ElementaryAssembler::addPacket(
178a979ad6739d573b3823b0fe7321f554ef5544753Andreas Huber        const sp<ARTPSource> &source) {
179a979ad6739d573b3823b0fe7321f554ef5544753Andreas Huber    List<sp<ABuffer> > *queue = source->queue();
180a979ad6739d573b3823b0fe7321f554ef5544753Andreas Huber
181a979ad6739d573b3823b0fe7321f554ef5544753Andreas Huber    if (queue->empty()) {
182a979ad6739d573b3823b0fe7321f554ef5544753Andreas Huber        return NOT_ENOUGH_DATA;
183a979ad6739d573b3823b0fe7321f554ef5544753Andreas Huber    }
184a979ad6739d573b3823b0fe7321f554ef5544753Andreas Huber
185a979ad6739d573b3823b0fe7321f554ef5544753Andreas Huber    if (mNextExpectedSeqNoValid) {
186a979ad6739d573b3823b0fe7321f554ef5544753Andreas Huber        List<sp<ABuffer> >::iterator it = queue->begin();
187a979ad6739d573b3823b0fe7321f554ef5544753Andreas Huber        while (it != queue->end()) {
188a979ad6739d573b3823b0fe7321f554ef5544753Andreas Huber            if ((uint32_t)(*it)->int32Data() >= mNextExpectedSeqNo) {
189a979ad6739d573b3823b0fe7321f554ef5544753Andreas Huber                break;
190a979ad6739d573b3823b0fe7321f554ef5544753Andreas Huber            }
191a979ad6739d573b3823b0fe7321f554ef5544753Andreas Huber
192a979ad6739d573b3823b0fe7321f554ef5544753Andreas Huber            it = queue->erase(it);
193a979ad6739d573b3823b0fe7321f554ef5544753Andreas Huber        }
194a979ad6739d573b3823b0fe7321f554ef5544753Andreas Huber
195a979ad6739d573b3823b0fe7321f554ef5544753Andreas Huber        if (queue->empty()) {
196a979ad6739d573b3823b0fe7321f554ef5544753Andreas Huber            return NOT_ENOUGH_DATA;
197a979ad6739d573b3823b0fe7321f554ef5544753Andreas Huber        }
198a979ad6739d573b3823b0fe7321f554ef5544753Andreas Huber    }
199a979ad6739d573b3823b0fe7321f554ef5544753Andreas Huber
200a979ad6739d573b3823b0fe7321f554ef5544753Andreas Huber    sp<ABuffer> buffer = *queue->begin();
201a979ad6739d573b3823b0fe7321f554ef5544753Andreas Huber
202a979ad6739d573b3823b0fe7321f554ef5544753Andreas Huber    if (!mNextExpectedSeqNoValid) {
203a979ad6739d573b3823b0fe7321f554ef5544753Andreas Huber        mNextExpectedSeqNoValid = true;
204a979ad6739d573b3823b0fe7321f554ef5544753Andreas Huber        mNextExpectedSeqNo = (uint32_t)buffer->int32Data();
205a979ad6739d573b3823b0fe7321f554ef5544753Andreas Huber    } else if ((uint32_t)buffer->int32Data() != mNextExpectedSeqNo) {
2066e3fa444c5b3970666707bb2b6d25e2615dafe80Andreas Huber        LOGV("Not the sequence number I expected");
207a979ad6739d573b3823b0fe7321f554ef5544753Andreas Huber
208a979ad6739d573b3823b0fe7321f554ef5544753Andreas Huber        return WRONG_SEQUENCE_NUMBER;
209a979ad6739d573b3823b0fe7321f554ef5544753Andreas Huber    }
210a979ad6739d573b3823b0fe7321f554ef5544753Andreas Huber
211a979ad6739d573b3823b0fe7321f554ef5544753Andreas Huber    uint32_t rtpTime;
212a979ad6739d573b3823b0fe7321f554ef5544753Andreas Huber    CHECK(buffer->meta()->findInt32("rtp-time", (int32_t *)&rtpTime));
213a979ad6739d573b3823b0fe7321f554ef5544753Andreas Huber
214a979ad6739d573b3823b0fe7321f554ef5544753Andreas Huber    if (mPackets.size() > 0 && rtpTime != mAccessUnitRTPTime) {
215a979ad6739d573b3823b0fe7321f554ef5544753Andreas Huber        submitAccessUnit();
216a979ad6739d573b3823b0fe7321f554ef5544753Andreas Huber    }
217a979ad6739d573b3823b0fe7321f554ef5544753Andreas Huber    mAccessUnitRTPTime = rtpTime;
218a979ad6739d573b3823b0fe7321f554ef5544753Andreas Huber
219e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber    if (!mIsGeneric) {
220e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber        mPackets.push_back(buffer);
221e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber    } else {
222e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber        // hexdump(buffer->data(), buffer->size());
223e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber
224e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber        CHECK_GE(buffer->size(), 2u);
225e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber        unsigned AU_headers_length = U16_AT(buffer->data());  // in bits
226e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber
227e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber        CHECK_GE(buffer->size(), 2 + (AU_headers_length + 7) / 8);
228e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber
229e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber        List<AUHeader> headers;
230e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber
231e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber        ABitReader bits(buffer->data() + 2, buffer->size() - 2);
232e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber        unsigned numBitsLeft = AU_headers_length;
233e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber
234e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber        unsigned AU_serial = 0;
235e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber        for (;;) {
236e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber            if (numBitsLeft < mSizeLength) { break; }
237e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber
238e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber            unsigned AU_size = bits.getBits(mSizeLength);
239e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber            numBitsLeft -= mSizeLength;
240e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber
241e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber            size_t n = headers.empty() ? mIndexLength : mIndexDeltaLength;
242e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber            if (numBitsLeft < n) { break; }
243e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber
244e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber            unsigned AU_index = bits.getBits(n);
245e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber            numBitsLeft -= n;
246e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber
247e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber            if (headers.empty()) {
248e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber                AU_serial = AU_index;
249e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber            } else {
250e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber                AU_serial += 1 + AU_index;
251e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber            }
252e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber
253e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber            if (mCTSDeltaLength > 0) {
254e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber                if (numBitsLeft < 1) {
255e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber                    break;
256e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber                }
257e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber                --numBitsLeft;
258e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber                if (bits.getBits(1)) {
259e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber                    if (numBitsLeft < mCTSDeltaLength) {
260e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber                        break;
261e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber                    }
262e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber                    bits.skipBits(mCTSDeltaLength);
263e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber                    numBitsLeft -= mCTSDeltaLength;
264e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber                }
265e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber            }
266e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber
267e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber            if (mDTSDeltaLength > 0) {
268e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber                if (numBitsLeft < 1) {
269e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber                    break;
270e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber                }
271e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber                --numBitsLeft;
272e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber                if (bits.getBits(1)) {
273e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber                    if (numBitsLeft < mDTSDeltaLength) {
274e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber                        break;
275e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber                    }
276e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber                    bits.skipBits(mDTSDeltaLength);
277e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber                    numBitsLeft -= mDTSDeltaLength;
278e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber                }
279e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber            }
280e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber
281e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber            if (mRandomAccessIndication) {
282e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber                if (numBitsLeft < 1) {
283e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber                    break;
284e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber                }
285e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber                bits.skipBits(1);
286e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber                --numBitsLeft;
287e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber            }
288e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber
289e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber            if (mStreamStateIndication > 0) {
290e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber                if (numBitsLeft < mStreamStateIndication) {
291e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber                    break;
292e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber                }
293e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber                bits.skipBits(mStreamStateIndication);
294e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber            }
295e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber
296e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber            AUHeader header;
297e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber            header.mSize = AU_size;
298e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber            header.mSerial = AU_serial;
299e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber            headers.push_back(header);
300e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber        }
301e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber
302e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber        size_t offset = 2 + (AU_headers_length + 7) / 8;
303e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber
304e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber        if (mAuxiliaryDataSizeLength > 0) {
305e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber            ABitReader bits(buffer->data() + offset, buffer->size() - offset);
306e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber
307e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber            unsigned auxSize = bits.getBits(mAuxiliaryDataSizeLength);
308e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber
309e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber            offset += (mAuxiliaryDataSizeLength + auxSize + 7) / 8;
310e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber        }
311e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber
312e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber        for (List<AUHeader>::iterator it = headers.begin();
313e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber             it != headers.end(); ++it) {
314e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber            const AUHeader &header = *it;
315e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber
316e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber            CHECK_LE(offset + header.mSize, buffer->size());
317e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber
318e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber            sp<ABuffer> accessUnit = new ABuffer(header.mSize);
319e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber            memcpy(accessUnit->data(), buffer->data() + offset, header.mSize);
320e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber
321e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber            offset += header.mSize;
322e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber
323e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber            CopyTimes(accessUnit, buffer);
324e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber            mPackets.push_back(accessUnit);
325e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber        }
326e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber
327e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber        CHECK_EQ(offset, buffer->size());
328e536f800c695bcd2ef861b9b9877b2108ed21613Andreas Huber    }
329a979ad6739d573b3823b0fe7321f554ef5544753Andreas Huber
330a979ad6739d573b3823b0fe7321f554ef5544753Andreas Huber    queue->erase(queue->begin());
331a979ad6739d573b3823b0fe7321f554ef5544753Andreas Huber    ++mNextExpectedSeqNo;
332a979ad6739d573b3823b0fe7321f554ef5544753Andreas Huber
333a979ad6739d573b3823b0fe7321f554ef5544753Andreas Huber    return OK;
334a979ad6739d573b3823b0fe7321f554ef5544753Andreas Huber}
335a979ad6739d573b3823b0fe7321f554ef5544753Andreas Huber
336a979ad6739d573b3823b0fe7321f554ef5544753Andreas Hubervoid AMPEG4ElementaryAssembler::submitAccessUnit() {
337a979ad6739d573b3823b0fe7321f554ef5544753Andreas Huber    CHECK(!mPackets.empty());
338a979ad6739d573b3823b0fe7321f554ef5544753Andreas Huber
3396e3fa444c5b3970666707bb2b6d25e2615dafe80Andreas Huber    LOGV("Access unit complete (%d nal units)", mPackets.size());
340a979ad6739d573b3823b0fe7321f554ef5544753Andreas Huber
341a979ad6739d573b3823b0fe7321f554ef5544753Andreas Huber    size_t totalSize = 0;
342a979ad6739d573b3823b0fe7321f554ef5544753Andreas Huber    for (List<sp<ABuffer> >::iterator it = mPackets.begin();
343a979ad6739d573b3823b0fe7321f554ef5544753Andreas Huber         it != mPackets.end(); ++it) {
344a979ad6739d573b3823b0fe7321f554ef5544753Andreas Huber        totalSize += (*it)->size();
345a979ad6739d573b3823b0fe7321f554ef5544753Andreas Huber    }
346a979ad6739d573b3823b0fe7321f554ef5544753Andreas Huber
347a979ad6739d573b3823b0fe7321f554ef5544753Andreas Huber    sp<ABuffer> accessUnit = new ABuffer(totalSize);
348a979ad6739d573b3823b0fe7321f554ef5544753Andreas Huber    size_t offset = 0;
349a979ad6739d573b3823b0fe7321f554ef5544753Andreas Huber    for (List<sp<ABuffer> >::iterator it = mPackets.begin();
350a979ad6739d573b3823b0fe7321f554ef5544753Andreas Huber         it != mPackets.end(); ++it) {
351a979ad6739d573b3823b0fe7321f554ef5544753Andreas Huber        sp<ABuffer> nal = *it;
352a979ad6739d573b3823b0fe7321f554ef5544753Andreas Huber        memcpy(accessUnit->data() + offset, nal->data(), nal->size());
353a979ad6739d573b3823b0fe7321f554ef5544753Andreas Huber        offset += nal->size();
354a979ad6739d573b3823b0fe7321f554ef5544753Andreas Huber    }
355a979ad6739d573b3823b0fe7321f554ef5544753Andreas Huber
356eeb97d91b97f1fc0b26815f098515e9c06d219b8Andreas Huber    CopyTimes(accessUnit, *mPackets.begin());
357a979ad6739d573b3823b0fe7321f554ef5544753Andreas Huber
358a979ad6739d573b3823b0fe7321f554ef5544753Andreas Huber#if 0
359a979ad6739d573b3823b0fe7321f554ef5544753Andreas Huber    printf(mAccessUnitDamaged ? "X" : ".");
360a979ad6739d573b3823b0fe7321f554ef5544753Andreas Huber    fflush(stdout);
361a979ad6739d573b3823b0fe7321f554ef5544753Andreas Huber#endif
362a979ad6739d573b3823b0fe7321f554ef5544753Andreas Huber
363a979ad6739d573b3823b0fe7321f554ef5544753Andreas Huber    if (mAccessUnitDamaged) {
364a979ad6739d573b3823b0fe7321f554ef5544753Andreas Huber        accessUnit->meta()->setInt32("damaged", true);
365a979ad6739d573b3823b0fe7321f554ef5544753Andreas Huber    }
366a979ad6739d573b3823b0fe7321f554ef5544753Andreas Huber
367a979ad6739d573b3823b0fe7321f554ef5544753Andreas Huber    mPackets.clear();
368a979ad6739d573b3823b0fe7321f554ef5544753Andreas Huber    mAccessUnitDamaged = false;
369a979ad6739d573b3823b0fe7321f554ef5544753Andreas Huber
370a979ad6739d573b3823b0fe7321f554ef5544753Andreas Huber    sp<AMessage> msg = mNotifyMsg->dup();
371a979ad6739d573b3823b0fe7321f554ef5544753Andreas Huber    msg->setObject("access-unit", accessUnit);
372a979ad6739d573b3823b0fe7321f554ef5544753Andreas Huber    msg->post();
373a979ad6739d573b3823b0fe7321f554ef5544753Andreas Huber}
374a979ad6739d573b3823b0fe7321f554ef5544753Andreas Huber
375a979ad6739d573b3823b0fe7321f554ef5544753Andreas HuberARTPAssembler::AssemblyStatus AMPEG4ElementaryAssembler::assembleMore(
376a979ad6739d573b3823b0fe7321f554ef5544753Andreas Huber        const sp<ARTPSource> &source) {
377a979ad6739d573b3823b0fe7321f554ef5544753Andreas Huber    AssemblyStatus status = addPacket(source);
378a979ad6739d573b3823b0fe7321f554ef5544753Andreas Huber    if (status == MALFORMED_PACKET) {
379a979ad6739d573b3823b0fe7321f554ef5544753Andreas Huber        mAccessUnitDamaged = true;
380a979ad6739d573b3823b0fe7321f554ef5544753Andreas Huber    }
381a979ad6739d573b3823b0fe7321f554ef5544753Andreas Huber    return status;
382a979ad6739d573b3823b0fe7321f554ef5544753Andreas Huber}
383a979ad6739d573b3823b0fe7321f554ef5544753Andreas Huber
384a979ad6739d573b3823b0fe7321f554ef5544753Andreas Hubervoid AMPEG4ElementaryAssembler::packetLost() {
385a979ad6739d573b3823b0fe7321f554ef5544753Andreas Huber    CHECK(mNextExpectedSeqNoValid);
3866e3fa444c5b3970666707bb2b6d25e2615dafe80Andreas Huber    LOGV("packetLost (expected %d)", mNextExpectedSeqNo);
387a979ad6739d573b3823b0fe7321f554ef5544753Andreas Huber
388a979ad6739d573b3823b0fe7321f554ef5544753Andreas Huber    ++mNextExpectedSeqNo;
389a979ad6739d573b3823b0fe7321f554ef5544753Andreas Huber
390a979ad6739d573b3823b0fe7321f554ef5544753Andreas Huber    mAccessUnitDamaged = true;
391a979ad6739d573b3823b0fe7321f554ef5544753Andreas Huber}
392a979ad6739d573b3823b0fe7321f554ef5544753Andreas Huber
393a979ad6739d573b3823b0fe7321f554ef5544753Andreas Hubervoid AMPEG4ElementaryAssembler::onByeReceived() {
394a979ad6739d573b3823b0fe7321f554ef5544753Andreas Huber    sp<AMessage> msg = mNotifyMsg->dup();
395a979ad6739d573b3823b0fe7321f554ef5544753Andreas Huber    msg->setInt32("eos", true);
396a979ad6739d573b3823b0fe7321f554ef5544753Andreas Huber    msg->post();
397a979ad6739d573b3823b0fe7321f554ef5544753Andreas Huber}
398a979ad6739d573b3823b0fe7321f554ef5544753Andreas Huber
399a979ad6739d573b3823b0fe7321f554ef5544753Andreas Huber}  // namespace android
400