aboutsummaryrefslogtreecommitdiffstats
path: root/videocodec/OMXVideoDecoderVP9Hybrid.cpp
diff options
context:
space:
mode:
authorywan171 <yi.a.wang@intel.com>2014-11-06 10:02:54 +0800
committerEd Tam <etam@google.com>2014-11-10 17:01:24 -0800
commit13c7df7e879f64e0055bbcc61dbe0d472ac8d43b (patch)
tree44a549eb1176ffc9cc58a2e63c6caca65c0377a9 /videocodec/OMXVideoDecoderVP9Hybrid.cpp
parent6725411e5c835fed1121f4ae9244013183f2ff38 (diff)
downloadandroid_hardware_intel_common_omx-components-13c7df7e879f64e0055bbcc61dbe0d472ac8d43b.tar.gz
android_hardware_intel_common_omx-components-13c7df7e879f64e0055bbcc61dbe0d472ac8d43b.tar.bz2
android_hardware_intel_common_omx-components-13c7df7e879f64e0055bbcc61dbe0d472ac8d43b.zip
vp9hybrid: add raw data mode support for vp9 hybrid plugin to pass cts test
Bug: 17729532 BZ: 225243 Change-Id: I3ae19c2a2fd6fb55b897375fb2ef22e2d8e90875 Signed-off-by: ywan171 <yi.a.wang@intel.com>
Diffstat (limited to 'videocodec/OMXVideoDecoderVP9Hybrid.cpp')
-rw-r--r--videocodec/OMXVideoDecoderVP9Hybrid.cpp73
1 files changed, 52 insertions, 21 deletions
diff --git a/videocodec/OMXVideoDecoderVP9Hybrid.cpp b/videocodec/OMXVideoDecoderVP9Hybrid.cpp
index 410cb3c..dc5e214 100644
--- a/videocodec/OMXVideoDecoderVP9Hybrid.cpp
+++ b/videocodec/OMXVideoDecoderVP9Hybrid.cpp
@@ -39,7 +39,9 @@ OMXVideoDecoderVP9Hybrid::OMXVideoDecoderVP9Hybrid() {
mDecoderDecode = NULL;
mCheckBufferAvailable = NULL;
mGetOutput = NULL;
+ mGetRawDataOutput = NULL;
mLastTimeStamp = 0;
+ mWorkingMode = RAWDATA_MODE;
}
OMXVideoDecoderVP9Hybrid::~OMXVideoDecoderVP9Hybrid() {
@@ -59,14 +61,24 @@ OMX_ERRORTYPE OMXVideoDecoderVP9Hybrid::InitInputPortFormatSpecific(
OMX_ERRORTYPE OMXVideoDecoderVP9Hybrid::ProcessorInit(void) {
unsigned int buff[MAX_GRAPHIC_BUFFER_NUM];
- unsigned int i;
- int bufferSize = mGraphicBufferParam.graphicBufferStride *
+ unsigned int i, bufferCount;
+ bool gralloc_mode = (mWorkingMode == GRAPHICBUFFER_MODE);
+ int bufferSize,bufferStride;
+
+ if (!gralloc_mode) {
+ bufferSize = 1920 * 1080 * 1.5;
+ bufferStride = 1920;
+ bufferCount = 12;
+ } else {
+ bufferSize = mGraphicBufferParam.graphicBufferStride *
mGraphicBufferParam.graphicBufferHeight * 1.5;
- int bufferStride = mGraphicBufferParam.graphicBufferStride;
+ bufferStride = mGraphicBufferParam.graphicBufferStride;
+ bufferCount = mOMXBufferHeaderTypePtrNum;
- for (i = 0; i < mOMXBufferHeaderTypePtrNum; i++ ) {
- OMX_BUFFERHEADERTYPE *buf_hdr = mOMXBufferHeaderTypePtrArray[i];
- buff[i] = (unsigned int)(buf_hdr->pBuffer);
+ for (i = 0; i < bufferCount; i++ ) {
+ OMX_BUFFERHEADERTYPE *buf_hdr = mOMXBufferHeaderTypePtrArray[i];
+ buff[i] = (unsigned int)(buf_hdr->pBuffer);
+ }
}
mLibHandle = dlopen("libDecoderVP9Hybrid.so", RTLD_NOW);
@@ -83,10 +95,11 @@ OMX_ERRORTYPE OMXVideoDecoderVP9Hybrid::ProcessorInit(void) {
mDecoderDecode = (DecodeFunc)dlsym(mLibHandle, "Decoder_Decode");
mCheckBufferAvailable = (IsBufferAvailableFunc)dlsym(mLibHandle, "Decoder_IsBufferAvailable");
mGetOutput = (GetOutputFunc)dlsym(mLibHandle, "Decoder_GetOutput");
+ mGetRawDataOutput = (GetRawDataOutputFunc)dlsym(mLibHandle, "Decoder_GetRawDataOutput");
if (mOpenDecoder == NULL || mCloseDecoder == NULL
|| mInitDecoder == NULL || mSingalRenderDone == NULL
|| mDecoderDecode == NULL || mCheckBufferAvailable == NULL
- || mGetOutput == NULL) {
+ || mGetOutput == NULL || mGetRawDataOutput == NULL) {
return OMX_ErrorBadParameter;
}
@@ -95,7 +108,7 @@ OMX_ERRORTYPE OMXVideoDecoderVP9Hybrid::ProcessorInit(void) {
return OMX_ErrorBadParameter;
}
- mInitDecoder(mHybridCtx,bufferSize,bufferStride,mOMXBufferHeaderTypePtrNum, buff);
+ mInitDecoder(mHybridCtx,bufferSize,bufferStride,bufferCount,gralloc_mode, buff);
return OMX_ErrorNone;
}
@@ -113,7 +126,13 @@ OMX_ERRORTYPE OMXVideoDecoderVP9Hybrid::ProcessorStop(void) {
return OMXComponentCodecBase::ProcessorStop();
}
-OMX_ERRORTYPE OMXVideoDecoderVP9Hybrid::ProcessorFlush(OMX_U32) {
+OMX_ERRORTYPE OMXVideoDecoderVP9Hybrid::ProcessorFlush(OMX_U32 portIndex) {
+ LOGI("Processor Flush portIndex = %d", portIndex);
+ // end the last frame
+ if (portIndex == INPORT_INDEX || portIndex == OMX_ALL) {
+ mDecoderDecode(mCtx,mHybridCtx,NULL,0,true);
+ mLastTimeStamp = 0;
+ }
return OMX_ErrorNone;
}
@@ -122,7 +141,7 @@ OMX_ERRORTYPE OMXVideoDecoderVP9Hybrid::ProcessorPreFillBuffer(OMX_BUFFERHEADERT
unsigned int i = 0;
if (buffer->nOutputPortIndex == OUTPORT_INDEX){
- mSingalRenderDone(handle);
+ mSingalRenderDone(mHybridCtx,handle);
}
return OMX_ErrorNone;
}
@@ -209,22 +228,34 @@ OMX_ERRORTYPE OMXVideoDecoderVP9Hybrid::FillRenderBuffer(OMX_BUFFERHEADERTYPE **
OMX_ERRORTYPE ret = OMX_ErrorNone;
- if (mWorkingMode != GRAPHICBUFFER_MODE) {
- LOGE("Working Mode is not GRAPHICBUFFER_MODE");
- ret = OMX_ErrorBadParameter;
+ int fb_index;
+ if (mWorkingMode == RAWDATA_MODE) {
+ const OMX_PARAM_PORTDEFINITIONTYPE *paramPortDefinitionOutput
+ = this->ports[OUTPORT_INDEX]->GetPortDefinition();
+ int32_t stride = paramPortDefinitionOutput->format.video.nStride;
+ int32_t height = paramPortDefinitionOutput->format.video.nFrameHeight;
+ int32_t width = paramPortDefinitionOutput->format.video.nFrameWidth;
+ unsigned char *dst = buffer->pBuffer;
+ fb_index = mGetRawDataOutput(mCtx,mHybridCtx,dst,height,stride);
+ if (fb_index == -1) {
+ LOGE("vpx_codec_get_frame return NULL.");
+ return OMX_ErrorNotReady;
+ }
+ buffer->nOffset = 0;
+ buffer->nFilledLen = stride*height*3/2;
+ if (inportBufferFlags & OMX_BUFFERFLAG_EOS) {
+ buffer->nFlags = OMX_BUFFERFLAG_EOS;
+ }
+ return OMX_ErrorNone;
}
- int fb_index = mGetOutput(mCtx);
+
+ fb_index = mGetOutput(mCtx,mHybridCtx);
if (fb_index == -1) {
LOGE("vpx_codec_get_frame return NULL.");
return OMX_ErrorNotReady;
}
buffer = *pBuffer = mOMXBufferHeaderTypePtrArray[fb_index];
-
- size_t dst_y_size = mGraphicBufferParam.graphicBufferStride *
- mGraphicBufferParam.graphicBufferHeight;
- size_t dst_c_stride = ALIGN(mGraphicBufferParam.graphicBufferStride / 2, 16);
- size_t dst_c_size = dst_c_stride * mGraphicBufferParam.graphicBufferHeight / 2;
buffer->nOffset = 0;
buffer->nFilledLen = sizeof(OMX_U8*);
if (inportBufferFlags & OMX_BUFFERFLAG_EOS) {
@@ -313,6 +344,7 @@ OMX_ERRORTYPE OMXVideoDecoderVP9Hybrid::SetNativeBufferModeSpecific(OMX_PTR pStr
if (!param->enable) {
mWorkingMode = RAWDATA_MODE;
+ LOGI("Raw data mode is used");
return OMX_ErrorNone;
}
mWorkingMode = GRAPHICBUFFER_MODE;
@@ -324,7 +356,6 @@ OMX_ERRORTYPE OMXVideoDecoderVP9Hybrid::SetNativeBufferModeSpecific(OMX_PTR pStr
port_def.nBufferCountMin = mNativeBufferCount;
port_def.nBufferCountActual = mNativeBufferCount;
port_def.format.video.cMIMEType = (OMX_STRING)VA_VED_RAW_MIME_TYPE;
- port_def.format.video.eColorFormat = (OMX_COLOR_FORMATTYPE)OMX_INTEL_COLOR_FormatYUV420PackedSemiPlanar;
// add borders for libvpx decode need.
port_def.format.video.nFrameHeight += VPX_DECODE_BORDER * 2;
port_def.format.video.nFrameWidth += VPX_DECODE_BORDER * 2;
@@ -350,7 +381,7 @@ bool OMXVideoDecoderVP9Hybrid::IsAllBufferAvailable(void) {
if (!port_def->bEnabled) {
return false;
}
- return mCheckBufferAvailable();
+ return mCheckBufferAvailable(mHybridCtx);
}
DECLARE_OMX_COMPONENT("OMX.Intel.VideoDecoder.VP9.hybrid", "video_decoder.vp9", OMXVideoDecoderVP9Hybrid);