DrmPassthruPlugIn.cpp revision 0bf43848adb00922122b0a0eed2fa0318bde8317
123b797ab5151eb2474f3bdd679f2f07bfd723042John Reck/* 223b797ab5151eb2474f3bdd679f2f07bfd723042John Reck * Copyright (C) 2010 The Android Open Source Project 323b797ab5151eb2474f3bdd679f2f07bfd723042John Reck * 423b797ab5151eb2474f3bdd679f2f07bfd723042John Reck * Licensed under the Apache License, Version 2.0 (the "License"); 523b797ab5151eb2474f3bdd679f2f07bfd723042John Reck * you may not use this file except in compliance with the License. 623b797ab5151eb2474f3bdd679f2f07bfd723042John Reck * You may obtain a copy of the License at 723b797ab5151eb2474f3bdd679f2f07bfd723042John Reck * 823b797ab5151eb2474f3bdd679f2f07bfd723042John Reck * http://www.apache.org/licenses/LICENSE-2.0 923b797ab5151eb2474f3bdd679f2f07bfd723042John Reck * 1023b797ab5151eb2474f3bdd679f2f07bfd723042John Reck * Unless required by applicable law or agreed to in writing, software 1123b797ab5151eb2474f3bdd679f2f07bfd723042John Reck * distributed under the License is distributed on an "AS IS" BASIS, 1223b797ab5151eb2474f3bdd679f2f07bfd723042John Reck * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1323b797ab5151eb2474f3bdd679f2f07bfd723042John Reck * See the License for the specific language governing permissions and 1423b797ab5151eb2474f3bdd679f2f07bfd723042John Reck * limitations under the License. 1523b797ab5151eb2474f3bdd679f2f07bfd723042John Reck */ 1623b797ab5151eb2474f3bdd679f2f07bfd723042John Reck 1738e0c32852e3b9d8ca4a9d3791577f52536419cbJohn Reck//#define LOG_NDEBUG 0 1823b797ab5151eb2474f3bdd679f2f07bfd723042John Reck#define LOG_TAG "DrmPassthruPlugIn" 1923b797ab5151eb2474f3bdd679f2f07bfd723042John Reck#include <utils/Log.h> 20d04794a9a3f9edc8b7ca336175d66eb81a8f55faJohn Reck 21d04794a9a3f9edc8b7ca336175d66eb81a8f55faJohn Reck#include <drm/DrmRights.h> 22d04794a9a3f9edc8b7ca336175d66eb81a8f55faJohn Reck#include <drm/DrmConstraints.h> 233b20251a355c88193c439f928a84ae69483fb488John Reck#include <drm/DrmMetadata.h> 240b7e8245db728d127ada698be63d78b33fc6e4daChris Craik#include <drm/DrmInfo.h> 25d04794a9a3f9edc8b7ca336175d66eb81a8f55faJohn Reck#include <drm/DrmInfoEvent.h> 26d04794a9a3f9edc8b7ca336175d66eb81a8f55faJohn Reck#include <drm/DrmInfoStatus.h> 27d04794a9a3f9edc8b7ca336175d66eb81a8f55faJohn Reck#include <drm/DrmConvertedStatus.h> 284f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck#include <drm/DrmInfoRequest.h> 29dccca44ffda4836b56a21da95a046c9708ffd49csergeyv#include <drm/DrmSupportInfo.h> 30d04794a9a3f9edc8b7ca336175d66eb81a8f55faJohn Reck#include <DrmPassthruPlugIn.h> 31d04794a9a3f9edc8b7ca336175d66eb81a8f55faJohn Reck 32e248bd1b2c3fcf8088429507e73b31f45ee2544bJohn Reckusing namespace android; 339372ac3621848085e77b867f220c0b5ffce4010dJohn Reck 34e486d932ca5a10446a3c98d6d065213913277268John Reck 3523b797ab5151eb2474f3bdd679f2f07bfd723042John Reck// This extern "C" is mandatory to be managed by TPlugInManager 36240ff6246a29602539fd0295274e1c769e743a2eJohn Reckextern "C" IDrmEngine* create() { 37e248bd1b2c3fcf8088429507e73b31f45ee2544bJohn Reck return new DrmPassthruPlugIn(); 3865fe5eeb19e2e15c8b1ee91e8a2dcf0c25e48ca6Chris Craik} 39e248bd1b2c3fcf8088429507e73b31f45ee2544bJohn Reck 40e248bd1b2c3fcf8088429507e73b31f45ee2544bJohn Reck// This extern "C" is mandatory to be managed by TPlugInManager 41e248bd1b2c3fcf8088429507e73b31f45ee2544bJohn Reckextern "C" void destroy(IDrmEngine* pPlugIn) { 42e248bd1b2c3fcf8088429507e73b31f45ee2544bJohn Reck delete pPlugIn; 43e248bd1b2c3fcf8088429507e73b31f45ee2544bJohn Reck pPlugIn = NULL; 4465fe5eeb19e2e15c8b1ee91e8a2dcf0c25e48ca6Chris Craik} 45290b23a1e11d532b39098bb58693ef97ba98a622Colin Cross 46290b23a1e11d532b39098bb58693ef97ba98a622Colin CrossDrmPassthruPlugIn::DrmPassthruPlugIn() 47f47a594f5250b1914c36423ee6b371f0b8db09d0John Reck : DrmEngineBase() { 48f47a594f5250b1914c36423ee6b371f0b8db09d0John Reck 49f47a594f5250b1914c36423ee6b371f0b8db09d0John Reck} 50e248bd1b2c3fcf8088429507e73b31f45ee2544bJohn Reck 51e248bd1b2c3fcf8088429507e73b31f45ee2544bJohn ReckDrmPassthruPlugIn::~DrmPassthruPlugIn() { 52149173d28c0843aba86b0810ce75b34be6a0d08fJohn Reck 53149173d28c0843aba86b0810ce75b34be6a0d08fJohn Reck} 54149173d28c0843aba86b0810ce75b34be6a0d08fJohn Reck 55149173d28c0843aba86b0810ce75b34be6a0d08fJohn ReckDrmMetadata* DrmPassthruPlugIn::onGetMetadata(int uniqueId, const String8* path) { 56149173d28c0843aba86b0810ce75b34be6a0d08fJohn Reck return NULL; 57149173d28c0843aba86b0810ce75b34be6a0d08fJohn Reck} 58149173d28c0843aba86b0810ce75b34be6a0d08fJohn Reck 59149173d28c0843aba86b0810ce75b34be6a0d08fJohn ReckDrmConstraints* DrmPassthruPlugIn::onGetConstraints( 6023b797ab5151eb2474f3bdd679f2f07bfd723042John Reck int uniqueId, const String8* path, int action) { 6123b797ab5151eb2474f3bdd679f2f07bfd723042John Reck ALOGV("DrmPassthruPlugIn::onGetConstraints From Path: %d", uniqueId); 6223b797ab5151eb2474f3bdd679f2f07bfd723042John Reck DrmConstraints* drmConstraints = new DrmConstraints(); 6323b797ab5151eb2474f3bdd679f2f07bfd723042John Reck 64119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck String8 value("dummy_available_time"); 65119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck char* charValue = NULL; 663b20251a355c88193c439f928a84ae69483fb488John Reck charValue = new char[value.length() + 1]; 673b20251a355c88193c439f928a84ae69483fb488John Reck strncpy(charValue, value.string(), value.length()); 684f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck charValue[value.length()] = '\0'; 6951d6a3db97bdd5315f1a17a4b447d10a92217b98Chris Craik 704c9e59d03c2bca38001225b79d01740b8999adfbJohn Reck //Just add dummy available time for verification 71ea7a7fb75acb7305eb774ca7bc7e96103bd49323Skuhne drmConstraints->put(&(DrmConstraints::LICENSE_AVAILABLE_TIME), charValue); 72b816087962aba0019b022303330f03b897b580edSkuhne delete[] charValue; 73ea7a7fb75acb7305eb774ca7bc7e96103bd49323Skuhne return drmConstraints; 74443a714fa7c0dd07fee3527cc5bc3d3ca1fb7d44John Reck} 75b36016c65f1d1b5846dba0349aab491dbd3a746aJohn Reck 7623b797ab5151eb2474f3bdd679f2f07bfd723042John ReckDrmInfoStatus* DrmPassthruPlugIn::onProcessDrmInfo(int uniqueId, const DrmInfo* drmInfo) { 7723b797ab5151eb2474f3bdd679f2f07bfd723042John Reck ALOGV("DrmPassthruPlugIn::onProcessDrmInfo - Enter : %d", uniqueId); 7823b797ab5151eb2474f3bdd679f2f07bfd723042John Reck DrmInfoStatus* drmInfoStatus = NULL; 7917035b0211a3c9d45ea46a99217a6acbe76e8fbeJohn Reck if (NULL != drmInfo) { 80443a714fa7c0dd07fee3527cc5bc3d3ca1fb7d44John Reck switch (drmInfo->getInfoType()) { 814f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck case DrmInfoRequest::TYPE_REGISTRATION_INFO: { 824f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck const DrmBuffer* emptyBuffer = new DrmBuffer(); 8317035b0211a3c9d45ea46a99217a6acbe76e8fbeJohn Reck drmInfoStatus = new DrmInfoStatus(DrmInfoStatus::STATUS_OK, 8417035b0211a3c9d45ea46a99217a6acbe76e8fbeJohn Reck DrmInfoRequest::TYPE_REGISTRATION_INFO, emptyBuffer, drmInfo->getMimeType()); 85d41c4d8c732095ae99c955b6b82f7306633004b1Chris Craik break; 8617035b0211a3c9d45ea46a99217a6acbe76e8fbeJohn Reck } 8717035b0211a3c9d45ea46a99217a6acbe76e8fbeJohn Reck case DrmInfoRequest::TYPE_UNREGISTRATION_INFO: { 88e2478d45ccbe5b6abb360ac9d44771b5f4a50bdeJohn Reck const DrmBuffer* emptyBuffer = new DrmBuffer(); 894f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck drmInfoStatus = new DrmInfoStatus(DrmInfoStatus::STATUS_OK, 904f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck DrmInfoRequest::TYPE_UNREGISTRATION_INFO, emptyBuffer, drmInfo->getMimeType()); 91d41c4d8c732095ae99c955b6b82f7306633004b1Chris Craik break; 924f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck } 9323b797ab5151eb2474f3bdd679f2f07bfd723042John Reck case DrmInfoRequest::TYPE_RIGHTS_ACQUISITION_INFO: { 9423b797ab5151eb2474f3bdd679f2f07bfd723042John Reck String8 licenseString("dummy_license_string"); 95f648108f83d4e74811919e9811efb8fcc184b8a3John Reck const int bufferSize = licenseString.size(); 96fbc8df03e498baf47ff1a5e05e182f1bcd60c770John Reck char* data = NULL; 97fbc8df03e498baf47ff1a5e05e182f1bcd60c770John Reck data = new char[bufferSize]; 98f648108f83d4e74811919e9811efb8fcc184b8a3John Reck memcpy(data, licenseString.string(), bufferSize); 99a5dda645da738da7b4ae15e28fa7d93d3b04b94fJohn Reck const DrmBuffer* buffer = new DrmBuffer(data, bufferSize); 10023b797ab5151eb2474f3bdd679f2f07bfd723042John Reck drmInfoStatus = new DrmInfoStatus(DrmInfoStatus::STATUS_OK, 1013b20251a355c88193c439f928a84ae69483fb488John Reck DrmInfoRequest::TYPE_RIGHTS_ACQUISITION_INFO, buffer, drmInfo->getMimeType()); 10223b797ab5151eb2474f3bdd679f2f07bfd723042John Reck break; 10323b797ab5151eb2474f3bdd679f2f07bfd723042John Reck } 10423b797ab5151eb2474f3bdd679f2f07bfd723042John Reck } 105f648108f83d4e74811919e9811efb8fcc184b8a3John Reck } 106f648108f83d4e74811919e9811efb8fcc184b8a3John Reck ALOGV("DrmPassthruPlugIn::onProcessDrmInfo - Exit"); 10723b797ab5151eb2474f3bdd679f2f07bfd723042John Reck return drmInfoStatus; 10823b797ab5151eb2474f3bdd679f2f07bfd723042John Reck} 10923b797ab5151eb2474f3bdd679f2f07bfd723042John Reck 1101125d1fa92ab9f3b8315bbfb72e038b62dfd454bJohn Reckstatus_t DrmPassthruPlugIn::onSetOnInfoListener( 1111125d1fa92ab9f3b8315bbfb72e038b62dfd454bJohn Reck int uniqueId, const IDrmEngine::OnInfoListener* infoListener) { 1124f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck ALOGV("DrmPassthruPlugIn::onSetOnInfoListener : %d", uniqueId); 113e486d932ca5a10446a3c98d6d065213913277268John Reck return DRM_NO_ERROR; 114dbc9a86d05e5e835051de22f6cb30ec1921e9705John Reck} 115368cdd85268999997fb495cf90c4417221797de0John Reck 116368cdd85268999997fb495cf90c4417221797de0John Reckstatus_t DrmPassthruPlugIn::onInitialize(int uniqueId) { 1174f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck ALOGV("DrmPassthruPlugIn::onInitialize : %d", uniqueId); 1184f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck return DRM_NO_ERROR; 1194f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck} 120f7d9c1dc84671d4e99657ef071d275700d85bb11John Reck 121f7d9c1dc84671d4e99657ef071d275700d85bb11John Reckstatus_t DrmPassthruPlugIn::onTerminate(int uniqueId) { 122f7d9c1dc84671d4e99657ef071d275700d85bb11John Reck ALOGV("DrmPassthruPlugIn::onTerminate : %d", uniqueId); 123dbc9a86d05e5e835051de22f6cb30ec1921e9705John Reck return DRM_NO_ERROR; 1244f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck} 1254f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck 1261125d1fa92ab9f3b8315bbfb72e038b62dfd454bJohn ReckDrmSupportInfo* DrmPassthruPlugIn::onGetSupportInfo(int uniqueId) { 1271125d1fa92ab9f3b8315bbfb72e038b62dfd454bJohn Reck ALOGV("DrmPassthruPlugIn::onGetSupportInfo : %d", uniqueId); 1281125d1fa92ab9f3b8315bbfb72e038b62dfd454bJohn Reck DrmSupportInfo* drmSupportInfo = new DrmSupportInfo(); 1291125d1fa92ab9f3b8315bbfb72e038b62dfd454bJohn Reck // Add mimetype's 130f648108f83d4e74811919e9811efb8fcc184b8a3John Reck drmSupportInfo->addMimeType(String8("application/vnd.passthru.drm")); 131f648108f83d4e74811919e9811efb8fcc184b8a3John Reck // Add File Suffixes 132b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik drmSupportInfo->addFileSuffix(String8(".passthru")); 1330bcd0cb6b1193168fa2840855195347488daab9eThomas Buhot // Add plug-in description 1343b20251a355c88193c439f928a84ae69483fb488John Reck drmSupportInfo->setDescription(String8("Passthru plug-in")); 1354f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck return drmSupportInfo; 136b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik} 1374f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck 1384f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reckstatus_t DrmPassthruPlugIn::onSaveRights(int uniqueId, const DrmRights& drmRights, 139f648108f83d4e74811919e9811efb8fcc184b8a3John Reck const String8& rightsPath, const String8& contentPath) { 140f648108f83d4e74811919e9811efb8fcc184b8a3John Reck ALOGV("DrmPassthruPlugIn::onSaveRights : %d", uniqueId); 141f7d9c1dc84671d4e99657ef071d275700d85bb11John Reck return DRM_NO_ERROR; 142f7d9c1dc84671d4e99657ef071d275700d85bb11John Reck} 143f648108f83d4e74811919e9811efb8fcc184b8a3John Reck 14401a5ea35fbba4c5bb1d7790ae1677a2fa752e042John ReckDrmInfo* DrmPassthruPlugIn::onAcquireDrmInfo(int uniqueId, const DrmInfoRequest* drmInfoRequest) { 1454f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck ALOGV("DrmPassthruPlugIn::onAcquireDrmInfo : %d", uniqueId); 1464f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck DrmInfo* drmInfo = NULL; 147284b24358410cb0200e525a5ba36994090c83f20Chris Craik 14850210d912925aef14e4ce69be82e4949122a3cd9Alan Viverette if (NULL != drmInfoRequest) { 14964bb413a664001c95c8439cf097dc3033f4ed733Andreas Gampe String8 dataString("dummy_acquistion_string"); 15098787e6c9b2c10b1ab7820bdac168686025b924aChris Craik int length = dataString.length(); 1516e068c0182f6f85bccb855a647510724d1c65a13Chris Craik char* data = NULL; 15298787e6c9b2c10b1ab7820bdac168686025b924aChris Craik data = new char[length]; 15398787e6c9b2c10b1ab7820bdac168686025b924aChris Craik memcpy(data, dataString.string(), length); 15498787e6c9b2c10b1ab7820bdac168686025b924aChris Craik drmInfo = new DrmInfo(drmInfoRequest->getInfoType(), 1554f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck DrmBuffer(data, length), drmInfoRequest->getMimeType()); 15650210d912925aef14e4ce69be82e4949122a3cd9Alan Viverette } 15798787e6c9b2c10b1ab7820bdac168686025b924aChris Craik return drmInfo; 15850210d912925aef14e4ce69be82e4949122a3cd9Alan Viverette} 15950210d912925aef14e4ce69be82e4949122a3cd9Alan Viverette 16050210d912925aef14e4ce69be82e4949122a3cd9Alan Viverettebool DrmPassthruPlugIn::onCanHandle(int uniqueId, const String8& path) { 16198787e6c9b2c10b1ab7820bdac168686025b924aChris Craik ALOGV("DrmPassthruPlugIn::canHandle: %s ", path.string()); 1626e068c0182f6f85bccb855a647510724d1c65a13Chris Craik String8 extension = path.getPathExtension(); 16398787e6c9b2c10b1ab7820bdac168686025b924aChris Craik extension.toLower(); 16450210d912925aef14e4ce69be82e4949122a3cd9Alan Viverette return (String8(".passthru") == extension); 16550210d912925aef14e4ce69be82e4949122a3cd9Alan Viverette} 16698787e6c9b2c10b1ab7820bdac168686025b924aChris Craik 1674f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John ReckString8 DrmPassthruPlugIn::onGetOriginalMimeType(int uniqueId, const String8& path, int fd) { 1684f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck ALOGV("DrmPassthruPlugIn::onGetOriginalMimeType() : %d", uniqueId); 16963a06673253914510bbeebd500655008682dade1John Reck return String8("video/passthru"); 17063a06673253914510bbeebd500655008682dade1John Reck} 17163a06673253914510bbeebd500655008682dade1John Reck 17263a06673253914510bbeebd500655008682dade1John Reckint DrmPassthruPlugIn::onGetDrmObjectType( 173860d155f866cc15a725e7ce03763280987f24901John Reck int uniqueId, const String8& path, const String8& mimeType) { 174dbc9a86d05e5e835051de22f6cb30ec1921e9705John Reck ALOGV("DrmPassthruPlugIn::onGetDrmObjectType() : %d", uniqueId); 175dbc9a86d05e5e835051de22f6cb30ec1921e9705John Reck return DrmObjectType::UNKNOWN; 176f2dcc2aecb94e726096256c47b913ed0a57ae7e2John Reck} 177f2dcc2aecb94e726096256c47b913ed0a57ae7e2John Reck 178f2dcc2aecb94e726096256c47b913ed0a57ae7e2John Reckint DrmPassthruPlugIn::onCheckRightsStatus(int uniqueId, const String8& path, int action) { 179f2dcc2aecb94e726096256c47b913ed0a57ae7e2John Reck ALOGV("DrmPassthruPlugIn::onCheckRightsStatus() : %d", uniqueId); 180f2dcc2aecb94e726096256c47b913ed0a57ae7e2John Reck int rightsStatus = RightsStatus::RIGHTS_VALID; 181860d155f866cc15a725e7ce03763280987f24901John Reck return rightsStatus; 182860d155f866cc15a725e7ce03763280987f24901John Reck} 183bf3c602284f9a344faf185c3a5e94a264ba44c4fJohn Reck 1841b54fb27ac48495ed0b33868fda5776fb49fe0f3Chris Craikstatus_t DrmPassthruPlugIn::onConsumeRights(int uniqueId, DecryptHandle* decryptHandle, 185bf3c602284f9a344faf185c3a5e94a264ba44c4fJohn Reck int action, bool reserve) { 186bf3c602284f9a344faf185c3a5e94a264ba44c4fJohn Reck ALOGV("DrmPassthruPlugIn::onConsumeRights() : %d", uniqueId); 187ea7a7fb75acb7305eb774ca7bc7e96103bd49323Skuhne return DRM_NO_ERROR; 188ea7a7fb75acb7305eb774ca7bc7e96103bd49323Skuhne} 189f9be77940e365036fecd8cc0e491e8545c34e79bJohn Reck 19018f16e6fba74eda173e1e7c869e6e2e2acc073ffJohn Reckstatus_t DrmPassthruPlugIn::onSetPlaybackStatus(int uniqueId, DecryptHandle* decryptHandle, 191bf3c602284f9a344faf185c3a5e94a264ba44c4fJohn Reck int playbackStatus, int64_t position) { 192bf3c602284f9a344faf185c3a5e94a264ba44c4fJohn Reck ALOGV("DrmPassthruPlugIn::onSetPlaybackStatus() : %d", uniqueId); 193bf3c602284f9a344faf185c3a5e94a264ba44c4fJohn Reck return DRM_NO_ERROR; 194bf3c602284f9a344faf185c3a5e94a264ba44c4fJohn Reck} 195bf3c602284f9a344faf185c3a5e94a264ba44c4fJohn Reck 196ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reckbool DrmPassthruPlugIn::onValidateAction(int uniqueId, const String8& path, 197be3fba05e823f740f65b2679929347dc3dd282adJohn Reck int action, const ActionDescription& description) { 198ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck ALOGV("DrmPassthruPlugIn::onValidateAction() : %d", uniqueId); 199ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck return true; 200e4267ea4f20740c37c01bfb6aefcf61fddc4566aJohn Reck} 2010b7e8245db728d127ada698be63d78b33fc6e4daChris Craik 2020b7e8245db728d127ada698be63d78b33fc6e4daChris Craikstatus_t DrmPassthruPlugIn::onRemoveRights(int uniqueId, const String8& path) { 2030b7e8245db728d127ada698be63d78b33fc6e4daChris Craik ALOGV("DrmPassthruPlugIn::onRemoveRights() : %d", uniqueId); 20425fbb3fa1138675379102a44405852555cefccbdJohn Reck return DRM_NO_ERROR; 2050b7e8245db728d127ada698be63d78b33fc6e4daChris Craik} 20600e79c9947b741194ff6c0d08ede9b3befbf9c9dJohn Reck 207f648108f83d4e74811919e9811efb8fcc184b8a3John Reckstatus_t DrmPassthruPlugIn::onRemoveAllRights(int uniqueId) { 208f648108f83d4e74811919e9811efb8fcc184b8a3John Reck ALOGV("DrmPassthruPlugIn::onRemoveAllRights() : %d", uniqueId); 209f648108f83d4e74811919e9811efb8fcc184b8a3John Reck return DRM_NO_ERROR; 210f648108f83d4e74811919e9811efb8fcc184b8a3John Reck} 211ec845a215e343cdb3b2e4c7b6aff7b24beb0236bJohn Reck 212ea7a7fb75acb7305eb774ca7bc7e96103bd49323Skuhnestatus_t DrmPassthruPlugIn::onOpenConvertSession(int uniqueId, int convertId) { 213ea7a7fb75acb7305eb774ca7bc7e96103bd49323Skuhne ALOGV("DrmPassthruPlugIn::onOpenConvertSession() : %d", uniqueId); 214ea7a7fb75acb7305eb774ca7bc7e96103bd49323Skuhne return DRM_NO_ERROR; 215ea7a7fb75acb7305eb774ca7bc7e96103bd49323Skuhne} 216ea7a7fb75acb7305eb774ca7bc7e96103bd49323Skuhne 217ea7a7fb75acb7305eb774ca7bc7e96103bd49323SkuhneDrmConvertedStatus* DrmPassthruPlugIn::onConvertData( 218975591a7af883d866d86ab819e164c6004694744John Reck int uniqueId, int convertId, const DrmBuffer* inputData) { 219ea7a7fb75acb7305eb774ca7bc7e96103bd49323Skuhne ALOGV("DrmPassthruPlugIn::onConvertData() : %d", uniqueId); 220119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck DrmBuffer* convertedData = NULL; 221975591a7af883d866d86ab819e164c6004694744John Reck 222e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck if (NULL != inputData && 0 < inputData->length) { 22300e79c9947b741194ff6c0d08ede9b3befbf9c9dJohn Reck int length = inputData->length; 224975591a7af883d866d86ab819e164c6004694744John Reck char* data = NULL; 225998a6d81896df8b662cc10ddeb35087b78b38d72John Reck data = new char[length]; 226f648108f83d4e74811919e9811efb8fcc184b8a3John Reck convertedData = new DrmBuffer(data, length); 2271b54fb27ac48495ed0b33868fda5776fb49fe0f3Chris Craik memcpy(convertedData->data, inputData->data, length); 228aa95a88327d9a3ac8a4a00b065b78ac0f28b3a19John Reck } 229aa95a88327d9a3ac8a4a00b065b78ac0f28b3a19John Reck return new DrmConvertedStatus(DrmConvertedStatus::STATUS_OK, convertedData, 0 /*offset*/); 230aa95a88327d9a3ac8a4a00b065b78ac0f28b3a19John Reck} 231aa95a88327d9a3ac8a4a00b065b78ac0f28b3a19John Reck 232e486d932ca5a10446a3c98d6d065213913277268John ReckDrmConvertedStatus* DrmPassthruPlugIn::onCloseConvertSession(int uniqueId, int convertId) { 233e486d932ca5a10446a3c98d6d065213913277268John Reck ALOGV("DrmPassthruPlugIn::onCloseConvertSession() : %d", uniqueId); 234e486d932ca5a10446a3c98d6d065213913277268John Reck return new DrmConvertedStatus(DrmConvertedStatus::STATUS_OK, NULL, 0 /*offset*/); 23552b783f76af58a948dad4d3b4d1b7ad7979347ceJohn Reck} 236e486d932ca5a10446a3c98d6d065213913277268John Reck 237e486d932ca5a10446a3c98d6d065213913277268John Reckstatus_t DrmPassthruPlugIn::onOpenDecryptSession( 238e486d932ca5a10446a3c98d6d065213913277268John Reck int uniqueId, DecryptHandle* decryptHandle, int fd, off64_t offset, off64_t length) { 239e486d932ca5a10446a3c98d6d065213913277268John Reck ALOGV("DrmPassthruPlugIn::onOpenDecryptSession() : %d", uniqueId); 240e486d932ca5a10446a3c98d6d065213913277268John Reck 241e486d932ca5a10446a3c98d6d065213913277268John Reck#ifdef ENABLE_PASSTHRU_DECRYPTION 242e486d932ca5a10446a3c98d6d065213913277268John Reck decryptHandle->mimeType = String8("video/passthru"); 243e486d932ca5a10446a3c98d6d065213913277268John Reck decryptHandle->decryptApiType = DecryptApiType::ELEMENTARY_STREAM_BASED; 244e486d932ca5a10446a3c98d6d065213913277268John Reck decryptHandle->status = DRM_NO_ERROR; 245e486d932ca5a10446a3c98d6d065213913277268John Reck decryptHandle->decryptInfo = NULL; 246e486d932ca5a10446a3c98d6d065213913277268John Reck return DRM_NO_ERROR; 247e486d932ca5a10446a3c98d6d065213913277268John Reck#endif 248e486d932ca5a10446a3c98d6d065213913277268John Reck 249f648108f83d4e74811919e9811efb8fcc184b8a3John Reck return DRM_ERROR_CANNOT_HANDLE; 250f648108f83d4e74811919e9811efb8fcc184b8a3John Reck} 251f648108f83d4e74811919e9811efb8fcc184b8a3John Reck 252e486d932ca5a10446a3c98d6d065213913277268John Reckstatus_t DrmPassthruPlugIn::onOpenDecryptSession( 253e486d932ca5a10446a3c98d6d065213913277268John Reck int uniqueId, DecryptHandle* decryptHandle, const char* uri) { 254e486d932ca5a10446a3c98d6d065213913277268John Reck return DRM_ERROR_CANNOT_HANDLE; 255e486d932ca5a10446a3c98d6d065213913277268John Reck} 256e486d932ca5a10446a3c98d6d065213913277268John Reck 257a5dda645da738da7b4ae15e28fa7d93d3b04b94fJohn Reckstatus_t DrmPassthruPlugIn::onCloseDecryptSession(int uniqueId, DecryptHandle* decryptHandle) { 258aef9dc8d186bd5f78068ab2d5240b5e9c8ab44b6John Reck ALOGV("DrmPassthruPlugIn::onCloseDecryptSession() : %d", uniqueId); 2591b54fb27ac48495ed0b33868fda5776fb49fe0f3Chris Craik if (NULL != decryptHandle) { 260aef9dc8d186bd5f78068ab2d5240b5e9c8ab44b6John Reck if (NULL != decryptHandle->decryptInfo) { 261aef9dc8d186bd5f78068ab2d5240b5e9c8ab44b6John Reck delete decryptHandle->decryptInfo; decryptHandle->decryptInfo = NULL; 262a5dda645da738da7b4ae15e28fa7d93d3b04b94fJohn Reck } 263cd028f336e36b22dbe8cf623eb5bd2361314495cJohn Reck delete decryptHandle; decryptHandle = NULL; 264f9be77940e365036fecd8cc0e491e8545c34e79bJohn Reck } 265f9be77940e365036fecd8cc0e491e8545c34e79bJohn Reck return DRM_NO_ERROR; 266f9be77940e365036fecd8cc0e491e8545c34e79bJohn Reck} 267f9be77940e365036fecd8cc0e491e8545c34e79bJohn Reck 268e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reckstatus_t DrmPassthruPlugIn::onInitializeDecryptUnit(int uniqueId, DecryptHandle* decryptHandle, 269e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck int decryptUnitId, const DrmBuffer* headerInfo) { 270e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck ALOGV("DrmPassthruPlugIn::onInitializeDecryptUnit() : %d", uniqueId); 271f47a594f5250b1914c36423ee6b371f0b8db09d0John Reck return DRM_NO_ERROR; 272f47a594f5250b1914c36423ee6b371f0b8db09d0John Reck} 273f47a594f5250b1914c36423ee6b371f0b8db09d0John Reck 274f47a594f5250b1914c36423ee6b371f0b8db09d0John Reckstatus_t DrmPassthruPlugIn::onDecrypt(int uniqueId, DecryptHandle* decryptHandle, 275a5dda645da738da7b4ae15e28fa7d93d3b04b94fJohn Reck int decryptUnitId, const DrmBuffer* encBuffer, DrmBuffer** decBuffer, DrmBuffer* IV) { 276a5dda645da738da7b4ae15e28fa7d93d3b04b94fJohn Reck ALOGV("DrmPassthruPlugIn::onDecrypt() : %d", uniqueId); 277a5dda645da738da7b4ae15e28fa7d93d3b04b94fJohn Reck /** 278a5dda645da738da7b4ae15e28fa7d93d3b04b94fJohn Reck * As a workaround implementation passthru would copy the given 279a5dda645da738da7b4ae15e28fa7d93d3b04b94fJohn Reck * encrypted buffer as it is to decrypted buffer. Note, decBuffer 280e4267ea4f20740c37c01bfb6aefcf61fddc4566aJohn Reck * memory has to be allocated by the caller. 281b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik */ 2824f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck if (NULL != (*decBuffer) && 0 < (*decBuffer)->length) { 283a7090e0cfd7c719a6d4c03aae34f5db98754cbddChris Craik if ((*decBuffer)->length >= encBuffer->length) { 284b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik memcpy((*decBuffer)->data, encBuffer->data, encBuffer->length); 2854f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck (*decBuffer)->length = encBuffer->length; 286e4267ea4f20740c37c01bfb6aefcf61fddc4566aJohn Reck } else { 287e4267ea4f20740c37c01bfb6aefcf61fddc4566aJohn Reck ALOGE("decBuffer size (%d) too small to hold %d bytes", 288e4267ea4f20740c37c01bfb6aefcf61fddc4566aJohn Reck (*decBuffer)->length, encBuffer->length); 2896d4d0db312fa8a9fce629dd92aa133c6f8249cf8John Reck return DRM_ERROR_UNKNOWN; 2906d4d0db312fa8a9fce629dd92aa133c6f8249cf8John Reck } 2916d4d0db312fa8a9fce629dd92aa133c6f8249cf8John Reck } 2926d4d0db312fa8a9fce629dd92aa133c6f8249cf8John Reck return DRM_NO_ERROR; 2936d4d0db312fa8a9fce629dd92aa133c6f8249cf8John Reck} 294240ff6246a29602539fd0295274e1c769e743a2eJohn Reck 295240ff6246a29602539fd0295274e1c769e743a2eJohn Reckstatus_t DrmPassthruPlugIn::onFinalizeDecryptUnit( 296240ff6246a29602539fd0295274e1c769e743a2eJohn Reck int uniqueId, DecryptHandle* decryptHandle, int decryptUnitId) { 297149173d28c0843aba86b0810ce75b34be6a0d08fJohn Reck ALOGV("DrmPassthruPlugIn::onFinalizeDecryptUnit() : %d", uniqueId); 298b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik return DRM_NO_ERROR; 29977c40109cf25d29f85ee6c13aeb96e22e55f33abJohn Reck} 30064e445bf74bee2098781d608cedfd723d8cc88d3Chris Craik 301e4267ea4f20740c37c01bfb6aefcf61fddc4566aJohn Reckssize_t DrmPassthruPlugIn::onPread(int uniqueId, DecryptHandle* decryptHandle, 30277c40109cf25d29f85ee6c13aeb96e22e55f33abJohn Reck void* buffer, ssize_t numBytes, off64_t offset) { 30377c40109cf25d29f85ee6c13aeb96e22e55f33abJohn Reck ALOGV("DrmPassthruPlugIn::onPread() : %d", uniqueId); 304149173d28c0843aba86b0810ce75b34be6a0d08fJohn Reck return 0; 305149173d28c0843aba86b0810ce75b34be6a0d08fJohn Reck} 306e4267ea4f20740c37c01bfb6aefcf61fddc4566aJohn Reck 307fe5e7b7346a54537b980796ceeca66bfdbd05561John Reck