AnotherPacketSource.cpp revision bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0
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
51cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huberstatus_t AnotherPacketSource::read(
52cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        MediaBuffer **out, const ReadOptions *) {
53cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    *out = NULL;
54cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
55cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    Mutex::Autolock autoLock(mLock);
56cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    while (mEOSResult == OK && mBuffers.empty()) {
57cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        mCondition.wait(mLock);
58cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    }
59cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
60cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    if (!mBuffers.empty()) {
61cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        const sp<ABuffer> buffer = *mBuffers.begin();
622a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber        mBuffers.erase(mBuffers.begin());
63cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
642a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber        int32_t discontinuity;
652a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber        if (buffer->meta()->findInt32("discontinuity", &discontinuity)
662a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber                && discontinuity) {
672a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber            return INFO_DISCONTINUITY;
682a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber        } else {
692a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber            uint64_t timeUs;
702a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber            CHECK(buffer->meta()->findInt64(
712a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber                        "time", (int64_t *)&timeUs));
72cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
732a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber            MediaBuffer *mediaBuffer = new MediaBuffer(buffer->size());
742a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber            mediaBuffer->meta_data()->setInt64(kKeyTime, timeUs);
75cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
762a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber            // hexdump(buffer->data(), buffer->size());
77cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
782a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber            memcpy(mediaBuffer->data(), buffer->data(), buffer->size());
792a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber            *out = mediaBuffer;
802a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber            return OK;
812a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber        }
82cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    }
83cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
84cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    return mEOSResult;
85cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber}
86cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
87cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Hubervoid AnotherPacketSource::queueAccessUnit(const sp<ABuffer> &buffer) {
88cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    int32_t damaged;
89cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    if (buffer->meta()->findInt32("damaged", &damaged) && damaged) {
90cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        // LOG(VERBOSE) << "discarding damaged AU";
91cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        return;
92cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    }
93cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
94bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas Huber    int64_t timeUs;
95bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas Huber    CHECK(buffer->meta()->findInt64("time", &timeUs));
96bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas Huber    LOGV("queueAccessUnit timeUs=%lld us (%.2f secs)", timeUs, timeUs / 1E6);
97bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas Huber
98cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    Mutex::Autolock autoLock(mLock);
99cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    mBuffers.push_back(buffer);
100cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    mCondition.signal();
101cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber}
102cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
1032a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Hubervoid AnotherPacketSource::queueDiscontinuity() {
1042a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber    sp<ABuffer> buffer = new ABuffer(0);
1052a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber    buffer->meta()->setInt32("discontinuity", true);
1062a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber
1072a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber    Mutex::Autolock autoLock(mLock);
108bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas Huber
1092a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber    mBuffers.push_back(buffer);
1102a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber    mCondition.signal();
1112a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber}
1122a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber
113bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas Hubervoid AnotherPacketSource::clear() {
114bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas Huber    Mutex::Autolock autoLock(mLock);
115bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas Huber    mBuffers.clear();
116bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas Huber    mEOSResult = OK;
117bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas Huber}
118bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas Huber
119cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Hubervoid AnotherPacketSource::signalEOS(status_t result) {
120cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    CHECK(result != OK);
121cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
122cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    Mutex::Autolock autoLock(mLock);
123cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    mEOSResult = result;
124cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    mCondition.signal();
125cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber}
126cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
127cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huberbool AnotherPacketSource::hasBufferAvailable(status_t *finalResult) {
128cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    Mutex::Autolock autoLock(mLock);
129cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    if (!mBuffers.empty()) {
130cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        return true;
131cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    }
132cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
133cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    *finalResult = mEOSResult;
134cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    return false;
135cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber}
136cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
137cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber}  // namespace android
138