1*ec779b8eSAndroid Build Coastguard Worker /* 2*ec779b8eSAndroid Build Coastguard Worker * Copyright (C) 2009 The Android Open Source Project 3*ec779b8eSAndroid Build Coastguard Worker * 4*ec779b8eSAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License"); 5*ec779b8eSAndroid Build Coastguard Worker * you may not use this file except in compliance with the License. 6*ec779b8eSAndroid Build Coastguard Worker * You may obtain a copy of the License at 7*ec779b8eSAndroid Build Coastguard Worker * 8*ec779b8eSAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0 9*ec779b8eSAndroid Build Coastguard Worker * 10*ec779b8eSAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software 11*ec779b8eSAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS, 12*ec779b8eSAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13*ec779b8eSAndroid Build Coastguard Worker * See the License for the specific language governing permissions and 14*ec779b8eSAndroid Build Coastguard Worker * limitations under the License. 15*ec779b8eSAndroid Build Coastguard Worker */ 16*ec779b8eSAndroid Build Coastguard Worker 17*ec779b8eSAndroid Build Coastguard Worker #ifndef DATA_SOURCE_H_ 18*ec779b8eSAndroid Build Coastguard Worker 19*ec779b8eSAndroid Build Coastguard Worker #define DATA_SOURCE_H_ 20*ec779b8eSAndroid Build Coastguard Worker 21*ec779b8eSAndroid Build Coastguard Worker #include <sys/types.h> 22*ec779b8eSAndroid Build Coastguard Worker 23*ec779b8eSAndroid Build Coastguard Worker #include <android/IDataSource.h> 24*ec779b8eSAndroid Build Coastguard Worker #include <media/stagefright/MediaErrors.h> 25*ec779b8eSAndroid Build Coastguard Worker #include <media/stagefright/DataSourceBase.h> 26*ec779b8eSAndroid Build Coastguard Worker #include <media/MediaExtractorPluginApi.h> 27*ec779b8eSAndroid Build Coastguard Worker #include <utils/Errors.h> 28*ec779b8eSAndroid Build Coastguard Worker #include <utils/RefBase.h> 29*ec779b8eSAndroid Build Coastguard Worker #include <utils/threads.h> 30*ec779b8eSAndroid Build Coastguard Worker 31*ec779b8eSAndroid Build Coastguard Worker 32*ec779b8eSAndroid Build Coastguard Worker namespace android { 33*ec779b8eSAndroid Build Coastguard Worker 34*ec779b8eSAndroid Build Coastguard Worker class String8; 35*ec779b8eSAndroid Build Coastguard Worker 36*ec779b8eSAndroid Build Coastguard Worker class DataSource : public DataSourceBase, public virtual RefBase { 37*ec779b8eSAndroid Build Coastguard Worker public: 38*ec779b8eSAndroid Build Coastguard Worker DataSource() : mWrapper(NULL) {} 39*ec779b8eSAndroid Build Coastguard Worker 40*ec779b8eSAndroid Build Coastguard Worker // returns a pointer to IDataSource if it is wrapped. 41*ec779b8eSAndroid Build Coastguard Worker virtual sp<IDataSource> getIDataSource() const { 42*ec779b8eSAndroid Build Coastguard Worker return nullptr; 43*ec779b8eSAndroid Build Coastguard Worker } 44*ec779b8eSAndroid Build Coastguard Worker 45*ec779b8eSAndroid Build Coastguard Worker virtual String8 toString() { 46*ec779b8eSAndroid Build Coastguard Worker return String8("<unspecified>"); 47*ec779b8eSAndroid Build Coastguard Worker } 48*ec779b8eSAndroid Build Coastguard Worker 49*ec779b8eSAndroid Build Coastguard Worker virtual status_t reconnectAtOffset(off64_t /*offset*/) { 50*ec779b8eSAndroid Build Coastguard Worker return ERROR_UNSUPPORTED; 51*ec779b8eSAndroid Build Coastguard Worker } 52*ec779b8eSAndroid Build Coastguard Worker 53*ec779b8eSAndroid Build Coastguard Worker //////////////////////////////////////////////////////////////////////////// 54*ec779b8eSAndroid Build Coastguard Worker 55*ec779b8eSAndroid Build Coastguard Worker virtual String8 getUri() { 56*ec779b8eSAndroid Build Coastguard Worker return String8(); 57*ec779b8eSAndroid Build Coastguard Worker } 58*ec779b8eSAndroid Build Coastguard Worker 59*ec779b8eSAndroid Build Coastguard Worker virtual bool getUri(char *uriString, size_t bufferSize) final { 60*ec779b8eSAndroid Build Coastguard Worker int ret = snprintf(uriString, bufferSize, "%s", getUri().c_str()); 61*ec779b8eSAndroid Build Coastguard Worker return ret >= 0 && static_cast<size_t>(ret) < bufferSize; 62*ec779b8eSAndroid Build Coastguard Worker } 63*ec779b8eSAndroid Build Coastguard Worker 64*ec779b8eSAndroid Build Coastguard Worker virtual String8 getMIMEType() const { 65*ec779b8eSAndroid Build Coastguard Worker return String8("application/octet-stream"); 66*ec779b8eSAndroid Build Coastguard Worker } 67*ec779b8eSAndroid Build Coastguard Worker 68*ec779b8eSAndroid Build Coastguard Worker CDataSource *wrap() { 69*ec779b8eSAndroid Build Coastguard Worker if (mWrapper) { 70*ec779b8eSAndroid Build Coastguard Worker return mWrapper; 71*ec779b8eSAndroid Build Coastguard Worker } 72*ec779b8eSAndroid Build Coastguard Worker mWrapper = new CDataSource(); 73*ec779b8eSAndroid Build Coastguard Worker mWrapper->handle = this; 74*ec779b8eSAndroid Build Coastguard Worker 75*ec779b8eSAndroid Build Coastguard Worker mWrapper->readAt = [](void *handle, off64_t offset, void *data, size_t size) -> ssize_t { 76*ec779b8eSAndroid Build Coastguard Worker return ((DataSource*)handle)->readAt(offset, data, size); 77*ec779b8eSAndroid Build Coastguard Worker }; 78*ec779b8eSAndroid Build Coastguard Worker mWrapper->getSize = [](void *handle, off64_t *size) -> status_t { 79*ec779b8eSAndroid Build Coastguard Worker return ((DataSource*)handle)->getSize(size); 80*ec779b8eSAndroid Build Coastguard Worker }; 81*ec779b8eSAndroid Build Coastguard Worker mWrapper->flags = [](void *handle) -> uint32_t { 82*ec779b8eSAndroid Build Coastguard Worker return ((DataSource*)handle)->flags(); 83*ec779b8eSAndroid Build Coastguard Worker }; 84*ec779b8eSAndroid Build Coastguard Worker mWrapper->getUri = [](void *handle, char *uriString, size_t bufferSize) -> bool { 85*ec779b8eSAndroid Build Coastguard Worker return ((DataSource*)handle)->getUri(uriString, bufferSize); 86*ec779b8eSAndroid Build Coastguard Worker }; 87*ec779b8eSAndroid Build Coastguard Worker return mWrapper; 88*ec779b8eSAndroid Build Coastguard Worker } 89*ec779b8eSAndroid Build Coastguard Worker 90*ec779b8eSAndroid Build Coastguard Worker protected: 91*ec779b8eSAndroid Build Coastguard Worker virtual ~DataSource() { 92*ec779b8eSAndroid Build Coastguard Worker delete mWrapper; 93*ec779b8eSAndroid Build Coastguard Worker } 94*ec779b8eSAndroid Build Coastguard Worker 95*ec779b8eSAndroid Build Coastguard Worker private: 96*ec779b8eSAndroid Build Coastguard Worker CDataSource *mWrapper; 97*ec779b8eSAndroid Build Coastguard Worker DataSource(const DataSource &); 98*ec779b8eSAndroid Build Coastguard Worker DataSource &operator=(const DataSource &); 99*ec779b8eSAndroid Build Coastguard Worker }; 100*ec779b8eSAndroid Build Coastguard Worker 101*ec779b8eSAndroid Build Coastguard Worker } // namespace android 102*ec779b8eSAndroid Build Coastguard Worker 103*ec779b8eSAndroid Build Coastguard Worker #endif // DATA_SOURCE_H_ 104