如何获得MediaCodec编码器的步幅和Y平面对齐值

时间:2013-12-20 08:12:50

标签: android encoding mediacodec

有关此主题的一些相关问题和讨论:

我正在将相机预览帧(NV21转换为NV12)提供给MediaCodec编码器(NV12又名COLOR_FormatYUV420SemiPlanar)。在QualComm编码器运行Android版本低于4.3的某些设备上看起来就是这样。我必须进行一些输入帧处理才能接收正确颜色的背帧。

Sony Xperia ZR正在运行Android 4.2.2我必须添加Y平面对齐,以使其能够处理几乎所有分辨率。上面的代码为宽度添加了1024字节对齐,对于其他分辨率,这些宽度不能被322048字节对齐。它会MediaCodec为所有分辨率正确编码帧,可以除以16176x144平面看起来不对齐的UV除外)。

int getYPadding() {
    if (mediaCodecInfo.getName().contains("OMX.qcom") && android.os.Build.VERSION.SDK_INT < 18) {
        if ((getWidth() % 32) != 0) {
            return (getWidth()*getHeight()) % 1024;
        } else {
            return (getWidth()*getHeight()) % 2048;
        }
    }
    return 0;
}

我已尝试在运行相同LG G2并具有Android 4.2.2编码器的QualComm上测试此对齐方式,看起来它无法正常工作。 UV平面未对齐(框架底部有绿色条纹)。我无法计算适用于这两款手机的填充。

我还可以使用Sony Xperia Z1芯片组访问运行Android 4.3的{​​{1}},看起来它没有这样的问题。每个分辨率的视频都很好,QualComm平面无论如何都不需要对齐。

我知道它与硬件有关并且可能很复杂,但由于我必须支持在Y之前运行Android的用户,因此我有一个问题。是否有可能以编程方式确定编码器期望的给定颜色格式的4.3平面对齐和垂直/水平步幅值?

1 个答案:

答案 0 :(得分:7)

问题简而言之:在Android 4.3(API 18)之前,视频编码没有CTS tests

因此,MediaCodec在不同设备上的行为不一致,并且一些错误未被注意到。 EncodeDecodeTest测试会执行您所询问的功能,因此您可以可靠地将YUV数据提供给4.3+设备(尽管您仍需要运行时检测它是否需要平面或半平面)。

对于您的特定问题,较旧的Qualcomm设备上的Y平面需要在2K边界处对齐,这与您的代码不同。对于720p视频,这种情况自然发生(720 * 1280 == 450 * 2048),对于176x144,您需要调整1280以在26624而不是25344处启动UV平面。您需要在缓冲区内设置绝对对齐,而不是固定填充量 - 使用uvoffset = (width*height + 2047) & ~2047

您需要检测编解码器供应商和Android软件版本,如果是4.3版之前的Qualcomm,则需要进行此调整。如果您的要求发生变化,并且您可以针对API 18+,则这些问题就会消失。 (并且您可以使用Surface输入到MediaCodec,这可以避免U / V交换问题,但这取决于您可能没用的需求。)