/*
* Copyright (C) 2010 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#ifndef __DRM_FRAMEWORK_COMMON_H__
#define __DRM_FRAMEWORK_COMMON_H__
#include <utils/Vector.h>
#include <utils/KeyedVector.h>
#include <utils/RefBase.h>
#include <utils/String8.h>
#include <utils/Errors.h>
#define INVALID_VALUE -1
namespace android {
/**
* Error code for DRM Frameowrk
*/
enum {
// The following constant values should be in sync with
// media/stagefright/MediaErrors.h
ERROR_BASE = -2000,
DRM_ERROR_UNKNOWN = ERROR_BASE,
DRM_ERROR_NO_LICENSE = ERROR_BASE - 1,
DRM_ERROR_LICENSE_EXPIRED = ERROR_BASE - 2,
DRM_ERROR_SESSION_NOT_OPENED = ERROR_BASE - 3,
DRM_ERROR_DECRYPT_UNIT_NOT_INITIALIZED = ERROR_BASE - 4,
DRM_ERROR_DECRYPT = ERROR_BASE - 5,
DRM_ERROR_CANNOT_HANDLE = ERROR_BASE - 6,
DRM_ERROR_TAMPER_DETECTED = ERROR_BASE - 7,
DRM_ERROR_NO_PERMISSION = ERROR_BASE - 8,
DRM_NO_ERROR = NO_ERROR
};
/**
* copy control settings used in DecryptHandle::copyControlVector
*/
enum DrmCopyControl {
DRM_COPY_CONTROL_BASE = 1000,
// the key used to set the value for HDCP
// if the associated value is 1, then HDCP is required
// otherwise, HDCP is not required
DRM_COPY_CONTROL_HDCP = DRM_COPY_CONTROL_BASE
};
/**
* Defines DRM Buffer
*/
class DrmBuffer {
public:
char* data;
int length;
DrmBuffer() :
data(NULL),
length(0) {
}
DrmBuffer(char* dataBytes, int dataLength) :
data(dataBytes),
length(dataLength) {
}
};
/**
* Defines detailed description of the action
*/
class ActionDescription {
public:
ActionDescription(int _outputType, int _configuration) :
outputType(_outputType),
configuration(_configuration) {
}
public:
int outputType; /* BLUETOOTH , HDMI*/
int configuration; /* RESOLUTION_720_480 , RECORDABLE etc.*/
};
/**
* Defines constants related to DRM types
*/
class DrmObjectType {
private:
DrmObjectType();
public:
/**
* Field specifies the unknown type
*/
static const int UNKNOWN = 0x00;
/**
* Field specifies the protected content type
*/
static const int CONTENT = 0x01;
/**
* Field specifies the rights information
*/
static const int RIGHTS_OBJECT = 0x02;
/**
* Field specifies the trigger information
*/
static const int TRIGGER_OBJECT = 0x03;
};
/**
* Defines constants related to play back
*/
class Playback {
private:
Playback();
public:
/**
* Constant field signifies playback start
*/
static const int START = 0x00;
/**
* Constant field signifies playback stop
*/
static const int STOP = 0x01;
/**
* Constant field signifies playback paused
*/
static const int PAUSE = 0x02;
/**
* Constant field signifies playback resumed
*/
static const int RESUME = 0x03;
};
/**
* Defines actions that can be performed on protected content
*/
class Action {
private:
Action();
public:
/**
* Constant field signifies that the default action
*/
static const int DEFAULT = 0x00;
/**
* Constant field signifies that the content can be played
*/
static const int PLAY = 0x01;
/**
* Constant field signifies that the content can be set as ring tone
*/
static const int RINGTONE = 0x02;
/**
* Constant field signifies that the content can be transfered
*/
static const int TRANSFER = 0x03;
/**
* Constant field signifies that the content can be set as output
*/
static const int OUTPUT = 0x04;
/**
* Constant field signifies that preview is allowed
*/
static const int PREVIEW = 0x05;
/**
* Constant field signifies that the content can be executed
*/
static const int EXECUTE = 0x06;
/**
* Constant field signifies that the content can displayed
*/
static const int DISPLAY = 0x07;
};
/**
* Defines constants related to status of the rights
*/
class RightsStatus {
private:
RightsStatus();
public:
/**
* Constant field signifies that the rights are valid
*/
static const int RIGHTS_VALID = 0x00;
/**
* Constant field signifies that the rights are invalid
*/
static const int RIGHTS_INVALID = 0x01;
/**
* Constant field signifies that the rights are expired for the content
*/
static const int RIGHTS_EXPIRED = 0x02;
/**
* Constant field signifies that the rights are not acquired for the content
*/
static const int RIGHTS_NOT_ACQUIRED = 0x03;
};
/**
* Defines API set for decryption
*/
class DecryptApiType {
private:
DecryptApiType();
public:
/**
* Decrypt API set for non encrypted content
*/
static const int NON_ENCRYPTED = 0x00;
/**
* Decrypt API set for ES based DRM
*/
static const int ELEMENTARY_STREAM_BASED = 0x01;
/**
* POSIX based Decrypt API set for container based DRM
*/
static const int CONTAINER_BASED = 0x02;
/**
* Decrypt API for Widevine streams
*/
static const int WV_BASED = 0x3;
};
/**
* Defines decryption information
*/
class DecryptInfo {
public:
/**
* size of memory to be allocated to get the decrypted content.
*/
int decryptBufferLength;
/**
* reserved for future purpose
*/
};
/**
* Defines decryption handle
*/
class DecryptHandle : public RefBase {
public:
/**
* Decryption session Handle
*/
int decryptId;
/**
* Mimetype of the content to be used to select the media extractor
* For e.g., "video/mpeg" or "audio/mp3"
*/
String8 mimeType;
/**
* Defines which decryption pattern should be used to decrypt the given content
* DrmFramework provides two different set of decryption APIs.
* 1. Decrypt APIs for elementary stream based DRM
* (file format is not encrypted but ES is encrypted)
* e.g., Marlin DRM (MP4 file format), WM-DRM (asf file format)
*
* DecryptApiType::ELEMENTARY_STREAM_BASED
* Decryption API set for ES based DRM
* initializeDecryptUnit(), decrypt(), and finalizeDecryptUnit()
* 2. Decrypt APIs for container based DRM (file format itself is encrypted)
* e.g., OMA DRM (dcf file format)
*
* DecryptApiType::CONTAINER_BASED
* POSIX based Decryption API set for container based DRM
* pread()
*/
int decryptApiType;
/**
* Defines the status of the rights like
* RIGHTS_VALID, RIGHTS_INVALID, RIGHTS_EXPIRED or RIGHTS_NOT_ACQUIRED
*/
int status;
/**
* Information required to decrypt content
* e.g. size of memory to be allocated to get the decrypted content.
*/
DecryptInfo* decryptInfo;
/**
* Defines a vector for the copy control settings sent from the DRM plugin
* to the player
*/
KeyedVector<DrmCopyControl, int> copyControlVector;
/**
* Defines a vector for any extra data the DRM plugin wants to send
* to the native code
*/
KeyedVector<String8, String8> extendedData;
public:
DecryptHandle():
decryptId(INVALID_VALUE),
mimeType(""),
decryptApiType(INVALID_VALUE),
status(INVALID_VALUE),
decryptInfo(NULL) {
}
~DecryptHandle() {
delete decryptInfo; decryptInfo = NULL;
}
bool operator<(const DecryptHandle& handle) const {
return (decryptId < handle.decryptId);
}
bool operator==(const DecryptHandle& handle) const {
return (decryptId == handle.decryptId);
}
};
};
#endif /* __DRM_FRAMEWORK_COMMON_H__ */