DataSource.h revision 92541a351d8c5ca6aa0c1b3b0d40023ff2385645
104fc583c3dd3144bc6b718fcac4b3e1afdfdb067John Reck/*
204fc583c3dd3144bc6b718fcac4b3e1afdfdb067John Reck * Copyright (C) 2009 The Android Open Source Project
304fc583c3dd3144bc6b718fcac4b3e1afdfdb067John Reck *
404fc583c3dd3144bc6b718fcac4b3e1afdfdb067John Reck * Licensed under the Apache License, Version 2.0 (the "License");
504fc583c3dd3144bc6b718fcac4b3e1afdfdb067John Reck * you may not use this file except in compliance with the License.
604fc583c3dd3144bc6b718fcac4b3e1afdfdb067John Reck * You may obtain a copy of the License at
704fc583c3dd3144bc6b718fcac4b3e1afdfdb067John Reck *
804fc583c3dd3144bc6b718fcac4b3e1afdfdb067John Reck *      http://www.apache.org/licenses/LICENSE-2.0
904fc583c3dd3144bc6b718fcac4b3e1afdfdb067John Reck *
1004fc583c3dd3144bc6b718fcac4b3e1afdfdb067John Reck * Unless required by applicable law or agreed to in writing, software
1104fc583c3dd3144bc6b718fcac4b3e1afdfdb067John Reck * distributed under the License is distributed on an "AS IS" BASIS,
1204fc583c3dd3144bc6b718fcac4b3e1afdfdb067John Reck * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1304fc583c3dd3144bc6b718fcac4b3e1afdfdb067John Reck * See the License for the specific language governing permissions and
1404fc583c3dd3144bc6b718fcac4b3e1afdfdb067John Reck * limitations under the License.
1504fc583c3dd3144bc6b718fcac4b3e1afdfdb067John Reck */
1604fc583c3dd3144bc6b718fcac4b3e1afdfdb067John Reck
1704fc583c3dd3144bc6b718fcac4b3e1afdfdb067John Reck#ifndef DATA_SOURCE_H_
188cd3edfa15cc9cdbffa935d19ab894426b08d174Greg Daniel
1945ec62ba72c5017fae7d8baab20bfb0d4c99c627Greg Daniel#define DATA_SOURCE_H_
203e9999bd866fac71c72e6b484a9836c87c328a08sergeyv
21749906b468912dab7bf69a86e852deac3e80b0ccJohn Reck#include <sys/types.h>
22749906b468912dab7bf69a86e852deac3e80b0ccJohn Reck#include <media/stagefright/foundation/ADebug.h>
235e00c7ce063116c11315639f0035aca8ad73e8ccChris Craik#include <media/stagefright/MediaErrors.h>
2404fc583c3dd3144bc6b718fcac4b3e1afdfdb067John Reck#include <utils/Errors.h>
2504fc583c3dd3144bc6b718fcac4b3e1afdfdb067John Reck#include <utils/KeyedVector.h>
2604fc583c3dd3144bc6b718fcac4b3e1afdfdb067John Reck#include <utils/List.h>
2704fc583c3dd3144bc6b718fcac4b3e1afdfdb067John Reck#include <utils/RefBase.h>
283e9999bd866fac71c72e6b484a9836c87c328a08sergeyv#include <utils/threads.h>
291bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck#include <drm/DrmManagerClient.h>
303e9999bd866fac71c72e6b484a9836c87c328a08sergeyv
313e9999bd866fac71c72e6b484a9836c87c328a08sergeyvnamespace android {
323e9999bd866fac71c72e6b484a9836c87c328a08sergeyv
33d41c4d8c732095ae99c955b6b82f7306633004b1Chris Craikstruct AMessage;
3400eb43dbc04083eab85fbb1a9589e2548f2004edsergeyvstruct AString;
3504fc583c3dd3144bc6b718fcac4b3e1afdfdb067John Reckclass  IDataSource;
363e9999bd866fac71c72e6b484a9836c87c328a08sergeyvstruct IMediaHTTPService;
373e9999bd866fac71c72e6b484a9836c87c328a08sergeyvclass String8;
383e9999bd866fac71c72e6b484a9836c87c328a08sergeyvstruct HTTPBase;
393e9999bd866fac71c72e6b484a9836c87c328a08sergeyv
4004fc583c3dd3144bc6b718fcac4b3e1afdfdb067John Reckclass DataSource : public RefBase {
4104fc583c3dd3144bc6b718fcac4b3e1afdfdb067John Reckpublic:
4204fc583c3dd3144bc6b718fcac4b3e1afdfdb067John Reck    enum Flags {
43d41c4d8c732095ae99c955b6b82f7306633004b1Chris Craik        kWantsPrefetching      = 1,
443e9999bd866fac71c72e6b484a9836c87c328a08sergeyv        kStreamedFromLocalHost = 2,
453e9999bd866fac71c72e6b484a9836c87c328a08sergeyv        kIsCachingDataSource   = 4,
463e9999bd866fac71c72e6b484a9836c87c328a08sergeyv        kIsHTTPBasedSource     = 8,
473e9999bd866fac71c72e6b484a9836c87c328a08sergeyv        kIsLocalFileSource     = 16,
483e9999bd866fac71c72e6b484a9836c87c328a08sergeyv    };
4900eb43dbc04083eab85fbb1a9589e2548f2004edsergeyv
5000eb43dbc04083eab85fbb1a9589e2548f2004edsergeyv    DataSource() {}
5100eb43dbc04083eab85fbb1a9589e2548f2004edsergeyv
5200eb43dbc04083eab85fbb1a9589e2548f2004edsergeyv    virtual status_t initCheck() const = 0;
5300eb43dbc04083eab85fbb1a9589e2548f2004edsergeyv
5400eb43dbc04083eab85fbb1a9589e2548f2004edsergeyv    // Returns the number of bytes read, or -1 on failure. It's not an error if
5500eb43dbc04083eab85fbb1a9589e2548f2004edsergeyv    // this returns zero; it just means the given offset is equal to, or
5600eb43dbc04083eab85fbb1a9589e2548f2004edsergeyv    // beyond, the end of the source.
5700eb43dbc04083eab85fbb1a9589e2548f2004edsergeyv    virtual ssize_t readAt(off64_t offset, void *data, size_t size) = 0;
5800eb43dbc04083eab85fbb1a9589e2548f2004edsergeyv
5900eb43dbc04083eab85fbb1a9589e2548f2004edsergeyv    // Convenience methods:
603e9999bd866fac71c72e6b484a9836c87c328a08sergeyv    bool getUInt16(off64_t offset, uint16_t *x);
6100eb43dbc04083eab85fbb1a9589e2548f2004edsergeyv    bool getUInt24(off64_t offset, uint32_t *x); // 3 byte int, returned as a 32-bit int
6200eb43dbc04083eab85fbb1a9589e2548f2004edsergeyv    bool getUInt32(off64_t offset, uint32_t *x);
6300eb43dbc04083eab85fbb1a9589e2548f2004edsergeyv    bool getUInt64(off64_t offset, uint64_t *x);
6404fc583c3dd3144bc6b718fcac4b3e1afdfdb067John Reck
6504fc583c3dd3144bc6b718fcac4b3e1afdfdb067John Reck    // read either int<N> or int<2N> into a uint<2N>_t, size is the int size in bytes.
66674554fc36932ca50b15bba41ac6f650254d4e72Derek Sollenberger    bool getUInt16Var(off64_t offset, uint16_t *x, size_t size);
67bf6f0f260886a04a1680c7f9917124a751322ca4Chris Craik    bool getUInt32Var(off64_t offset, uint32_t *x, size_t size);
68260ab726486317496bc12a57d599ea96dcde3284Mike Reed    bool getUInt64Var(off64_t offset, uint64_t *x, size_t size);
69551d08e2d50c7f73c5eb65fd366b92efba4f0ed5Derek Sollenberger
70551d08e2d50c7f73c5eb65fd366b92efba4f0ed5Derek Sollenberger    // Reads in "count" entries of type T into vector *x.
71551d08e2d50c7f73c5eb65fd366b92efba4f0ed5Derek Sollenberger    // Returns true if "count" entries can be read.
72551d08e2d50c7f73c5eb65fd366b92efba4f0ed5Derek Sollenberger    // If fewer than "count" entries can be read, return false. In this case,
73551d08e2d50c7f73c5eb65fd366b92efba4f0ed5Derek Sollenberger    // the output vector *x will still have those entries that were read. Call
7404fc583c3dd3144bc6b718fcac4b3e1afdfdb067John Reck    // x->size() to obtain the number of entries read.
7504fc583c3dd3144bc6b718fcac4b3e1afdfdb067John Reck    // The optional parameter chunkSize specifies how many entries should be
76d2dfd8f128b632ed99418ab2b32949c939a9a369Chris Craik    // read from the data source at one time into a temporary buffer. Increasing
773e9999bd866fac71c72e6b484a9836c87c328a08sergeyv    // chunkSize can improve the performance at the cost of extra memory usage.
783e9999bd866fac71c72e6b484a9836c87c328a08sergeyv    // The default value for chunkSize is set to read at least 4k bytes at a
793e9999bd866fac71c72e6b484a9836c87c328a08sergeyv    // time, depending on sizeof(T).
803e9999bd866fac71c72e6b484a9836c87c328a08sergeyv    template <typename T>
8104fc583c3dd3144bc6b718fcac4b3e1afdfdb067John Reck    bool getVector(off64_t offset, Vector<T>* x, size_t count,
8204fc583c3dd3144bc6b718fcac4b3e1afdfdb067John Reck                   size_t chunkSize = (4095 / sizeof(T)) + 1);
8304fc583c3dd3144bc6b718fcac4b3e1afdfdb067John Reck
8425fbb3fa1138675379102a44405852555cefccbdJohn Reck    // May return ERROR_UNSUPPORTED.
8545ec62ba72c5017fae7d8baab20bfb0d4c99c627Greg Daniel    virtual status_t getSize(off64_t *size);
8645ec62ba72c5017fae7d8baab20bfb0d4c99c627Greg Daniel
8745ec62ba72c5017fae7d8baab20bfb0d4c99c627Greg Daniel    virtual uint32_t flags() {
8845ec62ba72c5017fae7d8baab20bfb0d4c99c627Greg Daniel        return 0;
8945ec62ba72c5017fae7d8baab20bfb0d4c99c627Greg Daniel    }
9045ec62ba72c5017fae7d8baab20bfb0d4c99c627Greg Daniel
9145ec62ba72c5017fae7d8baab20bfb0d4c99c627Greg Daniel    virtual String8 toString() {
9245ec62ba72c5017fae7d8baab20bfb0d4c99c627Greg Daniel        return String8("<unspecified>");
9345ec62ba72c5017fae7d8baab20bfb0d4c99c627Greg Daniel    }
9400eb43dbc04083eab85fbb1a9589e2548f2004edsergeyv
9500eb43dbc04083eab85fbb1a9589e2548f2004edsergeyv    virtual status_t reconnectAtOffset(off64_t /*offset*/) {
9600eb43dbc04083eab85fbb1a9589e2548f2004edsergeyv        return ERROR_UNSUPPORTED;
9745ec62ba72c5017fae7d8baab20bfb0d4c99c627Greg Daniel    }
9845ec62ba72c5017fae7d8baab20bfb0d4c99c627Greg Daniel
9945ec62ba72c5017fae7d8baab20bfb0d4c99c627Greg Daniel    ////////////////////////////////////////////////////////////////////////////
10045ec62ba72c5017fae7d8baab20bfb0d4c99c627Greg Daniel
10145ec62ba72c5017fae7d8baab20bfb0d4c99c627Greg Daniel    // for DRM
10245ec62ba72c5017fae7d8baab20bfb0d4c99c627Greg Daniel    virtual sp<DecryptHandle> DrmInitialization(const char * /*mime*/ = NULL) {
10309df887c9078a34f2bda32c83734b7f75c0a60ffChris Craik        return NULL;
10409df887c9078a34f2bda32c83734b7f75c0a60ffChris Craik    }
10504fc583c3dd3144bc6b718fcac4b3e1afdfdb067John Reck
10604fc583c3dd3144bc6b718fcac4b3e1afdfdb067John Reck    virtual String8 getUri() {
10704fc583c3dd3144bc6b718fcac4b3e1afdfdb067John Reck        return String8();
108d41c4d8c732095ae99c955b6b82f7306633004b1Chris Craik    }
10904fc583c3dd3144bc6b718fcac4b3e1afdfdb067John Reck
11004fc583c3dd3144bc6b718fcac4b3e1afdfdb067John Reck    virtual String8 getMIMEType() const;
11104fc583c3dd3144bc6b718fcac4b3e1afdfdb067John Reck
11204fc583c3dd3144bc6b718fcac4b3e1afdfdb067John Reck    virtual void close() {};
11304fc583c3dd3144bc6b718fcac4b3e1afdfdb067John Reck
1148cd3edfa15cc9cdbffa935d19ab894426b08d174Greg Danielprotected:
1151bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck    virtual ~DataSource() {}
1161bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck
11704fc583c3dd3144bc6b718fcac4b3e1afdfdb067John Reckprivate:
11804fc583c3dd3144bc6b718fcac4b3e1afdfdb067John Reck    DataSource(const DataSource &);
11904fc583c3dd3144bc6b718fcac4b3e1afdfdb067John Reck    DataSource &operator=(const DataSource &);
12004fc583c3dd3144bc6b718fcac4b3e1afdfdb067John Reck};
12104fc583c3dd3144bc6b718fcac4b3e1afdfdb067John Reck
12204fc583c3dd3144bc6b718fcac4b3e1afdfdb067John Recktemplate <typename T>
12304fc583c3dd3144bc6b718fcac4b3e1afdfdb067John Reckbool DataSource::getVector(off64_t offset, Vector<T>* x, size_t count,
12404fc583c3dd3144bc6b718fcac4b3e1afdfdb067John Reck                           size_t chunkSize)
12504fc583c3dd3144bc6b718fcac4b3e1afdfdb067John Reck{
12604fc583c3dd3144bc6b718fcac4b3e1afdfdb067John Reck    x->clear();
12704fc583c3dd3144bc6b718fcac4b3e1afdfdb067John Reck    if (chunkSize == 0) {
12804fc583c3dd3144bc6b718fcac4b3e1afdfdb067John Reck        return false;
12904fc583c3dd3144bc6b718fcac4b3e1afdfdb067John Reck    }
13004fc583c3dd3144bc6b718fcac4b3e1afdfdb067John Reck    if (count == 0) {
13104fc583c3dd3144bc6b718fcac4b3e1afdfdb067John Reck        return true;
1329757ac0b9d62f6aea5e47cfb375f445c78bb7897Chris Craik    }
1339757ac0b9d62f6aea5e47cfb375f445c78bb7897Chris Craik
1349757ac0b9d62f6aea5e47cfb375f445c78bb7897Chris Craik    T tmp[chunkSize];
135d41c4d8c732095ae99c955b6b82f7306633004b1Chris Craik    ssize_t numBytesRead;
1369757ac0b9d62f6aea5e47cfb375f445c78bb7897Chris Craik    size_t numBytesPerChunk = chunkSize * sizeof(T);
1371bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck    size_t i;
1381bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck
1399757ac0b9d62f6aea5e47cfb375f445c78bb7897Chris Craik    for (i = 0; i + chunkSize < count; i += chunkSize) {
1409757ac0b9d62f6aea5e47cfb375f445c78bb7897Chris Craik        // This loops is executed when more than chunkSize records need to be
1411bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck        // read.
14204fc583c3dd3144bc6b718fcac4b3e1afdfdb067John Reck        numBytesRead = this->readAt(offset, (void*)&tmp, numBytesPerChunk);
14304fc583c3dd3144bc6b718fcac4b3e1afdfdb067John Reck        if (numBytesRead == -1) { // If readAt() returns -1, there is an error.
14404fc583c3dd3144bc6b718fcac4b3e1afdfdb067John Reck            return false;
1451bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck        }
14604fc583c3dd3144bc6b718fcac4b3e1afdfdb067John Reck        if (static_cast<size_t>(numBytesRead) < numBytesPerChunk) {
14704fc583c3dd3144bc6b718fcac4b3e1afdfdb067John Reck            // This case is triggered when the stream ends before the whole
148551d08e2d50c7f73c5eb65fd366b92efba4f0ed5Derek Sollenberger            // chunk is read.
14956ad6ec42f814e9e61030ff819cac4e5d31def8bDerek Sollenberger            x->appendArray(tmp, (size_t)numBytesRead / sizeof(T));
15056ad6ec42f814e9e61030ff819cac4e5d31def8bDerek Sollenberger            return false;
15156ad6ec42f814e9e61030ff819cac4e5d31def8bDerek Sollenberger        }
15245ec62ba72c5017fae7d8baab20bfb0d4c99c627Greg Daniel        x->appendArray(tmp, chunkSize);
15345ec62ba72c5017fae7d8baab20bfb0d4c99c627Greg Daniel        offset += numBytesPerChunk;
1541bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck    }
1551bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck
15645ec62ba72c5017fae7d8baab20bfb0d4c99c627Greg Daniel    // There are (count - i) more records to read.
15745ec62ba72c5017fae7d8baab20bfb0d4c99c627Greg Daniel    // Right now, (count - i) <= chunkSize.
158551d08e2d50c7f73c5eb65fd366b92efba4f0ed5Derek Sollenberger    // We do the same thing as above, but with chunkSize replaced by count - i.
15945ec62ba72c5017fae7d8baab20bfb0d4c99c627Greg Daniel    numBytesRead = this->readAt(offset, (void*)&tmp, (count - i) * sizeof(T));
16045ec62ba72c5017fae7d8baab20bfb0d4c99c627Greg Daniel    if (numBytesRead == -1) {
16145ec62ba72c5017fae7d8baab20bfb0d4c99c627Greg Daniel        return false;
16245ec62ba72c5017fae7d8baab20bfb0d4c99c627Greg Daniel    }
16345ec62ba72c5017fae7d8baab20bfb0d4c99c627Greg Daniel    x->appendArray(tmp, (size_t)numBytesRead / sizeof(T));
164551d08e2d50c7f73c5eb65fd366b92efba4f0ed5Derek Sollenberger    return x->size() == count;
165551d08e2d50c7f73c5eb65fd366b92efba4f0ed5Derek Sollenberger}
16645ec62ba72c5017fae7d8baab20bfb0d4c99c627Greg Daniel
16745ec62ba72c5017fae7d8baab20bfb0d4c99c627Greg Daniel}  // namespace android
16845ec62ba72c5017fae7d8baab20bfb0d4c99c627Greg Daniel
16945ec62ba72c5017fae7d8baab20bfb0d4c99c627Greg Daniel#endif  // DATA_SOURCE_H_
170551d08e2d50c7f73c5eb65fd366b92efba4f0ed5Derek Sollenberger