AnotherPacketSource.cpp revision 5bc087c573c70c84c6a39946457590b42d392a33
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
1082a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber            MediaBuffer *mediaBuffer = new MediaBuffer(buffer->size());
1092a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber            mediaBuffer->meta_data()->setInt64(kKeyTime, timeUs);
110cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
1112a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber            // hexdump(buffer->data(), buffer->size());
112cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
1132a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber            memcpy(mediaBuffer->data(), buffer->data(), buffer->size());
1142a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber            *out = mediaBuffer;
1152a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber            return OK;
1162a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber        }
117cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    }
118cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
119cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    return mEOSResult;
120cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber}
121cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
122cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Hubervoid AnotherPacketSource::queueAccessUnit(const sp<ABuffer> &buffer) {
123cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    int32_t damaged;
124cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    if (buffer->meta()->findInt32("damaged", &damaged) && damaged) {
125cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        // LOG(VERBOSE) << "discarding damaged AU";
126cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        return;
127cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    }
128cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
129bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas Huber    int64_t timeUs;
130f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    CHECK(buffer->meta()->findInt64("timeUs", &timeUs));
131bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas Huber    LOGV("queueAccessUnit timeUs=%lld us (%.2f secs)", timeUs, timeUs / 1E6);
132bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas Huber
133cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    Mutex::Autolock autoLock(mLock);
134cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    mBuffers.push_back(buffer);
135cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    mCondition.signal();
136cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber}
137cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
1385bc087c573c70c84c6a39946457590b42d392a33Andreas Hubervoid AnotherPacketSource::queueDiscontinuity(
1395bc087c573c70c84c6a39946457590b42d392a33Andreas Huber        ATSParser::DiscontinuityType type) {
1402a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber    sp<ABuffer> buffer = new ABuffer(0);
1415bc087c573c70c84c6a39946457590b42d392a33Andreas Huber    buffer->meta()->setInt32("discontinuity", static_cast<int32_t>(type));
14253df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber
1432a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber    Mutex::Autolock autoLock(mLock);
144bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas Huber
1452a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber    mBuffers.push_back(buffer);
1462a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber    mCondition.signal();
1472a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber}
1482a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber
149bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas Hubervoid AnotherPacketSource::clear() {
150bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas Huber    Mutex::Autolock autoLock(mLock);
151bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas Huber    mBuffers.clear();
152bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas Huber    mEOSResult = OK;
153bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas Huber}
154bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas Huber
155cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Hubervoid AnotherPacketSource::signalEOS(status_t result) {
156cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    CHECK(result != OK);
157cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
158cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    Mutex::Autolock autoLock(mLock);
159cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    mEOSResult = result;
160cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    mCondition.signal();
161cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber}
162cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
163cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huberbool AnotherPacketSource::hasBufferAvailable(status_t *finalResult) {
164cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    Mutex::Autolock autoLock(mLock);
165cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    if (!mBuffers.empty()) {
166cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        return true;
167cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    }
168cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
169cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    *finalResult = mEOSResult;
170cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    return false;
171cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber}
172cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
173f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatus_t AnotherPacketSource::nextBufferTime(int64_t *timeUs) {
174f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    *timeUs = 0;
175f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
176f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    Mutex::Autolock autoLock(mLock);
177f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
178f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    if (mBuffers.empty()) {
179f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        return mEOSResult != OK ? mEOSResult : -EWOULDBLOCK;
180f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    }
181f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
182f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    sp<ABuffer> buffer = *mBuffers.begin();
183f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    CHECK(buffer->meta()->findInt64("timeUs", timeUs));
184f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
185f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    return OK;
186f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
187f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
188cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber}  // namespace android
189