内容策略管理器的作用就是整合一系列与内容管理相关的服务,并提供统一的接口供上层应用调用,这些服务如DRM内容接入、起始控制(Parental Control)等均是作为CPM插件出现的。根据多媒体的特性,CPM为CPM插件设计了一系列的规则,这些规则主要分为3类:
·用户鉴权。
·操作授权(对播放、暂停、快进、快退、复制、保存等进行授权)。
·内容接入(提供打开、阅读、查找等媒体对象的操作)。
在实现完CPM插件后,为了使CPM插件能够在OpenCORE框架内可用,必须首先完成CPM插件在OSCL组件工厂(OsclComponentFactory)的注册。
在进行CPM插件注册时,其MIME类型标识符必须以“X-CPM-PLUGIN”作为起始字符,CPM插件的注册过程如下:
代码:RegisterPlugin
OSCL_EXPORT_REF PVMFStatus PVMFCPMPluginFactoryRegistryClient::RegisterPlugin (OSCL_String& aMimeType,
PVMFCPMPluginFactory& aFactory){
if (!iClient)
return PVMFErrInvalidState;
//确保它是一个有效的CPM-plugin的MIME字符串
OSCL_HeapString< OsclMemAllocator> cpmregid(PVMF_MIME_CPM_PLUGIN);
if (aMimeType.get_size()>=cpmregid.get_size()
&& oscl_CIstrncmp(cpmregid.get_cstr(), aMimeType.get_cstr(), cpmregid.get_size())==0
&& (aMimeType.get_cstr()[cpmregid.get_size()] ==’/’
|| aMimeType.get_cstr()[cpmregid.get_size()] ==’\0’)){
switch (iClient->Register(aMimeType, (OsclComponentFactory)&aFactory)){
case OsclErrNone:
return PVMFSuccess;
case OsclErrAlreadyExists:
return PVMFErrAlreadyExists;
case OsclErrNoMemory:
return PVMFErrNoMemory;
default:
return PVMFFailure;
}
} else{
return PVMFErrArgument;
}
}
在CPM中,内容是无法直接接入的,必须通过相应的接口来进行,如为了获得数据流的内容接入,必须获得一个相应的PVMIDataStreamSyncInterface接口。为了获得内容的描述符信息,必须获得一个相应的PVMFCPMPluginAccessUnitDecryptionInterface接口等。下图显示了内容的接入过程。

CPM内容的接入过程
在OpenCORE中,给出了一个OMA DRM 1.0规格的CPM插件的参考实现。目录为external\opencore\pvmi\content_policy_manager\plugins\oma1。
在目前的实现中,CPM支持的解析器节点包括PVMFAMRFFParserNode、PVMFAACFFParserNode、PVMFMP3FFParserNode、PVMFWAVFFParserNode、PVMFMP4 FFParserNode、PVMFDownloadManagerNode等。下图显示了CPM的主要类图。

CPM主要类图