我在我的VOIP应用程序中使用了G729编解码器,当应用程序仅定位armv7时,它工作正常.被叫者可以清楚地听到我的声音.然后我转向arm64,被叫方不再清楚地听到我的声音.我在呼叫方的armv7设备和arm64设备上记录G729编解码器之前和之后的输入语音原始数据,然后将G729编码数据转换回来.我发现armv7设备转换后的语音比arm64设备要好得多.
这取决于您使用的G729实现,但如果您使用的是Samuel Vinson,我相信我发现了问题.
在lpc.c第643行和第698行的两个值之间的结果和减法之间进行了比较:
lpc.c:643 if ((UWord32)(t0 - 0xfe000000L) < 0x01ffffffL - 0xfe000000L)
lpc.c:698 if ((UWord32)(t0 - 0xff000000L) < 0x00ffffffL - 0xff000000L)
Run Code Online (Sandbox Code Playgroud)
结果0x00ffffffL - 0xff000000L是32位上的is 1ffffff(33554431),而64位上的ffffffff01ffffff(-4261412865),因为ARM处理器上64位的长度更大(我正在测试iPhone 4,armv7,32位和iPhone 5s,arm64, 64位).
因此,基本上在64位上,比较将始终未通过检查,因为第二项始终为负且a UWord32将始终为正.
我的解决方案是使用32位减法的硬编码结果,因此使用0x3ffffffL第一个条件和0x1ffffffL第二个,修复语音质量问题:
lpc.c:643 if ((UWord32)(t0 - 0xff000000L) < 0x3ffffffL)
lpc.c:698 if ((UWord32)(t0 - 0xfe000000L) < 0x1ffffffL)
Run Code Online (Sandbox Code Playgroud)
希望这可以帮助.
| 归档时间: |
|
| 查看次数: |
530 次 |
| 最近记录: |