diff options
author | Andreas Huber <andih@google.com> | 2010-01-27 16:49:05 -0800 |
---|---|---|
committer | Andreas Huber <andih@google.com> | 2010-01-28 13:04:28 -0800 |
commit | 5561ccf4a8db88a2e44eac1b3ed13b4ff53a7f20 (patch) | |
tree | 0a98e19ea4a0721f2cc0e763203a69565eea6e2e /media | |
parent | 2db8455d8f4468a637109d31f319ce02d9d743ec (diff) | |
download | frameworks_av-5561ccf4a8db88a2e44eac1b3ed13b4ff53a7f20.zip frameworks_av-5561ccf4a8db88a2e44eac1b3ed13b4ff53a7f20.tar.gz frameworks_av-5561ccf4a8db88a2e44eac1b3ed13b4ff53a7f20.tar.bz2 |
Support the specification of additional HTTP headers in the creation of a DataSource.
related-to-bug: 2393577
Diffstat (limited to 'media')
-rw-r--r-- | media/libmediaplayerservice/StagefrightPlayer.cpp | 4 | ||||
-rw-r--r-- | media/libstagefright/AwesomePlayer.cpp | 5 | ||||
-rw-r--r-- | media/libstagefright/DataSource.cpp | 5 | ||||
-rw-r--r-- | media/libstagefright/HTTPDataSource.cpp | 50 | ||||
-rw-r--r-- | media/libstagefright/MediaExtractor.cpp | 12 | ||||
-rw-r--r-- | media/libstagefright/include/AwesomePlayer.h | 5 | ||||
-rw-r--r-- | media/libstagefright/omx/tests/OMXHarness.cpp | 14 |
7 files changed, 62 insertions, 33 deletions
diff --git a/media/libmediaplayerservice/StagefrightPlayer.cpp b/media/libmediaplayerservice/StagefrightPlayer.cpp index 3135d0c..f42d55b 100644 --- a/media/libmediaplayerservice/StagefrightPlayer.cpp +++ b/media/libmediaplayerservice/StagefrightPlayer.cpp @@ -29,9 +29,9 @@ status_t StagefrightPlayer::initCheck() { } status_t StagefrightPlayer::setDataSource( - const char *url, const KeyedVector<String8, String8> *) { + const char *url, const KeyedVector<String8, String8> *headers) { LOGI("setDataSource('%s')", url); - return mPlayer->setDataSource(url); + return mPlayer->setDataSource(url, headers); } // Warning: The filedescriptor passed into this method will only be valid until diff --git a/media/libstagefright/AwesomePlayer.cpp b/media/libstagefright/AwesomePlayer.cpp index 42b9acc..d6db59f 100644 --- a/media/libstagefright/AwesomePlayer.cpp +++ b/media/libstagefright/AwesomePlayer.cpp @@ -152,12 +152,13 @@ void AwesomePlayer::setListener(const wp<MediaPlayerBase> &listener) { mListener = listener; } -status_t AwesomePlayer::setDataSource(const char *uri) { +status_t AwesomePlayer::setDataSource( + const char *uri, const KeyedVector<String8, String8> *headers) { Mutex::Autolock autoLock(mLock); reset_l(); - sp<DataSource> dataSource = DataSource::CreateFromURI(uri); + sp<DataSource> dataSource = DataSource::CreateFromURI(uri, headers); if (dataSource == NULL) { return UNKNOWN_ERROR; diff --git a/media/libstagefright/DataSource.cpp b/media/libstagefright/DataSource.cpp index 741e5e0..1696eb9 100644 --- a/media/libstagefright/DataSource.cpp +++ b/media/libstagefright/DataSource.cpp @@ -95,12 +95,13 @@ void DataSource::RegisterDefaultSniffers() { } // static -sp<DataSource> DataSource::CreateFromURI(const char *uri) { +sp<DataSource> DataSource::CreateFromURI( + const char *uri, const KeyedVector<String8, String8> *headers) { sp<DataSource> source; if (!strncasecmp("file://", uri, 7)) { source = new FileSource(uri + 7); } else if (!strncasecmp("http://", uri, 7)) { - source = new HTTPDataSource(uri); + source = new HTTPDataSource(uri, headers); source = new CachingDataSource(source, 64 * 1024, 10); } else { // Assume it's a filename. diff --git a/media/libstagefright/HTTPDataSource.cpp b/media/libstagefright/HTTPDataSource.cpp index cf189af..5564886 100644 --- a/media/libstagefright/HTTPDataSource.cpp +++ b/media/libstagefright/HTTPDataSource.cpp @@ -31,14 +31,13 @@ static const char *kUserAgent = "stagefright-http"; // accordingly and return true, otherwise return false and leave the stream // connected. static bool PerformRedirectIfNecessary( - HTTPStream *http, string *host, string *path, int *port) { + HTTPStream *http, const String8 &headers, + string *host, string *path, int *port) { String8 request; request.append("HEAD "); request.append(path->c_str()); request.append(" HTTP/1.1\r\n"); - request.append("User-Agent: "); - request.append(kUserAgent); - request.append("\r\n"); + request.append(headers); request.append("Host: "); request.append(host->c_str()); request.append("\r\n\r\n"); @@ -94,7 +93,8 @@ static bool PerformRedirectIfNecessary( return true; } -HTTPDataSource::HTTPDataSource(const char *uri) +HTTPDataSource::HTTPDataSource( + const char *uri, const KeyedVector<String8, String8> *headers) : mHttp(new HTTPStream), mHost(NULL), mPort(0), @@ -105,6 +105,8 @@ HTTPDataSource::HTTPDataSource(const char *uri) mFirstRequest(true) { CHECK(!strncasecmp("http://", uri, 7)); + initHeaders(headers); + string host; string path; int port; @@ -140,14 +142,16 @@ HTTPDataSource::HTTPDataSource(const char *uri) if (mInitCheck != OK) { return; } - } while (PerformRedirectIfNecessary(mHttp, &host, &path, &port)); + } while (PerformRedirectIfNecessary(mHttp, mHeaders, &host, &path, &port)); mHost = strdup(host.c_str()); mPort = port; mPath = strdup(path.c_str()); } -HTTPDataSource::HTTPDataSource(const char *_host, int port, const char *_path) +HTTPDataSource::HTTPDataSource( + const char *_host, int port, const char *_path, + const KeyedVector<String8, String8> *headers) : mHttp(new HTTPStream), mHost(NULL), mPort(0), @@ -156,6 +160,8 @@ HTTPDataSource::HTTPDataSource(const char *_host, int port, const char *_path) mBufferLength(0), mBufferOffset(0), mFirstRequest(true) { + initHeaders(headers); + string host = _host; string path = _path; @@ -168,7 +174,7 @@ HTTPDataSource::HTTPDataSource(const char *_host, int port, const char *_path) if (mInitCheck != OK) { return; } - } while (PerformRedirectIfNecessary(mHttp, &host, &path, &port)); + } while (PerformRedirectIfNecessary(mHttp, mHeaders, &host, &path, &port)); mHost = strdup(host.c_str()); mPort = port; @@ -200,9 +206,6 @@ HTTPDataSource::~HTTPDataSource() { } ssize_t HTTPDataSource::sendRangeRequest(size_t offset) { - char agent[128]; - sprintf(agent, "User-Agent: %s\r\n", kUserAgent); - char host[128]; sprintf(host, "Host: %s\r\n", mHost); @@ -221,7 +224,7 @@ ssize_t HTTPDataSource::sendRangeRequest(size_t offset) { if ((err = mHttp->send("GET ")) != OK || (err = mHttp->send(mPath)) != OK || (err = mHttp->send(" HTTP/1.1\r\n")) != OK - || (err = mHttp->send(agent)) != OK + || (err = mHttp->send(mHeaders.string())) != OK || (err = mHttp->send(host)) != OK || (err = mHttp->send(range)) != OK || (err = mHttp->send("\r\n")) != OK @@ -304,5 +307,28 @@ ssize_t HTTPDataSource::readAt(off_t offset, void *data, size_t size) { return copy; } +void HTTPDataSource::initHeaders( + const KeyedVector<String8, String8> *overrides) { + mHeaders = String8(); + + mHeaders.append("User-Agent: "); + mHeaders.append(kUserAgent); + mHeaders.append("\r\n"); + + if (overrides == NULL) { + return; + } + + for (size_t i = 0; i < overrides->size(); ++i) { + String8 line; + line.append(overrides->keyAt(i)); + line.append(": "); + line.append(overrides->valueAt(i)); + line.append("\r\n"); + + mHeaders.append(line); + } +} + } // namespace android diff --git a/media/libstagefright/MediaExtractor.cpp b/media/libstagefright/MediaExtractor.cpp index e46f00e..738e18a 100644 --- a/media/libstagefright/MediaExtractor.cpp +++ b/media/libstagefright/MediaExtractor.cpp @@ -67,16 +67,4 @@ sp<MediaExtractor> MediaExtractor::Create( return NULL; } -// static -sp<MediaExtractor> MediaExtractor::CreateFromURI( - const char *uri, const char *mime) { - sp<DataSource> source = DataSource::CreateFromURI(uri); - - if (source == NULL || source->initCheck() != OK) { - return NULL; - } - - return Create(source, mime); -} - } // namespace android diff --git a/media/libstagefright/include/AwesomePlayer.h b/media/libstagefright/include/AwesomePlayer.h index c2e46c0..8bd6594 100644 --- a/media/libstagefright/include/AwesomePlayer.h +++ b/media/libstagefright/include/AwesomePlayer.h @@ -49,7 +49,10 @@ struct AwesomePlayer { void setListener(const wp<MediaPlayerBase> &listener); - status_t setDataSource(const char *uri); + status_t setDataSource( + const char *uri, + const KeyedVector<String8, String8> *headers = NULL); + status_t setDataSource(int fd, int64_t offset, int64_t length); void reset(); diff --git a/media/libstagefright/omx/tests/OMXHarness.cpp b/media/libstagefright/omx/tests/OMXHarness.cpp index 5b45c1c..6c36163 100644 --- a/media/libstagefright/omx/tests/OMXHarness.cpp +++ b/media/libstagefright/omx/tests/OMXHarness.cpp @@ -245,10 +245,20 @@ private: NodeReaper &operator=(const NodeReaper &); }; +static sp<MediaExtractor> CreateExtractorFromURI(const char *uri) { + sp<DataSource> source = DataSource::CreateFromURI(uri); + + if (source == NULL) { + return NULL; + } + + return MediaExtractor::Create(source); +} + static sp<MediaSource> MakeSource( const char *uri, const char *mimeType) { - sp<MediaExtractor> extractor = MediaExtractor::CreateFromURI(uri); + sp<MediaExtractor> extractor = CreateExtractorFromURI(uri); if (extractor == NULL) { return NULL; @@ -500,7 +510,7 @@ static sp<MediaSource> CreateSourceForMime(const char *mime) { const char *url = GetURLForMime(mime); CHECK(url != NULL); - sp<MediaExtractor> extractor = MediaExtractor::CreateFromURI(url); + sp<MediaExtractor> extractor = CreateExtractorFromURI(url); CHECK(extractor != NULL); |