aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorYuanjun Huang <yuanjun.huang@intel.com>2015-07-08 04:02:47 +0800
committerPatrick Tjin <pattjin@google.com>2015-07-10 08:16:07 -0700
commit4671addc0e10b5d30163630d6fd8eaf3a84b7779 (patch)
treeb0566b94f4cdfa1614779b38962bba10efba4291
parent82563df6bcb3f2a982b6c28b38147edba5cde22c (diff)
downloadandroid_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.cpp15
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;