DataSource.h revision 05f625c46b992ab66b8d1527a366fe2746b4e3c7
1e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng/*
2e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng * Copyright (C) 2009 The Android Open Source Project
3e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng *
4e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng * Licensed under the Apache License, Version 2.0 (the "License");
5e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng * you may not use this file except in compliance with the License.
6e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng * You may obtain a copy of the License at
7e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng *
8e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng *      http://www.apache.org/licenses/LICENSE-2.0
9e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng *
10e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng * Unless required by applicable law or agreed to in writing, software
11e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng * distributed under the License is distributed on an "AS IS" BASIS,
12e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng * See the License for the specific language governing permissions and
14e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng * limitations under the License.
15e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng */
16e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
17e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#ifndef DATA_SOURCE_H_
18e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
19e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#define DATA_SOURCE_H_
20e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
21e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include <sys/types.h>
22e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
23e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include <media/stagefright/MediaErrors.h>
24e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include <utils/Errors.h>
25e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include <utils/KeyedVector.h>
26e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include <utils/List.h>
27e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include <utils/RefBase.h>
28e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include <utils/threads.h>
29e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include <drm/DrmManagerClient.h>
30e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
31e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengnamespace android {
32e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
33e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengstruct AMessage;
34e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengclass String8;
35e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
36e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengclass DataSource : public RefBase {
37e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengpublic:
38e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng    enum Flags {
39e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng        kWantsPrefetching      = 1,
40e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng        kStreamedFromLocalHost = 2,
41e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng        kIsCachingDataSource   = 4,
42e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng        kIsHTTPBasedSource     = 8,
43e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng    };
44e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
45e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng    static sp<DataSource> CreateFromURI(
46e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng            const char *uri,
47e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng            const KeyedVector<String8, String8> *headers = NULL);
48e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
49e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng    DataSource() {}
50e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
51e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng    virtual status_t initCheck() const = 0;
52e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
53e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng    virtual ssize_t readAt(off64_t offset, void *data, size_t size) = 0;
54e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
55e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng    // Convenience methods:
56e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng    bool getUInt16(off64_t offset, uint16_t *x);
57e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng    bool getUInt32(off64_t offset, uint32_t *x);
58e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng    bool getUInt64(off64_t offset, uint64_t *x);
59e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
60e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng    // May return ERROR_UNSUPPORTED.
61e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng    virtual status_t getSize(off64_t *size);
62e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
63e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng    virtual uint32_t flags() {
64e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng        return 0;
65e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng    }
66e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
67e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng    virtual status_t reconnectAtOffset(off64_t offset) {
68e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng        return ERROR_UNSUPPORTED;
69e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng    }
70e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
71e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng    ////////////////////////////////////////////////////////////////////////////
72e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
73e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng    bool sniff(String8 *mimeType, float *confidence, sp<AMessage> *meta);
74e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
75e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng    // The sniffer can optionally fill in "meta" with an AMessage containing
76e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng    // a dictionary of values that helps the corresponding extractor initialize
77e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng    // its state without duplicating effort already exerted by the sniffer.
78e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng    typedef bool (*SnifferFunc)(
79e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng            const sp<DataSource> &source, String8 *mimeType,
80e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng            float *confidence, sp<AMessage> *meta);
81e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
82e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng    static void RegisterSniffer(SnifferFunc func);
83e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng    static void RegisterDefaultSniffers();
84e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
85e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng    // for DRM
86e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng    virtual sp<DecryptHandle> DrmInitialization(const char *mime = NULL) {
87e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng        return NULL;
88e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng    }
89e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng    virtual void getDrmInfo(sp<DecryptHandle> &handle, DrmManagerClient **client) {};
90e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
91e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng    virtual String8 getUri() {
92e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng        return String8();
93e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng    }
94e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
95e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng    virtual String8 getMIMEType() const;
96e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
97e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengprotected:
98e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng    virtual ~DataSource() {}
99e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
100e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengprivate:
101e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng    static Mutex gSnifferMutex;
102e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng    static List<SnifferFunc> gSniffers;
103e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
104e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng    DataSource(const DataSource &);
105e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng    DataSource &operator=(const DataSource &);
106e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng};
107e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
108e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng}  // namespace android
109e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
110e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#endif  // DATA_SOURCE_H_
111e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng