diff options
-rw-r--r-- | include/media/IMediaPlayerService.h | 4 | ||||
-rw-r--r-- | include/media/MediaPlayerInterface.h | 10 | ||||
-rw-r--r-- | include/media/PVPlayer.h | 5 | ||||
-rw-r--r-- | include/media/mediaplayer.h | 9 | ||||
-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 |
18 files changed, 105 insertions, 33 deletions
diff --git a/include/media/IMediaPlayerService.h b/include/media/IMediaPlayerService.h index d5c1594..31c0991 100644 --- a/include/media/IMediaPlayerService.h +++ b/include/media/IMediaPlayerService.h @@ -18,7 +18,9 @@ #define ANDROID_IMEDIAPLAYERSERVICE_H #include <utils/Errors.h> // for status_t +#include <utils/KeyedVector.h> #include <utils/RefBase.h> +#include <utils/String8.h> #include <binder/IInterface.h> #include <binder/Parcel.h> @@ -38,7 +40,7 @@ public: virtual sp<IMediaRecorder> createMediaRecorder(pid_t pid) = 0; virtual sp<IMediaMetadataRetriever> createMetadataRetriever(pid_t pid) = 0; - virtual sp<IMediaPlayer> create(pid_t pid, const sp<IMediaPlayerClient>& client, const char* url) = 0; + virtual sp<IMediaPlayer> create(pid_t pid, const sp<IMediaPlayerClient>& client, const char* url, const KeyedVector<String8, String8> *headers = NULL) = 0; virtual sp<IMediaPlayer> create(pid_t pid, const sp<IMediaPlayerClient>& client, int fd, int64_t offset, int64_t length) = 0; virtual sp<IMemory> decode(const char* url, uint32_t *pSampleRate, int* pNumChannels, int* pFormat) = 0; virtual sp<IMemory> decode(int fd, int64_t offset, int64_t length, uint32_t *pSampleRate, int* pNumChannels, int* pFormat) = 0; diff --git a/include/media/MediaPlayerInterface.h b/include/media/MediaPlayerInterface.h index 588c51a..a5a1bb8 100644 --- a/include/media/MediaPlayerInterface.h +++ b/include/media/MediaPlayerInterface.h @@ -21,8 +21,10 @@ #include <sys/types.h> #include <ui/ISurface.h> -#include <utils/RefBase.h> #include <utils/Errors.h> +#include <utils/KeyedVector.h> +#include <utils/String8.h> +#include <utils/RefBase.h> #include <media/mediaplayer.h> #include <media/AudioSystem.h> @@ -96,7 +98,11 @@ public: virtual ~MediaPlayerBase() {} virtual status_t initCheck() = 0; virtual bool hardwareOutput() = 0; - virtual status_t setDataSource(const char *url) = 0; + + virtual status_t setDataSource( + const char *url, + const KeyedVector<String8, String8> *headers = NULL) = 0; + virtual status_t setDataSource(int fd, int64_t offset, int64_t length) = 0; virtual status_t setVideoSurface(const sp<ISurface>& surface) = 0; virtual status_t prepare() = 0; diff --git a/include/media/PVPlayer.h b/include/media/PVPlayer.h index 8a66152..df50981 100644 --- a/include/media/PVPlayer.h +++ b/include/media/PVPlayer.h @@ -38,7 +38,10 @@ public: virtual ~PVPlayer(); 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/include/media/mediaplayer.h b/include/media/mediaplayer.h index 87d23f6..c9198d6 100644 --- a/include/media/mediaplayer.h +++ b/include/media/mediaplayer.h @@ -23,6 +23,9 @@ #include <media/IMediaPlayer.h> #include <media/IMediaDeathNotifier.h> +#include <utils/KeyedVector.h> +#include <utils/String8.h> + namespace android { enum media_event_type { @@ -130,7 +133,11 @@ public: ~MediaPlayer(); void died(); void disconnect(); - 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); status_t setVideoSurface(const sp<Surface>& surface); status_t setListener(const sp<MediaPlayerListener>& listener); 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(); |