为iOS arm64编译的G729编解码器无法正常运行

时间:2015-05-08 07:14:20

标签: ios arm64 g729

我在我的VOIP应用程序中使用了G729编解码器,当应用程序仅定位armv7时,它运行正常。被叫者可以清楚地听到我的声音。然后我转向arm64,被叫方不再清楚地听到我的声音。我在呼叫方的armv7设备和arm64设备上记录G729编解码器之前和之后的输入语音原始数据,然后将G729编码数据转换回来。我发现armv7设备转换后的声音比arm64设备要好得多。

1 个答案:

答案 0 :(得分:5)

这取决于您使用的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)

0x00ffffffL - 0xff000000L的结果是1ffffff33554431)在32位上,但是ffffffff01ffffff-4261412865)在64位上,因为长的是方式在ARM处理器上64位更大(我正在测试iPhone 4,armv7,32位和iPhone 5s,arm64,64位)。

因此,基本上在64位上,比较将始终无法通过检查,因为第二项始终为负,而UWord32将始终为正。

我的解决方案是在32位上使用减法的硬编码结果,所以 使用0x3ffffffL作为第一个条件,0x1ffffffL作为第二个,修复语音质量问题:

lpc.c:643  if ((UWord32)(t0 - 0xff000000L) < 0x3ffffffL)
lpc.c:698  if ((UWord32)(t0 - 0xfe000000L) < 0x1ffffffL)

希望这有帮助。

相关问题