DataSource.h revision 3de157dd8f9cd45bf9b0406268f5830887105ae1
1ecbab3662d4474bbb45477939aaa167eb883212bJorim Jaggi/* 2ecbab3662d4474bbb45477939aaa167eb883212bJorim Jaggi * Copyright (C) 2009 The Android Open Source Project 3ecbab3662d4474bbb45477939aaa167eb883212bJorim Jaggi * 4ecbab3662d4474bbb45477939aaa167eb883212bJorim Jaggi * Licensed under the Apache License, Version 2.0 (the "License"); 5ecbab3662d4474bbb45477939aaa167eb883212bJorim Jaggi * you may not use this file except in compliance with the License. 6ecbab3662d4474bbb45477939aaa167eb883212bJorim Jaggi * You may obtain a copy of the License at 7ecbab3662d4474bbb45477939aaa167eb883212bJorim Jaggi * 8ecbab3662d4474bbb45477939aaa167eb883212bJorim Jaggi * http://www.apache.org/licenses/LICENSE-2.0 9ecbab3662d4474bbb45477939aaa167eb883212bJorim Jaggi * 10ecbab3662d4474bbb45477939aaa167eb883212bJorim Jaggi * Unless required by applicable law or agreed to in writing, software 11ecbab3662d4474bbb45477939aaa167eb883212bJorim Jaggi * distributed under the License is distributed on an "AS IS" BASIS, 12ecbab3662d4474bbb45477939aaa167eb883212bJorim Jaggi * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13ecbab3662d4474bbb45477939aaa167eb883212bJorim Jaggi * See the License for the specific language governing permissions and 14ecbab3662d4474bbb45477939aaa167eb883212bJorim Jaggi * limitations under the License. 15ecbab3662d4474bbb45477939aaa167eb883212bJorim Jaggi */ 16ecbab3662d4474bbb45477939aaa167eb883212bJorim Jaggi 17ecbab3662d4474bbb45477939aaa167eb883212bJorim Jaggi#ifndef DATA_SOURCE_H_ 18ecbab3662d4474bbb45477939aaa167eb883212bJorim Jaggi 194222d9a7fb87d73e1443ec1a2de9782b05741af6Jorim Jaggi#define DATA_SOURCE_H_ 204222d9a7fb87d73e1443ec1a2de9782b05741af6Jorim Jaggi 214222d9a7fb87d73e1443ec1a2de9782b05741af6Jorim Jaggi#include <sys/types.h> 2248bc36af053885daf091bcca6d99411e0438ba83Jorim Jaggi 23ecbab3662d4474bbb45477939aaa167eb883212bJorim Jaggi#include <media/stagefright/MediaErrors.h> 24ecbab3662d4474bbb45477939aaa167eb883212bJorim Jaggi#include <utils/Errors.h> 25ecbab3662d4474bbb45477939aaa167eb883212bJorim Jaggi#include <utils/KeyedVector.h> 26ecbab3662d4474bbb45477939aaa167eb883212bJorim Jaggi#include <utils/List.h> 27c18010f6720f606003cde3cd376ddacaca30f6e5Selim Cinek#include <utils/RefBase.h> 28ecbab3662d4474bbb45477939aaa167eb883212bJorim Jaggi#include <utils/threads.h> 29ecbab3662d4474bbb45477939aaa167eb883212bJorim Jaggi#include <drm/DrmManagerClient.h> 30c0d7058b14c24cd07912f5629c26b39b7b4673d5Winson 31ecbab3662d4474bbb45477939aaa167eb883212bJorim Jagginamespace android { 320e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski 33ecbab3662d4474bbb45477939aaa167eb883212bJorim Jaggistruct AMessage; 34ecbab3662d4474bbb45477939aaa167eb883212bJorim Jaggistruct AString; 35ecbab3662d4474bbb45477939aaa167eb883212bJorim Jaggistruct IMediaHTTPService; 36ecbab3662d4474bbb45477939aaa167eb883212bJorim Jaggiclass String8; 37ecbab3662d4474bbb45477939aaa167eb883212bJorim Jaggi 38ecbab3662d4474bbb45477939aaa167eb883212bJorim Jaggiclass DataSource : public RefBase { 39ecbab3662d4474bbb45477939aaa167eb883212bJorim Jaggipublic: 404222d9a7fb87d73e1443ec1a2de9782b05741af6Jorim Jaggi enum Flags { 414222d9a7fb87d73e1443ec1a2de9782b05741af6Jorim Jaggi kWantsPrefetching = 1, 424222d9a7fb87d73e1443ec1a2de9782b05741af6Jorim Jaggi kStreamedFromLocalHost = 2, 434222d9a7fb87d73e1443ec1a2de9782b05741af6Jorim Jaggi kIsCachingDataSource = 4, 444222d9a7fb87d73e1443ec1a2de9782b05741af6Jorim Jaggi kIsHTTPBasedSource = 8, 45ecbab3662d4474bbb45477939aaa167eb883212bJorim Jaggi }; 46ecbab3662d4474bbb45477939aaa167eb883212bJorim Jaggi 47ecbab3662d4474bbb45477939aaa167eb883212bJorim Jaggi static sp<DataSource> CreateFromURI( 48ecbab3662d4474bbb45477939aaa167eb883212bJorim Jaggi const sp<IMediaHTTPService> &httpService, 49ecbab3662d4474bbb45477939aaa167eb883212bJorim Jaggi const char *uri, 50ecbab3662d4474bbb45477939aaa167eb883212bJorim Jaggi const KeyedVector<String8, String8> *headers = NULL, 5148bc36af053885daf091bcca6d99411e0438ba83Jorim Jaggi AString *sniffedMIME = NULL); 52ecbab3662d4474bbb45477939aaa167eb883212bJorim Jaggi 53ecbab3662d4474bbb45477939aaa167eb883212bJorim Jaggi DataSource() {} 54ecbab3662d4474bbb45477939aaa167eb883212bJorim Jaggi 554222d9a7fb87d73e1443ec1a2de9782b05741af6Jorim Jaggi virtual status_t initCheck() const = 0; 5648bc36af053885daf091bcca6d99411e0438ba83Jorim Jaggi 570e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski virtual ssize_t readAt(off64_t offset, void *data, size_t size) = 0; 58ecbab3662d4474bbb45477939aaa167eb883212bJorim Jaggi 59ecbab3662d4474bbb45477939aaa167eb883212bJorim Jaggi // Convenience methods: 6048bc36af053885daf091bcca6d99411e0438ba83Jorim Jaggi bool getUInt16(off64_t offset, uint16_t *x); 61ecbab3662d4474bbb45477939aaa167eb883212bJorim Jaggi bool getUInt24(off64_t offset, uint32_t *x); // 3 byte int, returned as a 32-bit int 62ecbab3662d4474bbb45477939aaa167eb883212bJorim Jaggi bool getUInt32(off64_t offset, uint32_t *x); 63ecbab3662d4474bbb45477939aaa167eb883212bJorim Jaggi bool getUInt64(off64_t offset, uint64_t *x); 64ecbab3662d4474bbb45477939aaa167eb883212bJorim Jaggi 6548bc36af053885daf091bcca6d99411e0438ba83Jorim Jaggi // May return ERROR_UNSUPPORTED. 66ecbab3662d4474bbb45477939aaa167eb883212bJorim Jaggi virtual status_t getSize(off64_t *size); 670e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski 68ecbab3662d4474bbb45477939aaa167eb883212bJorim Jaggi virtual uint32_t flags() { 69ecbab3662d4474bbb45477939aaa167eb883212bJorim Jaggi return 0; 70ecbab3662d4474bbb45477939aaa167eb883212bJorim Jaggi } 71ecbab3662d4474bbb45477939aaa167eb883212bJorim Jaggi 72ecbab3662d4474bbb45477939aaa167eb883212bJorim Jaggi virtual status_t reconnectAtOffset(off64_t offset) { 73ecbab3662d4474bbb45477939aaa167eb883212bJorim Jaggi return ERROR_UNSUPPORTED; 74ecbab3662d4474bbb45477939aaa167eb883212bJorim Jaggi } 75ecbab3662d4474bbb45477939aaa167eb883212bJorim Jaggi 76ecbab3662d4474bbb45477939aaa167eb883212bJorim Jaggi //////////////////////////////////////////////////////////////////////////// 77ecbab3662d4474bbb45477939aaa167eb883212bJorim Jaggi 78ecbab3662d4474bbb45477939aaa167eb883212bJorim Jaggi bool sniff(String8 *mimeType, float *confidence, sp<AMessage> *meta); 79ecbab3662d4474bbb45477939aaa167eb883212bJorim Jaggi 80ecbab3662d4474bbb45477939aaa167eb883212bJorim Jaggi // The sniffer can optionally fill in "meta" with an AMessage containing 81ecbab3662d4474bbb45477939aaa167eb883212bJorim Jaggi // a dictionary of values that helps the corresponding extractor initialize 82ecbab3662d4474bbb45477939aaa167eb883212bJorim Jaggi // its state without duplicating effort already exerted by the sniffer. 83ecbab3662d4474bbb45477939aaa167eb883212bJorim Jaggi typedef bool (*SnifferFunc)( 84ecbab3662d4474bbb45477939aaa167eb883212bJorim Jaggi const sp<DataSource> &source, String8 *mimeType, 85ecbab3662d4474bbb45477939aaa167eb883212bJorim Jaggi float *confidence, sp<AMessage> *meta); 86ecbab3662d4474bbb45477939aaa167eb883212bJorim Jaggi 870e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski static void RegisterDefaultSniffers(); 88ecbab3662d4474bbb45477939aaa167eb883212bJorim Jaggi 894222d9a7fb87d73e1443ec1a2de9782b05741af6Jorim Jaggi // for DRM 90ecbab3662d4474bbb45477939aaa167eb883212bJorim Jaggi virtual sp<DecryptHandle> DrmInitialization(const char *mime = NULL) { 91ecbab3662d4474bbb45477939aaa167eb883212bJorim Jaggi return NULL; 9248bc36af053885daf091bcca6d99411e0438ba83Jorim Jaggi } 93ecbab3662d4474bbb45477939aaa167eb883212bJorim Jaggi virtual void getDrmInfo(sp<DecryptHandle> &handle, DrmManagerClient **client) {}; 94ecbab3662d4474bbb45477939aaa167eb883212bJorim Jaggi 95ecbab3662d4474bbb45477939aaa167eb883212bJorim Jaggi virtual String8 getUri() { 96ecbab3662d4474bbb45477939aaa167eb883212bJorim Jaggi return String8(); 97ecbab3662d4474bbb45477939aaa167eb883212bJorim Jaggi } 98ecbab3662d4474bbb45477939aaa167eb883212bJorim Jaggi 99ecbab3662d4474bbb45477939aaa167eb883212bJorim Jaggi virtual String8 getMIMEType() const; 100ecbab3662d4474bbb45477939aaa167eb883212bJorim Jaggi 101ecbab3662d4474bbb45477939aaa167eb883212bJorim Jaggiprotected: 102ecbab3662d4474bbb45477939aaa167eb883212bJorim Jaggi virtual ~DataSource() {} 103ecbab3662d4474bbb45477939aaa167eb883212bJorim Jaggi 104ecbab3662d4474bbb45477939aaa167eb883212bJorim Jaggiprivate: 105ecbab3662d4474bbb45477939aaa167eb883212bJorim Jaggi enum { 106ecbab3662d4474bbb45477939aaa167eb883212bJorim Jaggi kDefaultMetaSize = 200000, 107ecbab3662d4474bbb45477939aaa167eb883212bJorim Jaggi }; 108ecbab3662d4474bbb45477939aaa167eb883212bJorim Jaggi 109ecbab3662d4474bbb45477939aaa167eb883212bJorim Jaggi static Mutex gSnifferMutex; 11048bc36af053885daf091bcca6d99411e0438ba83Jorim Jaggi static List<SnifferFunc> gSniffers; 1114222d9a7fb87d73e1443ec1a2de9782b05741af6Jorim Jaggi static bool gSniffersRegistered; 1124222d9a7fb87d73e1443ec1a2de9782b05741af6Jorim Jaggi 11348bc36af053885daf091bcca6d99411e0438ba83Jorim Jaggi static void RegisterSniffer_l(SnifferFunc func); 11448bc36af053885daf091bcca6d99411e0438ba83Jorim Jaggi 11548bc36af053885daf091bcca6d99411e0438ba83Jorim Jaggi DataSource(const DataSource &); 116ecbab3662d4474bbb45477939aaa167eb883212bJorim Jaggi DataSource &operator=(const DataSource &); 11748bc36af053885daf091bcca6d99411e0438ba83Jorim Jaggi}; 118ecbab3662d4474bbb45477939aaa167eb883212bJorim Jaggi 119ecbab3662d4474bbb45477939aaa167eb883212bJorim Jaggi} // namespace android 120177fd4324ab89dc138b3d4c7472623ae9dc8c9d8Selim Cinek 121ecbab3662d4474bbb45477939aaa167eb883212bJorim Jaggi#endif // DATA_SOURCE_H_ 122ecbab3662d4474bbb45477939aaa167eb883212bJorim Jaggi