summaryrefslogtreecommitdiffstats
path: root/media/libmedia
diff options
context:
space:
mode:
authorAndreas Huber <andih@google.com>2010-01-28 11:19:57 -0800
committerAndreas Huber <andih@google.com>2010-01-28 11:52:43 -0800
commit2db8455d8f4468a637109d31f319ce02d9d743ec (patch)
tree7f3418b24ec0779af3ab25202eb5063e860610d5 /media/libmedia
parent8566a635aa4bf6d2e908f0bc64d4fb8917025b58 (diff)
downloadframeworks_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/libmedia')
-rw-r--r--media/libmedia/IMediaPlayerService.cpp33
-rw-r--r--media/libmedia/mediaplayer.cpp9
2 files changed, 36 insertions, 6 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);
}
}