同样的硬件,在Android 5.0的load上,无法播放YouTube网站的视频,在Android 4.2的load上,可以播放
02-26 09:43:18.770 167 1504 E OMXCodec: before getParameter
02-26 09:43:18.770 167 1504 E OMX : getParameter(42 0x2000001 0xb0103af8 96)
02-26 09:43:18.770 167 1504 E OMXNodeInstance: OMXNodeInstance::getParameter, index: 0x2000001
02-26 09:43:18.770 167 1504 E : FSLOMXWrapper::GetParameter, nParamIndex: 0x2000001
02-26 09:43:18.770 167 1504 E : before ConvertOMXToAndroidColorFormat, pPortDef->format.video.eColorFormat: 19
02-26 09:43:18.770 167 1504 E : after ConvertOMXToAndroidColorFormat, pPortDef->format.video.eColorFormat: 257
02-26 09:43:18.770 167 1504 E : FSLOMXWrapper::GetParameter, ret: 0
02-26 09:43:18.770 167 1504 E OMXCodec: after getParameter, color format: 257, err: 0
02-26 09:43:18.770 167 1504 E OMXCodec: Not supported color format 257 by surface!
02-26 09:43:18.770 167 1504 E AwesomePlayer: failed to start video source
OMXFSLPlugin_new.cpp (external\fsl_imx_omx\stagefright\src)
OMX_ERRORTYPE FSLOMXWrapper::GetParameter(
OMX_INDEXTYPE nParamIndex,
OMX_PTR pStructure)
//when enable native buffer, the color format required in ACodec.cpp is pixel format. | |
//so need to convert OMX format to androd pixel format. | |
//once got the pixel format, it will report OMX color format when calling the function again. | |
if(bEnableNativeBuffers && bGotPixelFormat && OMX_IndexParamPortDefinition == nParamIndex){ | |
OMX_PARAM_PORTDEFINITIONTYPE *pPortDef = (OMX_PARAM_PORTDEFINITIONTYPE*)pStructure; | |
if(pPortDef->nPortIndex == 1 && OMX_PortDomainVideo == pPortDef->eDomain){ | |
LOGE("before ConvertOMXToAndroidColorFormat, pPortDef->format.video.eColorFormat: %d", pPortDef->format.video.eColorFormat); | |
pPortDef->format.video.eColorFormat = (OMX_COLOR_FORMATTYPE)ConvertOMXToAndroidColorFormat(pPortDef->format.video.eColorFormat); | |
LOGE("after ConvertOMXToAndroidColorFormat, pPortDef->format.video.eColorFormat: %d", pPortDef->format.video.eColorFormat); | |
bGotPixelFormat = OMX_FALSE; | |
} | |
} |
上面这段如果注释掉,就不会有问题了
OMXCodec.cpp (frameworks\av\media\libstagefright)
status_t OMXCodec::allocateOutputBuffersFromNativeWindow() {
int color_fmt = HAL_PIXEL_FORMAT_YCbCr_420_SP; | ||
switch(def.format.video.eColorFormat) { | ||
case OMX_COLOR_FormatYUV420SemiPlanar: | ||
color_fmt = HAL_PIXEL_FORMAT_YCbCr_420_SP; | ||
break; | ||
case OMX_COLOR_FormatYUV420Planar: | ||
color_fmt = HAL_PIXEL_FORMAT_YCbCr_420_P; | ||
break; | ||
case OMX_COLOR_Format16bitRGB565: | ||
color_fmt = HAL_PIXEL_FORMAT_RGB_565; | ||
break; | ||
case OMX_COLOR_FormatYUV422Planar: | ||
color_fmt = HAL_PIXEL_FORMAT_YCbCr_422_P; | ||
break; | ||
default: | ||
ALOGE("Not supported color format %d by surface!", def.format.video.eColorFormat); | ||
return UNKNOWN_ERROR; | ||
} |
上面这段已经做了color format转换,fsl_imx_omx下的code多做了一次这样的动作,造成了问题
但是,我担心直接这样修改,会造成其他问题,要确认一下,贵司是否已经有official patch for such issue