127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi/* 227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi * Copyright (C) 2010 The Android Open Source Project 327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi * 427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi * Licensed under the Apache License, Version 2.0 (the "License"); 527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi * you may not use this file except in compliance with the License. 627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi * You may obtain a copy of the License at 727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi * 827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi * http://www.apache.org/licenses/LICENSE-2.0 927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi * 1027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi * Unless required by applicable law or agreed to in writing, software 1127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi * distributed under the License is distributed on an "AS IS" BASIS, 1227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi * See the License for the specific language governing permissions and 1427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi * limitations under the License. 1527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi */ 1627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 170a38af09ebbacdc9aa0d5ecb24e2f0484bf4f191James Dong//#define LOG_NDEBUG 0 1827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi#define LOG_TAG "DrmPassthruPlugIn" 1927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi#include <utils/Log.h> 2027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 2127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi#include <drm/DrmRights.h> 2227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi#include <drm/DrmConstraints.h> 233473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi#include <drm/DrmMetadata.h> 2427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi#include <drm/DrmInfo.h> 2527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi#include <drm/DrmInfoEvent.h> 2627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi#include <drm/DrmInfoStatus.h> 2727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi#include <drm/DrmConvertedStatus.h> 2827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi#include <drm/DrmInfoRequest.h> 2927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi#include <drm/DrmSupportInfo.h> 3027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi#include <DrmPassthruPlugIn.h> 3127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 3227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshiusing namespace android; 3327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 3427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 3527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi// This extern "C" is mandatory to be managed by TPlugInManager 3627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshiextern "C" IDrmEngine* create() { 3727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return new DrmPassthruPlugIn(); 3827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 3927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 4027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi// This extern "C" is mandatory to be managed by TPlugInManager 4127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshiextern "C" void destroy(IDrmEngine* pPlugIn) { 4227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi delete pPlugIn; 4327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi pPlugIn = NULL; 4427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 4527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 4627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshiDrmPassthruPlugIn::DrmPassthruPlugIn() 4727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi : DrmEngineBase() { 4827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 4927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 5027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 5127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshiDrmPassthruPlugIn::~DrmPassthruPlugIn() { 5227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 5327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 5427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 555a8dbe7ad39fbfb9076894dcd24c596aae2cfccbMark SalyzynDrmMetadata* DrmPassthruPlugIn::onGetMetadata(int /*uniqueId*/, const String8* /*path*/) { 563473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi return NULL; 573473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi} 583473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi 5927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshiDrmConstraints* DrmPassthruPlugIn::onGetConstraints( 605a8dbe7ad39fbfb9076894dcd24c596aae2cfccbMark Salyzyn int uniqueId, const String8* /*path*/, int /*action*/) { 610a38af09ebbacdc9aa0d5ecb24e2f0484bf4f191James Dong ALOGV("DrmPassthruPlugIn::onGetConstraints From Path: %d", uniqueId); 6227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi DrmConstraints* drmConstraints = new DrmConstraints(); 6327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 6427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi String8 value("dummy_available_time"); 6527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi char* charValue = NULL; 6627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi charValue = new char[value.length() + 1]; 6727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi strncpy(charValue, value.string(), value.length()); 680bf43848adb00922122b0a0eed2fa0318bde8317Hung Nguyen charValue[value.length()] = '\0'; 6927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 7027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi //Just add dummy available time for verification 7127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi drmConstraints->put(&(DrmConstraints::LICENSE_AVAILABLE_TIME), charValue); 720bf43848adb00922122b0a0eed2fa0318bde8317Hung Nguyen delete[] charValue; 7327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return drmConstraints; 7427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 7527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 7627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshiDrmInfoStatus* DrmPassthruPlugIn::onProcessDrmInfo(int uniqueId, const DrmInfo* drmInfo) { 770a38af09ebbacdc9aa0d5ecb24e2f0484bf4f191James Dong ALOGV("DrmPassthruPlugIn::onProcessDrmInfo - Enter : %d", uniqueId); 7827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi DrmInfoStatus* drmInfoStatus = NULL; 7927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if (NULL != drmInfo) { 8027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi switch (drmInfo->getInfoType()) { 8127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi case DrmInfoRequest::TYPE_REGISTRATION_INFO: { 8227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const DrmBuffer* emptyBuffer = new DrmBuffer(); 83e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi drmInfoStatus = new DrmInfoStatus(DrmInfoStatus::STATUS_OK, 84e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi DrmInfoRequest::TYPE_REGISTRATION_INFO, emptyBuffer, drmInfo->getMimeType()); 8527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi break; 8627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 8727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi case DrmInfoRequest::TYPE_UNREGISTRATION_INFO: { 8827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const DrmBuffer* emptyBuffer = new DrmBuffer(); 89e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi drmInfoStatus = new DrmInfoStatus(DrmInfoStatus::STATUS_OK, 90e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi DrmInfoRequest::TYPE_UNREGISTRATION_INFO, emptyBuffer, drmInfo->getMimeType()); 9127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi break; 9227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 9327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi case DrmInfoRequest::TYPE_RIGHTS_ACQUISITION_INFO: { 9427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi String8 licenseString("dummy_license_string"); 9527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const int bufferSize = licenseString.size(); 9627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi char* data = NULL; 9727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data = new char[bufferSize]; 9827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi memcpy(data, licenseString.string(), bufferSize); 9927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const DrmBuffer* buffer = new DrmBuffer(data, bufferSize); 100e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi drmInfoStatus = new DrmInfoStatus(DrmInfoStatus::STATUS_OK, 101e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi DrmInfoRequest::TYPE_RIGHTS_ACQUISITION_INFO, buffer, drmInfo->getMimeType()); 10227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi break; 10327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 10427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 10527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 1060a38af09ebbacdc9aa0d5ecb24e2f0484bf4f191James Dong ALOGV("DrmPassthruPlugIn::onProcessDrmInfo - Exit"); 10727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return drmInfoStatus; 10827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 10927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 11027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshistatus_t DrmPassthruPlugIn::onSetOnInfoListener( 1115a8dbe7ad39fbfb9076894dcd24c596aae2cfccbMark Salyzyn int uniqueId, const IDrmEngine::OnInfoListener* /*infoListener*/) { 1120a38af09ebbacdc9aa0d5ecb24e2f0484bf4f191James Dong ALOGV("DrmPassthruPlugIn::onSetOnInfoListener : %d", uniqueId); 11327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return DRM_NO_ERROR; 11427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 11527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 11627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshistatus_t DrmPassthruPlugIn::onInitialize(int uniqueId) { 1170a38af09ebbacdc9aa0d5ecb24e2f0484bf4f191James Dong ALOGV("DrmPassthruPlugIn::onInitialize : %d", uniqueId); 11827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return DRM_NO_ERROR; 11927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 12027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 12127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshistatus_t DrmPassthruPlugIn::onTerminate(int uniqueId) { 1220a38af09ebbacdc9aa0d5ecb24e2f0484bf4f191James Dong ALOGV("DrmPassthruPlugIn::onTerminate : %d", uniqueId); 12327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return DRM_NO_ERROR; 12427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 12527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 12627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshiDrmSupportInfo* DrmPassthruPlugIn::onGetSupportInfo(int uniqueId) { 1270a38af09ebbacdc9aa0d5ecb24e2f0484bf4f191James Dong ALOGV("DrmPassthruPlugIn::onGetSupportInfo : %d", uniqueId); 12827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi DrmSupportInfo* drmSupportInfo = new DrmSupportInfo(); 12927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi // Add mimetype's 13027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi drmSupportInfo->addMimeType(String8("application/vnd.passthru.drm")); 13127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi // Add File Suffixes 13227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi drmSupportInfo->addFileSuffix(String8(".passthru")); 13327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi // Add plug-in description 13427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi drmSupportInfo->setDescription(String8("Passthru plug-in")); 13527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return drmSupportInfo; 13627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 13727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 1385a8dbe7ad39fbfb9076894dcd24c596aae2cfccbMark Salyzynstatus_t DrmPassthruPlugIn::onSaveRights(int uniqueId, const DrmRights& /*drmRights*/, 1395a8dbe7ad39fbfb9076894dcd24c596aae2cfccbMark Salyzyn const String8& /*rightsPath*/, const String8& /*contentPath*/) { 1400a38af09ebbacdc9aa0d5ecb24e2f0484bf4f191James Dong ALOGV("DrmPassthruPlugIn::onSaveRights : %d", uniqueId); 1412272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi return DRM_NO_ERROR; 14227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 14327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 14427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshiDrmInfo* DrmPassthruPlugIn::onAcquireDrmInfo(int uniqueId, const DrmInfoRequest* drmInfoRequest) { 1450a38af09ebbacdc9aa0d5ecb24e2f0484bf4f191James Dong ALOGV("DrmPassthruPlugIn::onAcquireDrmInfo : %d", uniqueId); 14627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi DrmInfo* drmInfo = NULL; 14727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 14827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if (NULL != drmInfoRequest) { 14927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi String8 dataString("dummy_acquistion_string"); 15027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi int length = dataString.length(); 15127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi char* data = NULL; 15227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data = new char[length]; 15327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi memcpy(data, dataString.string(), length); 15427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi drmInfo = new DrmInfo(drmInfoRequest->getInfoType(), 15527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi DrmBuffer(data, length), drmInfoRequest->getMimeType()); 15627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 15727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return drmInfo; 15827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 15927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 1605a8dbe7ad39fbfb9076894dcd24c596aae2cfccbMark Salyzynbool DrmPassthruPlugIn::onCanHandle(int /*uniqueId*/, const String8& path) { 1610a38af09ebbacdc9aa0d5ecb24e2f0484bf4f191James Dong ALOGV("DrmPassthruPlugIn::canHandle: %s ", path.string()); 16227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi String8 extension = path.getPathExtension(); 16327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi extension.toLower(); 16427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return (String8(".passthru") == extension); 16527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 16627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 1675a8dbe7ad39fbfb9076894dcd24c596aae2cfccbMark SalyzynString8 DrmPassthruPlugIn::onGetOriginalMimeType(int uniqueId, 1685a8dbe7ad39fbfb9076894dcd24c596aae2cfccbMark Salyzyn const String8& /*path*/, int /*fd*/) { 1690a38af09ebbacdc9aa0d5ecb24e2f0484bf4f191James Dong ALOGV("DrmPassthruPlugIn::onGetOriginalMimeType() : %d", uniqueId); 17027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return String8("video/passthru"); 17127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 17227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 17327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshiint DrmPassthruPlugIn::onGetDrmObjectType( 1745a8dbe7ad39fbfb9076894dcd24c596aae2cfccbMark Salyzyn int uniqueId, const String8& /*path*/, const String8& /*mimeType*/) { 1750a38af09ebbacdc9aa0d5ecb24e2f0484bf4f191James Dong ALOGV("DrmPassthruPlugIn::onGetDrmObjectType() : %d", uniqueId); 17627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return DrmObjectType::UNKNOWN; 17727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 17827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 1795a8dbe7ad39fbfb9076894dcd24c596aae2cfccbMark Salyzynint DrmPassthruPlugIn::onCheckRightsStatus(int uniqueId, const String8& /*path*/, int /*action*/) { 1800a38af09ebbacdc9aa0d5ecb24e2f0484bf4f191James Dong ALOGV("DrmPassthruPlugIn::onCheckRightsStatus() : %d", uniqueId); 18127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi int rightsStatus = RightsStatus::RIGHTS_VALID; 18227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return rightsStatus; 18327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 18427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 1855a8dbe7ad39fbfb9076894dcd24c596aae2cfccbMark Salyzynstatus_t DrmPassthruPlugIn::onConsumeRights(int uniqueId, 1865a8dbe7ad39fbfb9076894dcd24c596aae2cfccbMark Salyzyn DecryptHandle* /*decryptHandle*/, int /*action*/, bool /*reserve*/) { 1870a38af09ebbacdc9aa0d5ecb24e2f0484bf4f191James Dong ALOGV("DrmPassthruPlugIn::onConsumeRights() : %d", uniqueId); 1882272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi return DRM_NO_ERROR; 18927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 19027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 1915a8dbe7ad39fbfb9076894dcd24c596aae2cfccbMark Salyzynstatus_t DrmPassthruPlugIn::onSetPlaybackStatus(int uniqueId, 1925a8dbe7ad39fbfb9076894dcd24c596aae2cfccbMark Salyzyn DecryptHandle* /*decryptHandle*/, int /*playbackStatus*/, int64_t /*position*/) { 1930a38af09ebbacdc9aa0d5ecb24e2f0484bf4f191James Dong ALOGV("DrmPassthruPlugIn::onSetPlaybackStatus() : %d", uniqueId); 1942272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi return DRM_NO_ERROR; 19527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 19627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 1975a8dbe7ad39fbfb9076894dcd24c596aae2cfccbMark Salyzynbool DrmPassthruPlugIn::onValidateAction(int uniqueId, 1985a8dbe7ad39fbfb9076894dcd24c596aae2cfccbMark Salyzyn const String8& /*path*/, int /*action*/, const ActionDescription& /*description*/) { 1990a38af09ebbacdc9aa0d5ecb24e2f0484bf4f191James Dong ALOGV("DrmPassthruPlugIn::onValidateAction() : %d", uniqueId); 20027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return true; 20127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 20227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 2035a8dbe7ad39fbfb9076894dcd24c596aae2cfccbMark Salyzynstatus_t DrmPassthruPlugIn::onRemoveRights(int uniqueId, const String8& /*path*/) { 2040a38af09ebbacdc9aa0d5ecb24e2f0484bf4f191James Dong ALOGV("DrmPassthruPlugIn::onRemoveRights() : %d", uniqueId); 2052272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi return DRM_NO_ERROR; 20627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 20727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 2082272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimistatus_t DrmPassthruPlugIn::onRemoveAllRights(int uniqueId) { 2090a38af09ebbacdc9aa0d5ecb24e2f0484bf4f191James Dong ALOGV("DrmPassthruPlugIn::onRemoveAllRights() : %d", uniqueId); 2102272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi return DRM_NO_ERROR; 21127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 21227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 2135a8dbe7ad39fbfb9076894dcd24c596aae2cfccbMark Salyzynstatus_t DrmPassthruPlugIn::onOpenConvertSession(int uniqueId, int /*convertId*/) { 2140a38af09ebbacdc9aa0d5ecb24e2f0484bf4f191James Dong ALOGV("DrmPassthruPlugIn::onOpenConvertSession() : %d", uniqueId); 2152272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi return DRM_NO_ERROR; 21627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 21727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 21827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshiDrmConvertedStatus* DrmPassthruPlugIn::onConvertData( 2195a8dbe7ad39fbfb9076894dcd24c596aae2cfccbMark Salyzyn int uniqueId, int /*convertId*/, const DrmBuffer* inputData) { 2200a38af09ebbacdc9aa0d5ecb24e2f0484bf4f191James Dong ALOGV("DrmPassthruPlugIn::onConvertData() : %d", uniqueId); 22127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi DrmBuffer* convertedData = NULL; 22227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 22327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if (NULL != inputData && 0 < inputData->length) { 22427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi int length = inputData->length; 22527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi char* data = NULL; 22627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data = new char[length]; 22727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi convertedData = new DrmBuffer(data, length); 22827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi memcpy(convertedData->data, inputData->data, length); 22927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 23027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return new DrmConvertedStatus(DrmConvertedStatus::STATUS_OK, convertedData, 0 /*offset*/); 23127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 23227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 2335a8dbe7ad39fbfb9076894dcd24c596aae2cfccbMark SalyzynDrmConvertedStatus* DrmPassthruPlugIn::onCloseConvertSession(int uniqueId, int /*convertId*/) { 2340a38af09ebbacdc9aa0d5ecb24e2f0484bf4f191James Dong ALOGV("DrmPassthruPlugIn::onCloseConvertSession() : %d", uniqueId); 23527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return new DrmConvertedStatus(DrmConvertedStatus::STATUS_OK, NULL, 0 /*offset*/); 23627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 23727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 23827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshistatus_t DrmPassthruPlugIn::onOpenDecryptSession( 2395a8dbe7ad39fbfb9076894dcd24c596aae2cfccbMark Salyzyn int uniqueId, DecryptHandle* decryptHandle, int /*fd*/, off64_t /*offset*/, off64_t /*length*/) { 2400a38af09ebbacdc9aa0d5ecb24e2f0484bf4f191James Dong ALOGV("DrmPassthruPlugIn::onOpenDecryptSession() : %d", uniqueId); 24127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 24227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi#ifdef ENABLE_PASSTHRU_DECRYPTION 24327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi decryptHandle->mimeType = String8("video/passthru"); 24427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi decryptHandle->decryptApiType = DecryptApiType::ELEMENTARY_STREAM_BASED; 24527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi decryptHandle->status = DRM_NO_ERROR; 24627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi decryptHandle->decryptInfo = NULL; 24727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return DRM_NO_ERROR; 24827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi#endif 24927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 25027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return DRM_ERROR_CANNOT_HANDLE; 25127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 25227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 253e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimistatus_t DrmPassthruPlugIn::onOpenDecryptSession( 2545a8dbe7ad39fbfb9076894dcd24c596aae2cfccbMark Salyzyn int /*uniqueId*/, DecryptHandle* /*decryptHandle*/, const char* /*uri*/) { 255e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi return DRM_ERROR_CANNOT_HANDLE; 256e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi} 257e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi 2582272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimistatus_t DrmPassthruPlugIn::onCloseDecryptSession(int uniqueId, DecryptHandle* decryptHandle) { 2590a38af09ebbacdc9aa0d5ecb24e2f0484bf4f191James Dong ALOGV("DrmPassthruPlugIn::onCloseDecryptSession() : %d", uniqueId); 26027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if (NULL != decryptHandle) { 26127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if (NULL != decryptHandle->decryptInfo) { 26227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi delete decryptHandle->decryptInfo; decryptHandle->decryptInfo = NULL; 26327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 26427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi delete decryptHandle; decryptHandle = NULL; 26527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 2662272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi return DRM_NO_ERROR; 26727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 26827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 2695a8dbe7ad39fbfb9076894dcd24c596aae2cfccbMark Salyzynstatus_t DrmPassthruPlugIn::onInitializeDecryptUnit(int uniqueId, DecryptHandle* /*decryptHandle*/, 2705a8dbe7ad39fbfb9076894dcd24c596aae2cfccbMark Salyzyn int /*decryptUnitId*/, const DrmBuffer* /*headerInfo*/) { 2710a38af09ebbacdc9aa0d5ecb24e2f0484bf4f191James Dong ALOGV("DrmPassthruPlugIn::onInitializeDecryptUnit() : %d", uniqueId); 2722272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi return DRM_NO_ERROR; 27327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 27427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 2755a8dbe7ad39fbfb9076894dcd24c596aae2cfccbMark Salyzynstatus_t DrmPassthruPlugIn::onDecrypt(int uniqueId, DecryptHandle* /*decryptHandle*/, 2765a8dbe7ad39fbfb9076894dcd24c596aae2cfccbMark Salyzyn int /*decryptUnitId*/, const DrmBuffer* encBuffer, DrmBuffer** decBuffer, DrmBuffer* /*IV*/) { 2770a38af09ebbacdc9aa0d5ecb24e2f0484bf4f191James Dong ALOGV("DrmPassthruPlugIn::onDecrypt() : %d", uniqueId); 27827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi /** 27927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi * As a workaround implementation passthru would copy the given 28027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi * encrypted buffer as it is to decrypted buffer. Note, decBuffer 28127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi * memory has to be allocated by the caller. 28227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi */ 28327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if (NULL != (*decBuffer) && 0 < (*decBuffer)->length) { 28435250664455c9642cc14d3831b663880637a7d70James Dong if ((*decBuffer)->length >= encBuffer->length) { 28535250664455c9642cc14d3831b663880637a7d70James Dong memcpy((*decBuffer)->data, encBuffer->data, encBuffer->length); 28635250664455c9642cc14d3831b663880637a7d70James Dong (*decBuffer)->length = encBuffer->length; 28735250664455c9642cc14d3831b663880637a7d70James Dong } else { 28835250664455c9642cc14d3831b663880637a7d70James Dong ALOGE("decBuffer size (%d) too small to hold %d bytes", 28935250664455c9642cc14d3831b663880637a7d70James Dong (*decBuffer)->length, encBuffer->length); 29035250664455c9642cc14d3831b663880637a7d70James Dong return DRM_ERROR_UNKNOWN; 29135250664455c9642cc14d3831b663880637a7d70James Dong } 29227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 29327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return DRM_NO_ERROR; 29427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 29527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 2962272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimistatus_t DrmPassthruPlugIn::onFinalizeDecryptUnit( 2975a8dbe7ad39fbfb9076894dcd24c596aae2cfccbMark Salyzyn int uniqueId, DecryptHandle* /*decryptHandle*/, int /*decryptUnitId*/) { 2980a38af09ebbacdc9aa0d5ecb24e2f0484bf4f191James Dong ALOGV("DrmPassthruPlugIn::onFinalizeDecryptUnit() : %d", uniqueId); 2992272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi return DRM_NO_ERROR; 30027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 30127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 3025a8dbe7ad39fbfb9076894dcd24c596aae2cfccbMark Salyzynssize_t DrmPassthruPlugIn::onPread(int uniqueId, DecryptHandle* /*decryptHandle*/, 3035a8dbe7ad39fbfb9076894dcd24c596aae2cfccbMark Salyzyn void* /*buffer*/, ssize_t /*numBytes*/, off64_t /*offset*/) { 3040a38af09ebbacdc9aa0d5ecb24e2f0484bf4f191James Dong ALOGV("DrmPassthruPlugIn::onPread() : %d", uniqueId); 30527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return 0; 30627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 30727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 308