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