120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber/*
220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber * Copyright (C) 2009 The Android Open Source Project
320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber *
420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber * Licensed under the Apache License, Version 2.0 (the "License");
520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber * you may not use this file except in compliance with the License.
620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber * You may obtain a copy of the License at
720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber *
820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber *      http://www.apache.org/licenses/LICENSE-2.0
920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber *
1020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber * Unless required by applicable law or agreed to in writing, software
1120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber * distributed under the License is distributed on an "AS IS" BASIS,
1220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber * See the License for the specific language governing permissions and
1420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber * limitations under the License.
1520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber */
163de157dd8f9cd45bf9b0406268f5830887105ae1Chong Zhang//#define LOG_NDEBUG 0
173de157dd8f9cd45bf9b0406268f5830887105ae1Chong Zhang#define LOG_TAG "DataSource"
1820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
1966326a5ee0869f1ee4d136a477e6effba428b3cbAndreas Huber#include "include/AMRExtractor.h"
206c83e3be2921009ff7dcfced2a3eda7811b8b041Narayan Kamath
2156997121c5031598fbbba7b7c53980b7fd529c2dMarco Nelissen#include "include/AACExtractor.h"
2299f31604136d66ae10e20669fb6b5716f342bde0Chris Watkins#include "include/CallbackDataSource.h"
2356997121c5031598fbbba7b7c53980b7fd529c2dMarco Nelissen#include "include/DRMExtractor.h"
2456997121c5031598fbbba7b7c53980b7fd529c2dMarco Nelissen#include "include/FLACExtractor.h"
2556997121c5031598fbbba7b7c53980b7fd529c2dMarco Nelissen#include "include/HTTPBase.h"
26faf4efc6a41e88adf85f76f48f020a6d681f5ff1Marco Nelissen#include "include/MidiExtractor.h"
2766326a5ee0869f1ee4d136a477e6effba428b3cbAndreas Huber#include "include/MP3Extractor.h"
282944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber#include "include/MPEG2PSExtractor.h"
29cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber#include "include/MPEG2TSExtractor.h"
3056997121c5031598fbbba7b7c53980b7fd529c2dMarco Nelissen#include "include/MPEG4Extractor.h"
310a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber#include "include/NuCachedSource2.h"
3256997121c5031598fbbba7b7c53980b7fd529c2dMarco Nelissen#include "include/OggExtractor.h"
3356997121c5031598fbbba7b7c53980b7fd529c2dMarco Nelissen#include "include/WAVExtractor.h"
349d2f386dd2885eaffa11fd494ae258bb09fe6397James Dong#include "include/WVMExtractor.h"
3566326a5ee0869f1ee4d136a477e6effba428b3cbAndreas Huber
36093437c388e5dff6903a3d43f2ca9f8a1ba4744aAndreas Huber#include "matroska/MatroskaExtractor.h"
37093437c388e5dff6903a3d43f2ca9f8a1ba4744aAndreas Huber
381b86fe063badb5f28c467ade39be0f4008688947Andreas Huber#include <media/IMediaHTTPConnection.h>
391b86fe063badb5f28c467ade39be0f4008688947Andreas Huber#include <media/IMediaHTTPService.h>
403de157dd8f9cd45bf9b0406268f5830887105ae1Chong Zhang#include <media/stagefright/foundation/ADebug.h>
415a1c3529e4fa2f8a11054181294e0ce79fff8dd3Andreas Huber#include <media/stagefright/foundation/AMessage.h>
4220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#include <media/stagefright/DataSource.h>
434bbfff2dbf3968c267c3b2ea9f8912a38372a9daAndreas Huber#include <media/stagefright/DataURISource.h>
44fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huber#include <media/stagefright/FileSource.h>
4520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#include <media/stagefright/MediaErrors.h>
461b86fe063badb5f28c467ade39be0f4008688947Andreas Huber#include <media/stagefright/MediaHTTP.h>
4720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#include <utils/String8.h>
4820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
49a89082944308805b0def7de87c67e370e74b8789Gloria Wang#include <cutils/properties.h>
50a89082944308805b0def7de87c67e370e74b8789Gloria Wang
513001a8a6ed6cdd8cbf6e1ef85c5f47b4825f46dbMarco Nelissen#include <private/android_filesystem_config.h>
523001a8a6ed6cdd8cbf6e1ef85c5f47b4825f46dbMarco Nelissen
5320111aa043c5f404472bc63b90bc5aad906b1101Andreas Hubernamespace android {
5420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
55c7fc37a3dab9bd1f96713649f351b5990e6316ffJames Dongbool DataSource::getUInt16(off64_t offset, uint16_t *x) {
56693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber    *x = 0;
57693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber
58693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber    uint8_t byte[2];
5934769bc913e9f6bb138e666d94a9d685bf3da217Andreas Huber    if (readAt(offset, byte, 2) != 2) {
60693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber        return false;
61693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber    }
62693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber
63693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber    *x = (byte[0] << 8) | byte[1];
64693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber
65693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber    return true;
66693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber}
67693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber
68ec77122351b4e78c1fe5b60a208f76baf8c67591Marco Nelissenbool DataSource::getUInt24(off64_t offset, uint32_t *x) {
69ec77122351b4e78c1fe5b60a208f76baf8c67591Marco Nelissen    *x = 0;
70ec77122351b4e78c1fe5b60a208f76baf8c67591Marco Nelissen
71ec77122351b4e78c1fe5b60a208f76baf8c67591Marco Nelissen    uint8_t byte[3];
72ec77122351b4e78c1fe5b60a208f76baf8c67591Marco Nelissen    if (readAt(offset, byte, 3) != 3) {
73ec77122351b4e78c1fe5b60a208f76baf8c67591Marco Nelissen        return false;
74ec77122351b4e78c1fe5b60a208f76baf8c67591Marco Nelissen    }
75ec77122351b4e78c1fe5b60a208f76baf8c67591Marco Nelissen
76ec77122351b4e78c1fe5b60a208f76baf8c67591Marco Nelissen    *x = (byte[0] << 16) | (byte[1] << 8) | byte[2];
77ec77122351b4e78c1fe5b60a208f76baf8c67591Marco Nelissen
78ec77122351b4e78c1fe5b60a208f76baf8c67591Marco Nelissen    return true;
79ec77122351b4e78c1fe5b60a208f76baf8c67591Marco Nelissen}
80ec77122351b4e78c1fe5b60a208f76baf8c67591Marco Nelissen
8105f625c46b992ab66b8d1527a366fe2746b4e3c7Marco Nelissenbool DataSource::getUInt32(off64_t offset, uint32_t *x) {
8205f625c46b992ab66b8d1527a366fe2746b4e3c7Marco Nelissen    *x = 0;
8305f625c46b992ab66b8d1527a366fe2746b4e3c7Marco Nelissen
8405f625c46b992ab66b8d1527a366fe2746b4e3c7Marco Nelissen    uint32_t tmp;
8505f625c46b992ab66b8d1527a366fe2746b4e3c7Marco Nelissen    if (readAt(offset, &tmp, 4) != 4) {
8605f625c46b992ab66b8d1527a366fe2746b4e3c7Marco Nelissen        return false;
8705f625c46b992ab66b8d1527a366fe2746b4e3c7Marco Nelissen    }
8805f625c46b992ab66b8d1527a366fe2746b4e3c7Marco Nelissen
8905f625c46b992ab66b8d1527a366fe2746b4e3c7Marco Nelissen    *x = ntohl(tmp);
9005f625c46b992ab66b8d1527a366fe2746b4e3c7Marco Nelissen
9105f625c46b992ab66b8d1527a366fe2746b4e3c7Marco Nelissen    return true;
9205f625c46b992ab66b8d1527a366fe2746b4e3c7Marco Nelissen}
9305f625c46b992ab66b8d1527a366fe2746b4e3c7Marco Nelissen
9405f625c46b992ab66b8d1527a366fe2746b4e3c7Marco Nelissenbool DataSource::getUInt64(off64_t offset, uint64_t *x) {
9505f625c46b992ab66b8d1527a366fe2746b4e3c7Marco Nelissen    *x = 0;
9605f625c46b992ab66b8d1527a366fe2746b4e3c7Marco Nelissen
9705f625c46b992ab66b8d1527a366fe2746b4e3c7Marco Nelissen    uint64_t tmp;
9805f625c46b992ab66b8d1527a366fe2746b4e3c7Marco Nelissen    if (readAt(offset, &tmp, 8) != 8) {
9905f625c46b992ab66b8d1527a366fe2746b4e3c7Marco Nelissen        return false;
10005f625c46b992ab66b8d1527a366fe2746b4e3c7Marco Nelissen    }
10105f625c46b992ab66b8d1527a366fe2746b4e3c7Marco Nelissen
10205f625c46b992ab66b8d1527a366fe2746b4e3c7Marco Nelissen    *x = ntoh64(tmp);
10305f625c46b992ab66b8d1527a366fe2746b4e3c7Marco Nelissen
10405f625c46b992ab66b8d1527a366fe2746b4e3c7Marco Nelissen    return true;
10505f625c46b992ab66b8d1527a366fe2746b4e3c7Marco Nelissen}
10605f625c46b992ab66b8d1527a366fe2746b4e3c7Marco Nelissen
107c7fc37a3dab9bd1f96713649f351b5990e6316ffJames Dongstatus_t DataSource::getSize(off64_t *size) {
10820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    *size = 0;
10920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
11020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    return ERROR_UNSUPPORTED;
11120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber}
11220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
11320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber////////////////////////////////////////////////////////////////////////////////
11420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
11520111aa043c5f404472bc63b90bc5aad906b1101Andreas HuberMutex DataSource::gSnifferMutex;
11620111aa043c5f404472bc63b90bc5aad906b1101Andreas HuberList<DataSource::SnifferFunc> DataSource::gSniffers;
117377fce69297a0e5b7c3b266a7602b17146785635Marco Nelissenbool DataSource::gSniffersRegistered = false;
11820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
1195a1c3529e4fa2f8a11054181294e0ce79fff8dd3Andreas Huberbool DataSource::sniff(
1205a1c3529e4fa2f8a11054181294e0ce79fff8dd3Andreas Huber        String8 *mimeType, float *confidence, sp<AMessage> *meta) {
12120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    *mimeType = "";
12220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    *confidence = 0.0f;
1235a1c3529e4fa2f8a11054181294e0ce79fff8dd3Andreas Huber    meta->clear();
12420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
125377fce69297a0e5b7c3b266a7602b17146785635Marco Nelissen    {
126377fce69297a0e5b7c3b266a7602b17146785635Marco Nelissen        Mutex::Autolock autoLock(gSnifferMutex);
127377fce69297a0e5b7c3b266a7602b17146785635Marco Nelissen        if (!gSniffersRegistered) {
128377fce69297a0e5b7c3b266a7602b17146785635Marco Nelissen            return false;
129377fce69297a0e5b7c3b266a7602b17146785635Marco Nelissen        }
130377fce69297a0e5b7c3b266a7602b17146785635Marco Nelissen    }
131377fce69297a0e5b7c3b266a7602b17146785635Marco Nelissen
13220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    for (List<SnifferFunc>::iterator it = gSniffers.begin();
13320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber         it != gSniffers.end(); ++it) {
13420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        String8 newMimeType;
13520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        float newConfidence;
1365a1c3529e4fa2f8a11054181294e0ce79fff8dd3Andreas Huber        sp<AMessage> newMeta;
1375a1c3529e4fa2f8a11054181294e0ce79fff8dd3Andreas Huber        if ((*it)(this, &newMimeType, &newConfidence, &newMeta)) {
13820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            if (newConfidence > *confidence) {
13920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber                *mimeType = newMimeType;
14020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber                *confidence = newConfidence;
1415a1c3529e4fa2f8a11054181294e0ce79fff8dd3Andreas Huber                *meta = newMeta;
14220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            }
14320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        }
14420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    }
14520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
14620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    return *confidence > 0.0;
14720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber}
14820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
14920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber// static
150377fce69297a0e5b7c3b266a7602b17146785635Marco Nelissenvoid DataSource::RegisterSniffer_l(SnifferFunc func) {
15120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    for (List<SnifferFunc>::iterator it = gSniffers.begin();
15220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber         it != gSniffers.end(); ++it) {
15320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        if (*it == func) {
15420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            return;
15520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        }
15620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    }
15720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
15820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    gSniffers.push_back(func);
15920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber}
16020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
16120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber// static
16220111aa043c5f404472bc63b90bc5aad906b1101Andreas Hubervoid DataSource::RegisterDefaultSniffers() {
163377fce69297a0e5b7c3b266a7602b17146785635Marco Nelissen    Mutex::Autolock autoLock(gSnifferMutex);
164377fce69297a0e5b7c3b266a7602b17146785635Marco Nelissen    if (gSniffersRegistered) {
165377fce69297a0e5b7c3b266a7602b17146785635Marco Nelissen        return;
166377fce69297a0e5b7c3b266a7602b17146785635Marco Nelissen    }
167377fce69297a0e5b7c3b266a7602b17146785635Marco Nelissen
168377fce69297a0e5b7c3b266a7602b17146785635Marco Nelissen    RegisterSniffer_l(SniffMPEG4);
169377fce69297a0e5b7c3b266a7602b17146785635Marco Nelissen    RegisterSniffer_l(SniffMatroska);
170377fce69297a0e5b7c3b266a7602b17146785635Marco Nelissen    RegisterSniffer_l(SniffOgg);
171377fce69297a0e5b7c3b266a7602b17146785635Marco Nelissen    RegisterSniffer_l(SniffWAV);
172377fce69297a0e5b7c3b266a7602b17146785635Marco Nelissen    RegisterSniffer_l(SniffFLAC);
173377fce69297a0e5b7c3b266a7602b17146785635Marco Nelissen    RegisterSniffer_l(SniffAMR);
174377fce69297a0e5b7c3b266a7602b17146785635Marco Nelissen    RegisterSniffer_l(SniffMPEG2TS);
175377fce69297a0e5b7c3b266a7602b17146785635Marco Nelissen    RegisterSniffer_l(SniffMP3);
176377fce69297a0e5b7c3b266a7602b17146785635Marco Nelissen    RegisterSniffer_l(SniffAAC);
177377fce69297a0e5b7c3b266a7602b17146785635Marco Nelissen    RegisterSniffer_l(SniffMPEG2PS);
1783001a8a6ed6cdd8cbf6e1ef85c5f47b4825f46dbMarco Nelissen    if (getuid() == AID_MEDIA) {
1793001a8a6ed6cdd8cbf6e1ef85c5f47b4825f46dbMarco Nelissen        // WVM only in the media server process
1803001a8a6ed6cdd8cbf6e1ef85c5f47b4825f46dbMarco Nelissen        RegisterSniffer_l(SniffWVM);
1813001a8a6ed6cdd8cbf6e1ef85c5f47b4825f46dbMarco Nelissen    }
182faf4efc6a41e88adf85f76f48f020a6d681f5ff1Marco Nelissen    RegisterSniffer_l(SniffMidi);
183a89082944308805b0def7de87c67e370e74b8789Gloria Wang
184a89082944308805b0def7de87c67e370e74b8789Gloria Wang    char value[PROPERTY_VALUE_MAX];
185a89082944308805b0def7de87c67e370e74b8789Gloria Wang    if (property_get("drm.service.enabled", value, NULL)
186a89082944308805b0def7de87c67e370e74b8789Gloria Wang            && (!strcmp(value, "1") || !strcasecmp(value, "true"))) {
187377fce69297a0e5b7c3b266a7602b17146785635Marco Nelissen        RegisterSniffer_l(SniffDRM);
188a89082944308805b0def7de87c67e370e74b8789Gloria Wang    }
189377fce69297a0e5b7c3b266a7602b17146785635Marco Nelissen    gSniffersRegistered = true;
19020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber}
19120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
192fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huber// static
1935561ccf4a8db88a2e44eac1b3ed13b4ff53a7f20Andreas Hubersp<DataSource> DataSource::CreateFromURI(
1941b86fe063badb5f28c467ade39be0f4008688947Andreas Huber        const sp<IMediaHTTPService> &httpService,
1951b86fe063badb5f28c467ade39be0f4008688947Andreas Huber        const char *uri,
1963de157dd8f9cd45bf9b0406268f5830887105ae1Chong Zhang        const KeyedVector<String8, String8> *headers,
197360d6d0924f99b82ebacb5cfb6f7bca95e11b4eeRobert Shih        String8 *contentType,
198360d6d0924f99b82ebacb5cfb6f7bca95e11b4eeRobert Shih        HTTPBase *httpSource) {
199d354d8d1b09503c0166c1f3e626cda72a3eeb83cChong Zhang    if (contentType != NULL) {
200d354d8d1b09503c0166c1f3e626cda72a3eeb83cChong Zhang        *contentType = "";
2013de157dd8f9cd45bf9b0406268f5830887105ae1Chong Zhang    }
2023de157dd8f9cd45bf9b0406268f5830887105ae1Chong Zhang
2031608735ef488ecd8c3c012a3b0d4b1d4ef3d93c7Andreas Huber    bool isWidevine = !strncasecmp("widevine://", uri, 11);
2041608735ef488ecd8c3c012a3b0d4b1d4ef3d93c7Andreas Huber
205fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huber    sp<DataSource> source;
206fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huber    if (!strncasecmp("file://", uri, 7)) {
207fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huber        source = new FileSource(uri + 7);
2088cb0c4168bf4b678e4a6edfcf409247016be20d5Andreas Huber    } else if (!strncasecmp("http://", uri, 7)
2091608735ef488ecd8c3c012a3b0d4b1d4ef3d93c7Andreas Huber            || !strncasecmp("https://", uri, 8)
2101608735ef488ecd8c3c012a3b0d4b1d4ef3d93c7Andreas Huber            || isWidevine) {
211217bde880be6f4d937caf9555ea98942883ebda0Chong Zhang        if (httpService == NULL) {
212217bde880be6f4d937caf9555ea98942883ebda0Chong Zhang            ALOGE("Invalid http service!");
213217bde880be6f4d937caf9555ea98942883ebda0Chong Zhang            return NULL;
214217bde880be6f4d937caf9555ea98942883ebda0Chong Zhang        }
215217bde880be6f4d937caf9555ea98942883ebda0Chong Zhang
216360d6d0924f99b82ebacb5cfb6f7bca95e11b4eeRobert Shih        if (httpSource == NULL) {
217360d6d0924f99b82ebacb5cfb6f7bca95e11b4eeRobert Shih            sp<IMediaHTTPConnection> conn = httpService->makeHTTPConnection();
218360d6d0924f99b82ebacb5cfb6f7bca95e11b4eeRobert Shih            if (conn == NULL) {
219360d6d0924f99b82ebacb5cfb6f7bca95e11b4eeRobert Shih                ALOGE("Failed to make http connection from http service!");
220360d6d0924f99b82ebacb5cfb6f7bca95e11b4eeRobert Shih                return NULL;
221360d6d0924f99b82ebacb5cfb6f7bca95e11b4eeRobert Shih            }
222360d6d0924f99b82ebacb5cfb6f7bca95e11b4eeRobert Shih            httpSource = new MediaHTTP(conn);
223217bde880be6f4d937caf9555ea98942883ebda0Chong Zhang        }
224217bde880be6f4d937caf9555ea98942883ebda0Chong Zhang
2251608735ef488ecd8c3c012a3b0d4b1d4ef3d93c7Andreas Huber        String8 tmp;
2261608735ef488ecd8c3c012a3b0d4b1d4ef3d93c7Andreas Huber        if (isWidevine) {
2271608735ef488ecd8c3c012a3b0d4b1d4ef3d93c7Andreas Huber            tmp = String8("http://");
2281608735ef488ecd8c3c012a3b0d4b1d4ef3d93c7Andreas Huber            tmp.append(uri + 11);
2291608735ef488ecd8c3c012a3b0d4b1d4ef3d93c7Andreas Huber
2301608735ef488ecd8c3c012a3b0d4b1d4ef3d93c7Andreas Huber            uri = tmp.string();
2311608735ef488ecd8c3c012a3b0d4b1d4ef3d93c7Andreas Huber        }
2321608735ef488ecd8c3c012a3b0d4b1d4ef3d93c7Andreas Huber
2337b3cd1f33dcfc0b6034144cf48c0919cf7ca6046Chong Zhang        String8 cacheConfig;
2347b3cd1f33dcfc0b6034144cf48c0919cf7ca6046Chong Zhang        bool disconnectAtHighwatermark;
2357b3cd1f33dcfc0b6034144cf48c0919cf7ca6046Chong Zhang        KeyedVector<String8, String8> nonCacheSpecificHeaders;
2367b3cd1f33dcfc0b6034144cf48c0919cf7ca6046Chong Zhang        if (headers != NULL) {
2377b3cd1f33dcfc0b6034144cf48c0919cf7ca6046Chong Zhang            nonCacheSpecificHeaders = *headers;
2387b3cd1f33dcfc0b6034144cf48c0919cf7ca6046Chong Zhang            NuCachedSource2::RemoveCacheSpecificHeaders(
2397b3cd1f33dcfc0b6034144cf48c0919cf7ca6046Chong Zhang                    &nonCacheSpecificHeaders,
2407b3cd1f33dcfc0b6034144cf48c0919cf7ca6046Chong Zhang                    &cacheConfig,
2417b3cd1f33dcfc0b6034144cf48c0919cf7ca6046Chong Zhang                    &disconnectAtHighwatermark);
2427b3cd1f33dcfc0b6034144cf48c0919cf7ca6046Chong Zhang        }
2437b3cd1f33dcfc0b6034144cf48c0919cf7ca6046Chong Zhang
2447b3cd1f33dcfc0b6034144cf48c0919cf7ca6046Chong Zhang        if (httpSource->connect(uri, &nonCacheSpecificHeaders) != OK) {
2453de157dd8f9cd45bf9b0406268f5830887105ae1Chong Zhang            ALOGE("Failed to connect http source!");
246e94bd14078d327ef2f800e69907efce641a13272Andreas Huber            return NULL;
247e94bd14078d327ef2f800e69907efce641a13272Andreas Huber        }
248918c7652b9a38c02e26c0c46541cea82070c0e43Andreas Huber
2491608735ef488ecd8c3c012a3b0d4b1d4ef3d93c7Andreas Huber        if (!isWidevine) {
250d354d8d1b09503c0166c1f3e626cda72a3eeb83cChong Zhang            if (contentType != NULL) {
251d354d8d1b09503c0166c1f3e626cda72a3eeb83cChong Zhang                *contentType = httpSource->getMIMEType();
252d354d8d1b09503c0166c1f3e626cda72a3eeb83cChong Zhang            }
253918c7652b9a38c02e26c0c46541cea82070c0e43Andreas Huber
254316c3d929ffb004b0150d515e82aede02208ce97Wonsik Kim            source = NuCachedSource2::Create(
2551608735ef488ecd8c3c012a3b0d4b1d4ef3d93c7Andreas Huber                    httpSource,
2567b3cd1f33dcfc0b6034144cf48c0919cf7ca6046Chong Zhang                    cacheConfig.isEmpty() ? NULL : cacheConfig.string(),
2577b3cd1f33dcfc0b6034144cf48c0919cf7ca6046Chong Zhang                    disconnectAtHighwatermark);
2581608735ef488ecd8c3c012a3b0d4b1d4ef3d93c7Andreas Huber        } else {
2591608735ef488ecd8c3c012a3b0d4b1d4ef3d93c7Andreas Huber            // We do not want that prefetching, caching, datasource wrapper
2601608735ef488ecd8c3c012a3b0d4b1d4ef3d93c7Andreas Huber            // in the widevine:// case.
2611608735ef488ecd8c3c012a3b0d4b1d4ef3d93c7Andreas Huber            source = httpSource;
2621608735ef488ecd8c3c012a3b0d4b1d4ef3d93c7Andreas Huber        }
2634bbfff2dbf3968c267c3b2ea9f8912a38372a9daAndreas Huber    } else if (!strncasecmp("data:", uri, 5)) {
2644bbfff2dbf3968c267c3b2ea9f8912a38372a9daAndreas Huber        source = DataURISource::Create(uri);
265fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huber    } else {
266fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huber        // Assume it's a filename.
267fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huber        source = new FileSource(uri);
268fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huber    }
269fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huber
270fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huber    if (source == NULL || source->initCheck() != OK) {
271fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huber        return NULL;
272fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huber    }
273fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huber
274fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huber    return source;
275fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huber}
276fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huber
277360d6d0924f99b82ebacb5cfb6f7bca95e11b4eeRobert Shihsp<DataSource> DataSource::CreateMediaHTTP(const sp<IMediaHTTPService> &httpService) {
278360d6d0924f99b82ebacb5cfb6f7bca95e11b4eeRobert Shih    if (httpService == NULL) {
279360d6d0924f99b82ebacb5cfb6f7bca95e11b4eeRobert Shih        return NULL;
280360d6d0924f99b82ebacb5cfb6f7bca95e11b4eeRobert Shih    }
281360d6d0924f99b82ebacb5cfb6f7bca95e11b4eeRobert Shih
282360d6d0924f99b82ebacb5cfb6f7bca95e11b4eeRobert Shih    sp<IMediaHTTPConnection> conn = httpService->makeHTTPConnection();
283360d6d0924f99b82ebacb5cfb6f7bca95e11b4eeRobert Shih    if (conn == NULL) {
284360d6d0924f99b82ebacb5cfb6f7bca95e11b4eeRobert Shih        return NULL;
285360d6d0924f99b82ebacb5cfb6f7bca95e11b4eeRobert Shih    } else {
286360d6d0924f99b82ebacb5cfb6f7bca95e11b4eeRobert Shih        return new MediaHTTP(conn);
287360d6d0924f99b82ebacb5cfb6f7bca95e11b4eeRobert Shih    }
288360d6d0924f99b82ebacb5cfb6f7bca95e11b4eeRobert Shih}
289360d6d0924f99b82ebacb5cfb6f7bca95e11b4eeRobert Shih
29099f31604136d66ae10e20669fb6b5716f342bde0Chris Watkinssp<DataSource> DataSource::CreateFromIDataSource(const sp<IDataSource> &source) {
291da7e453e1d1c77959822cf9602ddfed1c50be445Chris Watkins    return new TinyCacheSource(new CallbackDataSource(source));
29299f31604136d66ae10e20669fb6b5716f342bde0Chris Watkins}
29399f31604136d66ae10e20669fb6b5716f342bde0Chris Watkins
2946511c9755c3a3360ba869772600c7aae048a7ffcAndreas HuberString8 DataSource::getMIMEType() const {
2956511c9755c3a3360ba869772600c7aae048a7ffcAndreas Huber    return String8("application/octet-stream");
2966511c9755c3a3360ba869772600c7aae048a7ffcAndreas Huber}
2976511c9755c3a3360ba869772600c7aae048a7ffcAndreas Huber
29820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber}  // namespace android
299