blob: 6b6fcdfd1cee1ec4a06405e0a1f777feef5c40d0 [file] [log] [blame]
Andreas Hubere46b7be2009-07-14 16:56:47 -07001/*
2 * Copyright (C) 2009 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#ifndef DATA_SOURCE_H_
18
19#define DATA_SOURCE_H_
20
21#include <sys/types.h>
22
23#include <utils/Errors.h>
Andreas Huber433c9ac2010-01-27 16:49:05 -080024#include <utils/KeyedVector.h>
Andreas Hubere46b7be2009-07-14 16:56:47 -070025#include <utils/List.h>
Andreas Huberbe06d262009-08-14 14:37:10 -070026#include <utils/RefBase.h>
Andreas Hubere46b7be2009-07-14 16:56:47 -070027#include <utils/threads.h>
Gloria Wangd5770912010-06-22 13:55:38 -070028#include <drm/DrmManagerClient.h>
Andreas Hubere46b7be2009-07-14 16:56:47 -070029
30namespace android {
31
Andreas Huberefdd0882010-08-25 11:09:41 -070032struct AMessage;
Andreas Hubere46b7be2009-07-14 16:56:47 -070033class String8;
34
Andreas Huberbe06d262009-08-14 14:37:10 -070035class DataSource : public RefBase {
Andreas Hubere46b7be2009-07-14 16:56:47 -070036public:
Andreas Huberb9e63832010-01-26 16:20:10 -080037 enum Flags {
Andreas Huber62f7ffe2010-05-06 10:18:05 -070038 kWantsPrefetching = 1,
39 kStreamedFromLocalHost = 2,
Andreas Huber54d09722010-10-12 11:34:37 -070040 kIsCachingDataSource = 4,
Andreas Huberb9e63832010-01-26 16:20:10 -080041 };
42
Andreas Huber433c9ac2010-01-27 16:49:05 -080043 static sp<DataSource> CreateFromURI(
44 const char *uri,
45 const KeyedVector<String8, String8> *headers = NULL);
Andreas Huberaee3c632010-01-11 15:35:19 -080046
Andreas Hubere46b7be2009-07-14 16:56:47 -070047 DataSource() {}
Andreas Hubere46b7be2009-07-14 16:56:47 -070048
Andreas Huber9a12baf2009-10-23 10:22:30 -070049 virtual status_t initCheck() const = 0;
50
James Dongb1262a82010-11-16 14:04:54 -080051 virtual ssize_t readAt(off64_t offset, void *data, size_t size) = 0;
Andreas Hubere46b7be2009-07-14 16:56:47 -070052
Andreas Huberbe06d262009-08-14 14:37:10 -070053 // Convenience methods:
James Dongb1262a82010-11-16 14:04:54 -080054 bool getUInt16(off64_t offset, uint16_t *x);
Andreas Huberbe06d262009-08-14 14:37:10 -070055
Andreas Hubere46b7be2009-07-14 16:56:47 -070056 // May return ERROR_UNSUPPORTED.
James Dongb1262a82010-11-16 14:04:54 -080057 virtual status_t getSize(off64_t *size);
Andreas Hubere46b7be2009-07-14 16:56:47 -070058
Andreas Huberb9e63832010-01-26 16:20:10 -080059 virtual uint32_t flags() {
60 return 0;
61 }
62
Andreas Hubere46b7be2009-07-14 16:56:47 -070063 ////////////////////////////////////////////////////////////////////////////
64
Andreas Huberefdd0882010-08-25 11:09:41 -070065 bool sniff(String8 *mimeType, float *confidence, sp<AMessage> *meta);
Andreas Hubere46b7be2009-07-14 16:56:47 -070066
Andreas Huberefdd0882010-08-25 11:09:41 -070067 // The sniffer can optionally fill in "meta" with an AMessage containing
68 // a dictionary of values that helps the corresponding extractor initialize
69 // its state without duplicating effort already exerted by the sniffer.
Andreas Hubere46b7be2009-07-14 16:56:47 -070070 typedef bool (*SnifferFunc)(
Andreas Huberefdd0882010-08-25 11:09:41 -070071 const sp<DataSource> &source, String8 *mimeType,
72 float *confidence, sp<AMessage> *meta);
Andreas Hubere46b7be2009-07-14 16:56:47 -070073
74 static void RegisterSniffer(SnifferFunc func);
75 static void RegisterDefaultSniffers();
76
Gloria Wangd5770912010-06-22 13:55:38 -070077 // for DRM
Gloria Wangae775272011-02-24 16:40:57 -080078 virtual sp<DecryptHandle> DrmInitialization() {
Gloria Wangd5770912010-06-22 13:55:38 -070079 return NULL;
80 }
Gloria Wangae775272011-02-24 16:40:57 -080081 virtual void getDrmInfo(sp<DecryptHandle> &handle, DrmManagerClient **client) {};
Gloria Wangd5770912010-06-22 13:55:38 -070082
Gloria Wang43cd12d2010-11-09 15:06:51 -080083 virtual String8 getUri() {
84 return String8();
85 }
Gloria Wangd5770912010-06-22 13:55:38 -070086
Andreas Hubera2e57ca2011-03-30 11:15:27 -070087 virtual String8 getMIMEType() const;
88
Andreas Huberbe06d262009-08-14 14:37:10 -070089protected:
90 virtual ~DataSource() {}
91
Andreas Hubere46b7be2009-07-14 16:56:47 -070092private:
93 static Mutex gSnifferMutex;
94 static List<SnifferFunc> gSniffers;
95
96 DataSource(const DataSource &);
97 DataSource &operator=(const DataSource &);
98};
99
100} // namespace android
101
102#endif // DATA_SOURCE_H_