aboutsummaryrefslogtreecommitdiffstats
path: root/videocodec/securevideo
diff options
context:
space:
mode:
authorRajesh Poornachandran <rajesh.poornachandran@intel.com>2013-08-22 12:10:22 -0700
committerPatrick Tjin <pattjin@google.com>2014-07-21 22:02:53 -0700
commit05d1ae7d3ce5072d9b5e788504e23fea525edc50 (patch)
tree32aa3bf596ce7591ec23a815ef3c773c3fc83d13 /videocodec/securevideo
parent7911d688c9493f94c2cf58b83550c3fade4eb955 (diff)
downloadandroid_hardware_intel_common_omx-components-05d1ae7d3ce5072d9b5e788504e23fea525edc50.tar.gz
android_hardware_intel_common_omx-components-05d1ae7d3ce5072d9b5e788504e23fea525edc50.tar.bz2
android_hardware_intel_common_omx-components-05d1ae7d3ce5072d9b5e788504e23fea525edc50.zip
[PORT FROM R42B-STABLE] BYT-DRM-WV-OMX: Enable thread sync in OMX
BZ: 132899 Enable thread sync support in OMX until support is available from PAVP lib. Route both Audio & Video decryption via SEC. Change-Id: Ied604066bdc3997c62a0d1c7303511cf69d8cd12 Signed-off-by: Rajesh Poornachandran <rajesh.poornachandran@intel.com> Reviewed-on: http://android.intel.com:8080/127249 Tested-by: Post, DavidX J <davidx.j.post@intel.com> Reviewed-by: cactus <cactus@intel.com> Tested-by: cactus <cactus@intel.com> Reviewed-on: http://android.intel.com:8080/132666 Reviewed-by: Sun, Hang L <hang.l.sun@intel.com> Tested-by: Sun, Hang L <hang.l.sun@intel.com>
Diffstat (limited to 'videocodec/securevideo')
-rw-r--r--videocodec/securevideo/baytrail/OMXVideoDecoderAVCSecure.cpp85
-rw-r--r--videocodec/securevideo/baytrail/OMXVideoDecoderAVCSecure.h3
2 files changed, 53 insertions, 35 deletions
diff --git a/videocodec/securevideo/baytrail/OMXVideoDecoderAVCSecure.cpp b/videocodec/securevideo/baytrail/OMXVideoDecoderAVCSecure.cpp
index 48f75b3..e370f70 100644
--- a/videocodec/securevideo/baytrail/OMXVideoDecoderAVCSecure.cpp
+++ b/videocodec/securevideo/baytrail/OMXVideoDecoderAVCSecure.cpp
@@ -72,14 +72,17 @@ struct SECFrameBuffer {
uint8_t clear; // 0 when SEC offset is valid, 1 when data is valid
uint8_t num_entries;
wv_packet_metadata packet_metadata[WV_MAX_PACKETS_IN_FRAME];
- uint8_t key[16];
pavp_lib_session *pLibInstance;
+ android::Mutex* pWVPAVPLock;
+ struct meimm MeiMm;
+ uint32_t VADmaBase;
};
#pragma pack(pop)
uint8_t outiv[WV_AES_IV_SIZE];
OMXVideoDecoderAVCSecure::OMXVideoDecoderAVCSecure()
: mSessionPaused(false),
+ mVADmaBase(0),
mpLibInstance(NULL) {
LOGV("OMXVideoDecoderAVCSecure is constructed.");
mVideoDecoder = createVideoDecoder(AVC_SECURE_MIME_TYPE);
@@ -137,17 +140,6 @@ OMX_ERRORTYPE OMXVideoDecoderAVCSecure::InitInputPortFormatSpecific(OMX_PARAM_PO
OMX_ERRORTYPE OMXVideoDecoderAVCSecure::ProcessorInit(void) {
- int status = meimm_init(&mMeiMm, true);
-
- if (status)
- LOGE("meimm_init FAILED ret: %#x", status);
-
- status = meimm_alloc_map_memory(&mMeiMm, DMA_BUFFER_SIZE);
- if (status)
- LOGE("meimm_alloc_map_memory FAILED ret: %#x", status);
-
- mVADmaBase = (uint32_t)meimm_get_addr(&mMeiMm);
- LOGI("mVADMAOffset: %#x", mVADmaBase);
mSessionPaused = false;
return OMXVideoDecoderBase::ProcessorInit();
@@ -278,6 +270,7 @@ OMX_ERRORTYPE OMXVideoDecoderAVCSecure::PrepareDecodeBuffer(OMX_BUFFERHEADERTYPE
} else {
LOGE("PAVP Heavy session created succesfully");
mpLibInstance = secBuffer->pLibInstance;
+ mLock = secBuffer->pWVPAVPLock;
}
if ( ret == OMX_ErrorNone) {
pavp_lib_session::pavp_lib_code rc = pavp_lib_session::status_ok;
@@ -308,6 +301,9 @@ OMX_ERRORTYPE OMXVideoDecoderAVCSecure::PrepareDecodeBuffer(OMX_BUFFERHEADERTYPE
}
}
+ if(secBuffer->pWVPAVPLock)
+ mLock = secBuffer->pWVPAVPLock;
+
if(mpLibInstance) {
bool balive = false;
pavp_lib_session::pavp_lib_code rc = pavp_lib_session::status_ok;
@@ -328,6 +324,7 @@ OMX_ERRORTYPE OMXVideoDecoderAVCSecure::PrepareDecodeBuffer(OMX_BUFFERHEADERTYPE
}
}
if ( ret == OMX_ErrorNone) {
+ android::Mutex::Autolock autoLock(*mLock);
wv_heci_process_video_frame_in input;
wv_heci_process_video_frame_out output;
sec_wv_packet_metadata metadata;
@@ -369,42 +366,45 @@ OMX_ERRORTYPE OMXVideoDecoderAVCSecure::PrepareDecodeBuffer(OMX_BUFFERHEADERTYPE
sizeof(input),
reinterpret_cast<BYTE*>(&output),
sizeof(output));
- }
- if (rc != pavp_lib_session::status_ok)
- LOGE(" sec_pass_through failed with error 0x%x", rc);
+ if (rc != pavp_lib_session::status_ok) {
+ LOGE("%s PAVP Failed: 0x%x", __FUNCTION__, rc);
+ secBuffer->size = 0;
+ ret = OMX_ErrorNotReady;
+ }
- if (output.Header.Status != 0x0) {
- LOGE(" SEC failed for wv_process_video_frame() returned 0x%x", output.Header.Status);
- } else {
- memcpy((unsigned char *)(secBuffer->data), (const unsigned int*) (mVADmaBase + (1024*512)), buffer->nFilledLen);
- parse_size = output.parsed_data_size;
- memcpy((unsigned char *)(secBuffer->data + buffer->nFilledLen + 4), (const unsigned int*) (mVADmaBase + ((1024*1024)+512)), output.parsed_data_size);
- memcpy(&outiv, output.iv, WV_AES_IV_SIZE);
+ if (output.Header.Status != 0x0) {
+ LOGE("%s SEC Failed:0x%x", __FUNCTION__, output.Header.Status);
+ secBuffer->size = 0;
+ ret = OMX_ErrorNotReady;
+ } else {
+ memcpy((unsigned char *)(secBuffer->data), (const unsigned int*) (mVADmaBase + (1024*512)), buffer->nFilledLen);
+ parse_size = output.parsed_data_size;
+ memcpy((unsigned char *)(secBuffer->data + buffer->nFilledLen + 4), (const unsigned int*) (mVADmaBase + ((1024*1024)+512)), output.parsed_data_size);
+ memcpy(&outiv, output.iv, WV_AES_IV_SIZE);
+ }
}
}
- p->data = secBuffer->data + buffer->nOffset;
- p->size = buffer->nFilledLen;
+ if(ret == OMX_ErrorNone) {
+ p->data = secBuffer->data + buffer->nOffset;
+ p->size = buffer->nFilledLen;
- // Call "SEC" to parse frame
- SECParsedFrame* parsedFrame = &(mParsedFrames[secBuffer->index]);
- memcpy(parsedFrame->nalu_data, (unsigned char *)(secBuffer->data + buffer->nFilledLen + 4), parse_size);
- parsedFrame->nalu_data_size = parse_size;
- memcpy(parsedFrame->pavp_info->iv, outiv, WV_AES_IV_SIZE);
+ // Call "SEC" to parse frame
+ SECParsedFrame* parsedFrame = &(mParsedFrames[secBuffer->index]);
+ memcpy(parsedFrame->nalu_data, (unsigned char *)(secBuffer->data + buffer->nFilledLen + 4), parse_size);
+ parsedFrame->nalu_data_size = parse_size;
+ memcpy(parsedFrame->pavp_info->iv, outiv, WV_AES_IV_SIZE);
- // construct frame_info
- ret = ConstructFrameInfo(p->data, p->size, parsedFrame->pavp_info,
+ // construct frame_info
+ ret = ConstructFrameInfo(p->data, p->size, parsedFrame->pavp_info,
parsedFrame->nalu_data, parsedFrame->nalu_data_size, &(parsedFrame->frame_info));
- if(ret == OMX_ErrorNone) {
if (parsedFrame->frame_info.num_nalus == 0 ) {
LOGE("NALU parsing failed - num_nalus = 0!");
secBuffer->size = 0;
ret = OMX_ErrorNotReady;
}
- }
- if(ret == OMX_ErrorNone) {
#ifdef PASS_FRAME_INFO
// Pass frame info to VideoDecoderAVCSecure in VideoDecodeBuffer
p->data = (uint8_t *)&(parsedFrame->frame_info);
@@ -534,7 +534,24 @@ OMX_U8* OMXVideoDecoderAVCSecure::MemAllocSEC(OMX_U32 nSizeBytes) {
return NULL;
}
+ if(!mVADmaBase) {
+ int status = meimm_init(&mMeiMm, true);
+
+ if (status)
+ LOGE("meimm_init FAILED ret: %#x", status);
+
+ status = meimm_alloc_map_memory(&mMeiMm, DMA_BUFFER_SIZE);
+ if (status)
+ LOGE("meimm_alloc_map_memory FAILED ret: %#x", status);
+
+ mVADmaBase = (uint32_t)meimm_get_addr(&mMeiMm);
+
+ LOGI("mVADMAOffset: %#x", mVADmaBase);
+ }
+
pBuffer->index = index;
+ pBuffer->MeiMm = mMeiMm;
+ pBuffer->VADmaBase = mVADmaBase;
pBuffer->data = mSECRegion.frameBuffers.buffers[index].base;
pBuffer->size = mSECRegion.frameBuffers.buffers[index].size;
mParsedFrames[index].nalu_data = mSECRegion.naluBuffers.buffers[index].base;
diff --git a/videocodec/securevideo/baytrail/OMXVideoDecoderAVCSecure.h b/videocodec/securevideo/baytrail/OMXVideoDecoderAVCSecure.h
index f2a8cb9..b154bb9 100644
--- a/videocodec/securevideo/baytrail/OMXVideoDecoderAVCSecure.h
+++ b/videocodec/securevideo/baytrail/OMXVideoDecoderAVCSecure.h
@@ -17,7 +17,7 @@
#ifndef OMX_VIDEO_DECODER_AVC_SECURE_H_
#define OMX_VIDEO_DECODER_AVC_SECURE_H_
-
+#include <utils/Mutex.h>
#include "OMXVideoDecoderBase.h"
extern "C" {
#include "secvideoparser.h"
@@ -126,6 +126,7 @@ private:
struct meimm mMeiMm;
uint32_t mVADmaBase;
pavp_lib_session *mpLibInstance;
+ android::Mutex *mLock;
};
#endif /* OMX_VIDEO_DECODER_AVC_SECURE_H_ */