diff options
Diffstat (limited to 'videocodec/OMXVideoDecoderAVC.cpp')
| -rw-r--r-- | videocodec/OMXVideoDecoderAVC.cpp | 40 |
1 files changed, 36 insertions, 4 deletions
diff --git a/videocodec/OMXVideoDecoderAVC.cpp b/videocodec/OMXVideoDecoderAVC.cpp index 7bec5af..7f22974 100644 --- a/videocodec/OMXVideoDecoderAVC.cpp +++ b/videocodec/OMXVideoDecoderAVC.cpp @@ -20,6 +20,7 @@ #include <utils/Log.h> #include "OMXVideoDecoderAVC.h" + // Be sure to have an equal string in VideoDecoderHost.cpp (libmix) static const char* AVC_MIME_TYPE = "video/h264"; #define INVALID_PTS (OMX_S64)-1 @@ -89,11 +90,11 @@ OMX_ERRORTYPE OMXVideoDecoderAVC::ProcessorFlush(OMX_U32 portIndex) { } OMX_ERRORTYPE OMXVideoDecoderAVC::ProcessorProcess( - OMX_BUFFERHEADERTYPE **buffers, + OMX_BUFFERHEADERTYPE ***pBuffers, buffer_retain_t *retains, OMX_U32 numberBuffers) { - return OMXVideoDecoderBase::ProcessorProcess(buffers, retains, numberBuffers); + return OMXVideoDecoderBase::ProcessorProcess(pBuffers, retains, numberBuffers); } OMX_ERRORTYPE OMXVideoDecoderAVC::PrepareConfigBuffer(VideoConfigBuffer *p) { @@ -112,8 +113,12 @@ OMX_ERRORTYPE OMXVideoDecoderAVC::PrepareConfigBuffer(VideoConfigBuffer *p) { p->width = mDecodeSettings.nMaxWidth; p->height = mDecodeSettings.nMaxHeight; p->profile = VAProfileH264ConstrainedBaseline; - p->surfaceNumber = mDecodeSettings.nMaxNumberOfReferenceFrame + EXTRA_REFERENCE_FRAME; - p->flag = WANT_ERROR_CONCEALMENT | WANT_LOW_DELAY | HAS_SURFACE_NUMBER | HAS_VA_PROFILE; + if(!(p->flag & USE_NATIVE_GRAPHIC_BUFFER)) { + p->surfaceNumber = mDecodeSettings.nMaxNumberOfReferenceFrame + EXTRA_REFERENCE_FRAME; + p->flag = WANT_ERROR_CONCEALMENT | WANT_LOW_DELAY | HAS_SURFACE_NUMBER | HAS_VA_PROFILE; + } else { + p->flag |= WANT_ERROR_CONCEALMENT | WANT_LOW_DELAY | HAS_SURFACE_NUMBER | HAS_VA_PROFILE; + } return OMX_ErrorNone; } @@ -218,6 +223,7 @@ OMX_ERRORTYPE OMXVideoDecoderAVC::BuildHandlerList(void) { OMXVideoDecoderBase::BuildHandlerList(); AddHandler(OMX_IndexParamVideoAvc, GetParamVideoAvc, SetParamVideoAvc); AddHandler((OMX_INDEXTYPE)OMX_IndexParamIntelAVCDecodeSettings, GetParamIntelAVCDecodeSettings, SetParamIntelAVCDecodeSettings); + AddHandler(static_cast<OMX_INDEXTYPE>(OMX_IndexExtEnableNativeBuffer),GetNativeBufferMode,SetNativeBufferMode); return OMX_ErrorNone; } @@ -268,5 +274,31 @@ OMX_ERRORTYPE OMXVideoDecoderAVC::SetParamIntelAVCDecodeSettings(OMX_PTR pStruct return OMX_ErrorNone; } +OMX_ERRORTYPE OMXVideoDecoderAVC::GetNativeBufferMode(OMX_PTR pStructure) { + OMX_ERRORTYPE ret; + return OMX_ErrorNone; //would not be here +} + +#define MAX_OUTPUT_BUFFER_COUNT_FOR_AVC 16+1+6 +OMX_ERRORTYPE OMXVideoDecoderAVC::SetNativeBufferMode(OMX_PTR pStructure) { + OMX_ERRORTYPE ret; + + //CHECK_TYPE_HEADER(param); + CHECK_SET_PARAM_STATE(); + mNativeBufferMode = true; + PortVideo *port = NULL; + port = static_cast<PortVideo *>(this->ports[OUTPORT_INDEX]); + + OMX_PARAM_PORTDEFINITIONTYPE port_def; + memcpy(&port_def,port->GetPortDefinition(),sizeof(port_def)); + port_def.nBufferCountMin = 1; + port_def.nBufferCountActual = MAX_OUTPUT_BUFFER_COUNT_FOR_AVC; + port_def.format.video.cMIMEType = (OMX_STRING)VA_VED_RAW_MIME_TYPE; + port_def.format.video.eColorFormat = static_cast<OMX_COLOR_FORMATTYPE>(VA_VED_COLOR_FORMAT); + port->SetPortDefinition(&port_def,true); + + return OMX_ErrorNone; +} + DECLARE_OMX_COMPONENT("OMX.Intel.VideoDecoder.AVC", "video_decoder.avc", OMXVideoDecoderAVC); |
