diff options
author | Yuanjun Huang <yuanjun.huang@intel.com> | 2015-07-08 04:02:47 +0800 |
---|---|---|
committer | Patrick Tjin <pattjin@google.com> | 2015-07-10 08:16:07 -0700 |
commit | 4671addc0e10b5d30163630d6fd8eaf3a84b7779 (patch) | |
tree | b0566b94f4cdfa1614779b38962bba10efba4291 | |
parent | 82563df6bcb3f2a982b6c28b38147edba5cde22c (diff) | |
download | android_hardware_intel_common_omx-components-4671addc0e10b5d30163630d6fd8eaf3a84b7779.tar.gz android_hardware_intel_common_omx-components-4671addc0e10b5d30163630d6fd8eaf3a84b7779.tar.bz2 android_hardware_intel_common_omx-components-4671addc0e10b5d30163630d6fd8eaf3a84b7779.zip |
omx-component: fix video corruption
a. if out port frame width parsed from extractor is
not as same as parsed from SPS/PPS nalu decoding, align it to the
result from decoder.
b. when resolution changes in adaptive playback, make sure out port
frame height is 32-align again so that graphic buffer is allocated
as 32-align.
BUG: 22184303
Change-Id: Id070b2d51fcda899e70b5b12fc9ec841bb9fd44a
Signed-off-by: Yuanjun Huang <yuanjun.huang@intel.com>
-rw-r--r-- | videocodec/OMXVideoDecoderBase.cpp | 15 |
1 files changed, 14 insertions, 1 deletions
diff --git a/videocodec/OMXVideoDecoderBase.cpp b/videocodec/OMXVideoDecoderBase.cpp index 594c734..40859b4 100644 --- a/videocodec/OMXVideoDecoderBase.cpp +++ b/videocodec/OMXVideoDecoderBase.cpp @@ -721,7 +721,7 @@ OMX_ERRORTYPE OMXVideoDecoderBase::HandleFormatChange(void) { paramPortDefinitionInput.format.video.nSliceHeight = sliceHeight; // output port paramPortDefinitionOutput.format.video.nFrameWidth = width; - paramPortDefinitionOutput.format.video.nFrameHeight = height; + paramPortDefinitionOutput.format.video.nFrameHeight = (height + 0x1f) & ~0x1f; paramPortDefinitionOutput.format.video.eColorFormat = GetOutputColorFormat(paramPortDefinitionOutput.format.video.nFrameWidth); paramPortDefinitionOutput.format.video.nStride = stride; paramPortDefinitionOutput.format.video.nSliceHeight = sliceHeight; @@ -1106,12 +1106,25 @@ OMX_ERRORTYPE OMXVideoDecoderBase::GetDecoderOutputCropSpecific(OMX_PTR pStructu if (rectParams->nPortIndex != OUTPORT_INDEX) { return OMX_ErrorUndefined; } + + PortVideo *port = NULL; + port = static_cast<PortVideo *>(this->ports[OUTPORT_INDEX]); + OMX_PARAM_PORTDEFINITIONTYPE port_def; + memcpy(&port_def,port->GetPortDefinition(),sizeof(port_def)); + const VideoFormatInfo *formatInfo = mVideoDecoder->getFormatInfo(); if (formatInfo->valid == true) { rectParams->nLeft = formatInfo->cropLeft; rectParams->nTop = formatInfo->cropTop; rectParams->nWidth = formatInfo->width - formatInfo->cropLeft - formatInfo->cropRight; rectParams->nHeight = formatInfo->height - formatInfo->cropTop - formatInfo->cropBottom; + + // if port width parsed from extractor is not as same as from SPS/PPS nalu header, + // align it. + if (port_def.format.video.nFrameWidth != rectParams->nWidth) { + port_def.format.video.nFrameWidth = rectParams->nWidth; + } + port->SetPortDefinition(&port_def,true); return OMX_ErrorNone; } else { return OMX_ErrorFormatNotDetected; |