fix for b/4126624 Widevine DRM client not sending heartbeats

Added some missing parameters to the heartbeat message, found in end-to-end
testing with youtube.  Also enabled heartbeats on client builds.

Change-Id: I445fb0cb168e63a041f0ecf828eaad493143a648
This commit is contained in:
Jeffrey Tinker
2011-03-25 13:57:21 -07:00
parent ba5fa0ef57
commit 18617b93c6
9 changed files with 53 additions and 14 deletions

View File

@@ -72,7 +72,11 @@ class WVDRMPluginAPI {
EventType_RightsRemoved,
EventType_HeartbeatServer,
EventType_HeartbeatPeriod
EventType_HeartbeatPeriod,
EventType_AssetId,
EventType_DeviceId,
EventType_StreamId,
EventType_UserData
};
enum EventDestination {

View File

@@ -117,7 +117,11 @@ protected:
enum MessageType {
MessageType_HeartbeatServer = 4000,
MessageType_HeartbeatPeriod = 4001
MessageType_HeartbeatPeriod = 4001,
MessageType_AssetId = 4002,
MessageType_DeviceId = 4003,
MessageType_StreamId = 4004,
MessageType_UserData = 4005
};
private:

View File

@@ -178,6 +178,18 @@ bool WVMDrmPlugin::SendEvent(WVDRMPluginAPI::EventType type,
case WVDRMPluginAPI::EventType_HeartbeatPeriod:
code = MessageType_HeartbeatPeriod;
break;
case WVDRMPluginAPI::EventType_AssetId:
code = MessageType_AssetId;
break;
case WVDRMPluginAPI::EventType_DeviceId:
code = MessageType_DeviceId;
break;
case WVDRMPluginAPI::EventType_StreamId:
code = MessageType_StreamId;
break;
case WVDRMPluginAPI::EventType_UserData:
code = MessageType_UserData;
break;
default:
break;
}

View File

@@ -480,15 +480,19 @@ WV_IsWidevineMedia(const char *buffer, size_t length);
// Parameters:
// [in] heartbeatURL - the URL of the heartbeat server
// [in] heartbeatPeriod - the heartbeat interval in seconds
//
// [in] assetId - the asset ID
// [in] deviceId - the device ID
// [in] streamId - the streamID
// [in] userData - user data
//
// Returns:
// WV_Status_OK on success, otherwise one of the WVStatus values
// indicating the specific error.
//
CLIENT_API WVStatus
WV_ConfigureHeartbeat(WVSession *session, std::string &heartbeatURL,
unsigned int heartbeatPeriod);
WV_ConfigureHeartbeat(WVSession *session, std::string &serverUrl, unsigned int period,
unsigned long assetId, std::string &deviceId,
std::string &streamId, std::string &userData);
//
// METHOD: WV_Teardown

View File

@@ -107,12 +107,7 @@ WVMExtractorImpl::WVMExtractorImpl(sp<DataSource> dataSource)
// Set an info listener to handle messages from the drm plugin
mInfoListener = new WVMInfoListener();
// Change #if 0 to #if 1 to enable heartbeats. Since the heartbeat server
// is not yet returning valid responses, this will cause the player to
// fail with an error, until the heartbeat server is working correctly.
#if 0
sDrmManagerClient->setOnInfoListener(mInfoListener);
#endif
WVStatus result = WV_Initialize(NULL);
if (result != WV_Status_OK) {

View File

@@ -44,14 +44,25 @@ void WVMInfoListener::onInfo(const DrmInfoEvent &event)
mServerUrl = event.getMessage();
else if (event.getType() == MessageType_HeartbeatPeriod)
mPeriod = atoi(event.getMessage());
else if (event.getType() == MessageType_AssetId)
mAssetId = atoi(event.getMessage());
else if (event.getType() == MessageType_DeviceId)
mDeviceId = event.getMessage();
else if (event.getType() == MessageType_StreamId)
mStreamId = event.getMessage();
else if (event.getType() == MessageType_UserData) {
mUserData = event.getMessage();
mHaveInfo = true;
}
}
void WVMInfoListener::configureHeartbeat()
{
// send the first time we have all the info
if (mSession && mServerUrl.size() && mPeriod != -1) {
if (mSession && mHaveInfo) {
//LOGD("WVMMediaSource::calling WV_ConfigureHeartbeat()");
WV_ConfigureHeartbeat(mSession, mServerUrl, mPeriod);
WV_ConfigureHeartbeat(mSession, mServerUrl, mPeriod, mAssetId,
mDeviceId, mStreamId, mUserData);
mSession = NULL;
}
}

View File

@@ -31,19 +31,28 @@ namespace android {
class WVMInfoListener : public DrmManagerClient::OnInfoListener {
enum MessageType {
MessageType_HeartbeatServer = 4000,
MessageType_HeartbeatPeriod = 4001
MessageType_HeartbeatPeriod = 4001,
MessageType_AssetId = 4002,
MessageType_DeviceId = 4003,
MessageType_StreamId = 4004,
MessageType_UserData = 4005
};
public:
WVMInfoListener() : mPeriod(-1) {};
WVMInfoListener() : mSession(NULL), mHaveInfo(false){};
virtual void onInfo(const DrmInfoEvent &event);
void setSession(WVSession *session);
void configureHeartbeat();
private:
WVSession *mSession;
uint32_t mAssetId;
std::string mServerUrl;
std::string mStreamId;
std::string mDeviceId;
std::string mUserData;
int mPeriod;
bool mHaveInfo;
};
} // namespace android