DataSource.h revision 92541a351d8c5ca6aa0c1b3b0d40023ff2385645
104fc583c3dd3144bc6b718fcac4b3e1afdfdb067John Reck/* 204fc583c3dd3144bc6b718fcac4b3e1afdfdb067John Reck * Copyright (C) 2009 The Android Open Source Project 304fc583c3dd3144bc6b718fcac4b3e1afdfdb067John Reck * 404fc583c3dd3144bc6b718fcac4b3e1afdfdb067John Reck * Licensed under the Apache License, Version 2.0 (the "License"); 504fc583c3dd3144bc6b718fcac4b3e1afdfdb067John Reck * you may not use this file except in compliance with the License. 604fc583c3dd3144bc6b718fcac4b3e1afdfdb067John Reck * You may obtain a copy of the License at 704fc583c3dd3144bc6b718fcac4b3e1afdfdb067John Reck * 804fc583c3dd3144bc6b718fcac4b3e1afdfdb067John Reck * http://www.apache.org/licenses/LICENSE-2.0 904fc583c3dd3144bc6b718fcac4b3e1afdfdb067John Reck * 1004fc583c3dd3144bc6b718fcac4b3e1afdfdb067John Reck * Unless required by applicable law or agreed to in writing, software 1104fc583c3dd3144bc6b718fcac4b3e1afdfdb067John Reck * distributed under the License is distributed on an "AS IS" BASIS, 1204fc583c3dd3144bc6b718fcac4b3e1afdfdb067John Reck * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1304fc583c3dd3144bc6b718fcac4b3e1afdfdb067John Reck * See the License for the specific language governing permissions and 1404fc583c3dd3144bc6b718fcac4b3e1afdfdb067John Reck * limitations under the License. 1504fc583c3dd3144bc6b718fcac4b3e1afdfdb067John Reck */ 1604fc583c3dd3144bc6b718fcac4b3e1afdfdb067John Reck 1704fc583c3dd3144bc6b718fcac4b3e1afdfdb067John Reck#ifndef DATA_SOURCE_H_ 188cd3edfa15cc9cdbffa935d19ab894426b08d174Greg Daniel 1945ec62ba72c5017fae7d8baab20bfb0d4c99c627Greg Daniel#define DATA_SOURCE_H_ 203e9999bd866fac71c72e6b484a9836c87c328a08sergeyv 21749906b468912dab7bf69a86e852deac3e80b0ccJohn Reck#include <sys/types.h> 22749906b468912dab7bf69a86e852deac3e80b0ccJohn Reck#include <media/stagefright/foundation/ADebug.h> 235e00c7ce063116c11315639f0035aca8ad73e8ccChris Craik#include <media/stagefright/MediaErrors.h> 2404fc583c3dd3144bc6b718fcac4b3e1afdfdb067John Reck#include <utils/Errors.h> 2504fc583c3dd3144bc6b718fcac4b3e1afdfdb067John Reck#include <utils/KeyedVector.h> 2604fc583c3dd3144bc6b718fcac4b3e1afdfdb067John Reck#include <utils/List.h> 2704fc583c3dd3144bc6b718fcac4b3e1afdfdb067John Reck#include <utils/RefBase.h> 283e9999bd866fac71c72e6b484a9836c87c328a08sergeyv#include <utils/threads.h> 291bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck#include <drm/DrmManagerClient.h> 303e9999bd866fac71c72e6b484a9836c87c328a08sergeyv 313e9999bd866fac71c72e6b484a9836c87c328a08sergeyvnamespace android { 323e9999bd866fac71c72e6b484a9836c87c328a08sergeyv 33d41c4d8c732095ae99c955b6b82f7306633004b1Chris Craikstruct AMessage; 3400eb43dbc04083eab85fbb1a9589e2548f2004edsergeyvstruct AString; 3504fc583c3dd3144bc6b718fcac4b3e1afdfdb067John Reckclass IDataSource; 363e9999bd866fac71c72e6b484a9836c87c328a08sergeyvstruct IMediaHTTPService; 373e9999bd866fac71c72e6b484a9836c87c328a08sergeyvclass String8; 383e9999bd866fac71c72e6b484a9836c87c328a08sergeyvstruct HTTPBase; 393e9999bd866fac71c72e6b484a9836c87c328a08sergeyv 4004fc583c3dd3144bc6b718fcac4b3e1afdfdb067John Reckclass DataSource : public RefBase { 4104fc583c3dd3144bc6b718fcac4b3e1afdfdb067John Reckpublic: 4204fc583c3dd3144bc6b718fcac4b3e1afdfdb067John Reck enum Flags { 43d41c4d8c732095ae99c955b6b82f7306633004b1Chris Craik kWantsPrefetching = 1, 443e9999bd866fac71c72e6b484a9836c87c328a08sergeyv kStreamedFromLocalHost = 2, 453e9999bd866fac71c72e6b484a9836c87c328a08sergeyv kIsCachingDataSource = 4, 463e9999bd866fac71c72e6b484a9836c87c328a08sergeyv kIsHTTPBasedSource = 8, 473e9999bd866fac71c72e6b484a9836c87c328a08sergeyv kIsLocalFileSource = 16, 483e9999bd866fac71c72e6b484a9836c87c328a08sergeyv }; 4900eb43dbc04083eab85fbb1a9589e2548f2004edsergeyv 5000eb43dbc04083eab85fbb1a9589e2548f2004edsergeyv DataSource() {} 5100eb43dbc04083eab85fbb1a9589e2548f2004edsergeyv 5200eb43dbc04083eab85fbb1a9589e2548f2004edsergeyv virtual status_t initCheck() const = 0; 5300eb43dbc04083eab85fbb1a9589e2548f2004edsergeyv 5400eb43dbc04083eab85fbb1a9589e2548f2004edsergeyv // Returns the number of bytes read, or -1 on failure. It's not an error if 5500eb43dbc04083eab85fbb1a9589e2548f2004edsergeyv // this returns zero; it just means the given offset is equal to, or 5600eb43dbc04083eab85fbb1a9589e2548f2004edsergeyv // beyond, the end of the source. 5700eb43dbc04083eab85fbb1a9589e2548f2004edsergeyv virtual ssize_t readAt(off64_t offset, void *data, size_t size) = 0; 5800eb43dbc04083eab85fbb1a9589e2548f2004edsergeyv 5900eb43dbc04083eab85fbb1a9589e2548f2004edsergeyv // Convenience methods: 603e9999bd866fac71c72e6b484a9836c87c328a08sergeyv bool getUInt16(off64_t offset, uint16_t *x); 6100eb43dbc04083eab85fbb1a9589e2548f2004edsergeyv bool getUInt24(off64_t offset, uint32_t *x); // 3 byte int, returned as a 32-bit int 6200eb43dbc04083eab85fbb1a9589e2548f2004edsergeyv bool getUInt32(off64_t offset, uint32_t *x); 6300eb43dbc04083eab85fbb1a9589e2548f2004edsergeyv bool getUInt64(off64_t offset, uint64_t *x); 6404fc583c3dd3144bc6b718fcac4b3e1afdfdb067John Reck 6504fc583c3dd3144bc6b718fcac4b3e1afdfdb067John Reck // read either int<N> or int<2N> into a uint<2N>_t, size is the int size in bytes. 66674554fc36932ca50b15bba41ac6f650254d4e72Derek Sollenberger bool getUInt16Var(off64_t offset, uint16_t *x, size_t size); 67bf6f0f260886a04a1680c7f9917124a751322ca4Chris Craik bool getUInt32Var(off64_t offset, uint32_t *x, size_t size); 68260ab726486317496bc12a57d599ea96dcde3284Mike Reed bool getUInt64Var(off64_t offset, uint64_t *x, size_t size); 69551d08e2d50c7f73c5eb65fd366b92efba4f0ed5Derek Sollenberger 70551d08e2d50c7f73c5eb65fd366b92efba4f0ed5Derek Sollenberger // Reads in "count" entries of type T into vector *x. 71551d08e2d50c7f73c5eb65fd366b92efba4f0ed5Derek Sollenberger // Returns true if "count" entries can be read. 72551d08e2d50c7f73c5eb65fd366b92efba4f0ed5Derek Sollenberger // If fewer than "count" entries can be read, return false. In this case, 73551d08e2d50c7f73c5eb65fd366b92efba4f0ed5Derek Sollenberger // the output vector *x will still have those entries that were read. Call 7404fc583c3dd3144bc6b718fcac4b3e1afdfdb067John Reck // x->size() to obtain the number of entries read. 7504fc583c3dd3144bc6b718fcac4b3e1afdfdb067John Reck // The optional parameter chunkSize specifies how many entries should be 76d2dfd8f128b632ed99418ab2b32949c939a9a369Chris Craik // read from the data source at one time into a temporary buffer. Increasing 773e9999bd866fac71c72e6b484a9836c87c328a08sergeyv // chunkSize can improve the performance at the cost of extra memory usage. 783e9999bd866fac71c72e6b484a9836c87c328a08sergeyv // The default value for chunkSize is set to read at least 4k bytes at a 793e9999bd866fac71c72e6b484a9836c87c328a08sergeyv // time, depending on sizeof(T). 803e9999bd866fac71c72e6b484a9836c87c328a08sergeyv template <typename T> 8104fc583c3dd3144bc6b718fcac4b3e1afdfdb067John Reck bool getVector(off64_t offset, Vector<T>* x, size_t count, 8204fc583c3dd3144bc6b718fcac4b3e1afdfdb067John Reck size_t chunkSize = (4095 / sizeof(T)) + 1); 8304fc583c3dd3144bc6b718fcac4b3e1afdfdb067John Reck 8425fbb3fa1138675379102a44405852555cefccbdJohn Reck // May return ERROR_UNSUPPORTED. 8545ec62ba72c5017fae7d8baab20bfb0d4c99c627Greg Daniel virtual status_t getSize(off64_t *size); 8645ec62ba72c5017fae7d8baab20bfb0d4c99c627Greg Daniel 8745ec62ba72c5017fae7d8baab20bfb0d4c99c627Greg Daniel virtual uint32_t flags() { 8845ec62ba72c5017fae7d8baab20bfb0d4c99c627Greg Daniel return 0; 8945ec62ba72c5017fae7d8baab20bfb0d4c99c627Greg Daniel } 9045ec62ba72c5017fae7d8baab20bfb0d4c99c627Greg Daniel 9145ec62ba72c5017fae7d8baab20bfb0d4c99c627Greg Daniel virtual String8 toString() { 9245ec62ba72c5017fae7d8baab20bfb0d4c99c627Greg Daniel return String8("<unspecified>"); 9345ec62ba72c5017fae7d8baab20bfb0d4c99c627Greg Daniel } 9400eb43dbc04083eab85fbb1a9589e2548f2004edsergeyv 9500eb43dbc04083eab85fbb1a9589e2548f2004edsergeyv virtual status_t reconnectAtOffset(off64_t /*offset*/) { 9600eb43dbc04083eab85fbb1a9589e2548f2004edsergeyv return ERROR_UNSUPPORTED; 9745ec62ba72c5017fae7d8baab20bfb0d4c99c627Greg Daniel } 9845ec62ba72c5017fae7d8baab20bfb0d4c99c627Greg Daniel 9945ec62ba72c5017fae7d8baab20bfb0d4c99c627Greg Daniel //////////////////////////////////////////////////////////////////////////// 10045ec62ba72c5017fae7d8baab20bfb0d4c99c627Greg Daniel 10145ec62ba72c5017fae7d8baab20bfb0d4c99c627Greg Daniel // for DRM 10245ec62ba72c5017fae7d8baab20bfb0d4c99c627Greg Daniel virtual sp<DecryptHandle> DrmInitialization(const char * /*mime*/ = NULL) { 10309df887c9078a34f2bda32c83734b7f75c0a60ffChris Craik return NULL; 10409df887c9078a34f2bda32c83734b7f75c0a60ffChris Craik } 10504fc583c3dd3144bc6b718fcac4b3e1afdfdb067John Reck 10604fc583c3dd3144bc6b718fcac4b3e1afdfdb067John Reck virtual String8 getUri() { 10704fc583c3dd3144bc6b718fcac4b3e1afdfdb067John Reck return String8(); 108d41c4d8c732095ae99c955b6b82f7306633004b1Chris Craik } 10904fc583c3dd3144bc6b718fcac4b3e1afdfdb067John Reck 11004fc583c3dd3144bc6b718fcac4b3e1afdfdb067John Reck virtual String8 getMIMEType() const; 11104fc583c3dd3144bc6b718fcac4b3e1afdfdb067John Reck 11204fc583c3dd3144bc6b718fcac4b3e1afdfdb067John Reck virtual void close() {}; 11304fc583c3dd3144bc6b718fcac4b3e1afdfdb067John Reck 1148cd3edfa15cc9cdbffa935d19ab894426b08d174Greg Danielprotected: 1151bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck virtual ~DataSource() {} 1161bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck 11704fc583c3dd3144bc6b718fcac4b3e1afdfdb067John Reckprivate: 11804fc583c3dd3144bc6b718fcac4b3e1afdfdb067John Reck DataSource(const DataSource &); 11904fc583c3dd3144bc6b718fcac4b3e1afdfdb067John Reck DataSource &operator=(const DataSource &); 12004fc583c3dd3144bc6b718fcac4b3e1afdfdb067John Reck}; 12104fc583c3dd3144bc6b718fcac4b3e1afdfdb067John Reck 12204fc583c3dd3144bc6b718fcac4b3e1afdfdb067John Recktemplate <typename T> 12304fc583c3dd3144bc6b718fcac4b3e1afdfdb067John Reckbool DataSource::getVector(off64_t offset, Vector<T>* x, size_t count, 12404fc583c3dd3144bc6b718fcac4b3e1afdfdb067John Reck size_t chunkSize) 12504fc583c3dd3144bc6b718fcac4b3e1afdfdb067John Reck{ 12604fc583c3dd3144bc6b718fcac4b3e1afdfdb067John Reck x->clear(); 12704fc583c3dd3144bc6b718fcac4b3e1afdfdb067John Reck if (chunkSize == 0) { 12804fc583c3dd3144bc6b718fcac4b3e1afdfdb067John Reck return false; 12904fc583c3dd3144bc6b718fcac4b3e1afdfdb067John Reck } 13004fc583c3dd3144bc6b718fcac4b3e1afdfdb067John Reck if (count == 0) { 13104fc583c3dd3144bc6b718fcac4b3e1afdfdb067John Reck return true; 1329757ac0b9d62f6aea5e47cfb375f445c78bb7897Chris Craik } 1339757ac0b9d62f6aea5e47cfb375f445c78bb7897Chris Craik 1349757ac0b9d62f6aea5e47cfb375f445c78bb7897Chris Craik T tmp[chunkSize]; 135d41c4d8c732095ae99c955b6b82f7306633004b1Chris Craik ssize_t numBytesRead; 1369757ac0b9d62f6aea5e47cfb375f445c78bb7897Chris Craik size_t numBytesPerChunk = chunkSize * sizeof(T); 1371bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck size_t i; 1381bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck 1399757ac0b9d62f6aea5e47cfb375f445c78bb7897Chris Craik for (i = 0; i + chunkSize < count; i += chunkSize) { 1409757ac0b9d62f6aea5e47cfb375f445c78bb7897Chris Craik // This loops is executed when more than chunkSize records need to be 1411bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck // read. 14204fc583c3dd3144bc6b718fcac4b3e1afdfdb067John Reck numBytesRead = this->readAt(offset, (void*)&tmp, numBytesPerChunk); 14304fc583c3dd3144bc6b718fcac4b3e1afdfdb067John Reck if (numBytesRead == -1) { // If readAt() returns -1, there is an error. 14404fc583c3dd3144bc6b718fcac4b3e1afdfdb067John Reck return false; 1451bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck } 14604fc583c3dd3144bc6b718fcac4b3e1afdfdb067John Reck if (static_cast<size_t>(numBytesRead) < numBytesPerChunk) { 14704fc583c3dd3144bc6b718fcac4b3e1afdfdb067John Reck // This case is triggered when the stream ends before the whole 148551d08e2d50c7f73c5eb65fd366b92efba4f0ed5Derek Sollenberger // chunk is read. 14956ad6ec42f814e9e61030ff819cac4e5d31def8bDerek Sollenberger x->appendArray(tmp, (size_t)numBytesRead / sizeof(T)); 15056ad6ec42f814e9e61030ff819cac4e5d31def8bDerek Sollenberger return false; 15156ad6ec42f814e9e61030ff819cac4e5d31def8bDerek Sollenberger } 15245ec62ba72c5017fae7d8baab20bfb0d4c99c627Greg Daniel x->appendArray(tmp, chunkSize); 15345ec62ba72c5017fae7d8baab20bfb0d4c99c627Greg Daniel offset += numBytesPerChunk; 1541bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck } 1551bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck 15645ec62ba72c5017fae7d8baab20bfb0d4c99c627Greg Daniel // There are (count - i) more records to read. 15745ec62ba72c5017fae7d8baab20bfb0d4c99c627Greg Daniel // Right now, (count - i) <= chunkSize. 158551d08e2d50c7f73c5eb65fd366b92efba4f0ed5Derek Sollenberger // We do the same thing as above, but with chunkSize replaced by count - i. 15945ec62ba72c5017fae7d8baab20bfb0d4c99c627Greg Daniel numBytesRead = this->readAt(offset, (void*)&tmp, (count - i) * sizeof(T)); 16045ec62ba72c5017fae7d8baab20bfb0d4c99c627Greg Daniel if (numBytesRead == -1) { 16145ec62ba72c5017fae7d8baab20bfb0d4c99c627Greg Daniel return false; 16245ec62ba72c5017fae7d8baab20bfb0d4c99c627Greg Daniel } 16345ec62ba72c5017fae7d8baab20bfb0d4c99c627Greg Daniel x->appendArray(tmp, (size_t)numBytesRead / sizeof(T)); 164551d08e2d50c7f73c5eb65fd366b92efba4f0ed5Derek Sollenberger return x->size() == count; 165551d08e2d50c7f73c5eb65fd366b92efba4f0ed5Derek Sollenberger} 16645ec62ba72c5017fae7d8baab20bfb0d4c99c627Greg Daniel 16745ec62ba72c5017fae7d8baab20bfb0d4c99c627Greg Daniel} // namespace android 16845ec62ba72c5017fae7d8baab20bfb0d4c99c627Greg Daniel 16945ec62ba72c5017fae7d8baab20bfb0d4c99c627Greg Daniel#endif // DATA_SOURCE_H_ 170551d08e2d50c7f73c5eb65fd366b92efba4f0ed5Derek Sollenberger