Fix for b/4463415 test-wvplayer unit test always returns status 2001

Fixed test-wvplayer unit test.  Some restructuring of the drm plugin broke this test, now it is working again.
This is an important unit test for OEMs developing support for Widevine.

Change-Id: I528608bf594f7211d839a0c3cacc5a69a7301fdf
This commit is contained in:
Jeffrey Tinker
2011-05-19 05:18:45 -07:00
parent b0543e305c
commit 1ab51c68fc
2 changed files with 119 additions and 48 deletions

View File

@@ -12,7 +12,9 @@ LOCAL_C_INCLUDES+= \
vendor/widevine/proprietary/include \
external/stlport/stlport \
vendor/widevine/proprietary/streamcontrol/include \
vendor/widevine/proprietary/drmwvmplugin/include
vendor/widevine/proprietary/drmwvmplugin/include \
frameworks/base/drm/libdrmframework/include \
frameworks/base/drm/libdrmframework/plugins/common/include
LOCAL_SHARED_LIBRARIES := \
libstlport \
@@ -22,7 +24,8 @@ LOCAL_SHARED_LIBRARIES := \
liblog \
libutils \
libz \
libcutils
libcutils \
libdl
LOCAL_MODULE:=test-wvplayer

View File

@@ -19,18 +19,25 @@
#include <stdio.h>
#include <stdint.h>
#include <sys/time.h>
#include <dlfcn.h>
#include <iostream>
#include <cstring>
#include <memory>
#include "WVDRMPluginAPI.h"
#include "WVStreamControlAPI.h"
#include "AndroidHooks.h"
#include "WVMDrmPlugin.h"
#include "drm/DrmInfoRequest.h"
#include "drm/DrmInfoStatus.h"
#include "drm/DrmConstraints.h"
#include "drm/DrmInfo.h"
#define AES_BLOCK_SIZE 16
using namespace std;
using namespace android;
#define DEFAULT_BLOCK_SIZE 16*1024
#define DEFAULT_PLAYBACK_BUFFER_SIZE 0*1024*1024
@@ -40,6 +47,9 @@ using namespace std;
#define SHOW_BITRATE 1
static void Terminate();
/**
* Print command line options
*/
@@ -55,7 +65,9 @@ void PrintUsage(char *prog)
exit(-1);
}
static WVDRMPluginAPI *sDrmPlugin = NULL;
static IDrmEngine *sDrmPlugin = NULL;
static void *sSharedLibHandle = NULL;
static bool sWVInitialized = false;
static struct termios termattr, save_termattr;
static int ttysavefd = -1;
@@ -172,18 +184,99 @@ unsigned char kb_getc(void)
}
}
static void Terminate()
{
WV_Terminate();
exit(-1);
}
static void PrintMessage(const char *msg)
{
printf("%s", msg);
}
static void OpenDrmPlugin()
{
const char *path = "/system/lib/drm/libdrmwvmplugin.so";
sSharedLibHandle = dlopen(path, RTLD_NOW);
if (sSharedLibHandle == NULL) {
fprintf(stderr, "Can't open plugin: %s\n", path);
Terminate();
}
typedef IDrmEngine *(*create_t)();
create_t creator = (create_t)dlsym(sSharedLibHandle, "create");
if (!creator) {
fprintf(stderr, "Can't find create method\n");
Terminate();
}
sDrmPlugin = (*creator)();
if (sDrmPlugin->initialize(0) != DRM_NO_ERROR) {
fprintf(stderr, "onInitialize failed!\n");
Terminate();
}
}
static void CloseDrmPlugin()
{
if (sSharedLibHandle) {
if (sDrmPlugin) {
typedef IDrmEngine *(*destroy_t)(IDrmEngine *plugin);
destroy_t destroyer = (destroy_t)dlsym(sSharedLibHandle, "destroy");
if (destroyer) {
(*destroyer(sDrmPlugin));
sDrmPlugin = NULL;
} else
fprintf(stderr, "Can't find destroy method\n");
}
dlclose(sSharedLibHandle);
sSharedLibHandle = NULL;
}
}
static void AcquireRights(IDrmEngine *plugin, string url, string drmUrl)
{
String8 mimeType("video/wvm");
DrmInfoRequest rightsAcquisitionInfo(DrmInfoRequest::TYPE_RIGHTS_ACQUISITION_INFO, mimeType);
rightsAcquisitionInfo.put(String8("WVDRMServerKey"), String8(drmUrl.c_str()));
rightsAcquisitionInfo.put(String8("WVAssetURIKey"), String8(url.c_str()));
rightsAcquisitionInfo.put(String8("WVDeviceIDKey"), String8("device1234"));
rightsAcquisitionInfo.put(String8("WVPortalKey"), String8("YouTube"));
rightsAcquisitionInfo.put(String8("WVLicenseTypeKey"), String8("1"));
DrmInfo *info = plugin->acquireDrmInfo(0, &rightsAcquisitionInfo);
if (info == NULL) {
fprintf(stderr, "acquireDrmInfo failed!\n");
Terminate();
}
DrmInfoStatus *status = plugin->processDrmInfo(0, info);
if (status == NULL || status->statusCode != DrmInfoStatus::STATUS_OK) {
fprintf(stderr, "processDrmInfo failed!\n");
Terminate();
}
if (plugin->checkRightsStatus(0, String8(url.c_str()), Action::DEFAULT) != RightsStatus::RIGHTS_VALID) {
fprintf(stderr, "checkValidRights default action failed!\n");
Terminate();
}
delete status;
delete info;
}
static void Terminate()
{
if (sWVInitialized)
WV_Terminate();
CloseDrmPlugin();
exit(-1);
}
static void _cb1(char *a, unsigned long b)
{
DrmBuffer buf(a, b);
sDrmPlugin->initializeDecryptUnit(0, NULL, 0, &buf);
}
/**
* Program entry pointer
@@ -202,13 +295,6 @@ int main( int argc, char *argv[] )
_ah006(PrintMessage);
// Create DRM plugin object
sDrmPlugin = WVDRMPluginAPI::create();
if (sDrmPlugin == NULL) {
fprintf(stderr, "FATAL: failed to construct WVMDRMPluginAPI instance\n");
exit(-1);
}
while ((option = getopt(argc, argv, "o:b:p:s:mD:d:")) != -1) {
switch (option) {
case 'o':
@@ -253,7 +339,7 @@ int main( int argc, char *argv[] )
output = fopen(outputFile.c_str(), "wb");
if (!output) {
fprintf(stderr, "unable to open output file %s for writing\n", argv[2]);
exit(-1);
Terminate();
}
}
@@ -265,10 +351,16 @@ int main( int argc, char *argv[] )
if (status != WV_Status_OK) {
fprintf(stderr, "ERROR: WV_Initialize returned status %d\n", (int)status);
Terminate();
}
} else
sWVInitialized = true;
// enable HTTP logging if you want to debug
//WV_SetLogging(WV_Logging_HTTP);
WV_SetLogging(WV_Logging_HTTP);
OpenDrmPlugin();
AcquireRights(sDrmPlugin, url, drmUrl);
_ah002(_cb1);
/*
status = WV_StartBandwidthCheck( url.c_str() );
@@ -294,31 +386,6 @@ int main( int argc, char *argv[] )
*/
WVSession *session = 0;
WVCredentials credentials;
credentials.deviceID="SN12345ABC";
credentials.streamID="0123456789";
credentials.portal = "YouTube";
credentials.clientIP="1.1.1.1";
credentials.drmServerURL= drmUrl;
credentials.userData="";
credentials.drmAckServerURL=DEFAULT_DRM_ACK_URL;
string dsPath = "";
string assetIdStr = "";
string systemIdStr = "";
string keyIdStr = "";
uint_t assetId, systemId, keyId;
if (!sDrmPlugin->AcquireDrmInfo(url, credentials, dsPath,
assetIdStr, systemIdStr, keyIdStr,
&assetId, &systemId, &keyId)) {
fprintf(stderr, "ERROR: AcquireDrmInfo failed\n");
Terminate();
}
if (!sDrmPlugin->ProcessDrmInfo(url, WVDRMPluginAPI::PlaybackMode_Any)) {
fprintf(stderr, "ERROR: ProcessDrmInfo failed\n");
Terminate();
}
status = WV_Setup( session, url.c_str(), "RAW/RAW/RAW;destination=getdata", credentials);
if (status != WV_Status_OK) {
@@ -459,8 +526,7 @@ int main( int argc, char *argv[] )
case WV_Status_OK:
break;
case WV_Status_End_Of_Media:
printf("END OF MEDIA %d\n", trickPlayRate);
break;
printf("End of Media\n");
if (trickPlayRate < 0) {
WV_Play( session, 1.0, &scale_used, "00:00:00-" );
trickPlayRate = 1;
@@ -580,6 +646,8 @@ int main( int argc, char *argv[] )
WV_Teardown( session );
WV_Terminate();
CloseDrmPlugin();
if (output)
fclose(output);