1a44153c1a57202fb538659eb50706e60454d6273Andreas Huber/*
2a44153c1a57202fb538659eb50706e60454d6273Andreas Huber * Copyright (C) 2010 The Android Open Source Project
3a44153c1a57202fb538659eb50706e60454d6273Andreas Huber *
4a44153c1a57202fb538659eb50706e60454d6273Andreas Huber * Licensed under the Apache License, Version 2.0 (the "License");
5a44153c1a57202fb538659eb50706e60454d6273Andreas Huber * you may not use this file except in compliance with the License.
6a44153c1a57202fb538659eb50706e60454d6273Andreas Huber * You may obtain a copy of the License at
7a44153c1a57202fb538659eb50706e60454d6273Andreas Huber *
8a44153c1a57202fb538659eb50706e60454d6273Andreas Huber *      http://www.apache.org/licenses/LICENSE-2.0
9a44153c1a57202fb538659eb50706e60454d6273Andreas Huber *
10a44153c1a57202fb538659eb50706e60454d6273Andreas Huber * Unless required by applicable law or agreed to in writing, software
11a44153c1a57202fb538659eb50706e60454d6273Andreas Huber * distributed under the License is distributed on an "AS IS" BASIS,
12a44153c1a57202fb538659eb50706e60454d6273Andreas Huber * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13a44153c1a57202fb538659eb50706e60454d6273Andreas Huber * See the License for the specific language governing permissions and
14a44153c1a57202fb538659eb50706e60454d6273Andreas Huber * limitations under the License.
15a44153c1a57202fb538659eb50706e60454d6273Andreas Huber */
16a44153c1a57202fb538659eb50706e60454d6273Andreas Huber
17a44153c1a57202fb538659eb50706e60454d6273Andreas Huber//#define LOG_NDEBUG 0
18a44153c1a57202fb538659eb50706e60454d6273Andreas Huber#define LOG_TAG "LiveDataSource"
19a44153c1a57202fb538659eb50706e60454d6273Andreas Huber#include <utils/Log.h>
20a44153c1a57202fb538659eb50706e60454d6273Andreas Huber
21a44153c1a57202fb538659eb50706e60454d6273Andreas Huber#include "LiveDataSource.h"
22a44153c1a57202fb538659eb50706e60454d6273Andreas Huber
23a44153c1a57202fb538659eb50706e60454d6273Andreas Huber#include <media/stagefright/foundation/ABuffer.h>
24a44153c1a57202fb538659eb50706e60454d6273Andreas Huber#include <media/stagefright/foundation/ADebug.h>
25a44153c1a57202fb538659eb50706e60454d6273Andreas Huber
26a44153c1a57202fb538659eb50706e60454d6273Andreas Huber#define SAVE_BACKUP     0
27a44153c1a57202fb538659eb50706e60454d6273Andreas Huber
28a44153c1a57202fb538659eb50706e60454d6273Andreas Hubernamespace android {
29a44153c1a57202fb538659eb50706e60454d6273Andreas Huber
30a44153c1a57202fb538659eb50706e60454d6273Andreas HuberLiveDataSource::LiveDataSource()
31a44153c1a57202fb538659eb50706e60454d6273Andreas Huber    : mOffset(0),
32a44153c1a57202fb538659eb50706e60454d6273Andreas Huber      mFinalResult(OK),
33a44153c1a57202fb538659eb50706e60454d6273Andreas Huber      mBackupFile(NULL) {
34a44153c1a57202fb538659eb50706e60454d6273Andreas Huber#if SAVE_BACKUP
35a44153c1a57202fb538659eb50706e60454d6273Andreas Huber    mBackupFile = fopen("/data/misc/backup.ts", "wb");
36a44153c1a57202fb538659eb50706e60454d6273Andreas Huber    CHECK(mBackupFile != NULL);
37a44153c1a57202fb538659eb50706e60454d6273Andreas Huber#endif
38a44153c1a57202fb538659eb50706e60454d6273Andreas Huber}
39a44153c1a57202fb538659eb50706e60454d6273Andreas Huber
40a44153c1a57202fb538659eb50706e60454d6273Andreas HuberLiveDataSource::~LiveDataSource() {
41a44153c1a57202fb538659eb50706e60454d6273Andreas Huber    if (mBackupFile != NULL) {
42a44153c1a57202fb538659eb50706e60454d6273Andreas Huber        fclose(mBackupFile);
43a44153c1a57202fb538659eb50706e60454d6273Andreas Huber        mBackupFile = NULL;
44a44153c1a57202fb538659eb50706e60454d6273Andreas Huber    }
45a44153c1a57202fb538659eb50706e60454d6273Andreas Huber}
46a44153c1a57202fb538659eb50706e60454d6273Andreas Huber
47a44153c1a57202fb538659eb50706e60454d6273Andreas Huberstatus_t LiveDataSource::initCheck() const {
48a44153c1a57202fb538659eb50706e60454d6273Andreas Huber    return OK;
49a44153c1a57202fb538659eb50706e60454d6273Andreas Huber}
50a44153c1a57202fb538659eb50706e60454d6273Andreas Huber
51a44153c1a57202fb538659eb50706e60454d6273Andreas Hubersize_t LiveDataSource::countQueuedBuffers() {
52a44153c1a57202fb538659eb50706e60454d6273Andreas Huber    Mutex::Autolock autoLock(mLock);
53a44153c1a57202fb538659eb50706e60454d6273Andreas Huber
54a44153c1a57202fb538659eb50706e60454d6273Andreas Huber    return mBufferQueue.size();
55a44153c1a57202fb538659eb50706e60454d6273Andreas Huber}
56a44153c1a57202fb538659eb50706e60454d6273Andreas Huber
575bc087c573c70c84c6a39946457590b42d392a33Andreas Huberssize_t LiveDataSource::readAtNonBlocking(
585bc087c573c70c84c6a39946457590b42d392a33Andreas Huber        off64_t offset, void *data, size_t size) {
595bc087c573c70c84c6a39946457590b42d392a33Andreas Huber    Mutex::Autolock autoLock(mLock);
605bc087c573c70c84c6a39946457590b42d392a33Andreas Huber
615bc087c573c70c84c6a39946457590b42d392a33Andreas Huber    if (offset != mOffset) {
6229357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block        ALOGE("Attempt at reading non-sequentially from LiveDataSource.");
635bc087c573c70c84c6a39946457590b42d392a33Andreas Huber        return -EPIPE;
645bc087c573c70c84c6a39946457590b42d392a33Andreas Huber    }
655bc087c573c70c84c6a39946457590b42d392a33Andreas Huber
665bc087c573c70c84c6a39946457590b42d392a33Andreas Huber    size_t totalAvailable = 0;
675bc087c573c70c84c6a39946457590b42d392a33Andreas Huber    for (List<sp<ABuffer> >::iterator it = mBufferQueue.begin();
685bc087c573c70c84c6a39946457590b42d392a33Andreas Huber         it != mBufferQueue.end(); ++it) {
695bc087c573c70c84c6a39946457590b42d392a33Andreas Huber        sp<ABuffer> buffer = *it;
705bc087c573c70c84c6a39946457590b42d392a33Andreas Huber
715bc087c573c70c84c6a39946457590b42d392a33Andreas Huber        totalAvailable += buffer->size();
725bc087c573c70c84c6a39946457590b42d392a33Andreas Huber
735bc087c573c70c84c6a39946457590b42d392a33Andreas Huber        if (totalAvailable >= size) {
745bc087c573c70c84c6a39946457590b42d392a33Andreas Huber            break;
755bc087c573c70c84c6a39946457590b42d392a33Andreas Huber        }
765bc087c573c70c84c6a39946457590b42d392a33Andreas Huber    }
775bc087c573c70c84c6a39946457590b42d392a33Andreas Huber
785bc087c573c70c84c6a39946457590b42d392a33Andreas Huber    if (totalAvailable < size) {
795bc087c573c70c84c6a39946457590b42d392a33Andreas Huber        return mFinalResult == OK ? -EWOULDBLOCK : mFinalResult;
805bc087c573c70c84c6a39946457590b42d392a33Andreas Huber    }
815bc087c573c70c84c6a39946457590b42d392a33Andreas Huber
825bc087c573c70c84c6a39946457590b42d392a33Andreas Huber    return readAt_l(offset, data, size);
835bc087c573c70c84c6a39946457590b42d392a33Andreas Huber}
845bc087c573c70c84c6a39946457590b42d392a33Andreas Huber
85a44153c1a57202fb538659eb50706e60454d6273Andreas Huberssize_t LiveDataSource::readAt(off64_t offset, void *data, size_t size) {
86a44153c1a57202fb538659eb50706e60454d6273Andreas Huber    Mutex::Autolock autoLock(mLock);
875bc087c573c70c84c6a39946457590b42d392a33Andreas Huber    return readAt_l(offset, data, size);
885bc087c573c70c84c6a39946457590b42d392a33Andreas Huber}
89a44153c1a57202fb538659eb50706e60454d6273Andreas Huber
905bc087c573c70c84c6a39946457590b42d392a33Andreas Huberssize_t LiveDataSource::readAt_l(off64_t offset, void *data, size_t size) {
91a44153c1a57202fb538659eb50706e60454d6273Andreas Huber    if (offset != mOffset) {
9229357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block        ALOGE("Attempt at reading non-sequentially from LiveDataSource.");
93a44153c1a57202fb538659eb50706e60454d6273Andreas Huber        return -EPIPE;
94a44153c1a57202fb538659eb50706e60454d6273Andreas Huber    }
95a44153c1a57202fb538659eb50706e60454d6273Andreas Huber
96a44153c1a57202fb538659eb50706e60454d6273Andreas Huber    size_t sizeDone = 0;
97a44153c1a57202fb538659eb50706e60454d6273Andreas Huber
98a44153c1a57202fb538659eb50706e60454d6273Andreas Huber    while (sizeDone < size) {
99a44153c1a57202fb538659eb50706e60454d6273Andreas Huber        while (mBufferQueue.empty() && mFinalResult == OK) {
100a44153c1a57202fb538659eb50706e60454d6273Andreas Huber            mCondition.wait(mLock);
101a44153c1a57202fb538659eb50706e60454d6273Andreas Huber        }
102a44153c1a57202fb538659eb50706e60454d6273Andreas Huber
103a44153c1a57202fb538659eb50706e60454d6273Andreas Huber        if (mBufferQueue.empty()) {
104a44153c1a57202fb538659eb50706e60454d6273Andreas Huber            if (sizeDone > 0) {
105a44153c1a57202fb538659eb50706e60454d6273Andreas Huber                mOffset += sizeDone;
106a44153c1a57202fb538659eb50706e60454d6273Andreas Huber                return sizeDone;
107a44153c1a57202fb538659eb50706e60454d6273Andreas Huber            }
108a44153c1a57202fb538659eb50706e60454d6273Andreas Huber
109a44153c1a57202fb538659eb50706e60454d6273Andreas Huber            return mFinalResult;
110a44153c1a57202fb538659eb50706e60454d6273Andreas Huber        }
111a44153c1a57202fb538659eb50706e60454d6273Andreas Huber
112a44153c1a57202fb538659eb50706e60454d6273Andreas Huber        sp<ABuffer> buffer = *mBufferQueue.begin();
113a44153c1a57202fb538659eb50706e60454d6273Andreas Huber
114a44153c1a57202fb538659eb50706e60454d6273Andreas Huber        size_t copy = size - sizeDone;
115a44153c1a57202fb538659eb50706e60454d6273Andreas Huber
116a44153c1a57202fb538659eb50706e60454d6273Andreas Huber        if (copy > buffer->size()) {
117a44153c1a57202fb538659eb50706e60454d6273Andreas Huber            copy = buffer->size();
118a44153c1a57202fb538659eb50706e60454d6273Andreas Huber        }
119a44153c1a57202fb538659eb50706e60454d6273Andreas Huber
120a44153c1a57202fb538659eb50706e60454d6273Andreas Huber        memcpy((uint8_t *)data + sizeDone, buffer->data(), copy);
121a44153c1a57202fb538659eb50706e60454d6273Andreas Huber
122a44153c1a57202fb538659eb50706e60454d6273Andreas Huber        sizeDone += copy;
123a44153c1a57202fb538659eb50706e60454d6273Andreas Huber
124a44153c1a57202fb538659eb50706e60454d6273Andreas Huber        buffer->setRange(buffer->offset() + copy, buffer->size() - copy);
125a44153c1a57202fb538659eb50706e60454d6273Andreas Huber
126a44153c1a57202fb538659eb50706e60454d6273Andreas Huber        if (buffer->size() == 0) {
127a44153c1a57202fb538659eb50706e60454d6273Andreas Huber            mBufferQueue.erase(mBufferQueue.begin());
128a44153c1a57202fb538659eb50706e60454d6273Andreas Huber        }
129a44153c1a57202fb538659eb50706e60454d6273Andreas Huber    }
130a44153c1a57202fb538659eb50706e60454d6273Andreas Huber
131a44153c1a57202fb538659eb50706e60454d6273Andreas Huber    mOffset += sizeDone;
132a44153c1a57202fb538659eb50706e60454d6273Andreas Huber
133a44153c1a57202fb538659eb50706e60454d6273Andreas Huber    return sizeDone;
134a44153c1a57202fb538659eb50706e60454d6273Andreas Huber}
135a44153c1a57202fb538659eb50706e60454d6273Andreas Huber
136a44153c1a57202fb538659eb50706e60454d6273Andreas Hubervoid LiveDataSource::queueBuffer(const sp<ABuffer> &buffer) {
137a44153c1a57202fb538659eb50706e60454d6273Andreas Huber    Mutex::Autolock autoLock(mLock);
138a44153c1a57202fb538659eb50706e60454d6273Andreas Huber
139a44153c1a57202fb538659eb50706e60454d6273Andreas Huber    if (mFinalResult != OK) {
140a44153c1a57202fb538659eb50706e60454d6273Andreas Huber        return;
141a44153c1a57202fb538659eb50706e60454d6273Andreas Huber    }
142a44153c1a57202fb538659eb50706e60454d6273Andreas Huber
143a44153c1a57202fb538659eb50706e60454d6273Andreas Huber#if SAVE_BACKUP
144a44153c1a57202fb538659eb50706e60454d6273Andreas Huber    if (mBackupFile != NULL) {
145a44153c1a57202fb538659eb50706e60454d6273Andreas Huber        CHECK_EQ(fwrite(buffer->data(), 1, buffer->size(), mBackupFile),
146a44153c1a57202fb538659eb50706e60454d6273Andreas Huber                 buffer->size());
147a44153c1a57202fb538659eb50706e60454d6273Andreas Huber    }
148a44153c1a57202fb538659eb50706e60454d6273Andreas Huber#endif
149a44153c1a57202fb538659eb50706e60454d6273Andreas Huber
150a44153c1a57202fb538659eb50706e60454d6273Andreas Huber    mBufferQueue.push_back(buffer);
151a44153c1a57202fb538659eb50706e60454d6273Andreas Huber    mCondition.broadcast();
152a44153c1a57202fb538659eb50706e60454d6273Andreas Huber}
153a44153c1a57202fb538659eb50706e60454d6273Andreas Huber
154a44153c1a57202fb538659eb50706e60454d6273Andreas Hubervoid LiveDataSource::queueEOS(status_t finalResult) {
155a44153c1a57202fb538659eb50706e60454d6273Andreas Huber    CHECK_NE(finalResult, (status_t)OK);
156a44153c1a57202fb538659eb50706e60454d6273Andreas Huber
157a44153c1a57202fb538659eb50706e60454d6273Andreas Huber    Mutex::Autolock autoLock(mLock);
158a44153c1a57202fb538659eb50706e60454d6273Andreas Huber
159a44153c1a57202fb538659eb50706e60454d6273Andreas Huber    mFinalResult = finalResult;
160a44153c1a57202fb538659eb50706e60454d6273Andreas Huber    mCondition.broadcast();
161a44153c1a57202fb538659eb50706e60454d6273Andreas Huber}
162a44153c1a57202fb538659eb50706e60454d6273Andreas Huber
163a44153c1a57202fb538659eb50706e60454d6273Andreas Hubervoid LiveDataSource::reset() {
164a44153c1a57202fb538659eb50706e60454d6273Andreas Huber    Mutex::Autolock autoLock(mLock);
165a44153c1a57202fb538659eb50706e60454d6273Andreas Huber
166a44153c1a57202fb538659eb50706e60454d6273Andreas Huber    // XXX FIXME: If we've done a partial read and waiting for more buffers,
167a44153c1a57202fb538659eb50706e60454d6273Andreas Huber    // we'll mix old and new data...
168a44153c1a57202fb538659eb50706e60454d6273Andreas Huber
169a44153c1a57202fb538659eb50706e60454d6273Andreas Huber    mFinalResult = OK;
170a44153c1a57202fb538659eb50706e60454d6273Andreas Huber    mBufferQueue.clear();
171a44153c1a57202fb538659eb50706e60454d6273Andreas Huber}
172a44153c1a57202fb538659eb50706e60454d6273Andreas Huber
173a44153c1a57202fb538659eb50706e60454d6273Andreas Huber}  // namespace android
174