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