通过日志可以发现,一旦拼多多开启直播就会报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 条评论

发表回复

您的电子邮箱地址不会被公开。