aboutsummaryrefslogtreecommitdiffstats
path: root/videocodec/securevideo
diff options
context:
space:
mode:
authorSudheer Mogilappagari <sudheer.mogilappagari@intel.com>2014-04-23 12:07:56 -0700
committerPatrick Tjin <pattjin@google.com>2014-07-21 22:02:59 -0700
commit3436b963c46096901e9a9a26e27c83a96919437c (patch)
tree293357919915f02cb38ac4f08b47f835d15e35cb /videocodec/securevideo
parent88e64cfe7880b3ee81c3e5e34b37a408eb855680 (diff)
downloadandroid_hardware_intel_common_omx-components-3436b963c46096901e9a9a26e27c83a96919437c.tar.gz
android_hardware_intel_common_omx-components-3436b963c46096901e9a9a26e27c83a96919437c.tar.bz2
android_hardware_intel_common_omx-components-3436b963c46096901e9a9a26e27c83a96919437c.zip
[MOFD] PlayReady support in OMX for Moorefield v0.
BZ: 190106 This patch has to go along with changes to liboemcrypto for WV and mWV to work properly. patch details will be provided later. Implementation is similar to classic widevine. Change-Id: I20bb53376f0b5fb46543810ab1f9ecb09315fd39 Signed-off-by: Sudheer Mogilappagari <sudheer.mogilappagari@intel.com>
Diffstat (limited to 'videocodec/securevideo')
-rw-r--r--videocodec/securevideo/moorefield/OMXVideoDecoderAVCSecure.cpp83
-rw-r--r--videocodec/securevideo/moorefield/OMXVideoDecoderAVCSecure.h2
2 files changed, 84 insertions, 1 deletions
diff --git a/videocodec/securevideo/moorefield/OMXVideoDecoderAVCSecure.cpp b/videocodec/securevideo/moorefield/OMXVideoDecoderAVCSecure.cpp
index 5154508..592b52f 100644
--- a/videocodec/securevideo/moorefield/OMXVideoDecoderAVCSecure.cpp
+++ b/videocodec/securevideo/moorefield/OMXVideoDecoderAVCSecure.cpp
@@ -26,6 +26,7 @@
extern "C" {
#include <sepdrm.h>
+#include <pr_drm_api.h>
#include <fcntl.h>
#include <linux/psb_drm.h>
#include "xf86drm.h"
@@ -50,6 +51,7 @@ static const char* AVC_SECURE_MIME_TYPE = "video/avc-secure";
#define DRM_SCHEME_NONE 0
#define DRM_SCHEME_WV_CLASSIC 1
#define DRM_SCHEME_WV_MODULAR 2
+#define DRM_SCHEME_PLAYREADY 3
//#pragma pack(push, 1)
struct DataBuffer {
@@ -57,6 +59,8 @@ struct DataBuffer {
uint8_t *data;
uint8_t clear;
uint32_t drmScheme;
+ uint32_t session_id; //used by PlayReady only
+ uint32_t flags; //used by PlayReady only
};
//#pragma pack(pop)
@@ -325,6 +329,80 @@ OMX_ERRORTYPE OMXVideoDecoderAVCSecure::PrepareModularWVDecodeBuffer(OMX_BUFFERH
}
+OMX_ERRORTYPE OMXVideoDecoderAVCSecure::PreparePlayReadyDecodeBuffer(OMX_BUFFERHEADERTYPE *buffer, buffer_retain_t *retain, VideoDecodeBuffer *p){
+ OMX_ERRORTYPE ret = OMX_ErrorNone;
+
+ // OMX_BUFFERFLAG_CODECCONFIG is an optional flag
+ // if flag is set, buffer will only contain codec data.
+ if (buffer->nFlags & OMX_BUFFERFLAG_CODECCONFIG) {
+ LOGV("PR: Received codec data.");
+ return ret;
+ }
+ p->flag |= HAS_COMPLETE_FRAME;
+
+ if (buffer->nOffset != 0) {
+ LOGW("PR:buffer offset %lu is not zero!!!", buffer->nOffset);
+ }
+
+ DataBuffer *dataBuffer = (DataBuffer *)buffer->pBuffer;
+ if (dataBuffer->clear) {
+ p->data = dataBuffer->data + buffer->nOffset;
+ p->size = buffer->nFilledLen;
+ } else {
+ dataBuffer->size = NALU_BUFFER_SIZE;
+ struct drm_nalu_headers nalu_headers;
+ nalu_headers.p_enc_ciphertext = dataBuffer->data;
+
+ // TODO: NALU Buffer is supposed to be 4k but using 1k, fix it once chaabi fix is there
+ nalu_headers.hdrs_buf_len = NALU_HEADER_LENGTH;
+ nalu_headers.frame_size = buffer->nFilledLen;
+ // Make sure that NALU header frame size is 16 bytes aligned
+ nalu_headers.frame_size = (nalu_headers.frame_size + 0xF) & (~0xF);
+ // Use same video buffer to fill NALU headers returned by chaabi,
+ // Adding 4 because the first 4 bytes after databuffer will be used to store length of NALU headers
+ if((nalu_headers.frame_size + NALU_HEADER_LENGTH) > INPORT_BUFFER_SIZE){
+ LOGE("Not enough buffer for NALU headers");
+ return OMX_ErrorOverflow;
+ }
+
+ nalu_headers.p_hdrs_buf = (uint8_t *)(dataBuffer->data + nalu_headers.frame_size + 4);
+ nalu_headers.parse_size = buffer->nFilledLen;
+
+ uint32_t res = drm_pr_return_naluheaders(dataBuffer->session_id, &nalu_headers);
+
+ if (res == DRM_FAIL_FW_SESSION || !nalu_headers.hdrs_buf_len) {
+ LOGW("drm_ReturnNALUHeaders failed. Session is disabled.");
+ mSessionPaused = true;
+ ret = OMX_ErrorNotReady;
+ } else if (res != 0) {
+ mSessionPaused = false;
+ LOGE("drm_pr_return_naluheaders failed. Error = %#x, frame_size: %d, len = %lu", res, nalu_headers.frame_size, buffer->nFilledLen);
+ ret = OMX_ErrorHardware;
+ } else {
+ mSessionPaused = false;
+
+ // If chaabi returns 0 NALU headers fill the frame size to zero.
+ if (!nalu_headers.hdrs_buf_len) {
+ p->size = 0;
+ return ret;
+ }
+ else{
+ // NALU headers are appended to encrypted video bitstream
+ // |...encrypted video bitstream (16 bytes aligned)...| 4 bytes of header size |...NALU headers..|
+ uint32_t *ptr = (uint32_t*)(dataBuffer->data + nalu_headers.frame_size);
+ *ptr = nalu_headers.hdrs_buf_len;
+ p->data = dataBuffer->data;
+ p->size = nalu_headers.frame_size;
+ p->flag |= IS_SECURE_DATA;
+ }
+ }
+ }
+
+ // reset Data size
+ dataBuffer->size = NALU_BUFFER_SIZE;
+ return ret;
+}
+
OMX_ERRORTYPE OMXVideoDecoderAVCSecure::PrepareDecodeBuffer(OMX_BUFFERHEADERTYPE *buffer, buffer_retain_t *retain, VideoDecodeBuffer *p) {
OMX_ERRORTYPE ret;
@@ -351,6 +429,11 @@ OMX_ERRORTYPE OMXVideoDecoderAVCSecure::PrepareDecodeBuffer(OMX_BUFFERHEADERTYPE
mDrmScheme = DRM_SCHEME_WV_MODULAR;
return PrepareModularWVDecodeBuffer(buffer, retain, p);
}
+ else if(dataBuffer->drmScheme == DRM_SCHEME_PLAYREADY)
+ {
+ mDrmScheme = DRM_SCHEME_PLAYREADY;
+ return PreparePlayReadyDecodeBuffer(buffer, retain, p);
+ }
return ret;
}
diff --git a/videocodec/securevideo/moorefield/OMXVideoDecoderAVCSecure.h b/videocodec/securevideo/moorefield/OMXVideoDecoderAVCSecure.h
index 6281c23..a4cfb35 100644
--- a/videocodec/securevideo/moorefield/OMXVideoDecoderAVCSecure.h
+++ b/videocodec/securevideo/moorefield/OMXVideoDecoderAVCSecure.h
@@ -57,7 +57,7 @@ private:
//bool EnableIEDSession(bool enable);
OMX_ERRORTYPE PrepareClassicWVDecodeBuffer(OMX_BUFFERHEADERTYPE *buffer, buffer_retain_t *retain, VideoDecodeBuffer *p);
OMX_ERRORTYPE PrepareModularWVDecodeBuffer(OMX_BUFFERHEADERTYPE *buffer, buffer_retain_t *retain, VideoDecodeBuffer *p);
-
+ OMX_ERRORTYPE PreparePlayReadyDecodeBuffer(OMX_BUFFERHEADERTYPE *buffer, buffer_retain_t *retain, VideoDecodeBuffer *p);
private:
enum {
// OMX_PARAM_PORTDEFINITIONTYPE