AnotherPacketSource.cpp revision 9a442c1b9a051edc6d4ceb0daad2d0a8433e7b0b
1cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber/*
2cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber * Copyright (C) 2010 The Android Open Source Project
3cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber *
4cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber * Licensed under the Apache License, Version 2.0 (the "License");
5cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber * you may not use this file except in compliance with the License.
6cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber * You may obtain a copy of the License at
7cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber *
8cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber *      http://www.apache.org/licenses/LICENSE-2.0
9cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber *
10cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber * Unless required by applicable law or agreed to in writing, software
11cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber * distributed under the License is distributed on an "AS IS" BASIS,
12cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber * See the License for the specific language governing permissions and
14cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber * limitations under the License.
15cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber */
16cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
17cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber#include "AnotherPacketSource.h"
18cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
19cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber#include <media/stagefright/foundation/ABuffer.h>
20cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber#include <media/stagefright/foundation/ADebug.h>
21cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber#include <media/stagefright/foundation/AMessage.h>
22cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber#include <media/stagefright/foundation/AString.h>
23cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber#include <media/stagefright/foundation/hexdump.h>
24cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber#include <media/stagefright/MediaBuffer.h>
25cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber#include <media/stagefright/MediaDefs.h>
26cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber#include <media/stagefright/MetaData.h>
27cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber#include <utils/Vector.h>
28cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
29cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Hubernamespace android {
30cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
31cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas HuberAnotherPacketSource::AnotherPacketSource(const sp<MetaData> &meta)
32cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    : mFormat(meta),
33cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber      mEOSResult(OK) {
34cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber}
35cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
365bc087c573c70c84c6a39946457590b42d392a33Andreas Hubervoid AnotherPacketSource::setFormat(const sp<MetaData> &meta) {
375bc087c573c70c84c6a39946457590b42d392a33Andreas Huber    CHECK(mFormat == NULL);
385bc087c573c70c84c6a39946457590b42d392a33Andreas Huber    mFormat = meta;
395bc087c573c70c84c6a39946457590b42d392a33Andreas Huber}
405bc087c573c70c84c6a39946457590b42d392a33Andreas Huber
41cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas HuberAnotherPacketSource::~AnotherPacketSource() {
42cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber}
43cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
44cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huberstatus_t AnotherPacketSource::start(MetaData *params) {
45cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    return OK;
46cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber}
47cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
48cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huberstatus_t AnotherPacketSource::stop() {
49cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    return OK;
50cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber}
51cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
52cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Hubersp<MetaData> AnotherPacketSource::getFormat() {
53cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    return mFormat;
54cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber}
55cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
56f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatus_t AnotherPacketSource::dequeueAccessUnit(sp<ABuffer> *buffer) {
57f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    buffer->clear();
58f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
59f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    Mutex::Autolock autoLock(mLock);
60f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    while (mEOSResult == OK && mBuffers.empty()) {
61f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        mCondition.wait(mLock);
62f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    }
63f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
64f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    if (!mBuffers.empty()) {
65f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        *buffer = *mBuffers.begin();
66f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        mBuffers.erase(mBuffers.begin());
67f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
68f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        int32_t discontinuity;
695bc087c573c70c84c6a39946457590b42d392a33Andreas Huber        if ((*buffer)->meta()->findInt32("discontinuity", &discontinuity)) {
705bc087c573c70c84c6a39946457590b42d392a33Andreas Huber
715bc087c573c70c84c6a39946457590b42d392a33Andreas Huber            if (discontinuity == ATSParser::DISCONTINUITY_FORMATCHANGE) {
725bc087c573c70c84c6a39946457590b42d392a33Andreas Huber                mFormat.clear();
735bc087c573c70c84c6a39946457590b42d392a33Andreas Huber            }
745bc087c573c70c84c6a39946457590b42d392a33Andreas Huber
75f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            return INFO_DISCONTINUITY;
76f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        }
77f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
78f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        return OK;
79f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    }
80f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
81f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    return mEOSResult;
82f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
83f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
84cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huberstatus_t AnotherPacketSource::read(
85cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        MediaBuffer **out, const ReadOptions *) {
86cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    *out = NULL;
87cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
88cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    Mutex::Autolock autoLock(mLock);
89cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    while (mEOSResult == OK && mBuffers.empty()) {
90cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        mCondition.wait(mLock);
91cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    }
92cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
93cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    if (!mBuffers.empty()) {
94cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        const sp<ABuffer> buffer = *mBuffers.begin();
952a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber        mBuffers.erase(mBuffers.begin());
96cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
972a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber        int32_t discontinuity;
985bc087c573c70c84c6a39946457590b42d392a33Andreas Huber        if (buffer->meta()->findInt32("discontinuity", &discontinuity)) {
995bc087c573c70c84c6a39946457590b42d392a33Andreas Huber            if (discontinuity == ATSParser::DISCONTINUITY_FORMATCHANGE) {
1005bc087c573c70c84c6a39946457590b42d392a33Andreas Huber                mFormat.clear();
1015bc087c573c70c84c6a39946457590b42d392a33Andreas Huber            }
1025bc087c573c70c84c6a39946457590b42d392a33Andreas Huber
1032a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber            return INFO_DISCONTINUITY;
1042a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber        } else {
105f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            int64_t timeUs;
106f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            CHECK(buffer->meta()->findInt64("timeUs", &timeUs));
107cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
108f89d780df70b7fbb8465bce4913c46cca019721fAndreas Huber            MediaBuffer *mediaBuffer = new MediaBuffer(buffer);
109cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
110f89d780df70b7fbb8465bce4913c46cca019721fAndreas Huber            mediaBuffer->meta_data()->setInt64(kKeyTime, timeUs);
111cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
1122a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber            *out = mediaBuffer;
1132a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber            return OK;
1142a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber        }
115cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    }
116cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
117cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    return mEOSResult;
118cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber}
119cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
120cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Hubervoid AnotherPacketSource::queueAccessUnit(const sp<ABuffer> &buffer) {
121cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    int32_t damaged;
122cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    if (buffer->meta()->findInt32("damaged", &damaged) && damaged) {
123cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        // LOG(VERBOSE) << "discarding damaged AU";
124cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        return;
125cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    }
126cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
127bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas Huber    int64_t timeUs;
128f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    CHECK(buffer->meta()->findInt64("timeUs", &timeUs));
129bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas Huber    LOGV("queueAccessUnit timeUs=%lld us (%.2f secs)", timeUs, timeUs / 1E6);
130bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas Huber
131cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    Mutex::Autolock autoLock(mLock);
132cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    mBuffers.push_back(buffer);
133cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    mCondition.signal();
134cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber}
135cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
1365bc087c573c70c84c6a39946457590b42d392a33Andreas Hubervoid AnotherPacketSource::queueDiscontinuity(
13732f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber        ATSParser::DiscontinuityType type,
13832f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber        const sp<AMessage> &extra) {
1392a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber    Mutex::Autolock autoLock(mLock);
140bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas Huber
1419a442c1b9a051edc6d4ceb0daad2d0a8433e7b0bAndreas Huber    // Leave only discontinuities in the queue.
1429a442c1b9a051edc6d4ceb0daad2d0a8433e7b0bAndreas Huber    List<sp<ABuffer> >::iterator it = mBuffers.begin();
1439a442c1b9a051edc6d4ceb0daad2d0a8433e7b0bAndreas Huber    while (it != mBuffers.end()) {
1449a442c1b9a051edc6d4ceb0daad2d0a8433e7b0bAndreas Huber        sp<ABuffer> oldBuffer = *it;
1459a442c1b9a051edc6d4ceb0daad2d0a8433e7b0bAndreas Huber
1469a442c1b9a051edc6d4ceb0daad2d0a8433e7b0bAndreas Huber        int32_t oldDiscontinuityType;
1479a442c1b9a051edc6d4ceb0daad2d0a8433e7b0bAndreas Huber        if (!oldBuffer->meta()->findInt32(
1489a442c1b9a051edc6d4ceb0daad2d0a8433e7b0bAndreas Huber                    "discontinuity", &oldDiscontinuityType)) {
1499a442c1b9a051edc6d4ceb0daad2d0a8433e7b0bAndreas Huber            it = mBuffers.erase(it);
1509a442c1b9a051edc6d4ceb0daad2d0a8433e7b0bAndreas Huber            continue;
1519a442c1b9a051edc6d4ceb0daad2d0a8433e7b0bAndreas Huber        }
15222fc52f6f72f39e33c3970d0291de3569118aa5cAndreas Huber
1539a442c1b9a051edc6d4ceb0daad2d0a8433e7b0bAndreas Huber        ++it;
15422fc52f6f72f39e33c3970d0291de3569118aa5cAndreas Huber    }
1559a442c1b9a051edc6d4ceb0daad2d0a8433e7b0bAndreas Huber
1569a442c1b9a051edc6d4ceb0daad2d0a8433e7b0bAndreas Huber    mEOSResult = OK;
1579a442c1b9a051edc6d4ceb0daad2d0a8433e7b0bAndreas Huber
1589a442c1b9a051edc6d4ceb0daad2d0a8433e7b0bAndreas Huber    sp<ABuffer> buffer = new ABuffer(0);
1599a442c1b9a051edc6d4ceb0daad2d0a8433e7b0bAndreas Huber    buffer->meta()->setInt32("discontinuity", static_cast<int32_t>(type));
1609a442c1b9a051edc6d4ceb0daad2d0a8433e7b0bAndreas Huber    buffer->meta()->setMessage("extra", extra);
16122fc52f6f72f39e33c3970d0291de3569118aa5cAndreas Huber
1622a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber    mBuffers.push_back(buffer);
1632a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber    mCondition.signal();
1642a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber}
1652a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber
166cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Hubervoid AnotherPacketSource::signalEOS(status_t result) {
167cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    CHECK(result != OK);
168cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
169cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    Mutex::Autolock autoLock(mLock);
170cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    mEOSResult = result;
171cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    mCondition.signal();
172cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber}
173cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
174cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huberbool AnotherPacketSource::hasBufferAvailable(status_t *finalResult) {
175cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    Mutex::Autolock autoLock(mLock);
176cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    if (!mBuffers.empty()) {
177cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        return true;
178cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    }
179cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
180cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    *finalResult = mEOSResult;
181cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    return false;
182cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber}
183cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
184f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatus_t AnotherPacketSource::nextBufferTime(int64_t *timeUs) {
185f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    *timeUs = 0;
186f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
187f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    Mutex::Autolock autoLock(mLock);
188f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
189f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    if (mBuffers.empty()) {
190f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        return mEOSResult != OK ? mEOSResult : -EWOULDBLOCK;
191f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    }
192f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
193f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    sp<ABuffer> buffer = *mBuffers.begin();
194f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    CHECK(buffer->meta()->findInt64("timeUs", timeUs));
195f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
196f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    return OK;
197f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
198f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
199cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber}  // namespace android
200