MediaPlayer2: use protobuf instead of parcel for notification message
Test: MediaPlayer2Test
Bug: 112767225
Change-Id: I7f5bd177c138a8ad5c005f4505d4d9c5042486a8
diff --git a/media/libmediaplayer2/include/mediaplayer2/MediaPlayer2Interface.h b/media/libmediaplayer2/include/mediaplayer2/MediaPlayer2Interface.h
index 715bbe0..55d812b 100644
--- a/media/libmediaplayer2/include/mediaplayer2/MediaPlayer2Interface.h
+++ b/media/libmediaplayer2/include/mediaplayer2/MediaPlayer2Interface.h
@@ -60,7 +60,8 @@
class MediaPlayer2InterfaceListener: public RefBase
{
public:
- virtual void notify(int64_t srcId, int msg, int ext1, int ext2, const Parcel *obj) = 0;
+ virtual void notify(int64_t srcId, int msg, int ext1, int ext2,
+ const PlayerMessage *obj) = 0;
};
class MediaPlayer2Interface : public AHandler {
@@ -240,7 +241,7 @@
mListener = listener;
}
- void sendEvent(int64_t srcId, int msg, int ext1=0, int ext2=0, const Parcel *obj=NULL) {
+ void sendEvent(int64_t srcId, int msg, int ext1=0, int ext2=0, const PlayerMessage *obj=NULL) {
sp<MediaPlayer2InterfaceListener> listener;
{
Mutex::Autolock autoLock(mListenerLock);
diff --git a/media/libmediaplayer2/include/mediaplayer2/mediaplayer2.h b/media/libmediaplayer2/include/mediaplayer2/mediaplayer2.h
index 628e732..e03b499 100644
--- a/media/libmediaplayer2/include/mediaplayer2/mediaplayer2.h
+++ b/media/libmediaplayer2/include/mediaplayer2/mediaplayer2.h
@@ -42,7 +42,8 @@
class MediaPlayer2Listener: virtual public RefBase
{
public:
- virtual void notify(int64_t srcId, int msg, int ext1, int ext2, const Parcel *obj) = 0;
+ virtual void notify(int64_t srcId, int msg, int ext1, int ext2,
+ const PlayerMessage *obj = NULL) = 0;
};
class MediaPlayer2 : public MediaPlayer2InterfaceListener
@@ -89,7 +90,7 @@
bool isLooping();
status_t setVolume(float leftVolume, float rightVolume);
void notify(int64_t srcId, int msg, int ext1, int ext2,
- const Parcel *obj = NULL);
+ const PlayerMessage *obj = NULL);
status_t invoke(const PlayerMessage &request, PlayerMessage *reply);
status_t setMetadataFilter(const Parcel& filter);
status_t getMetadata(bool update_only, bool apply_filter, Parcel *metadata);
diff --git a/media/libmediaplayer2/mediaplayer2.cpp b/media/libmediaplayer2/mediaplayer2.cpp
index 18cf040..8d0df8a 100644
--- a/media/libmediaplayer2/mediaplayer2.cpp
+++ b/media/libmediaplayer2/mediaplayer2.cpp
@@ -223,7 +223,8 @@
~proxyListener() { };
- virtual void notify(int64_t srcId, int msg, int ext1, int ext2, const Parcel *obj) override {
+ virtual void notify(int64_t srcId, int msg, int ext1, int ext2,
+ const PlayerMessage *obj) override {
sp<MediaPlayer2> player = mPlayer.promote();
if (player != NULL) {
player->notify(srcId, msg, ext1, ext2, obj);
@@ -1271,7 +1272,7 @@
}
}
-void MediaPlayer2::notify(int64_t srcId, int msg, int ext1, int ext2, const Parcel *obj) {
+void MediaPlayer2::notify(int64_t srcId, int msg, int ext1, int ext2, const PlayerMessage *obj) {
ALOGV("message received srcId=%lld, msg=%d, ext1=%d, ext2=%d",
(long long)srcId, msg, ext1, ext2);
diff --git a/media/libmediaplayer2/nuplayer2/GenericSource2.cpp b/media/libmediaplayer2/nuplayer2/GenericSource2.cpp
index e317e23..4ce1a88 100644
--- a/media/libmediaplayer2/nuplayer2/GenericSource2.cpp
+++ b/media/libmediaplayer2/nuplayer2/GenericSource2.cpp
@@ -1590,15 +1590,20 @@
return OK; // source without DRM info
}
- sp<ABuffer> drmInfoBuffer = NuPlayer2Drm::retrieveDrmInfo(psshInfo);
- ALOGV("checkDrmInfo: MEDIA_DRM_INFO PSSH drm info size: %d", (int)drmInfoBuffer->size());
+ PlayerMessage playerMsg;
+ status_t ret = NuPlayer2Drm::retrieveDrmInfo(psshInfo, &playerMsg);
+ ALOGV("checkDrmInfo: MEDIA_DRM_INFO PSSH drm info size: %d", (int)playerMsg.ByteSize());
- if (drmInfoBuffer->size() == 0) {
- ALOGE("checkDrmInfo: Unexpected parcel size: 0");
+ if (ret != OK) {
+ ALOGE("checkDrmInfo: failed to retrive DrmInfo %d", ret);
return UNKNOWN_ERROR;
}
- notifyDrmInfo(drmInfoBuffer);
+ int size = playerMsg.ByteSize();
+ sp<ABuffer> drmInfoBuf = new ABuffer(size);
+ playerMsg.SerializeToArray(drmInfoBuf->data(), size);
+ drmInfoBuf->setRange(0, size);
+ notifyDrmInfo(drmInfoBuf);
return OK;
}
diff --git a/media/libmediaplayer2/nuplayer2/NuPlayer2.cpp b/media/libmediaplayer2/nuplayer2/NuPlayer2.cpp
index 2a0fbdd..2ec7bc0 100644
--- a/media/libmediaplayer2/nuplayer2/NuPlayer2.cpp
+++ b/media/libmediaplayer2/nuplayer2/NuPlayer2.cpp
@@ -2145,7 +2145,8 @@
displayHeight);
}
-void NuPlayer2::notifyListener(int64_t srcId, int msg, int ext1, int ext2, const Parcel *in) {
+void NuPlayer2::notifyListener(
+ int64_t srcId, int msg, int ext1, int ext2, const PlayerMessage *in) {
if (mDriver == NULL) {
return;
}
@@ -2616,15 +2617,15 @@
// Modular DRM
case Source::kWhatDrmInfo:
{
- Parcel parcel;
+ PlayerMessage playerMsg;
sp<ABuffer> drmInfo;
CHECK(msg->findBuffer("drmInfo", &drmInfo));
- parcel.setData(drmInfo->data(), drmInfo->size());
+ playerMsg.ParseFromArray(drmInfo->data(), drmInfo->size());
- ALOGV("onSourceNotify() kWhatDrmInfo MEDIA2_DRM_INFO drmInfo: %p parcel size: %zu",
- drmInfo.get(), parcel.dataSize());
+ ALOGV("onSourceNotify() kWhatDrmInfo MEDIA2_DRM_INFO drmInfo: %p playerMsg size: %d",
+ drmInfo.get(), playerMsg.ByteSize());
- notifyListener(srcId, MEDIA2_DRM_INFO, 0 /* ext1 */, 0 /* ext2 */, &parcel);
+ notifyListener(srcId, MEDIA2_DRM_INFO, 0 /* ext1 */, 0 /* ext2 */, &playerMsg);
break;
}
@@ -2845,28 +2846,24 @@
CHECK(buffer->meta()->findInt64("timeUs", &timeUs));
CHECK(buffer->meta()->findInt64("durationUs", &durationUs));
- Parcel in;
- in.writeInt32(trackIndex + baseIndex);
- in.writeInt64(timeUs);
- in.writeInt64(durationUs);
- in.writeInt32(buffer->size());
- in.writeInt32(buffer->size());
- in.write(buffer->data(), buffer->size());
+ PlayerMessage playerMsg;
+ playerMsg.add_values()->set_int32_value(trackIndex + baseIndex);
+ playerMsg.add_values()->set_int64_value(timeUs);
+ playerMsg.add_values()->set_int64_value(durationUs);
+ playerMsg.add_values()->set_bytes_value(buffer->data(), buffer->size());
- notifyListener(mSrcId, MEDIA2_SUBTITLE_DATA, 0, 0, &in);
+ notifyListener(mSrcId, MEDIA2_SUBTITLE_DATA, 0, 0, &playerMsg);
}
void NuPlayer2::sendTimedMetaData(const sp<ABuffer> &buffer) {
int64_t timeUs;
CHECK(buffer->meta()->findInt64("timeUs", &timeUs));
- Parcel in;
- in.writeInt64(timeUs);
- in.writeInt32(buffer->size());
- in.writeInt32(buffer->size());
- in.write(buffer->data(), buffer->size());
+ PlayerMessage playerMsg;
+ playerMsg.add_values()->set_int64_value(timeUs);
+ playerMsg.add_values()->set_bytes_value(buffer->data(), buffer->size());
- notifyListener(mSrcId, MEDIA2_META_DATA, 0, 0, &in);
+ notifyListener(mSrcId, MEDIA2_META_DATA, 0, 0, &playerMsg);
}
void NuPlayer2::sendTimedTextData(const sp<ABuffer> &buffer) {
@@ -2896,7 +2893,8 @@
}
if ((parcel.dataSize() > 0)) {
- notifyListener(mSrcId, MEDIA2_TIMED_TEXT, 0, 0, &parcel);
+ // TODO: convert text data to PlayerMessage
+ // notifyListener(mSrcId, MEDIA2_TIMED_TEXT, 0, 0, &parcel);
} else { // send an empty timed text
notifyListener(mSrcId, MEDIA2_TIMED_TEXT, 0, 0);
}
diff --git a/media/libmediaplayer2/nuplayer2/NuPlayer2.h b/media/libmediaplayer2/nuplayer2/NuPlayer2.h
index c92d408..77845ac 100644
--- a/media/libmediaplayer2/nuplayer2/NuPlayer2.h
+++ b/media/libmediaplayer2/nuplayer2/NuPlayer2.h
@@ -296,7 +296,7 @@
const sp<AMessage> &inputFormat,
const sp<AMessage> &outputFormat = NULL);
- void notifyListener(int64_t srcId, int msg, int ext1, int ext2, const Parcel *in = NULL);
+ void notifyListener(int64_t srcId, int msg, int ext1, int ext2, const PlayerMessage *in = NULL);
void handleFlushComplete(bool audio, bool isDecoder);
void finishFlushIfPossible();
diff --git a/media/libmediaplayer2/nuplayer2/NuPlayer2Driver.cpp b/media/libmediaplayer2/nuplayer2/NuPlayer2Driver.cpp
index fd231a3..4d799b8 100644
--- a/media/libmediaplayer2/nuplayer2/NuPlayer2Driver.cpp
+++ b/media/libmediaplayer2/nuplayer2/NuPlayer2Driver.cpp
@@ -44,40 +44,39 @@
namespace android {
-struct ParcelWrapper : public RefBase {
- static sp<ParcelWrapper> Create(const Parcel *p) {
+struct PlayerMessageWrapper : public RefBase {
+ static sp<PlayerMessageWrapper> Create(const PlayerMessage *p) {
if (p != NULL) {
- sp<ParcelWrapper> pw = new ParcelWrapper();
- if (pw->appendFrom(p) == OK) {
- return pw;
- }
+ sp<PlayerMessageWrapper> pw = new PlayerMessageWrapper();
+ pw->copyFrom(p);
+ return pw;
}
return NULL;
}
- const Parcel *getParcel() {
- return mParcel;
+ const PlayerMessage *getPlayerMessage() {
+ return mPlayerMessage;
}
protected:
- virtual ~ParcelWrapper() {
- if (mParcel != NULL) {
- delete mParcel;
+ virtual ~PlayerMessageWrapper() {
+ if (mPlayerMessage != NULL) {
+ delete mPlayerMessage;
}
}
private:
- ParcelWrapper()
- : mParcel(NULL) { }
+ PlayerMessageWrapper()
+ : mPlayerMessage(NULL) { }
- status_t appendFrom(const Parcel *p) {
- if (mParcel == NULL) {
- mParcel = new Parcel;
+ void copyFrom(const PlayerMessage *p) {
+ if (mPlayerMessage == NULL) {
+ mPlayerMessage = new PlayerMessage;
}
- return mParcel->appendFrom(p, 0 /* start */, p->dataSize());
+ mPlayerMessage->CopyFrom(*p);
}
- Parcel *mParcel;
+ PlayerMessage *mPlayerMessage;
};
// key for media statistics
@@ -828,12 +827,12 @@
CHECK(msg->findInt32("messageId", &msgId));
msg->findInt32("ext1", &ext1);
msg->findInt32("ext2", &ext2);
- sp<ParcelWrapper> in;
+ sp<PlayerMessageWrapper> in;
sp<RefBase> obj;
- if (msg->findObject("parcel", &obj) && obj != NULL) {
- in = static_cast<ParcelWrapper *>(obj.get());
+ if (msg->findObject("obj", &obj) && obj != NULL) {
+ in = static_cast<PlayerMessageWrapper *>(obj.get());
}
- sendEvent(srcId, msgId, ext1, ext2, (in == NULL ? NULL : in->getParcel()));
+ sendEvent(srcId, msgId, ext1, ext2, (in == NULL ? NULL : in->getPlayerMessage()));
break;
}
default:
@@ -842,16 +841,16 @@
}
void NuPlayer2Driver::notifyListener(
- int64_t srcId, int msg, int ext1, int ext2, const Parcel *in) {
+ int64_t srcId, int msg, int ext1, int ext2, const PlayerMessage *in) {
Mutex::Autolock autoLock(mLock);
notifyListener_l(srcId, msg, ext1, ext2, in);
}
void NuPlayer2Driver::notifyListener_l(
- int64_t srcId, int msg, int ext1, int ext2, const Parcel *in) {
+ int64_t srcId, int msg, int ext1, int ext2, const PlayerMessage *in) {
ALOGD("notifyListener_l(%p), (%lld, %d, %d, %d, %d), loop setting(%d, %d)",
this, (long long)srcId, msg, ext1, ext2,
- (in == NULL ? -1 : (int)in->dataSize()), mAutoLoop, mLooping);
+ (in == NULL ? -1 : (int)in->ByteSize()), mAutoLoop, mLooping);
if (srcId == mSrcId) {
switch (msg) {
case MEDIA2_PLAYBACK_COMPLETE:
@@ -918,7 +917,7 @@
notify->setInt32("messageId", msg);
notify->setInt32("ext1", ext1);
notify->setInt32("ext2", ext2);
- notify->setObject("parcel", ParcelWrapper::Create(in));
+ notify->setObject("obj", PlayerMessageWrapper::Create((PlayerMessage*)in));
notify->post();
}
diff --git a/media/libmediaplayer2/nuplayer2/NuPlayer2Driver.h b/media/libmediaplayer2/nuplayer2/NuPlayer2Driver.h
index 8dfcaa1..50ee173 100644
--- a/media/libmediaplayer2/nuplayer2/NuPlayer2Driver.h
+++ b/media/libmediaplayer2/nuplayer2/NuPlayer2Driver.h
@@ -78,7 +78,7 @@
void notifyRebufferingWhenExit(int64_t srcId, bool status);
void notifySeekComplete(int64_t srcId);
void notifyListener(int64_t srcId, int msg, int ext1 = 0, int ext2 = 0,
- const Parcel *in = NULL);
+ const PlayerMessage *in = NULL);
void notifyFlagsChanged(int64_t srcId, uint32_t flags);
// Modular DRM
@@ -145,7 +145,7 @@
status_t start_l();
void notifyListener_l(int64_t srcId, int msg, int ext1 = 0, int ext2 = 0,
- const Parcel *in = NULL);
+ const PlayerMessage *in = NULL);
DISALLOW_EVIL_CONSTRUCTORS(NuPlayer2Driver);
};
diff --git a/media/libmediaplayer2/nuplayer2/NuPlayer2Drm.cpp b/media/libmediaplayer2/nuplayer2/NuPlayer2Drm.cpp
index 4853ae1..57d1147 100644
--- a/media/libmediaplayer2/nuplayer2/NuPlayer2Drm.cpp
+++ b/media/libmediaplayer2/nuplayer2/NuPlayer2Drm.cpp
@@ -133,9 +133,8 @@
return drmInfoBuffer;
}
-sp<ABuffer> NuPlayer2Drm::retrieveDrmInfo(PsshInfo *psshInfo)
+status_t NuPlayer2Drm::retrieveDrmInfo(PsshInfo *psshInfo, PlayerMessage *playerMsg)
{
-
std::ostringstream pssh, drmInfo;
// 0) Generate PSSH bytes
@@ -153,22 +152,20 @@
ALOGV("retrieveDrmInfo: MEDIA_DRM_INFO PSSH: size: %u %s", psshSize, psshHex);
// 1) Write PSSH bytes
- drmInfo.write(reinterpret_cast<const char *>(&psshSize), sizeof(psshSize));
- drmInfo.write(reinterpret_cast<const char *>(pssh.str().c_str()), psshSize);
+ playerMsg->add_values()->set_bytes_value(
+ reinterpret_cast<const char *>(pssh.str().c_str()), psshSize);
// 2) Write supportedDRMs
uint32_t numentries = psshInfo->numentries;
- drmInfo.write(reinterpret_cast<const char *>(&numentries), sizeof(numentries));
+ playerMsg->add_values()->set_int32_value(numentries);
for (size_t i = 0; i < numentries; i++) {
PsshEntry *entry = &psshInfo->entries[i];
- drmInfo.write(reinterpret_cast<const char *>(&entry->uuid), sizeof(entry->uuid));
+ playerMsg->add_values()->set_bytes_value(
+ reinterpret_cast<const char *>(&entry->uuid), sizeof(entry->uuid));
ALOGV("retrieveDrmInfo: MEDIA_DRM_INFO supportedScheme[%zu] %s", i,
DrmUUID::arrayToHex((const uint8_t*)&entry->uuid, sizeof(AMediaUUID)).string());
}
-
- sp<ABuffer> drmInfoBuf = ABuffer::CreateAsCopy(drmInfo.str().c_str(), drmInfo.tellp());
- drmInfoBuf->setRange(0, drmInfo.tellp());
- return drmInfoBuf;
+ return OK;
}
} // namespace android
diff --git a/media/libmediaplayer2/nuplayer2/NuPlayer2Drm.h b/media/libmediaplayer2/nuplayer2/NuPlayer2Drm.h
index 99d2415..968d1be 100644
--- a/media/libmediaplayer2/nuplayer2/NuPlayer2Drm.h
+++ b/media/libmediaplayer2/nuplayer2/NuPlayer2Drm.h
@@ -23,6 +23,10 @@
#include <utils/String8.h>
#include <utils/Vector.h>
+#include "mediaplayer2.pb.h"
+
+using android::media::MediaPlayer2Proto::PlayerMessage;
+
namespace android {
struct DrmUUID {
@@ -80,7 +84,7 @@
public:
static sp<ABuffer> retrieveDrmInfo(const void *pssh, uint32_t psshsize);
- static sp<ABuffer> retrieveDrmInfo(PsshInfo *);
+ static status_t retrieveDrmInfo(PsshInfo *, PlayerMessage *);
}; // NuPlayer2Drm