diff options
| author | Rajesh Poornachandran <rajesh.poornachandran@intel.com> | 2013-08-22 12:10:22 -0700 |
|---|---|---|
| committer | Patrick Tjin <pattjin@google.com> | 2014-07-21 22:02:53 -0700 |
| commit | 05d1ae7d3ce5072d9b5e788504e23fea525edc50 (patch) | |
| tree | 32aa3bf596ce7591ec23a815ef3c773c3fc83d13 /videocodec/securevideo | |
| parent | 7911d688c9493f94c2cf58b83550c3fade4eb955 (diff) | |
| download | android_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.cpp | 85 | ||||
| -rw-r--r-- | videocodec/securevideo/baytrail/OMXVideoDecoderAVCSecure.h | 3 |
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_ */ |
