1a557b24ac4dd568d86b08753f7c0361d04f80d46Andreas Huber/*
2a557b24ac4dd568d86b08753f7c0361d04f80d46Andreas Huber * Copyright (C) 2010 The Android Open Source Project
3a557b24ac4dd568d86b08753f7c0361d04f80d46Andreas Huber *
4a557b24ac4dd568d86b08753f7c0361d04f80d46Andreas Huber * Licensed under the Apache License, Version 2.0 (the "License");
5a557b24ac4dd568d86b08753f7c0361d04f80d46Andreas Huber * you may not use this file except in compliance with the License.
6a557b24ac4dd568d86b08753f7c0361d04f80d46Andreas Huber * You may obtain a copy of the License at
7a557b24ac4dd568d86b08753f7c0361d04f80d46Andreas Huber *
8a557b24ac4dd568d86b08753f7c0361d04f80d46Andreas Huber *      http://www.apache.org/licenses/LICENSE-2.0
9a557b24ac4dd568d86b08753f7c0361d04f80d46Andreas Huber *
10a557b24ac4dd568d86b08753f7c0361d04f80d46Andreas Huber * Unless required by applicable law or agreed to in writing, software
11a557b24ac4dd568d86b08753f7c0361d04f80d46Andreas Huber * distributed under the License is distributed on an "AS IS" BASIS,
12a557b24ac4dd568d86b08753f7c0361d04f80d46Andreas Huber * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13a557b24ac4dd568d86b08753f7c0361d04f80d46Andreas Huber * See the License for the specific language governing permissions and
14a557b24ac4dd568d86b08753f7c0361d04f80d46Andreas Huber * limitations under the License.
15a557b24ac4dd568d86b08753f7c0361d04f80d46Andreas Huber */
16a557b24ac4dd568d86b08753f7c0361d04f80d46Andreas Huber
17a557b24ac4dd568d86b08753f7c0361d04f80d46Andreas Huber#include "AnotherPacketSource.h"
18a557b24ac4dd568d86b08753f7c0361d04f80d46Andreas Huber
19a557b24ac4dd568d86b08753f7c0361d04f80d46Andreas Huber#include <media/stagefright/foundation/ABuffer.h>
20a557b24ac4dd568d86b08753f7c0361d04f80d46Andreas Huber#include <media/stagefright/foundation/ADebug.h>
21a557b24ac4dd568d86b08753f7c0361d04f80d46Andreas Huber#include <media/stagefright/foundation/AMessage.h>
22a557b24ac4dd568d86b08753f7c0361d04f80d46Andreas Huber#include <media/stagefright/foundation/AString.h>
23a557b24ac4dd568d86b08753f7c0361d04f80d46Andreas Huber#include <media/stagefright/foundation/hexdump.h>
24a557b24ac4dd568d86b08753f7c0361d04f80d46Andreas Huber#include <media/stagefright/MediaBuffer.h>
25a557b24ac4dd568d86b08753f7c0361d04f80d46Andreas Huber#include <media/stagefright/MediaDefs.h>
26a557b24ac4dd568d86b08753f7c0361d04f80d46Andreas Huber#include <media/stagefright/MetaData.h>
27a557b24ac4dd568d86b08753f7c0361d04f80d46Andreas Huber#include <utils/Vector.h>
28a557b24ac4dd568d86b08753f7c0361d04f80d46Andreas Huber
29a557b24ac4dd568d86b08753f7c0361d04f80d46Andreas Hubernamespace android {
30a557b24ac4dd568d86b08753f7c0361d04f80d46Andreas Huber
31a557b24ac4dd568d86b08753f7c0361d04f80d46Andreas HuberAnotherPacketSource::AnotherPacketSource(const sp<MetaData> &meta)
3266a051af37c3d7a610802c0c58906dc0faefa6beAndreas Huber    : mIsAudio(false),
3366a051af37c3d7a610802c0c58906dc0faefa6beAndreas Huber      mFormat(meta),
34a557b24ac4dd568d86b08753f7c0361d04f80d46Andreas Huber      mEOSResult(OK) {
3566a051af37c3d7a610802c0c58906dc0faefa6beAndreas Huber    const char *mime;
3666a051af37c3d7a610802c0c58906dc0faefa6beAndreas Huber    CHECK(meta->findCString(kKeyMIMEType, &mime));
3766a051af37c3d7a610802c0c58906dc0faefa6beAndreas Huber
3866a051af37c3d7a610802c0c58906dc0faefa6beAndreas Huber    if (!strncasecmp("audio/", mime, 6)) {
3966a051af37c3d7a610802c0c58906dc0faefa6beAndreas Huber        mIsAudio = true;
4066a051af37c3d7a610802c0c58906dc0faefa6beAndreas Huber    } else {
4166a051af37c3d7a610802c0c58906dc0faefa6beAndreas Huber        CHECK(!strncasecmp("video/", mime, 6));
4266a051af37c3d7a610802c0c58906dc0faefa6beAndreas Huber    }
43a557b24ac4dd568d86b08753f7c0361d04f80d46Andreas Huber}
44a557b24ac4dd568d86b08753f7c0361d04f80d46Andreas Huber
4554e6649e4cac3475593f3acb7894837fa1dc61ebAndreas Hubervoid AnotherPacketSource::setFormat(const sp<MetaData> &meta) {
4654e6649e4cac3475593f3acb7894837fa1dc61ebAndreas Huber    CHECK(mFormat == NULL);
4754e6649e4cac3475593f3acb7894837fa1dc61ebAndreas Huber    mFormat = meta;
4854e6649e4cac3475593f3acb7894837fa1dc61ebAndreas Huber}
4954e6649e4cac3475593f3acb7894837fa1dc61ebAndreas Huber
50a557b24ac4dd568d86b08753f7c0361d04f80d46Andreas HuberAnotherPacketSource::~AnotherPacketSource() {
51a557b24ac4dd568d86b08753f7c0361d04f80d46Andreas Huber}
52a557b24ac4dd568d86b08753f7c0361d04f80d46Andreas Huber
53a557b24ac4dd568d86b08753f7c0361d04f80d46Andreas Huberstatus_t AnotherPacketSource::start(MetaData *params) {
54a557b24ac4dd568d86b08753f7c0361d04f80d46Andreas Huber    return OK;
55a557b24ac4dd568d86b08753f7c0361d04f80d46Andreas Huber}
56a557b24ac4dd568d86b08753f7c0361d04f80d46Andreas Huber
57a557b24ac4dd568d86b08753f7c0361d04f80d46Andreas Huberstatus_t AnotherPacketSource::stop() {
58a557b24ac4dd568d86b08753f7c0361d04f80d46Andreas Huber    return OK;
59a557b24ac4dd568d86b08753f7c0361d04f80d46Andreas Huber}
60a557b24ac4dd568d86b08753f7c0361d04f80d46Andreas Huber
61a557b24ac4dd568d86b08753f7c0361d04f80d46Andreas Hubersp<MetaData> AnotherPacketSource::getFormat() {
62a557b24ac4dd568d86b08753f7c0361d04f80d46Andreas Huber    return mFormat;
63a557b24ac4dd568d86b08753f7c0361d04f80d46Andreas Huber}
64a557b24ac4dd568d86b08753f7c0361d04f80d46Andreas Huber
65a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huberstatus_t AnotherPacketSource::dequeueAccessUnit(sp<ABuffer> *buffer) {
66a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huber    buffer->clear();
67a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huber
68a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huber    Mutex::Autolock autoLock(mLock);
69a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huber    while (mEOSResult == OK && mBuffers.empty()) {
70a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huber        mCondition.wait(mLock);
71a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huber    }
72a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huber
73a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huber    if (!mBuffers.empty()) {
74a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huber        *buffer = *mBuffers.begin();
75a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huber        mBuffers.erase(mBuffers.begin());
76a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huber
77a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huber        int32_t discontinuity;
7854e6649e4cac3475593f3acb7894837fa1dc61ebAndreas Huber        if ((*buffer)->meta()->findInt32("discontinuity", &discontinuity)) {
7966a051af37c3d7a610802c0c58906dc0faefa6beAndreas Huber            if (wasFormatChange(discontinuity)) {
8054e6649e4cac3475593f3acb7894837fa1dc61ebAndreas Huber                mFormat.clear();
8154e6649e4cac3475593f3acb7894837fa1dc61ebAndreas Huber            }
8254e6649e4cac3475593f3acb7894837fa1dc61ebAndreas Huber
83a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huber            return INFO_DISCONTINUITY;
84a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huber        }
85a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huber
86a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huber        return OK;
87a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huber    }
88a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huber
89a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huber    return mEOSResult;
90a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huber}
91a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huber
92a557b24ac4dd568d86b08753f7c0361d04f80d46Andreas Huberstatus_t AnotherPacketSource::read(
93a557b24ac4dd568d86b08753f7c0361d04f80d46Andreas Huber        MediaBuffer **out, const ReadOptions *) {
94a557b24ac4dd568d86b08753f7c0361d04f80d46Andreas Huber    *out = NULL;
95a557b24ac4dd568d86b08753f7c0361d04f80d46Andreas Huber
96a557b24ac4dd568d86b08753f7c0361d04f80d46Andreas Huber    Mutex::Autolock autoLock(mLock);
97a557b24ac4dd568d86b08753f7c0361d04f80d46Andreas Huber    while (mEOSResult == OK && mBuffers.empty()) {
98a557b24ac4dd568d86b08753f7c0361d04f80d46Andreas Huber        mCondition.wait(mLock);
99a557b24ac4dd568d86b08753f7c0361d04f80d46Andreas Huber    }
100a557b24ac4dd568d86b08753f7c0361d04f80d46Andreas Huber
101a557b24ac4dd568d86b08753f7c0361d04f80d46Andreas Huber    if (!mBuffers.empty()) {
102a557b24ac4dd568d86b08753f7c0361d04f80d46Andreas Huber        const sp<ABuffer> buffer = *mBuffers.begin();
1034c19bf9833f59f58a9aaea566f0eb98a7fb7e2eaAndreas Huber        mBuffers.erase(mBuffers.begin());
104a557b24ac4dd568d86b08753f7c0361d04f80d46Andreas Huber
1054c19bf9833f59f58a9aaea566f0eb98a7fb7e2eaAndreas Huber        int32_t discontinuity;
10654e6649e4cac3475593f3acb7894837fa1dc61ebAndreas Huber        if (buffer->meta()->findInt32("discontinuity", &discontinuity)) {
10766a051af37c3d7a610802c0c58906dc0faefa6beAndreas Huber            if (wasFormatChange(discontinuity)) {
10854e6649e4cac3475593f3acb7894837fa1dc61ebAndreas Huber                mFormat.clear();
10954e6649e4cac3475593f3acb7894837fa1dc61ebAndreas Huber            }
11054e6649e4cac3475593f3acb7894837fa1dc61ebAndreas Huber
1114c19bf9833f59f58a9aaea566f0eb98a7fb7e2eaAndreas Huber            return INFO_DISCONTINUITY;
1124c19bf9833f59f58a9aaea566f0eb98a7fb7e2eaAndreas Huber        } else {
113a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huber            int64_t timeUs;
114a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huber            CHECK(buffer->meta()->findInt64("timeUs", &timeUs));
115a557b24ac4dd568d86b08753f7c0361d04f80d46Andreas Huber
116e38a2cba16f2161a3a41521c84325cc5c24d9668Andreas Huber            MediaBuffer *mediaBuffer = new MediaBuffer(buffer);
117a557b24ac4dd568d86b08753f7c0361d04f80d46Andreas Huber
118e38a2cba16f2161a3a41521c84325cc5c24d9668Andreas Huber            mediaBuffer->meta_data()->setInt64(kKeyTime, timeUs);
119a557b24ac4dd568d86b08753f7c0361d04f80d46Andreas Huber
1204c19bf9833f59f58a9aaea566f0eb98a7fb7e2eaAndreas Huber            *out = mediaBuffer;
1214c19bf9833f59f58a9aaea566f0eb98a7fb7e2eaAndreas Huber            return OK;
1224c19bf9833f59f58a9aaea566f0eb98a7fb7e2eaAndreas Huber        }
123a557b24ac4dd568d86b08753f7c0361d04f80d46Andreas Huber    }
124a557b24ac4dd568d86b08753f7c0361d04f80d46Andreas Huber
125a557b24ac4dd568d86b08753f7c0361d04f80d46Andreas Huber    return mEOSResult;
126a557b24ac4dd568d86b08753f7c0361d04f80d46Andreas Huber}
127a557b24ac4dd568d86b08753f7c0361d04f80d46Andreas Huber
12866a051af37c3d7a610802c0c58906dc0faefa6beAndreas Huberbool AnotherPacketSource::wasFormatChange(
12966a051af37c3d7a610802c0c58906dc0faefa6beAndreas Huber        int32_t discontinuityType) const {
13066a051af37c3d7a610802c0c58906dc0faefa6beAndreas Huber    if (mIsAudio) {
13166a051af37c3d7a610802c0c58906dc0faefa6beAndreas Huber        return (discontinuityType & ATSParser::DISCONTINUITY_AUDIO_FORMAT) != 0;
13266a051af37c3d7a610802c0c58906dc0faefa6beAndreas Huber    }
13366a051af37c3d7a610802c0c58906dc0faefa6beAndreas Huber
13466a051af37c3d7a610802c0c58906dc0faefa6beAndreas Huber    return (discontinuityType & ATSParser::DISCONTINUITY_VIDEO_FORMAT) != 0;
13566a051af37c3d7a610802c0c58906dc0faefa6beAndreas Huber}
13666a051af37c3d7a610802c0c58906dc0faefa6beAndreas Huber
137a557b24ac4dd568d86b08753f7c0361d04f80d46Andreas Hubervoid AnotherPacketSource::queueAccessUnit(const sp<ABuffer> &buffer) {
138a557b24ac4dd568d86b08753f7c0361d04f80d46Andreas Huber    int32_t damaged;
139a557b24ac4dd568d86b08753f7c0361d04f80d46Andreas Huber    if (buffer->meta()->findInt32("damaged", &damaged) && damaged) {
140a557b24ac4dd568d86b08753f7c0361d04f80d46Andreas Huber        // LOG(VERBOSE) << "discarding damaged AU";
141a557b24ac4dd568d86b08753f7c0361d04f80d46Andreas Huber        return;
142a557b24ac4dd568d86b08753f7c0361d04f80d46Andreas Huber    }
143a557b24ac4dd568d86b08753f7c0361d04f80d46Andreas Huber
14454d09724e3ea2af4e08dff47d7ade92a95784127Andreas Huber    int64_t timeUs;
145a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huber    CHECK(buffer->meta()->findInt64("timeUs", &timeUs));
14654d09724e3ea2af4e08dff47d7ade92a95784127Andreas Huber    LOGV("queueAccessUnit timeUs=%lld us (%.2f secs)", timeUs, timeUs / 1E6);
14754d09724e3ea2af4e08dff47d7ade92a95784127Andreas Huber
148a557b24ac4dd568d86b08753f7c0361d04f80d46Andreas Huber    Mutex::Autolock autoLock(mLock);
149a557b24ac4dd568d86b08753f7c0361d04f80d46Andreas Huber    mBuffers.push_back(buffer);
150a557b24ac4dd568d86b08753f7c0361d04f80d46Andreas Huber    mCondition.signal();
151a557b24ac4dd568d86b08753f7c0361d04f80d46Andreas Huber}
152a557b24ac4dd568d86b08753f7c0361d04f80d46Andreas Huber
15354e6649e4cac3475593f3acb7894837fa1dc61ebAndreas Hubervoid AnotherPacketSource::queueDiscontinuity(
154669ad13de924af145771837b339c882e30ea8ce2Andreas Huber        ATSParser::DiscontinuityType type,
155669ad13de924af145771837b339c882e30ea8ce2Andreas Huber        const sp<AMessage> &extra) {
1564c19bf9833f59f58a9aaea566f0eb98a7fb7e2eaAndreas Huber    Mutex::Autolock autoLock(mLock);
15754d09724e3ea2af4e08dff47d7ade92a95784127Andreas Huber
158ced159b1d839b24775525ccb736876e7cb7e649dAndreas Huber    // Leave only discontinuities in the queue.
159ced159b1d839b24775525ccb736876e7cb7e649dAndreas Huber    List<sp<ABuffer> >::iterator it = mBuffers.begin();
160ced159b1d839b24775525ccb736876e7cb7e649dAndreas Huber    while (it != mBuffers.end()) {
161ced159b1d839b24775525ccb736876e7cb7e649dAndreas Huber        sp<ABuffer> oldBuffer = *it;
162ced159b1d839b24775525ccb736876e7cb7e649dAndreas Huber
163ced159b1d839b24775525ccb736876e7cb7e649dAndreas Huber        int32_t oldDiscontinuityType;
164ced159b1d839b24775525ccb736876e7cb7e649dAndreas Huber        if (!oldBuffer->meta()->findInt32(
165ced159b1d839b24775525ccb736876e7cb7e649dAndreas Huber                    "discontinuity", &oldDiscontinuityType)) {
166ced159b1d839b24775525ccb736876e7cb7e649dAndreas Huber            it = mBuffers.erase(it);
167ced159b1d839b24775525ccb736876e7cb7e649dAndreas Huber            continue;
168ced159b1d839b24775525ccb736876e7cb7e649dAndreas Huber        }
169847551cff3fc824e898a2652e4c6a8dd1b049cb5Andreas Huber
170ced159b1d839b24775525ccb736876e7cb7e649dAndreas Huber        ++it;
171847551cff3fc824e898a2652e4c6a8dd1b049cb5Andreas Huber    }
172ced159b1d839b24775525ccb736876e7cb7e649dAndreas Huber
173ced159b1d839b24775525ccb736876e7cb7e649dAndreas Huber    mEOSResult = OK;
174ced159b1d839b24775525ccb736876e7cb7e649dAndreas Huber
175ced159b1d839b24775525ccb736876e7cb7e649dAndreas Huber    sp<ABuffer> buffer = new ABuffer(0);
176ced159b1d839b24775525ccb736876e7cb7e649dAndreas Huber    buffer->meta()->setInt32("discontinuity", static_cast<int32_t>(type));
177ced159b1d839b24775525ccb736876e7cb7e649dAndreas Huber    buffer->meta()->setMessage("extra", extra);
178847551cff3fc824e898a2652e4c6a8dd1b049cb5Andreas Huber
1794c19bf9833f59f58a9aaea566f0eb98a7fb7e2eaAndreas Huber    mBuffers.push_back(buffer);
1804c19bf9833f59f58a9aaea566f0eb98a7fb7e2eaAndreas Huber    mCondition.signal();
1814c19bf9833f59f58a9aaea566f0eb98a7fb7e2eaAndreas Huber}
1824c19bf9833f59f58a9aaea566f0eb98a7fb7e2eaAndreas Huber
183a557b24ac4dd568d86b08753f7c0361d04f80d46Andreas Hubervoid AnotherPacketSource::signalEOS(status_t result) {
184a557b24ac4dd568d86b08753f7c0361d04f80d46Andreas Huber    CHECK(result != OK);
185a557b24ac4dd568d86b08753f7c0361d04f80d46Andreas Huber
186a557b24ac4dd568d86b08753f7c0361d04f80d46Andreas Huber    Mutex::Autolock autoLock(mLock);
187a557b24ac4dd568d86b08753f7c0361d04f80d46Andreas Huber    mEOSResult = result;
188a557b24ac4dd568d86b08753f7c0361d04f80d46Andreas Huber    mCondition.signal();
189a557b24ac4dd568d86b08753f7c0361d04f80d46Andreas Huber}
190a557b24ac4dd568d86b08753f7c0361d04f80d46Andreas Huber
191a557b24ac4dd568d86b08753f7c0361d04f80d46Andreas Huberbool AnotherPacketSource::hasBufferAvailable(status_t *finalResult) {
192a557b24ac4dd568d86b08753f7c0361d04f80d46Andreas Huber    Mutex::Autolock autoLock(mLock);
193a557b24ac4dd568d86b08753f7c0361d04f80d46Andreas Huber    if (!mBuffers.empty()) {
194a557b24ac4dd568d86b08753f7c0361d04f80d46Andreas Huber        return true;
195a557b24ac4dd568d86b08753f7c0361d04f80d46Andreas Huber    }
196a557b24ac4dd568d86b08753f7c0361d04f80d46Andreas Huber
197a557b24ac4dd568d86b08753f7c0361d04f80d46Andreas Huber    *finalResult = mEOSResult;
198a557b24ac4dd568d86b08753f7c0361d04f80d46Andreas Huber    return false;
199a557b24ac4dd568d86b08753f7c0361d04f80d46Andreas Huber}
200a557b24ac4dd568d86b08753f7c0361d04f80d46Andreas Huber
201a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huberstatus_t AnotherPacketSource::nextBufferTime(int64_t *timeUs) {
202a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huber    *timeUs = 0;
203a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huber
204a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huber    Mutex::Autolock autoLock(mLock);
205a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huber
206a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huber    if (mBuffers.empty()) {
207a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huber        return mEOSResult != OK ? mEOSResult : -EWOULDBLOCK;
208a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huber    }
209a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huber
210a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huber    sp<ABuffer> buffer = *mBuffers.begin();
211a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huber    CHECK(buffer->meta()->findInt64("timeUs", timeUs));
212a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huber
213a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huber    return OK;
214a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huber}
215a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huber
216a557b24ac4dd568d86b08753f7c0361d04f80d46Andreas Huber}  // namespace android
217