120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber/* 220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber * Copyright (C) 2009 The Android Open Source Project 320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber * 420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber * Licensed under the Apache License, Version 2.0 (the "License"); 520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber * you may not use this file except in compliance with the License. 620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber * You may obtain a copy of the License at 720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber * 820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber * http://www.apache.org/licenses/LICENSE-2.0 920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber * 1020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber * Unless required by applicable law or agreed to in writing, software 1120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber * distributed under the License is distributed on an "AS IS" BASIS, 1220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber * See the License for the specific language governing permissions and 1420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber * limitations under the License. 1520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber */ 1620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 1720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#ifndef DATA_SOURCE_H_ 1820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 1920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#define DATA_SOURCE_H_ 2020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 2120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#include <sys/types.h> 22a3630a418b4f65277a42cd4018cd3b0b7e134d0cPawin Vongmasa#include <media/stagefright/foundation/ADebug.h> 230683eba6b35c396c21f10e926709f2f8fc05f090Andreas Huber#include <media/stagefright/MediaErrors.h> 2420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#include <utils/Errors.h> 255561ccf4a8db88a2e44eac1b3ed13b4ff53a7f20Andreas Huber#include <utils/KeyedVector.h> 2620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#include <utils/List.h> 27693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber#include <utils/RefBase.h> 2820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#include <utils/threads.h> 29dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang#include <drm/DrmManagerClient.h> 3020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 3120111aa043c5f404472bc63b90bc5aad906b1101Andreas Hubernamespace android { 3220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 335a1c3529e4fa2f8a11054181294e0ce79fff8dd3Andreas Huberstruct AMessage; 343de157dd8f9cd45bf9b0406268f5830887105ae1Chong Zhangstruct AString; 35ee4e1b1a63758941460ae79a064249d3a5189443Lajos Molnarclass IDataSource; 361b86fe063badb5f28c467ade39be0f4008688947Andreas Huberstruct IMediaHTTPService; 3720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberclass String8; 38360d6d0924f99b82ebacb5cfb6f7bca95e11b4eeRobert Shihstruct HTTPBase; 3920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 40693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huberclass DataSource : public RefBase { 4120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberpublic: 4266b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber enum Flags { 43acdd9d0f59c3d8bdc3de80664a609527ec3d21e2Andreas Huber kWantsPrefetching = 1, 44acdd9d0f59c3d8bdc3de80664a609527ec3d21e2Andreas Huber kStreamedFromLocalHost = 2, 45bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas Huber kIsCachingDataSource = 4, 46b33d2ac90cfce0fe6db8c3e979e7ae2bbfc28163James Dong kIsHTTPBasedSource = 8, 4782e147049625a4cfdcb228a1de7efda594d446c9Robert Shih kIsLocalFileSource = 16, 4866b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber }; 4966b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber 505561ccf4a8db88a2e44eac1b3ed13b4ff53a7f20Andreas Huber static sp<DataSource> CreateFromURI( 511b86fe063badb5f28c467ade39be0f4008688947Andreas Huber const sp<IMediaHTTPService> &httpService, 525561ccf4a8db88a2e44eac1b3ed13b4ff53a7f20Andreas Huber const char *uri, 533de157dd8f9cd45bf9b0406268f5830887105ae1Chong Zhang const KeyedVector<String8, String8> *headers = NULL, 54360d6d0924f99b82ebacb5cfb6f7bca95e11b4eeRobert Shih String8 *contentType = NULL, 55360d6d0924f99b82ebacb5cfb6f7bca95e11b4eeRobert Shih HTTPBase *httpSource = NULL); 56360d6d0924f99b82ebacb5cfb6f7bca95e11b4eeRobert Shih 57360d6d0924f99b82ebacb5cfb6f7bca95e11b4eeRobert Shih static sp<DataSource> CreateMediaHTTP(const sp<IMediaHTTPService> &httpService); 5899f31604136d66ae10e20669fb6b5716f342bde0Chris Watkins static sp<DataSource> CreateFromIDataSource(const sp<IDataSource> &source); 59d49dbd6b625cddb82f3f7bbeac62d48ef338ef0fAndy Hung static sp<DataSource> CreateFromFd(int fd, int64_t offset, int64_t length); 60fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huber 6120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber DataSource() {} 6220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 6334769bc913e9f6bb138e666d94a9d685bf3da217Andreas Huber virtual status_t initCheck() const = 0; 6434769bc913e9f6bb138e666d94a9d685bf3da217Andreas Huber 6599f31604136d66ae10e20669fb6b5716f342bde0Chris Watkins // Returns the number of bytes read, or -1 on failure. It's not an error if 6699f31604136d66ae10e20669fb6b5716f342bde0Chris Watkins // this returns zero; it just means the given offset is equal to, or 6799f31604136d66ae10e20669fb6b5716f342bde0Chris Watkins // beyond, the end of the source. 68c7fc37a3dab9bd1f96713649f351b5990e6316ffJames Dong virtual ssize_t readAt(off64_t offset, void *data, size_t size) = 0; 6920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 70693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber // Convenience methods: 71c7fc37a3dab9bd1f96713649f351b5990e6316ffJames Dong bool getUInt16(off64_t offset, uint16_t *x); 72ec77122351b4e78c1fe5b60a208f76baf8c67591Marco Nelissen bool getUInt24(off64_t offset, uint32_t *x); // 3 byte int, returned as a 32-bit int 7305f625c46b992ab66b8d1527a366fe2746b4e3c7Marco Nelissen bool getUInt32(off64_t offset, uint32_t *x); 7405f625c46b992ab66b8d1527a366fe2746b4e3c7Marco Nelissen bool getUInt64(off64_t offset, uint64_t *x); 75693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 76a3630a418b4f65277a42cd4018cd3b0b7e134d0cPawin Vongmasa // Reads in "count" entries of type T into vector *x. 77a3630a418b4f65277a42cd4018cd3b0b7e134d0cPawin Vongmasa // Returns true if "count" entries can be read. 78a3630a418b4f65277a42cd4018cd3b0b7e134d0cPawin Vongmasa // If fewer than "count" entries can be read, return false. In this case, 79a3630a418b4f65277a42cd4018cd3b0b7e134d0cPawin Vongmasa // the output vector *x will still have those entries that were read. Call 80a3630a418b4f65277a42cd4018cd3b0b7e134d0cPawin Vongmasa // x->size() to obtain the number of entries read. 81a3630a418b4f65277a42cd4018cd3b0b7e134d0cPawin Vongmasa // The optional parameter chunkSize specifies how many entries should be 82a3630a418b4f65277a42cd4018cd3b0b7e134d0cPawin Vongmasa // read from the data source at one time into a temporary buffer. Increasing 83a3630a418b4f65277a42cd4018cd3b0b7e134d0cPawin Vongmasa // chunkSize can improve the performance at the cost of extra memory usage. 84a3630a418b4f65277a42cd4018cd3b0b7e134d0cPawin Vongmasa // The default value for chunkSize is set to read at least 4k bytes at a 85a3630a418b4f65277a42cd4018cd3b0b7e134d0cPawin Vongmasa // time, depending on sizeof(T). 86a3630a418b4f65277a42cd4018cd3b0b7e134d0cPawin Vongmasa template <typename T> 87a3630a418b4f65277a42cd4018cd3b0b7e134d0cPawin Vongmasa bool getVector(off64_t offset, Vector<T>* x, size_t count, 88a3630a418b4f65277a42cd4018cd3b0b7e134d0cPawin Vongmasa size_t chunkSize = (4095 / sizeof(T)) + 1); 89a3630a418b4f65277a42cd4018cd3b0b7e134d0cPawin Vongmasa 9020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber // May return ERROR_UNSUPPORTED. 91c7fc37a3dab9bd1f96713649f351b5990e6316ffJames Dong virtual status_t getSize(off64_t *size); 9220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 9366b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber virtual uint32_t flags() { 9466b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber return 0; 9566b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber } 9666b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber 9769d3d8a9540b0da787ea0beccad2517f057dd54dMarco Nelissen virtual String8 toString() { 9869d3d8a9540b0da787ea0beccad2517f057dd54dMarco Nelissen return String8("<unspecified>"); 9969d3d8a9540b0da787ea0beccad2517f057dd54dMarco Nelissen } 10069d3d8a9540b0da787ea0beccad2517f057dd54dMarco Nelissen 101b5fc9e5454e606df9bed9ca81c1ab7f9317f8b54Dan Willemsen virtual status_t reconnectAtOffset(off64_t /*offset*/) { 1020683eba6b35c396c21f10e926709f2f8fc05f090Andreas Huber return ERROR_UNSUPPORTED; 1030683eba6b35c396c21f10e926709f2f8fc05f090Andreas Huber } 1040683eba6b35c396c21f10e926709f2f8fc05f090Andreas Huber 10520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber //////////////////////////////////////////////////////////////////////////// 10620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 107dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang // for DRM 108b5fc9e5454e606df9bed9ca81c1ab7f9317f8b54Dan Willemsen virtual sp<DecryptHandle> DrmInitialization(const char * /*mime*/ = NULL) { 109dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang return NULL; 110dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang } 111b5fc9e5454e606df9bed9ca81c1ab7f9317f8b54Dan Willemsen virtual void getDrmInfo(sp<DecryptHandle> &/*handle*/, DrmManagerClient ** /*client*/) {}; 112dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang 113771b85d9245a24273497792a2515d88d31c99e1eGloria Wang virtual String8 getUri() { 114771b85d9245a24273497792a2515d88d31c99e1eGloria Wang return String8(); 115771b85d9245a24273497792a2515d88d31c99e1eGloria Wang } 116dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang 1176511c9755c3a3360ba869772600c7aae048a7ffcAndreas Huber virtual String8 getMIMEType() const; 1186511c9755c3a3360ba869772600c7aae048a7ffcAndreas Huber 119fbe7fcfe818b6f68e352c7c450d4fe15a543b801Marco Nelissen virtual void close() {}; 120fbe7fcfe818b6f68e352c7c450d4fe15a543b801Marco Nelissen 121d49dbd6b625cddb82f3f7bbeac62d48ef338ef0fAndy Hung // creates an IDataSource wrapper to the DataSource. 122d49dbd6b625cddb82f3f7bbeac62d48ef338ef0fAndy Hung virtual sp<IDataSource> asIDataSource(); 123d49dbd6b625cddb82f3f7bbeac62d48ef338ef0fAndy Hung 124d49dbd6b625cddb82f3f7bbeac62d48ef338ef0fAndy Hung // returns a pointer to IDataSource if it is wrapped. 125d49dbd6b625cddb82f3f7bbeac62d48ef338ef0fAndy Hung virtual sp<IDataSource> getIDataSource() const; 126d49dbd6b625cddb82f3f7bbeac62d48ef338ef0fAndy Hung 127693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huberprotected: 128693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber virtual ~DataSource() {} 129693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 13020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberprivate: 13120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber DataSource(const DataSource &); 13220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber DataSource &operator=(const DataSource &); 13320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber}; 13420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 135a3630a418b4f65277a42cd4018cd3b0b7e134d0cPawin Vongmasatemplate <typename T> 136a3630a418b4f65277a42cd4018cd3b0b7e134d0cPawin Vongmasabool DataSource::getVector(off64_t offset, Vector<T>* x, size_t count, 137a3630a418b4f65277a42cd4018cd3b0b7e134d0cPawin Vongmasa size_t chunkSize) 138a3630a418b4f65277a42cd4018cd3b0b7e134d0cPawin Vongmasa{ 139a3630a418b4f65277a42cd4018cd3b0b7e134d0cPawin Vongmasa x->clear(); 140a3630a418b4f65277a42cd4018cd3b0b7e134d0cPawin Vongmasa if (chunkSize == 0) { 141a3630a418b4f65277a42cd4018cd3b0b7e134d0cPawin Vongmasa return false; 142a3630a418b4f65277a42cd4018cd3b0b7e134d0cPawin Vongmasa } 143a3630a418b4f65277a42cd4018cd3b0b7e134d0cPawin Vongmasa if (count == 0) { 144a3630a418b4f65277a42cd4018cd3b0b7e134d0cPawin Vongmasa return true; 145a3630a418b4f65277a42cd4018cd3b0b7e134d0cPawin Vongmasa } 146a3630a418b4f65277a42cd4018cd3b0b7e134d0cPawin Vongmasa 147a3630a418b4f65277a42cd4018cd3b0b7e134d0cPawin Vongmasa T tmp[chunkSize]; 148a3630a418b4f65277a42cd4018cd3b0b7e134d0cPawin Vongmasa ssize_t numBytesRead; 149a3630a418b4f65277a42cd4018cd3b0b7e134d0cPawin Vongmasa size_t numBytesPerChunk = chunkSize * sizeof(T); 150a3630a418b4f65277a42cd4018cd3b0b7e134d0cPawin Vongmasa size_t i; 151a3630a418b4f65277a42cd4018cd3b0b7e134d0cPawin Vongmasa 152a3630a418b4f65277a42cd4018cd3b0b7e134d0cPawin Vongmasa for (i = 0; i + chunkSize < count; i += chunkSize) { 153a3630a418b4f65277a42cd4018cd3b0b7e134d0cPawin Vongmasa // This loops is executed when more than chunkSize records need to be 154a3630a418b4f65277a42cd4018cd3b0b7e134d0cPawin Vongmasa // read. 155a3630a418b4f65277a42cd4018cd3b0b7e134d0cPawin Vongmasa numBytesRead = this->readAt(offset, (void*)&tmp, numBytesPerChunk); 156a3630a418b4f65277a42cd4018cd3b0b7e134d0cPawin Vongmasa if (numBytesRead == -1) { // If readAt() returns -1, there is an error. 157a3630a418b4f65277a42cd4018cd3b0b7e134d0cPawin Vongmasa return false; 158a3630a418b4f65277a42cd4018cd3b0b7e134d0cPawin Vongmasa } 159a3630a418b4f65277a42cd4018cd3b0b7e134d0cPawin Vongmasa if (numBytesRead < numBytesPerChunk) { 160a3630a418b4f65277a42cd4018cd3b0b7e134d0cPawin Vongmasa // This case is triggered when the stream ends before the whole 161a3630a418b4f65277a42cd4018cd3b0b7e134d0cPawin Vongmasa // chunk is read. 162a3630a418b4f65277a42cd4018cd3b0b7e134d0cPawin Vongmasa x->appendArray(tmp, (size_t)numBytesRead / sizeof(T)); 163a3630a418b4f65277a42cd4018cd3b0b7e134d0cPawin Vongmasa return false; 164a3630a418b4f65277a42cd4018cd3b0b7e134d0cPawin Vongmasa } 165a3630a418b4f65277a42cd4018cd3b0b7e134d0cPawin Vongmasa x->appendArray(tmp, chunkSize); 166a3630a418b4f65277a42cd4018cd3b0b7e134d0cPawin Vongmasa offset += numBytesPerChunk; 167a3630a418b4f65277a42cd4018cd3b0b7e134d0cPawin Vongmasa } 168a3630a418b4f65277a42cd4018cd3b0b7e134d0cPawin Vongmasa 169a3630a418b4f65277a42cd4018cd3b0b7e134d0cPawin Vongmasa // There are (count - i) more records to read. 170a3630a418b4f65277a42cd4018cd3b0b7e134d0cPawin Vongmasa // Right now, (count - i) <= chunkSize. 171a3630a418b4f65277a42cd4018cd3b0b7e134d0cPawin Vongmasa // We do the same thing as above, but with chunkSize replaced by count - i. 172a3630a418b4f65277a42cd4018cd3b0b7e134d0cPawin Vongmasa numBytesRead = this->readAt(offset, (void*)&tmp, (count - i) * sizeof(T)); 173a3630a418b4f65277a42cd4018cd3b0b7e134d0cPawin Vongmasa if (numBytesRead == -1) { 174a3630a418b4f65277a42cd4018cd3b0b7e134d0cPawin Vongmasa return false; 175a3630a418b4f65277a42cd4018cd3b0b7e134d0cPawin Vongmasa } 176a3630a418b4f65277a42cd4018cd3b0b7e134d0cPawin Vongmasa x->appendArray(tmp, (size_t)numBytesRead / sizeof(T)); 177a3630a418b4f65277a42cd4018cd3b0b7e134d0cPawin Vongmasa return x->size() == count; 178a3630a418b4f65277a42cd4018cd3b0b7e134d0cPawin Vongmasa} 179a3630a418b4f65277a42cd4018cd3b0b7e134d0cPawin Vongmasa 18020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber} // namespace android 18120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 18220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#endif // DATA_SOURCE_H_ 183