通过日志可以发现,一旦拼多多开启直播就会报RgaBlit fail
以及颜色格式错误:
问题追踪
追踪RgaBlit方法调用
(hardware/rockchip/omx_il/osal/Rockchip_OSAL_RGA_Process.c->rga_rgb2nv12->RgaBlit),RgaBlit
方法实现于hardware/rockchip/librga/normal/NormalRga.cpp类中,然后又调用了NormalRgaApi.cpp类的checkRectForRga方法,当width无法被8整除就会报错,而这个width为540,恰好无法被8整除。
追踪rga_rgb2nv12方法调用
hardware/rockchip/omx_il/component/video/enc/Rkvpu_OMX_Venc.c
->Rkvpu_ProcessStoreMetaData,此方法会被此类中的UpdateFrameSize方法调用,UpdateFrameSize方法又会被hardware/rockchip/omx_il/component/video/enc/Rkvpu_OMX_VencControl.c
中的Rkvpu_OMX_SetParameter方法调用,此方法又会被hardware/rockchip/omx_il/component/video/enc/Rkvpu_OMX_Venc.c
通过pOMXComponent->SetParameter = &Rkvpu_OMX_SetParameter;
赋值给omx组件
继续往上追踪
其实追踪到上面,几乎已经迷茫了。意外的百度时看到MediaCodec的使用,会设置width,debug了一下,发现确实拼多多直播时会通过MediaCodec进行编码。然后才发现这个540竟然是拼多多应用设置的。
https://mp.weixin.qq.com/s/gBI6Tz5VmXJF9AZ9HPVUiQ (MediaCodec与openmax的调用关系分析)
解决方案
修改MediaFormat.java类,强制修改用户的参数设定。
public final void setInteger(String name, int value) {
Log.i("MediaFormat set,name=" + name + ",value=" + value);
if(name == KEY_WIDTH){
if(value == 540){
value = 544;
}
}
if(name == KEY_COLOR_FORMAT){
if(value == 2130708361){
value = MediaCodecInfo.CodecCapabilities.COLOR_FormatSurface;
}
}
mMap.put(name, Integer.valueOf(value));
}
0 条评论