AnotherPacketSource.cpp revision 2a4d22d79e927f2245537921e10fc5fda1c47a29
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
94cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    Mutex::Autolock autoLock(mLock);
95cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    mBuffers.push_back(buffer);
96cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    mCondition.signal();
97cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber}
98cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
992a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Hubervoid AnotherPacketSource::queueDiscontinuity() {
1002a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber    sp<ABuffer> buffer = new ABuffer(0);
1012a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber    buffer->meta()->setInt32("discontinuity", true);
1022a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber
1032a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber    Mutex::Autolock autoLock(mLock);
1042a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber    mBuffers.push_back(buffer);
1052a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber    mCondition.signal();
1062a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber}
1072a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber
108cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Hubervoid AnotherPacketSource::signalEOS(status_t result) {
109cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    CHECK(result != OK);
110cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
111cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    Mutex::Autolock autoLock(mLock);
112cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    mEOSResult = result;
113cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    mCondition.signal();
114cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber}
115cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
116cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huberbool AnotherPacketSource::hasBufferAvailable(status_t *finalResult) {
117cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    Mutex::Autolock autoLock(mLock);
118cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    if (!mBuffers.empty()) {
119cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        return true;
120cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    }
121cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
122cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    *finalResult = mEOSResult;
123cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    return false;
124cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber}
125cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
126cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber}  // namespace android
127