DataSource.cpp revision faf4efc6a41e88adf85f76f48f020a6d681f5ff1
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"
2256997121c5031598fbbba7b7c53980b7fd529c2dMarco Nelissen#include "include/DRMExtractor.h"
2356997121c5031598fbbba7b7c53980b7fd529c2dMarco Nelissen#include "include/FLACExtractor.h"
2456997121c5031598fbbba7b7c53980b7fd529c2dMarco Nelissen#include "include/HTTPBase.h"
25faf4efc6a41e88adf85f76f48f020a6d681f5ff1Marco Nelissen#include "include/MidiExtractor.h"
2666326a5ee0869f1ee4d136a477e6effba428b3cbAndreas Huber#include "include/MP3Extractor.h"
272944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber#include "include/MPEG2PSExtractor.h"
28cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber#include "include/MPEG2TSExtractor.h"
2956997121c5031598fbbba7b7c53980b7fd529c2dMarco Nelissen#include "include/MPEG4Extractor.h"
300a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber#include "include/NuCachedSource2.h"
3156997121c5031598fbbba7b7c53980b7fd529c2dMarco Nelissen#include "include/OggExtractor.h"
3256997121c5031598fbbba7b7c53980b7fd529c2dMarco Nelissen#include "include/WAVExtractor.h"
339d2f386dd2885eaffa11fd494ae258bb09fe6397James Dong#include "include/WVMExtractor.h"
3466326a5ee0869f1ee4d136a477e6effba428b3cbAndreas Huber
35093437c388e5dff6903a3d43f2ca9f8a1ba4744aAndreas Huber#include "matroska/MatroskaExtractor.h"
36093437c388e5dff6903a3d43f2ca9f8a1ba4744aAndreas Huber
371b86fe063badb5f28c467ade39be0f4008688947Andreas Huber#include <media/IMediaHTTPConnection.h>
381b86fe063badb5f28c467ade39be0f4008688947Andreas Huber#include <media/IMediaHTTPService.h>
393de157dd8f9cd45bf9b0406268f5830887105ae1Chong Zhang#include <media/stagefright/foundation/ADebug.h>
405a1c3529e4fa2f8a11054181294e0ce79fff8dd3Andreas Huber#include <media/stagefright/foundation/AMessage.h>
4120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#include <media/stagefright/DataSource.h>
424bbfff2dbf3968c267c3b2ea9f8912a38372a9daAndreas Huber#include <media/stagefright/DataURISource.h>
43fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huber#include <media/stagefright/FileSource.h>
4420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#include <media/stagefright/MediaErrors.h>
451b86fe063badb5f28c467ade39be0f4008688947Andreas Huber#include <media/stagefright/MediaHTTP.h>
4620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#include <utils/String8.h>
4720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
48a89082944308805b0def7de87c67e370e74b8789Gloria Wang#include <cutils/properties.h>
49a89082944308805b0def7de87c67e370e74b8789Gloria Wang
5020111aa043c5f404472bc63b90bc5aad906b1101Andreas Hubernamespace android {
5120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
52c7fc37a3dab9bd1f96713649f351b5990e6316ffJames Dongbool DataSource::getUInt16(off64_t offset, uint16_t *x) {
53693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber    *x = 0;
54693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber
55693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber    uint8_t byte[2];
5634769bc913e9f6bb138e666d94a9d685bf3da217Andreas Huber    if (readAt(offset, byte, 2) != 2) {
57693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber        return false;
58693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber    }
59693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber
60693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber    *x = (byte[0] << 8) | byte[1];
61693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber
62693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber    return true;
63693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber}
64693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber
65ec77122351b4e78c1fe5b60a208f76baf8c67591Marco Nelissenbool DataSource::getUInt24(off64_t offset, uint32_t *x) {
66ec77122351b4e78c1fe5b60a208f76baf8c67591Marco Nelissen    *x = 0;
67ec77122351b4e78c1fe5b60a208f76baf8c67591Marco Nelissen
68ec77122351b4e78c1fe5b60a208f76baf8c67591Marco Nelissen    uint8_t byte[3];
69ec77122351b4e78c1fe5b60a208f76baf8c67591Marco Nelissen    if (readAt(offset, byte, 3) != 3) {
70ec77122351b4e78c1fe5b60a208f76baf8c67591Marco Nelissen        return false;
71ec77122351b4e78c1fe5b60a208f76baf8c67591Marco Nelissen    }
72ec77122351b4e78c1fe5b60a208f76baf8c67591Marco Nelissen
73ec77122351b4e78c1fe5b60a208f76baf8c67591Marco Nelissen    *x = (byte[0] << 16) | (byte[1] << 8) | byte[2];
74ec77122351b4e78c1fe5b60a208f76baf8c67591Marco Nelissen
75ec77122351b4e78c1fe5b60a208f76baf8c67591Marco Nelissen    return true;
76ec77122351b4e78c1fe5b60a208f76baf8c67591Marco Nelissen}
77ec77122351b4e78c1fe5b60a208f76baf8c67591Marco Nelissen
7805f625c46b992ab66b8d1527a366fe2746b4e3c7Marco Nelissenbool DataSource::getUInt32(off64_t offset, uint32_t *x) {
7905f625c46b992ab66b8d1527a366fe2746b4e3c7Marco Nelissen    *x = 0;
8005f625c46b992ab66b8d1527a366fe2746b4e3c7Marco Nelissen
8105f625c46b992ab66b8d1527a366fe2746b4e3c7Marco Nelissen    uint32_t tmp;
8205f625c46b992ab66b8d1527a366fe2746b4e3c7Marco Nelissen    if (readAt(offset, &tmp, 4) != 4) {
8305f625c46b992ab66b8d1527a366fe2746b4e3c7Marco Nelissen        return false;
8405f625c46b992ab66b8d1527a366fe2746b4e3c7Marco Nelissen    }
8505f625c46b992ab66b8d1527a366fe2746b4e3c7Marco Nelissen
8605f625c46b992ab66b8d1527a366fe2746b4e3c7Marco Nelissen    *x = ntohl(tmp);
8705f625c46b992ab66b8d1527a366fe2746b4e3c7Marco Nelissen
8805f625c46b992ab66b8d1527a366fe2746b4e3c7Marco Nelissen    return true;
8905f625c46b992ab66b8d1527a366fe2746b4e3c7Marco Nelissen}
9005f625c46b992ab66b8d1527a366fe2746b4e3c7Marco Nelissen
9105f625c46b992ab66b8d1527a366fe2746b4e3c7Marco Nelissenbool DataSource::getUInt64(off64_t offset, uint64_t *x) {
9205f625c46b992ab66b8d1527a366fe2746b4e3c7Marco Nelissen    *x = 0;
9305f625c46b992ab66b8d1527a366fe2746b4e3c7Marco Nelissen
9405f625c46b992ab66b8d1527a366fe2746b4e3c7Marco Nelissen    uint64_t tmp;
9505f625c46b992ab66b8d1527a366fe2746b4e3c7Marco Nelissen    if (readAt(offset, &tmp, 8) != 8) {
9605f625c46b992ab66b8d1527a366fe2746b4e3c7Marco Nelissen        return false;
9705f625c46b992ab66b8d1527a366fe2746b4e3c7Marco Nelissen    }
9805f625c46b992ab66b8d1527a366fe2746b4e3c7Marco Nelissen
9905f625c46b992ab66b8d1527a366fe2746b4e3c7Marco Nelissen    *x = ntoh64(tmp);
10005f625c46b992ab66b8d1527a366fe2746b4e3c7Marco Nelissen
10105f625c46b992ab66b8d1527a366fe2746b4e3c7Marco Nelissen    return true;
10205f625c46b992ab66b8d1527a366fe2746b4e3c7Marco Nelissen}
10305f625c46b992ab66b8d1527a366fe2746b4e3c7Marco Nelissen
104c7fc37a3dab9bd1f96713649f351b5990e6316ffJames Dongstatus_t DataSource::getSize(off64_t *size) {
10520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    *size = 0;
10620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
10720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    return ERROR_UNSUPPORTED;
10820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber}
10920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
11020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber////////////////////////////////////////////////////////////////////////////////
11120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
11220111aa043c5f404472bc63b90bc5aad906b1101Andreas HuberMutex DataSource::gSnifferMutex;
11320111aa043c5f404472bc63b90bc5aad906b1101Andreas HuberList<DataSource::SnifferFunc> DataSource::gSniffers;
114377fce69297a0e5b7c3b266a7602b17146785635Marco Nelissenbool DataSource::gSniffersRegistered = false;
11520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
1165a1c3529e4fa2f8a11054181294e0ce79fff8dd3Andreas Huberbool DataSource::sniff(
1175a1c3529e4fa2f8a11054181294e0ce79fff8dd3Andreas Huber        String8 *mimeType, float *confidence, sp<AMessage> *meta) {
11820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    *mimeType = "";
11920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    *confidence = 0.0f;
1205a1c3529e4fa2f8a11054181294e0ce79fff8dd3Andreas Huber    meta->clear();
12120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
122377fce69297a0e5b7c3b266a7602b17146785635Marco Nelissen    {
123377fce69297a0e5b7c3b266a7602b17146785635Marco Nelissen        Mutex::Autolock autoLock(gSnifferMutex);
124377fce69297a0e5b7c3b266a7602b17146785635Marco Nelissen        if (!gSniffersRegistered) {
125377fce69297a0e5b7c3b266a7602b17146785635Marco Nelissen            return false;
126377fce69297a0e5b7c3b266a7602b17146785635Marco Nelissen        }
127377fce69297a0e5b7c3b266a7602b17146785635Marco Nelissen    }
128377fce69297a0e5b7c3b266a7602b17146785635Marco Nelissen
12920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    for (List<SnifferFunc>::iterator it = gSniffers.begin();
13020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber         it != gSniffers.end(); ++it) {
13120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        String8 newMimeType;
13220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        float newConfidence;
1335a1c3529e4fa2f8a11054181294e0ce79fff8dd3Andreas Huber        sp<AMessage> newMeta;
1345a1c3529e4fa2f8a11054181294e0ce79fff8dd3Andreas Huber        if ((*it)(this, &newMimeType, &newConfidence, &newMeta)) {
13520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            if (newConfidence > *confidence) {
13620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber                *mimeType = newMimeType;
13720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber                *confidence = newConfidence;
1385a1c3529e4fa2f8a11054181294e0ce79fff8dd3Andreas Huber                *meta = newMeta;
13920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            }
14020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        }
14120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    }
14220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
14320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    return *confidence > 0.0;
14420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber}
14520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
14620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber// static
147377fce69297a0e5b7c3b266a7602b17146785635Marco Nelissenvoid DataSource::RegisterSniffer_l(SnifferFunc func) {
14820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    for (List<SnifferFunc>::iterator it = gSniffers.begin();
14920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber         it != gSniffers.end(); ++it) {
15020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        if (*it == func) {
15120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            return;
15220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        }
15320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    }
15420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
15520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    gSniffers.push_back(func);
15620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber}
15720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
15820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber// static
15920111aa043c5f404472bc63b90bc5aad906b1101Andreas Hubervoid DataSource::RegisterDefaultSniffers() {
160377fce69297a0e5b7c3b266a7602b17146785635Marco Nelissen    Mutex::Autolock autoLock(gSnifferMutex);
161377fce69297a0e5b7c3b266a7602b17146785635Marco Nelissen    if (gSniffersRegistered) {
162377fce69297a0e5b7c3b266a7602b17146785635Marco Nelissen        return;
163377fce69297a0e5b7c3b266a7602b17146785635Marco Nelissen    }
164377fce69297a0e5b7c3b266a7602b17146785635Marco Nelissen
165377fce69297a0e5b7c3b266a7602b17146785635Marco Nelissen    RegisterSniffer_l(SniffMPEG4);
166377fce69297a0e5b7c3b266a7602b17146785635Marco Nelissen    RegisterSniffer_l(SniffMatroska);
167377fce69297a0e5b7c3b266a7602b17146785635Marco Nelissen    RegisterSniffer_l(SniffOgg);
168377fce69297a0e5b7c3b266a7602b17146785635Marco Nelissen    RegisterSniffer_l(SniffWAV);
169377fce69297a0e5b7c3b266a7602b17146785635Marco Nelissen    RegisterSniffer_l(SniffFLAC);
170377fce69297a0e5b7c3b266a7602b17146785635Marco Nelissen    RegisterSniffer_l(SniffAMR);
171377fce69297a0e5b7c3b266a7602b17146785635Marco Nelissen    RegisterSniffer_l(SniffMPEG2TS);
172377fce69297a0e5b7c3b266a7602b17146785635Marco Nelissen    RegisterSniffer_l(SniffMP3);
173377fce69297a0e5b7c3b266a7602b17146785635Marco Nelissen    RegisterSniffer_l(SniffAAC);
174377fce69297a0e5b7c3b266a7602b17146785635Marco Nelissen    RegisterSniffer_l(SniffMPEG2PS);
175377fce69297a0e5b7c3b266a7602b17146785635Marco Nelissen    RegisterSniffer_l(SniffWVM);
176faf4efc6a41e88adf85f76f48f020a6d681f5ff1Marco Nelissen    RegisterSniffer_l(SniffMidi);
177a89082944308805b0def7de87c67e370e74b8789Gloria Wang
178a89082944308805b0def7de87c67e370e74b8789Gloria Wang    char value[PROPERTY_VALUE_MAX];
179a89082944308805b0def7de87c67e370e74b8789Gloria Wang    if (property_get("drm.service.enabled", value, NULL)
180a89082944308805b0def7de87c67e370e74b8789Gloria Wang            && (!strcmp(value, "1") || !strcasecmp(value, "true"))) {
181377fce69297a0e5b7c3b266a7602b17146785635Marco Nelissen        RegisterSniffer_l(SniffDRM);
182a89082944308805b0def7de87c67e370e74b8789Gloria Wang    }
183377fce69297a0e5b7c3b266a7602b17146785635Marco Nelissen    gSniffersRegistered = true;
18420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber}
18520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
186fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huber// static
1875561ccf4a8db88a2e44eac1b3ed13b4ff53a7f20Andreas Hubersp<DataSource> DataSource::CreateFromURI(
1881b86fe063badb5f28c467ade39be0f4008688947Andreas Huber        const sp<IMediaHTTPService> &httpService,
1891b86fe063badb5f28c467ade39be0f4008688947Andreas Huber        const char *uri,
1903de157dd8f9cd45bf9b0406268f5830887105ae1Chong Zhang        const KeyedVector<String8, String8> *headers,
191360d6d0924f99b82ebacb5cfb6f7bca95e11b4eeRobert Shih        String8 *contentType,
192360d6d0924f99b82ebacb5cfb6f7bca95e11b4eeRobert Shih        HTTPBase *httpSource) {
193d354d8d1b09503c0166c1f3e626cda72a3eeb83cChong Zhang    if (contentType != NULL) {
194d354d8d1b09503c0166c1f3e626cda72a3eeb83cChong Zhang        *contentType = "";
1953de157dd8f9cd45bf9b0406268f5830887105ae1Chong Zhang    }
1963de157dd8f9cd45bf9b0406268f5830887105ae1Chong Zhang
1971608735ef488ecd8c3c012a3b0d4b1d4ef3d93c7Andreas Huber    bool isWidevine = !strncasecmp("widevine://", uri, 11);
1981608735ef488ecd8c3c012a3b0d4b1d4ef3d93c7Andreas Huber
199fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huber    sp<DataSource> source;
200fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huber    if (!strncasecmp("file://", uri, 7)) {
201fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huber        source = new FileSource(uri + 7);
2028cb0c4168bf4b678e4a6edfcf409247016be20d5Andreas Huber    } else if (!strncasecmp("http://", uri, 7)
2031608735ef488ecd8c3c012a3b0d4b1d4ef3d93c7Andreas Huber            || !strncasecmp("https://", uri, 8)
2041608735ef488ecd8c3c012a3b0d4b1d4ef3d93c7Andreas Huber            || isWidevine) {
205217bde880be6f4d937caf9555ea98942883ebda0Chong Zhang        if (httpService == NULL) {
206217bde880be6f4d937caf9555ea98942883ebda0Chong Zhang            ALOGE("Invalid http service!");
207217bde880be6f4d937caf9555ea98942883ebda0Chong Zhang            return NULL;
208217bde880be6f4d937caf9555ea98942883ebda0Chong Zhang        }
209217bde880be6f4d937caf9555ea98942883ebda0Chong Zhang
210360d6d0924f99b82ebacb5cfb6f7bca95e11b4eeRobert Shih        if (httpSource == NULL) {
211360d6d0924f99b82ebacb5cfb6f7bca95e11b4eeRobert Shih            sp<IMediaHTTPConnection> conn = httpService->makeHTTPConnection();
212360d6d0924f99b82ebacb5cfb6f7bca95e11b4eeRobert Shih            if (conn == NULL) {
213360d6d0924f99b82ebacb5cfb6f7bca95e11b4eeRobert Shih                ALOGE("Failed to make http connection from http service!");
214360d6d0924f99b82ebacb5cfb6f7bca95e11b4eeRobert Shih                return NULL;
215360d6d0924f99b82ebacb5cfb6f7bca95e11b4eeRobert Shih            }
216360d6d0924f99b82ebacb5cfb6f7bca95e11b4eeRobert Shih            httpSource = new MediaHTTP(conn);
217217bde880be6f4d937caf9555ea98942883ebda0Chong Zhang        }
218217bde880be6f4d937caf9555ea98942883ebda0Chong Zhang
2191608735ef488ecd8c3c012a3b0d4b1d4ef3d93c7Andreas Huber        String8 tmp;
2201608735ef488ecd8c3c012a3b0d4b1d4ef3d93c7Andreas Huber        if (isWidevine) {
2211608735ef488ecd8c3c012a3b0d4b1d4ef3d93c7Andreas Huber            tmp = String8("http://");
2221608735ef488ecd8c3c012a3b0d4b1d4ef3d93c7Andreas Huber            tmp.append(uri + 11);
2231608735ef488ecd8c3c012a3b0d4b1d4ef3d93c7Andreas Huber
2241608735ef488ecd8c3c012a3b0d4b1d4ef3d93c7Andreas Huber            uri = tmp.string();
2251608735ef488ecd8c3c012a3b0d4b1d4ef3d93c7Andreas Huber        }
2261608735ef488ecd8c3c012a3b0d4b1d4ef3d93c7Andreas Huber
2277b3cd1f33dcfc0b6034144cf48c0919cf7ca6046Chong Zhang        String8 cacheConfig;
2287b3cd1f33dcfc0b6034144cf48c0919cf7ca6046Chong Zhang        bool disconnectAtHighwatermark;
2297b3cd1f33dcfc0b6034144cf48c0919cf7ca6046Chong Zhang        KeyedVector<String8, String8> nonCacheSpecificHeaders;
2307b3cd1f33dcfc0b6034144cf48c0919cf7ca6046Chong Zhang        if (headers != NULL) {
2317b3cd1f33dcfc0b6034144cf48c0919cf7ca6046Chong Zhang            nonCacheSpecificHeaders = *headers;
2327b3cd1f33dcfc0b6034144cf48c0919cf7ca6046Chong Zhang            NuCachedSource2::RemoveCacheSpecificHeaders(
2337b3cd1f33dcfc0b6034144cf48c0919cf7ca6046Chong Zhang                    &nonCacheSpecificHeaders,
2347b3cd1f33dcfc0b6034144cf48c0919cf7ca6046Chong Zhang                    &cacheConfig,
2357b3cd1f33dcfc0b6034144cf48c0919cf7ca6046Chong Zhang                    &disconnectAtHighwatermark);
2367b3cd1f33dcfc0b6034144cf48c0919cf7ca6046Chong Zhang        }
2377b3cd1f33dcfc0b6034144cf48c0919cf7ca6046Chong Zhang
2387b3cd1f33dcfc0b6034144cf48c0919cf7ca6046Chong Zhang        if (httpSource->connect(uri, &nonCacheSpecificHeaders) != OK) {
2393de157dd8f9cd45bf9b0406268f5830887105ae1Chong Zhang            ALOGE("Failed to connect http source!");
240e94bd14078d327ef2f800e69907efce641a13272Andreas Huber            return NULL;
241e94bd14078d327ef2f800e69907efce641a13272Andreas Huber        }
242918c7652b9a38c02e26c0c46541cea82070c0e43Andreas Huber
2431608735ef488ecd8c3c012a3b0d4b1d4ef3d93c7Andreas Huber        if (!isWidevine) {
244d354d8d1b09503c0166c1f3e626cda72a3eeb83cChong Zhang            if (contentType != NULL) {
245d354d8d1b09503c0166c1f3e626cda72a3eeb83cChong Zhang                *contentType = httpSource->getMIMEType();
246d354d8d1b09503c0166c1f3e626cda72a3eeb83cChong Zhang            }
247918c7652b9a38c02e26c0c46541cea82070c0e43Andreas Huber
248d354d8d1b09503c0166c1f3e626cda72a3eeb83cChong Zhang            source = new NuCachedSource2(
2491608735ef488ecd8c3c012a3b0d4b1d4ef3d93c7Andreas Huber                    httpSource,
2507b3cd1f33dcfc0b6034144cf48c0919cf7ca6046Chong Zhang                    cacheConfig.isEmpty() ? NULL : cacheConfig.string(),
2517b3cd1f33dcfc0b6034144cf48c0919cf7ca6046Chong Zhang                    disconnectAtHighwatermark);
2521608735ef488ecd8c3c012a3b0d4b1d4ef3d93c7Andreas Huber        } else {
2531608735ef488ecd8c3c012a3b0d4b1d4ef3d93c7Andreas Huber            // We do not want that prefetching, caching, datasource wrapper
2541608735ef488ecd8c3c012a3b0d4b1d4ef3d93c7Andreas Huber            // in the widevine:// case.
2551608735ef488ecd8c3c012a3b0d4b1d4ef3d93c7Andreas Huber            source = httpSource;
2561608735ef488ecd8c3c012a3b0d4b1d4ef3d93c7Andreas Huber        }
2574bbfff2dbf3968c267c3b2ea9f8912a38372a9daAndreas Huber    } else if (!strncasecmp("data:", uri, 5)) {
2584bbfff2dbf3968c267c3b2ea9f8912a38372a9daAndreas Huber        source = DataURISource::Create(uri);
259fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huber    } else {
260fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huber        // Assume it's a filename.
261fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huber        source = new FileSource(uri);
262fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huber    }
263fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huber
264fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huber    if (source == NULL || source->initCheck() != OK) {
265fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huber        return NULL;
266fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huber    }
267fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huber
268fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huber    return source;
269fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huber}
270fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huber
271360d6d0924f99b82ebacb5cfb6f7bca95e11b4eeRobert Shihsp<DataSource> DataSource::CreateMediaHTTP(const sp<IMediaHTTPService> &httpService) {
272360d6d0924f99b82ebacb5cfb6f7bca95e11b4eeRobert Shih    if (httpService == NULL) {
273360d6d0924f99b82ebacb5cfb6f7bca95e11b4eeRobert Shih        return NULL;
274360d6d0924f99b82ebacb5cfb6f7bca95e11b4eeRobert Shih    }
275360d6d0924f99b82ebacb5cfb6f7bca95e11b4eeRobert Shih
276360d6d0924f99b82ebacb5cfb6f7bca95e11b4eeRobert Shih    sp<IMediaHTTPConnection> conn = httpService->makeHTTPConnection();
277360d6d0924f99b82ebacb5cfb6f7bca95e11b4eeRobert Shih    if (conn == NULL) {
278360d6d0924f99b82ebacb5cfb6f7bca95e11b4eeRobert Shih        return NULL;
279360d6d0924f99b82ebacb5cfb6f7bca95e11b4eeRobert Shih    } else {
280360d6d0924f99b82ebacb5cfb6f7bca95e11b4eeRobert Shih        return new MediaHTTP(conn);
281360d6d0924f99b82ebacb5cfb6f7bca95e11b4eeRobert Shih    }
282360d6d0924f99b82ebacb5cfb6f7bca95e11b4eeRobert Shih}
283360d6d0924f99b82ebacb5cfb6f7bca95e11b4eeRobert Shih
2846511c9755c3a3360ba869772600c7aae048a7ffcAndreas HuberString8 DataSource::getMIMEType() const {
2856511c9755c3a3360ba869772600c7aae048a7ffcAndreas Huber    return String8("application/octet-stream");
2866511c9755c3a3360ba869772600c7aae048a7ffcAndreas Huber}
2876511c9755c3a3360ba869772600c7aae048a7ffcAndreas Huber
28820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber}  // namespace android
289