DrmPassthruPlugIn.cpp revision e943f84129326ab885cc7a69dcfa17f766b72b89
121ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff/* 221ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff * Copyright (C) 2010 The Android Open Source Project 321ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff * 421ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff * Licensed under the Apache License, Version 2.0 (the "License"); 521ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff * you may not use this file except in compliance with the License. 621ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff * You may obtain a copy of the License at 721ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff * 821ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff * http://www.apache.org/licenses/LICENSE-2.0 921ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff * 1021ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff * Unless required by applicable law or agreed to in writing, software 1121ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff * distributed under the License is distributed on an "AS IS" BASIS, 1221ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1321ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff * See the License for the specific language governing permissions and 1421ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff * limitations under the License. 1521ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff */ 1621ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff 1721ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff#define LOG_NDEBUG 0 1821ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff#define LOG_TAG "DrmPassthruPlugIn" 1921ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff#include <utils/Log.h> 2021ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff 2121ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff#include <drm/DrmRights.h> 2221ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff#include <drm/DrmConstraints.h> 2321ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff#include <drm/DrmInfo.h> 2421ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff#include <drm/DrmInfoEvent.h> 2521ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff#include <drm/DrmInfoStatus.h> 2621ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff#include <drm/DrmConvertedStatus.h> 2721ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff#include <drm/DrmInfoRequest.h> 2821ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff#include <drm/DrmSupportInfo.h> 2921ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff#include <DrmPassthruPlugIn.h> 3021ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff 3121ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriffusing namespace android; 3221ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff 3321ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff 3421ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff// This extern "C" is mandatory to be managed by TPlugInManager 3521ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriffextern "C" IDrmEngine* create() { 3621ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff return new DrmPassthruPlugIn(); 3721ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff} 3821ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff 3921ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff// This extern "C" is mandatory to be managed by TPlugInManager 4021ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriffextern "C" void destroy(IDrmEngine* pPlugIn) { 4121ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff delete pPlugIn; 4221ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff pPlugIn = NULL; 4321ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff} 4421ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff 4521ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan SheriffDrmPassthruPlugIn::DrmPassthruPlugIn() 4621ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff : DrmEngineBase() { 4721ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff 4821ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff} 4921ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff 5021ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan SheriffDrmPassthruPlugIn::~DrmPassthruPlugIn() { 5121ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff 5221ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff} 5321ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff 5421ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan SheriffDrmConstraints* DrmPassthruPlugIn::onGetConstraints( 5521ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff int uniqueId, const String8* path, int action) { 5621ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff LOGD("DrmPassthruPlugIn::onGetConstraints From Path: %d", uniqueId); 5721ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff DrmConstraints* drmConstraints = new DrmConstraints(); 5821ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff 5921ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff String8 value("dummy_available_time"); 6021ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff char* charValue = NULL; 6121ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff charValue = new char[value.length() + 1]; 6221ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff strncpy(charValue, value.string(), value.length()); 6321ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff 6421ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff //Just add dummy available time for verification 6521ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff drmConstraints->put(&(DrmConstraints::LICENSE_AVAILABLE_TIME), charValue); 6621ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff 6721ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff return drmConstraints; 6821ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff} 6921ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff 7021ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan SheriffDrmInfoStatus* DrmPassthruPlugIn::onProcessDrmInfo(int uniqueId, const DrmInfo* drmInfo) { 7121ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff LOGD("DrmPassthruPlugIn::onProcessDrmInfo - Enter : %d", uniqueId); 7221ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff DrmInfoStatus* drmInfoStatus = NULL; 7321ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff if (NULL != drmInfo) { 7421ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff switch (drmInfo->getInfoType()) { 7521ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff case DrmInfoRequest::TYPE_REGISTRATION_INFO: { 7621ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff const DrmBuffer* emptyBuffer = new DrmBuffer(); 7721ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff drmInfoStatus = new DrmInfoStatus(DrmInfoStatus::STATUS_OK, 7821ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff DrmInfoRequest::TYPE_REGISTRATION_INFO, emptyBuffer, drmInfo->getMimeType()); 7921ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff break; 8021ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff } 8121ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff case DrmInfoRequest::TYPE_UNREGISTRATION_INFO: { 8221ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff const DrmBuffer* emptyBuffer = new DrmBuffer(); 8321ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff drmInfoStatus = new DrmInfoStatus(DrmInfoStatus::STATUS_OK, 8421ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff DrmInfoRequest::TYPE_UNREGISTRATION_INFO, emptyBuffer, drmInfo->getMimeType()); 8521ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff break; 8621ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff } 8721ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff case DrmInfoRequest::TYPE_RIGHTS_ACQUISITION_INFO: { 8821ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff String8 licenseString("dummy_license_string"); 8921ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff const int bufferSize = licenseString.size(); 9021ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff char* data = NULL; 9121ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff data = new char[bufferSize]; 9221ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff memcpy(data, licenseString.string(), bufferSize); 9321ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff const DrmBuffer* buffer = new DrmBuffer(data, bufferSize); 9421ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff drmInfoStatus = new DrmInfoStatus(DrmInfoStatus::STATUS_OK, 9521ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff DrmInfoRequest::TYPE_RIGHTS_ACQUISITION_INFO, buffer, drmInfo->getMimeType()); 9621ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff break; 9721ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff } 9821ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff } 9921ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff } 10021ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff LOGD("DrmPassthruPlugIn::onProcessDrmInfo - Exit"); 10121ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff return drmInfoStatus; 10221ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff} 10321ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff 10421ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriffstatus_t DrmPassthruPlugIn::onSetOnInfoListener( 10521ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff int uniqueId, const IDrmEngine::OnInfoListener* infoListener) { 10621ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff LOGD("DrmPassthruPlugIn::onSetOnInfoListener : %d", uniqueId); 10721ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff return DRM_NO_ERROR; 10821ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff} 10921ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff 11021ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriffstatus_t DrmPassthruPlugIn::onInitialize(int uniqueId) { 11121ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff LOGD("DrmPassthruPlugIn::onInitialize : %d", uniqueId); 11221ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff return DRM_NO_ERROR; 11321ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff} 11421ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff 11521ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriffstatus_t DrmPassthruPlugIn::onTerminate(int uniqueId) { 11621ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff LOGD("DrmPassthruPlugIn::onTerminate : %d", uniqueId); 11721ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff return DRM_NO_ERROR; 11821ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff} 11921ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff 12021ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan SheriffDrmSupportInfo* DrmPassthruPlugIn::onGetSupportInfo(int uniqueId) { 12121ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff LOGD("DrmPassthruPlugIn::onGetSupportInfo : %d", uniqueId); 12221ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff DrmSupportInfo* drmSupportInfo = new DrmSupportInfo(); 12321ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff // Add mimetype's 12421ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff drmSupportInfo->addMimeType(String8("application/vnd.passthru.drm")); 12521ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff // Add File Suffixes 12621ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff drmSupportInfo->addFileSuffix(String8(".passthru")); 12721ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff // Add plug-in description 12821ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff drmSupportInfo->setDescription(String8("Passthru plug-in")); 12921ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff return drmSupportInfo; 13021ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff} 13121ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff 13221ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriffstatus_t DrmPassthruPlugIn::onSaveRights(int uniqueId, const DrmRights& drmRights, 13321ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff const String8& rightsPath, const String8& contentPath) { 13421ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff LOGD("DrmPassthruPlugIn::onSaveRights : %d", uniqueId); 13521ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff return DRM_NO_ERROR; 13621ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff} 13721ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff 13821ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan SheriffDrmInfo* DrmPassthruPlugIn::onAcquireDrmInfo(int uniqueId, const DrmInfoRequest* drmInfoRequest) { 13921ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff LOGD("DrmPassthruPlugIn::onAcquireDrmInfo : %d", uniqueId); 14021ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff DrmInfo* drmInfo = NULL; 14121ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff 14221ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff if (NULL != drmInfoRequest) { 14321ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff String8 dataString("dummy_acquistion_string"); 14421ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff int length = dataString.length(); 14521ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff char* data = NULL; 14621ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff data = new char[length]; 14721ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff memcpy(data, dataString.string(), length); 14821ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff drmInfo = new DrmInfo(drmInfoRequest->getInfoType(), 14921ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff DrmBuffer(data, length), drmInfoRequest->getMimeType()); 15021ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff } 15121ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff return drmInfo; 15221ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff} 15321ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff 15421ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriffbool DrmPassthruPlugIn::onCanHandle(int uniqueId, const String8& path) { 15521ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff LOGD("DrmPassthruPlugIn::canHandle: %s ", path.string()); 15621ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff String8 extension = path.getPathExtension(); 15721ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff extension.toLower(); 15821ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff return (String8(".passthru") == extension); 15921ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff} 160 161String8 DrmPassthruPlugIn::onGetOriginalMimeType(int uniqueId, const String8& path) { 162 LOGD("DrmPassthruPlugIn::onGetOriginalMimeType() : %d", uniqueId); 163 return String8("video/passthru"); 164} 165 166int DrmPassthruPlugIn::onGetDrmObjectType( 167 int uniqueId, const String8& path, const String8& mimeType) { 168 LOGD("DrmPassthruPlugIn::onGetDrmObjectType() : %d", uniqueId); 169 return DrmObjectType::UNKNOWN; 170} 171 172int DrmPassthruPlugIn::onCheckRightsStatus(int uniqueId, const String8& path, int action) { 173 LOGD("DrmPassthruPlugIn::onCheckRightsStatus() : %d", uniqueId); 174 int rightsStatus = RightsStatus::RIGHTS_VALID; 175 return rightsStatus; 176} 177 178status_t DrmPassthruPlugIn::onConsumeRights(int uniqueId, DecryptHandle* decryptHandle, 179 int action, bool reserve) { 180 LOGD("DrmPassthruPlugIn::onConsumeRights() : %d", uniqueId); 181 return DRM_NO_ERROR; 182} 183 184status_t DrmPassthruPlugIn::onSetPlaybackStatus(int uniqueId, DecryptHandle* decryptHandle, 185 int playbackStatus, int position) { 186 LOGD("DrmPassthruPlugIn::onSetPlaybackStatus() : %d", uniqueId); 187 return DRM_NO_ERROR; 188} 189 190bool DrmPassthruPlugIn::onValidateAction(int uniqueId, const String8& path, 191 int action, const ActionDescription& description) { 192 LOGD("DrmPassthruPlugIn::onValidateAction() : %d", uniqueId); 193 return true; 194} 195 196status_t DrmPassthruPlugIn::onRemoveRights(int uniqueId, const String8& path) { 197 LOGD("DrmPassthruPlugIn::onRemoveRights() : %d", uniqueId); 198 return DRM_NO_ERROR; 199} 200 201status_t DrmPassthruPlugIn::onRemoveAllRights(int uniqueId) { 202 LOGD("DrmPassthruPlugIn::onRemoveAllRights() : %d", uniqueId); 203 return DRM_NO_ERROR; 204} 205 206status_t DrmPassthruPlugIn::onOpenConvertSession(int uniqueId, int convertId) { 207 LOGD("DrmPassthruPlugIn::onOpenConvertSession() : %d", uniqueId); 208 return DRM_NO_ERROR; 209} 210 211DrmConvertedStatus* DrmPassthruPlugIn::onConvertData( 212 int uniqueId, int convertId, const DrmBuffer* inputData) { 213 LOGD("DrmPassthruPlugIn::onConvertData() : %d", uniqueId); 214 DrmBuffer* convertedData = NULL; 215 216 if (NULL != inputData && 0 < inputData->length) { 217 int length = inputData->length; 218 char* data = NULL; 219 data = new char[length]; 220 convertedData = new DrmBuffer(data, length); 221 memcpy(convertedData->data, inputData->data, length); 222 } 223 return new DrmConvertedStatus(DrmConvertedStatus::STATUS_OK, convertedData, 0 /*offset*/); 224} 225 226DrmConvertedStatus* DrmPassthruPlugIn::onCloseConvertSession(int uniqueId, int convertId) { 227 LOGD("DrmPassthruPlugIn::onCloseConvertSession() : %d", uniqueId); 228 return new DrmConvertedStatus(DrmConvertedStatus::STATUS_OK, NULL, 0 /*offset*/); 229} 230 231status_t DrmPassthruPlugIn::onOpenDecryptSession( 232 int uniqueId, DecryptHandle* decryptHandle, int fd, int offset, int length) { 233 LOGD("DrmPassthruPlugIn::onOpenDecryptSession() : %d", uniqueId); 234 235#ifdef ENABLE_PASSTHRU_DECRYPTION 236 decryptHandle->mimeType = String8("video/passthru"); 237 decryptHandle->decryptApiType = DecryptApiType::ELEMENTARY_STREAM_BASED; 238 decryptHandle->status = DRM_NO_ERROR; 239 decryptHandle->decryptInfo = NULL; 240 return DRM_NO_ERROR; 241#endif 242 243 return DRM_ERROR_CANNOT_HANDLE; 244} 245 246status_t DrmPassthruPlugIn::onOpenDecryptSession( 247 int uniqueId, DecryptHandle* decryptHandle, const char* uri) { 248 return DRM_ERROR_CANNOT_HANDLE; 249} 250 251status_t DrmPassthruPlugIn::onCloseDecryptSession(int uniqueId, DecryptHandle* decryptHandle) { 252 LOGD("DrmPassthruPlugIn::onCloseDecryptSession() : %d", uniqueId); 253 if (NULL != decryptHandle) { 254 if (NULL != decryptHandle->decryptInfo) { 255 delete decryptHandle->decryptInfo; decryptHandle->decryptInfo = NULL; 256 } 257 delete decryptHandle; decryptHandle = NULL; 258 } 259 return DRM_NO_ERROR; 260} 261 262status_t DrmPassthruPlugIn::onInitializeDecryptUnit(int uniqueId, DecryptHandle* decryptHandle, 263 int decryptUnitId, const DrmBuffer* headerInfo) { 264 LOGD("DrmPassthruPlugIn::onInitializeDecryptUnit() : %d", uniqueId); 265 return DRM_NO_ERROR; 266} 267 268status_t DrmPassthruPlugIn::onDecrypt(int uniqueId, DecryptHandle* decryptHandle, 269 int decryptUnitId, const DrmBuffer* encBuffer, DrmBuffer** decBuffer, DrmBuffer* IV) { 270 LOGD("DrmPassthruPlugIn::onDecrypt() : %d", uniqueId); 271 /** 272 * As a workaround implementation passthru would copy the given 273 * encrypted buffer as it is to decrypted buffer. Note, decBuffer 274 * memory has to be allocated by the caller. 275 */ 276 if (NULL != (*decBuffer) && 0 < (*decBuffer)->length) { 277 memcpy((*decBuffer)->data, encBuffer->data, encBuffer->length); 278 (*decBuffer)->length = encBuffer->length; 279 } 280 return DRM_NO_ERROR; 281} 282 283status_t DrmPassthruPlugIn::onFinalizeDecryptUnit( 284 int uniqueId, DecryptHandle* decryptHandle, int decryptUnitId) { 285 LOGD("DrmPassthruPlugIn::onFinalizeDecryptUnit() : %d", uniqueId); 286 return DRM_NO_ERROR; 287} 288 289ssize_t DrmPassthruPlugIn::onPread(int uniqueId, DecryptHandle* decryptHandle, 290 void* buffer, ssize_t numBytes, off_t offset) { 291 LOGD("DrmPassthruPlugIn::onPread() : %d", uniqueId); 292 return 0; 293} 294 295