AnotherPacketSource.cpp revision f933441648ef6a71dee783d733aac17b9508b452
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
36cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas HuberAnotherPacketSource::~AnotherPacketSource() {
37cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber}
38cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
39cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huberstatus_t AnotherPacketSource::start(MetaData *params) {
40cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    return OK;
41cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber}
42cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
43cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huberstatus_t AnotherPacketSource::stop() {
44cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    return OK;
45cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber}
46cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
47cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Hubersp<MetaData> AnotherPacketSource::getFormat() {
48cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    return mFormat;
49cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber}
50cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
51f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatus_t AnotherPacketSource::dequeueAccessUnit(sp<ABuffer> *buffer) {
52f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    buffer->clear();
53f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
54f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    Mutex::Autolock autoLock(mLock);
55f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    while (mEOSResult == OK && mBuffers.empty()) {
56f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        mCondition.wait(mLock);
57f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    }
58f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
59f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    if (!mBuffers.empty()) {
60f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        *buffer = *mBuffers.begin();
61f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        mBuffers.erase(mBuffers.begin());
62f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
63f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        int32_t discontinuity;
64f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        if ((*buffer)->meta()->findInt32("discontinuity", &discontinuity)
65f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                && discontinuity) {
66f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            buffer->clear();
67f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
68f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            return INFO_DISCONTINUITY;
69f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        }
70f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
71f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        return OK;
72f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    }
73f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
74f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    return mEOSResult;
75f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
76f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
77cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huberstatus_t AnotherPacketSource::read(
78cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        MediaBuffer **out, const ReadOptions *) {
79cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    *out = NULL;
80cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
81cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    Mutex::Autolock autoLock(mLock);
82cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    while (mEOSResult == OK && mBuffers.empty()) {
83cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        mCondition.wait(mLock);
84cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    }
85cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
86cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    if (!mBuffers.empty()) {
87cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        const sp<ABuffer> buffer = *mBuffers.begin();
882a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber        mBuffers.erase(mBuffers.begin());
89cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
902a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber        int32_t discontinuity;
912a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber        if (buffer->meta()->findInt32("discontinuity", &discontinuity)
922a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber                && discontinuity) {
932a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber            return INFO_DISCONTINUITY;
942a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber        } else {
95f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            int64_t timeUs;
96f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            CHECK(buffer->meta()->findInt64("timeUs", &timeUs));
97cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
982a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber            MediaBuffer *mediaBuffer = new MediaBuffer(buffer->size());
992a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber            mediaBuffer->meta_data()->setInt64(kKeyTime, timeUs);
100cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
1012a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber            // hexdump(buffer->data(), buffer->size());
102cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
1032a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber            memcpy(mediaBuffer->data(), buffer->data(), buffer->size());
1042a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber            *out = mediaBuffer;
1052a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber            return OK;
1062a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber        }
107cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    }
108cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
109cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    return mEOSResult;
110cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber}
111cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
112cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Hubervoid AnotherPacketSource::queueAccessUnit(const sp<ABuffer> &buffer) {
113cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    int32_t damaged;
114cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    if (buffer->meta()->findInt32("damaged", &damaged) && damaged) {
115cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        // LOG(VERBOSE) << "discarding damaged AU";
116cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        return;
117cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    }
118cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
119bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas Huber    int64_t timeUs;
120f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    CHECK(buffer->meta()->findInt64("timeUs", &timeUs));
121bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas Huber    LOGV("queueAccessUnit timeUs=%lld us (%.2f secs)", timeUs, timeUs / 1E6);
122bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas Huber
123cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    Mutex::Autolock autoLock(mLock);
124cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    mBuffers.push_back(buffer);
125cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    mCondition.signal();
126cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber}
127cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
1282a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Hubervoid AnotherPacketSource::queueDiscontinuity() {
1292a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber    sp<ABuffer> buffer = new ABuffer(0);
1302a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber    buffer->meta()->setInt32("discontinuity", true);
1312a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber
1322a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber    Mutex::Autolock autoLock(mLock);
133bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas Huber
1342a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber    mBuffers.push_back(buffer);
1352a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber    mCondition.signal();
1362a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber}
1372a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber
138bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas Hubervoid AnotherPacketSource::clear() {
139bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas Huber    Mutex::Autolock autoLock(mLock);
140bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas Huber    mBuffers.clear();
141bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas Huber    mEOSResult = OK;
142bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas Huber}
143bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas Huber
144cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Hubervoid AnotherPacketSource::signalEOS(status_t result) {
145cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    CHECK(result != OK);
146cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
147cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    Mutex::Autolock autoLock(mLock);
148cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    mEOSResult = result;
149cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    mCondition.signal();
150cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber}
151cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
152cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huberbool AnotherPacketSource::hasBufferAvailable(status_t *finalResult) {
153cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    Mutex::Autolock autoLock(mLock);
154cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    if (!mBuffers.empty()) {
155cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        return true;
156cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    }
157cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
158cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    *finalResult = mEOSResult;
159cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    return false;
160cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber}
161cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
162f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatus_t AnotherPacketSource::nextBufferTime(int64_t *timeUs) {
163f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    *timeUs = 0;
164f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
165f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    Mutex::Autolock autoLock(mLock);
166f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
167f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    if (mBuffers.empty()) {
168f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        return mEOSResult != OK ? mEOSResult : -EWOULDBLOCK;
169f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    }
170f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
171f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    sp<ABuffer> buffer = *mBuffers.begin();
172f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    CHECK(buffer->meta()->findInt64("timeUs", timeUs));
173f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
174f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    return OK;
175f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
176f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
177cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber}  // namespace android
178