diff options
author | Andreas Huber <andih@google.com> | 2010-01-28 11:19:57 -0800 |
---|---|---|
committer | Andreas Huber <andih@google.com> | 2010-01-28 11:52:43 -0800 |
commit | 2db8455d8f4468a637109d31f319ce02d9d743ec (patch) | |
tree | 7f3418b24ec0779af3ab25202eb5063e860610d5 /media | |
parent | 8566a635aa4bf6d2e908f0bc64d4fb8917025b58 (diff) | |
download | frameworks_av-2db8455d8f4468a637109d31f319ce02d9d743ec.zip frameworks_av-2db8455d8f4468a637109d31f319ce02d9d743ec.tar.gz frameworks_av-2db8455d8f4468a637109d31f319ce02d9d743ec.tar.bz2 |
API Extension: Support for optionally specifying a map of extra request headers when specifying the uri of media data to be played.
related-to-bug: 2393577
Original change by Andrei Popescu <andreip@google.com>
Diffstat (limited to 'media')
-rw-r--r-- | media/libmedia/IMediaPlayerService.cpp | 33 | ||||
-rw-r--r-- | media/libmedia/mediaplayer.cpp | 9 | ||||
-rw-r--r-- | media/libmediaplayerservice/MediaPlayerService.cpp | 11 | ||||
-rw-r--r-- | media/libmediaplayerservice/MediaPlayerService.h | 12 | ||||
-rw-r--r-- | media/libmediaplayerservice/MidiFile.cpp | 4 | ||||
-rw-r--r-- | media/libmediaplayerservice/MidiFile.h | 5 | ||||
-rw-r--r-- | media/libmediaplayerservice/MidiMetadataRetriever.cpp | 3 | ||||
-rw-r--r-- | media/libmediaplayerservice/StagefrightPlayer.cpp | 5 | ||||
-rw-r--r-- | media/libmediaplayerservice/StagefrightPlayer.h | 5 | ||||
-rw-r--r-- | media/libmediaplayerservice/TestPlayerStub.cpp | 6 | ||||
-rw-r--r-- | media/libmediaplayerservice/TestPlayerStub.h | 3 | ||||
-rw-r--r-- | media/libmediaplayerservice/VorbisMetadataRetriever.cpp | 3 | ||||
-rw-r--r-- | media/libmediaplayerservice/VorbisPlayer.cpp | 6 | ||||
-rw-r--r-- | media/libmediaplayerservice/VorbisPlayer.h | 5 |
14 files changed, 82 insertions, 28 deletions
diff --git a/media/libmedia/IMediaPlayerService.cpp b/media/libmedia/IMediaPlayerService.cpp index cca3e9b..71c5f86 100644 --- a/media/libmedia/IMediaPlayerService.cpp +++ b/media/libmedia/IMediaPlayerService.cpp @@ -56,13 +56,26 @@ public: return interface_cast<IMediaMetadataRetriever>(reply.readStrongBinder()); } - virtual sp<IMediaPlayer> create(pid_t pid, const sp<IMediaPlayerClient>& client, const char* url) - { + virtual sp<IMediaPlayer> create( + pid_t pid, const sp<IMediaPlayerClient>& client, + const char* url, const KeyedVector<String8, String8> *headers) { Parcel data, reply; data.writeInterfaceToken(IMediaPlayerService::getInterfaceDescriptor()); data.writeInt32(pid); data.writeStrongBinder(client->asBinder()); data.writeCString(url); + + if (headers == NULL) { + data.writeInt32(0); + } else { + // serialize the headers + data.writeInt32(headers->size()); + for (size_t i = 0; i < headers->size(); ++i) { + data.writeString8(headers->keyAt(i)); + data.writeString8(headers->valueAt(i)); + } + } + remote()->transact(CREATE_URL, data, &reply); return interface_cast<IMediaPlayer>(reply.readStrongBinder()); } @@ -142,9 +155,21 @@ status_t BnMediaPlayerService::onTransact( case CREATE_URL: { CHECK_INTERFACE(IMediaPlayerService, data, reply); pid_t pid = data.readInt32(); - sp<IMediaPlayerClient> client = interface_cast<IMediaPlayerClient>(data.readStrongBinder()); + sp<IMediaPlayerClient> client = + interface_cast<IMediaPlayerClient>(data.readStrongBinder()); const char* url = data.readCString(); - sp<IMediaPlayer> player = create(pid, client, url); + + KeyedVector<String8, String8> headers; + int32_t numHeaders = data.readInt32(); + for (int i = 0; i < numHeaders; ++i) { + String8 key = data.readString8(); + String8 value = data.readString8(); + headers.add(key, value); + } + + sp<IMediaPlayer> player = create( + pid, client, url, numHeaders > 0 ? &headers : NULL); + reply->writeStrongBinder(player->asBinder()); return NO_ERROR; } break; diff --git a/media/libmedia/mediaplayer.cpp b/media/libmedia/mediaplayer.cpp index c0664f3..cb5ee4b 100644 --- a/media/libmedia/mediaplayer.cpp +++ b/media/libmedia/mediaplayer.cpp @@ -32,6 +32,9 @@ #include <binder/MemoryBase.h> +#include <utils/KeyedVector.h> +#include <utils/String8.h> + namespace android { MediaPlayer::MediaPlayer() @@ -122,14 +125,16 @@ status_t MediaPlayer::setDataSource(const sp<IMediaPlayer>& player) return err; } -status_t MediaPlayer::setDataSource(const char *url) +status_t MediaPlayer::setDataSource( + const char *url, const KeyedVector<String8, String8> *headers) { LOGV("setDataSource(%s)", url); status_t err = BAD_VALUE; if (url != NULL) { const sp<IMediaPlayerService>& service(getMediaPlayerService()); if (service != 0) { - sp<IMediaPlayer> player(service->create(getpid(), this, url)); + sp<IMediaPlayer> player( + service->create(getpid(), this, url, headers)); err = setDataSource(player); } } diff --git a/media/libmediaplayerservice/MediaPlayerService.cpp b/media/libmediaplayerservice/MediaPlayerService.cpp index 5b061b1..8e61011 100644 --- a/media/libmediaplayerservice/MediaPlayerService.cpp +++ b/media/libmediaplayerservice/MediaPlayerService.cpp @@ -254,12 +254,14 @@ sp<IMediaMetadataRetriever> MediaPlayerService::createMetadataRetriever(pid_t pi return retriever; } -sp<IMediaPlayer> MediaPlayerService::create(pid_t pid, const sp<IMediaPlayerClient>& client, const char* url) +sp<IMediaPlayer> MediaPlayerService::create( + pid_t pid, const sp<IMediaPlayerClient>& client, const char* url, + const KeyedVector<String8, String8> *headers) { int32_t connId = android_atomic_inc(&mNextConnId); sp<Client> c = new Client(this, pid, connId, client); LOGV("Create new client(%d) from pid %d, url=%s, connId=%d", connId, pid, url, connId); - if (NO_ERROR != c->setDataSource(url)) + if (NO_ERROR != c->setDataSource(url, headers)) { c.clear(); return c; @@ -803,7 +805,8 @@ sp<MediaPlayerBase> MediaPlayerService::Client::createPlayer(player_type playerT return p; } -status_t MediaPlayerService::Client::setDataSource(const char *url) +status_t MediaPlayerService::Client::setDataSource( + const char *url, const KeyedVector<String8, String8> *headers) { LOGV("setDataSource(%s)", url); if (url == NULL) @@ -838,7 +841,7 @@ status_t MediaPlayerService::Client::setDataSource(const char *url) // now set data source LOGV(" setDataSource"); - mStatus = p->setDataSource(url); + mStatus = p->setDataSource(url, headers); if (mStatus == NO_ERROR) { mPlayer = p; } else { diff --git a/media/libmediaplayerservice/MediaPlayerService.h b/media/libmediaplayerservice/MediaPlayerService.h index d243b96..ffe1ba0 100644 --- a/media/libmediaplayerservice/MediaPlayerService.h +++ b/media/libmediaplayerservice/MediaPlayerService.h @@ -23,6 +23,7 @@ #include <utils/List.h> #include <utils/Errors.h> #include <utils/KeyedVector.h> +#include <utils/String8.h> #include <utils/Vector.h> #include <ui/SurfaceComposerClient.h> @@ -181,7 +182,10 @@ public: virtual sp<IMediaMetadataRetriever> createMetadataRetriever(pid_t pid); // House keeping for media player clients - virtual sp<IMediaPlayer> create(pid_t pid, const sp<IMediaPlayerClient>& client, const char* url); + virtual sp<IMediaPlayer> create( + pid_t pid, const sp<IMediaPlayerClient>& client, const char* url, + const KeyedVector<String8, String8> *headers); + virtual sp<IMediaPlayer> create(pid_t pid, const sp<IMediaPlayerClient>& client, int fd, int64_t offset, int64_t length); virtual sp<IMemory> decode(const char* url, uint32_t *pSampleRate, int* pNumChannels, int* pFormat); virtual sp<IMemory> decode(int fd, int64_t offset, int64_t length, uint32_t *pSampleRate, int* pNumChannels, int* pFormat); @@ -219,7 +223,11 @@ private: Parcel *reply); sp<MediaPlayerBase> createPlayer(player_type playerType); - status_t setDataSource(const char *url); + + status_t setDataSource( + const char *url, + const KeyedVector<String8, String8> *headers); + status_t setDataSource(int fd, int64_t offset, int64_t length); static void notify(void* cookie, int msg, int ext1, int ext2); diff --git a/media/libmediaplayerservice/MidiFile.cpp b/media/libmediaplayerservice/MidiFile.cpp index e9cbb97..1b0b05f 100644 --- a/media/libmediaplayerservice/MidiFile.cpp +++ b/media/libmediaplayerservice/MidiFile.cpp @@ -115,8 +115,8 @@ MidiFile::~MidiFile() { release(); } -status_t MidiFile::setDataSource(const char* path) -{ +status_t MidiFile::setDataSource( + const char* path, const KeyedVector<String8, String8> *) { LOGV("MidiFile::setDataSource url=%s", path); Mutex::Autolock lock(mMutex); diff --git a/media/libmediaplayerservice/MidiFile.h b/media/libmediaplayerservice/MidiFile.h index 25d4a1b..4a60ece 100644 --- a/media/libmediaplayerservice/MidiFile.h +++ b/media/libmediaplayerservice/MidiFile.h @@ -30,7 +30,10 @@ public: ~MidiFile(); virtual status_t initCheck(); - virtual status_t setDataSource(const char* path); + + virtual status_t setDataSource( + const char* path, const KeyedVector<String8, String8> *headers); + virtual status_t setDataSource(int fd, int64_t offset, int64_t length); virtual status_t setVideoSurface(const sp<ISurface>& surface) { return UNKNOWN_ERROR; } virtual status_t prepare(); diff --git a/media/libmediaplayerservice/MidiMetadataRetriever.cpp b/media/libmediaplayerservice/MidiMetadataRetriever.cpp index 3795b7b..ad95fac 100644 --- a/media/libmediaplayerservice/MidiMetadataRetriever.cpp +++ b/media/libmediaplayerservice/MidiMetadataRetriever.cpp @@ -43,7 +43,8 @@ status_t MidiMetadataRetriever::setDataSource(const char *url) if (mMidiPlayer == 0) { mMidiPlayer = new MidiFile(); } - return mMidiPlayer->setDataSource(url); + // TODO: support headers in MetadataRetriever interface! + return mMidiPlayer->setDataSource(url, NULL /* headers */); } status_t MidiMetadataRetriever::setDataSource(int fd, int64_t offset, int64_t length) diff --git a/media/libmediaplayerservice/StagefrightPlayer.cpp b/media/libmediaplayerservice/StagefrightPlayer.cpp index 5915105..3135d0c 100644 --- a/media/libmediaplayerservice/StagefrightPlayer.cpp +++ b/media/libmediaplayerservice/StagefrightPlayer.cpp @@ -28,8 +28,9 @@ status_t StagefrightPlayer::initCheck() { return OK; } -status_t StagefrightPlayer::setDataSource(const char *url) { - LOGV("setDataSource('%s')", url); +status_t StagefrightPlayer::setDataSource( + const char *url, const KeyedVector<String8, String8> *) { + LOGI("setDataSource('%s')", url); return mPlayer->setDataSource(url); } diff --git a/media/libmediaplayerservice/StagefrightPlayer.h b/media/libmediaplayerservice/StagefrightPlayer.h index 9d005cb..9e6674a 100644 --- a/media/libmediaplayerservice/StagefrightPlayer.h +++ b/media/libmediaplayerservice/StagefrightPlayer.h @@ -30,7 +30,10 @@ public: virtual ~StagefrightPlayer(); virtual status_t initCheck(); - virtual status_t setDataSource(const char *url); + + virtual status_t setDataSource( + const char *url, const KeyedVector<String8, String8> *headers); + virtual status_t setDataSource(int fd, int64_t offset, int64_t length); virtual status_t setVideoSurface(const sp<ISurface> &surface); virtual status_t prepare(); diff --git a/media/libmediaplayerservice/TestPlayerStub.cpp b/media/libmediaplayerservice/TestPlayerStub.cpp index aa49429..169e49a 100644 --- a/media/libmediaplayerservice/TestPlayerStub.cpp +++ b/media/libmediaplayerservice/TestPlayerStub.cpp @@ -112,8 +112,8 @@ status_t TestPlayerStub::parseUrl() // Load the dynamic library. // Create the test player. // Call setDataSource on the test player with the url in param. -status_t TestPlayerStub::setDataSource(const char *url) -{ +status_t TestPlayerStub::setDataSource( + const char *url, const KeyedVector<String8, String8> *headers) { if (!isTestUrl(url) || NULL != mHandle) { return INVALID_OPERATION; } @@ -162,7 +162,7 @@ status_t TestPlayerStub::setDataSource(const char *url) } mPlayer = (*mNewPlayer)(); - return mPlayer->setDataSource(mContentUrl); + return mPlayer->setDataSource(mContentUrl, headers); } // Internal cleanup. diff --git a/media/libmediaplayerservice/TestPlayerStub.h b/media/libmediaplayerservice/TestPlayerStub.h index 80d53a8..6e6c3cd 100644 --- a/media/libmediaplayerservice/TestPlayerStub.h +++ b/media/libmediaplayerservice/TestPlayerStub.h @@ -65,7 +65,8 @@ class TestPlayerStub : public MediaPlayerInterface { virtual status_t initCheck(); // @param url Should be a test url. See class comment. - virtual status_t setDataSource(const char* url); + virtual status_t setDataSource( + const char* url, const KeyedVector<String8, String8> *headers); // Test player for a file descriptor source is not supported. virtual status_t setDataSource(int, int64_t, int64_t) { diff --git a/media/libmediaplayerservice/VorbisMetadataRetriever.cpp b/media/libmediaplayerservice/VorbisMetadataRetriever.cpp index e981678..eac74fc 100644 --- a/media/libmediaplayerservice/VorbisMetadataRetriever.cpp +++ b/media/libmediaplayerservice/VorbisMetadataRetriever.cpp @@ -39,7 +39,8 @@ status_t VorbisMetadataRetriever::setDataSource(const char *url) if (mVorbisPlayer == 0) { mVorbisPlayer = new VorbisPlayer(); } - return mVorbisPlayer->setDataSource(url); + // TODO: support headers in MetadataRetriever interface! + return mVorbisPlayer->setDataSource(url, NULL /* headers */); } status_t VorbisMetadataRetriever::setDataSource(int fd, int64_t offset, int64_t length) diff --git a/media/libmediaplayerservice/VorbisPlayer.cpp b/media/libmediaplayerservice/VorbisPlayer.cpp index 7f0ef21..8181999 100644 --- a/media/libmediaplayerservice/VorbisPlayer.cpp +++ b/media/libmediaplayerservice/VorbisPlayer.cpp @@ -86,9 +86,9 @@ VorbisPlayer::~VorbisPlayer() { release(); } -status_t VorbisPlayer::setDataSource(const char* path) -{ - return setdatasource(path, -1, 0, 0x7ffffffffffffffLL); // intentionally less than LONG_MAX +status_t VorbisPlayer::setDataSource( + const char *uri, const KeyedVector<String8, String8> *headers) { + return setdatasource(uri, -1, 0, 0x7ffffffffffffffLL); // intentionally less than LONG_MAX } status_t VorbisPlayer::setDataSource(int fd, int64_t offset, int64_t length) diff --git a/media/libmediaplayerservice/VorbisPlayer.h b/media/libmediaplayerservice/VorbisPlayer.h index 4024654..4a50835 100644 --- a/media/libmediaplayerservice/VorbisPlayer.h +++ b/media/libmediaplayerservice/VorbisPlayer.h @@ -37,7 +37,10 @@ public: virtual void onFirstRef(); virtual status_t initCheck(); - virtual status_t setDataSource(const char* path); + + virtual status_t setDataSource( + const char *uri, const KeyedVector<String8, String8> *headers); + virtual status_t setDataSource(int fd, int64_t offset, int64_t length); virtual status_t setVideoSurface(const sp<ISurface>& surface) { return UNKNOWN_ERROR; } virtual status_t prepare(); |