From 5561ccf4a8db88a2e44eac1b3ed13b4ff53a7f20 Mon Sep 17 00:00:00 2001 From: Andreas Huber Date: Wed, 27 Jan 2010 16:49:05 -0800 Subject: Support the specification of additional HTTP headers in the creation of a DataSource. related-to-bug: 2393577 --- media/libmediaplayerservice/StagefrightPlayer.cpp | 4 +- media/libstagefright/AwesomePlayer.cpp | 5 ++- media/libstagefright/DataSource.cpp | 5 ++- media/libstagefright/HTTPDataSource.cpp | 50 +++++++++++++++++------ media/libstagefright/MediaExtractor.cpp | 12 ------ media/libstagefright/include/AwesomePlayer.h | 5 ++- media/libstagefright/omx/tests/OMXHarness.cpp | 14 ++++++- 7 files changed, 62 insertions(+), 33 deletions(-) (limited to 'media') 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 *) { + const char *url, const KeyedVector *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 &listener) { mListener = listener; } -status_t AwesomePlayer::setDataSource(const char *uri) { +status_t AwesomePlayer::setDataSource( + const char *uri, const KeyedVector *headers) { Mutex::Autolock autoLock(mLock); reset_l(); - sp dataSource = DataSource::CreateFromURI(uri); + sp 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::CreateFromURI(const char *uri) { +sp DataSource::CreateFromURI( + const char *uri, const KeyedVector *headers) { sp 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 *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 *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 *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::Create( return NULL; } -// static -sp MediaExtractor::CreateFromURI( - const char *uri, const char *mime) { - sp 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 &listener); - status_t setDataSource(const char *uri); + status_t setDataSource( + const char *uri, + const KeyedVector *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 CreateExtractorFromURI(const char *uri) { + sp source = DataSource::CreateFromURI(uri); + + if (source == NULL) { + return NULL; + } + + return MediaExtractor::Create(source); +} + static sp MakeSource( const char *uri, const char *mimeType) { - sp extractor = MediaExtractor::CreateFromURI(uri); + sp extractor = CreateExtractorFromURI(uri); if (extractor == NULL) { return NULL; @@ -500,7 +510,7 @@ static sp CreateSourceForMime(const char *mime) { const char *url = GetURLForMime(mime); CHECK(url != NULL); - sp extractor = MediaExtractor::CreateFromURI(url); + sp extractor = CreateExtractorFromURI(url); CHECK(extractor != NULL); -- cgit v1.1