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