MediaPlayer2: use protobuf instead of parcel in invoke()
Test: pass MediaPlayer2Test
Bug: 63934228
Change-Id: Ie3d7c9352f369b6481e35c98e40b736cdff23204
diff --git a/media/libmediaplayer2/Android.bp b/media/libmediaplayer2/Android.bp
index 0fb5abc..300adec 100644
--- a/media/libmediaplayer2/Android.bp
+++ b/media/libmediaplayer2/Android.bp
@@ -56,6 +56,8 @@
static_libs: [
"libmedia_helper",
+ "libmediaplayer2-protos",
+ "libprotobuf-cpp-lite",
"libstagefright_nuplayer2",
"libstagefright_rtsp",
"libstagefright_timedtext",
diff --git a/media/libmediaplayer2/include/mediaplayer2/MediaPlayer2Interface.h b/media/libmediaplayer2/include/mediaplayer2/MediaPlayer2Interface.h
index a6bf543..715bbe0 100644
--- a/media/libmediaplayer2/include/mediaplayer2/MediaPlayer2Interface.h
+++ b/media/libmediaplayer2/include/mediaplayer2/MediaPlayer2Interface.h
@@ -33,6 +33,10 @@
#include <media/stagefright/foundation/AHandler.h>
#include <mediaplayer2/MediaPlayer2Types.h>
+#include "mediaplayer2.pb.h"
+
+using android::media::MediaPlayer2Proto::PlayerMessage;
+
// Fwd decl to make sure everyone agrees that the scope of struct sockaddr_in is
// global, and not in android::
struct sockaddr_in;
@@ -217,7 +221,7 @@
// data sent by the java layer.
// @param[out] reply Parcel to hold the reply data. Cannot be null.
// @return OK if the call was successful.
- virtual status_t invoke(const Parcel& request, Parcel *reply) = 0;
+ virtual status_t invoke(const PlayerMessage &request, PlayerMessage *reply) = 0;
// The Client in the MetadataPlayerService calls this method on
// the native player to retrieve all or a subset of metadata.
diff --git a/media/libmediaplayer2/include/mediaplayer2/mediaplayer2.h b/media/libmediaplayer2/include/mediaplayer2/mediaplayer2.h
index 43fba23..628e732 100644
--- a/media/libmediaplayer2/include/mediaplayer2/mediaplayer2.h
+++ b/media/libmediaplayer2/include/mediaplayer2/mediaplayer2.h
@@ -90,7 +90,7 @@
status_t setVolume(float leftVolume, float rightVolume);
void notify(int64_t srcId, int msg, int ext1, int ext2,
const Parcel *obj = NULL);
- status_t invoke(const Parcel& request, Parcel *reply);
+ 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);
status_t setAudioSessionId(audio_session_t sessionId);
diff --git a/media/libmediaplayer2/mediaplayer2.cpp b/media/libmediaplayer2/mediaplayer2.cpp
index f0ea59e..18cf040 100644
--- a/media/libmediaplayer2/mediaplayer2.cpp
+++ b/media/libmediaplayer2/mediaplayer2.cpp
@@ -565,16 +565,15 @@
return mPlayer->playNextDataSource(srcId);
}
-status_t MediaPlayer2::invoke(const Parcel& request, Parcel *reply) {
+status_t MediaPlayer2::invoke(const PlayerMessage &request, PlayerMessage *reply) {
Mutex::Autolock _l(mLock);
const bool hasBeenInitialized =
(mCurrentState != MEDIA_PLAYER2_STATE_ERROR) &&
((mCurrentState & MEDIA_PLAYER2_IDLE) != MEDIA_PLAYER2_IDLE);
if ((mPlayer == NULL) || !hasBeenInitialized) {
- ALOGE("invoke failed: wrong state %X, mPlayer(%p)", mCurrentState, mPlayer.get());
+ ALOGE("invoke() failed: wrong state %X, mPlayer(%p)", mCurrentState, mPlayer.get());
return INVALID_OPERATION;
}
- ALOGV("invoke %zu", request.dataSize());
return mPlayer->invoke(request, reply);
}
diff --git a/media/libmediaplayer2/nuplayer2/Android.bp b/media/libmediaplayer2/nuplayer2/Android.bp
index 1634f35..dd91628 100644
--- a/media/libmediaplayer2/nuplayer2/Android.bp
+++ b/media/libmediaplayer2/nuplayer2/Android.bp
@@ -54,6 +54,7 @@
static_libs: [
"libmedia_helper",
+ "libmediaplayer2-protos",
],
name: "libstagefright_nuplayer2",
diff --git a/media/libmediaplayer2/nuplayer2/NuPlayer2.cpp b/media/libmediaplayer2/nuplayer2/NuPlayer2.cpp
index b6b9b78..2a0fbdd 100644
--- a/media/libmediaplayer2/nuplayer2/NuPlayer2.cpp
+++ b/media/libmediaplayer2/nuplayer2/NuPlayer2.cpp
@@ -584,9 +584,8 @@
msg->post();
}
-
void NuPlayer2::writeTrackInfo(
- Parcel* reply, const sp<AMessage>& format) const {
+ PlayerMessage* reply, const sp<AMessage>& format) const {
if (format == NULL) {
ALOGE("NULL format");
return;
@@ -619,10 +618,9 @@
return;
}
- reply->writeInt32(2); // write something non-zero
- reply->writeInt32(trackType);
- reply->writeString16(String16(mime.c_str()));
- reply->writeString16(String16(lang.c_str()));
+ reply->add_values()->set_int32_value(trackType);
+ reply->add_values()->set_string_value(mime.c_str());
+ reply->add_values()->set_string_value(lang.c_str());
if (trackType == MEDIA_TRACK_TYPE_SUBTITLE) {
int32_t isAuto, isDefault, isForced;
@@ -630,9 +628,9 @@
CHECK(format->findInt32("default", &isDefault));
CHECK(format->findInt32("forced", &isForced));
- reply->writeInt32(isAuto);
- reply->writeInt32(isDefault);
- reply->writeInt32(isForced);
+ reply->add_values()->set_int32_value(isAuto);
+ reply->add_values()->set_int32_value(isDefault);
+ reply->add_values()->set_int32_value(isForced);
}
}
@@ -764,7 +762,7 @@
sp<AReplyToken> replyID;
CHECK(msg->senderAwaitsResponse(&replyID));
- Parcel* reply;
+ PlayerMessage* reply;
CHECK(msg->findPointer("reply", (void**)&reply));
size_t inbandTracks = 0;
@@ -778,7 +776,7 @@
}
// total track count
- reply->writeInt32(inbandTracks + ccTracks);
+ reply->add_values()->set_int32_value(inbandTracks + ccTracks);
// write inband tracks
for (size_t i = 0; i < inbandTracks; ++i) {
@@ -806,9 +804,9 @@
media_track_type type = (media_track_type)type32;
ssize_t selectedTrack = mSource->getSelectedTrack(type);
- Parcel* reply;
+ PlayerMessage* reply;
CHECK(msg->findPointer("reply", (void**)&reply));
- reply->writeInt32(selectedTrack);
+ reply->add_values()->set_int32_value(selectedTrack);
}
sp<AMessage> response = new AMessage;
@@ -2231,7 +2229,7 @@
return OK;
}
-status_t NuPlayer2::getTrackInfo(Parcel* reply) const {
+status_t NuPlayer2::getTrackInfo(PlayerMessage* reply) const {
sp<AMessage> msg = new AMessage(kWhatGetTrackInfo, this);
msg->setPointer("reply", reply);
@@ -2240,7 +2238,7 @@
return err;
}
-status_t NuPlayer2::getSelectedTrack(int32_t type, Parcel* reply) const {
+status_t NuPlayer2::getSelectedTrack(int32_t type, PlayerMessage* reply) const {
sp<AMessage> msg = new AMessage(kWhatGetSelectedTrack, this);
msg->setPointer("reply", reply);
msg->setInt32("type", type);
diff --git a/media/libmediaplayer2/nuplayer2/NuPlayer2.h b/media/libmediaplayer2/nuplayer2/NuPlayer2.h
index 96f85f9..c92d408 100644
--- a/media/libmediaplayer2/nuplayer2/NuPlayer2.h
+++ b/media/libmediaplayer2/nuplayer2/NuPlayer2.h
@@ -23,6 +23,10 @@
#include <mediaplayer2/MediaPlayer2Interface.h>
+#include "mediaplayer2.pb.h"
+
+using android::media::MediaPlayer2Proto::PlayerMessage;
+
namespace android {
struct ABuffer;
@@ -77,8 +81,8 @@
bool needNotify = false);
status_t setVideoScalingMode(int32_t mode);
- status_t getTrackInfo(Parcel* reply) const;
- status_t getSelectedTrack(int32_t type, Parcel* reply) const;
+ status_t getTrackInfo(PlayerMessage* reply) const;
+ status_t getSelectedTrack(int32_t type, PlayerMessage* reply) const;
status_t selectTrack(size_t trackIndex, bool select, int64_t timeUs);
status_t getCurrentPosition(int64_t *mediaUs);
void getStats(Vector<sp<AMessage> > *mTrackStats);
@@ -333,7 +337,7 @@
void sendTimedMetaData(const sp<ABuffer> &buffer);
void sendTimedTextData(const sp<ABuffer> &buffer);
- void writeTrackInfo(Parcel* reply, const sp<AMessage>& format) const;
+ void writeTrackInfo(PlayerMessage* reply, const sp<AMessage>& format) const;
status_t onPrepareDrm(const sp<AMessage> &msg);
status_t onReleaseDrm();
diff --git a/media/libmediaplayer2/nuplayer2/NuPlayer2Driver.cpp b/media/libmediaplayer2/nuplayer2/NuPlayer2Driver.cpp
index f85e3a2..fd231a3 100644
--- a/media/libmediaplayer2/nuplayer2/NuPlayer2Driver.cpp
+++ b/media/libmediaplayer2/nuplayer2/NuPlayer2Driver.cpp
@@ -36,6 +36,9 @@
#include <media/IMediaAnalyticsService.h>
+using google::protobuf::RepeatedPtrField;
+using android::media::MediaPlayer2Proto::Value;
+
static const int kDumpLockRetries = 50;
static const int kDumpLockSleepUs = 20000;
@@ -591,34 +594,30 @@
return OK;
}
-status_t NuPlayer2Driver::invoke(const Parcel &request, Parcel *reply) {
- if (reply == NULL) {
+status_t NuPlayer2Driver::invoke(const PlayerMessage &request, PlayerMessage *response) {
+ if (response == NULL) {
ALOGE("reply is a NULL pointer");
return BAD_VALUE;
}
- int32_t methodId;
- status_t ret = request.readInt32(&methodId);
- if (ret != OK) {
- ALOGE("Failed to retrieve the requested method to invoke, err(%d)", ret);
- return ret;
- }
+ RepeatedPtrField<const Value>::const_iterator it = request.values().cbegin();
+ int32_t methodId = (it++)->int32_value();
switch (methodId) {
case MEDIA_PLAYER2_INVOKE_ID_SET_VIDEO_SCALING_MODE:
{
- int mode = request.readInt32();
+ int mode = (it++)->int32_value();
return mPlayer->setVideoScalingMode(mode);
}
case MEDIA_PLAYER2_INVOKE_ID_GET_TRACK_INFO:
{
- return mPlayer->getTrackInfo(reply);
+ return mPlayer->getTrackInfo(response);
}
case MEDIA_PLAYER2_INVOKE_ID_SELECT_TRACK:
{
- int trackIndex = request.readInt32();
+ int trackIndex = (it++)->int32_value();
int64_t msec = 0;
// getCurrentPosition should always return OK
getCurrentPosition(&msec);
@@ -627,14 +626,14 @@
case MEDIA_PLAYER2_INVOKE_ID_UNSELECT_TRACK:
{
- int trackIndex = request.readInt32();
+ int trackIndex = (it++)->int32_value();
return mPlayer->selectTrack(trackIndex, false /* select */, 0xdeadbeef /* not used */);
}
case MEDIA_PLAYER2_INVOKE_ID_GET_SELECTED_TRACK:
{
- int32_t type = request.readInt32();
- return mPlayer->getSelectedTrack(type, reply);
+ int32_t type = (it++)->int32_value();
+ return mPlayer->getSelectedTrack(type, response);
}
default:
diff --git a/media/libmediaplayer2/nuplayer2/NuPlayer2Driver.h b/media/libmediaplayer2/nuplayer2/NuPlayer2Driver.h
index 6d5a007..8dfcaa1 100644
--- a/media/libmediaplayer2/nuplayer2/NuPlayer2Driver.h
+++ b/media/libmediaplayer2/nuplayer2/NuPlayer2Driver.h
@@ -56,7 +56,7 @@
virtual status_t reset() override;
virtual status_t notifyAt(int64_t mediaTimeUs) override;
virtual status_t setLooping(int loop) override;
- virtual status_t invoke(const Parcel &request, Parcel *reply) override;
+ virtual status_t invoke(const PlayerMessage &request, PlayerMessage *response) override;
virtual void setAudioSink(const sp<AudioSink> &audioSink) override;
virtual status_t setParameter(int key, const Parcel &request) override;
virtual status_t getParameter(int key, Parcel *reply) override;