为 iOS arm64 编译的 G729 编解码器无法正常运行
G729 codec compiled for iOS arm64 does not function properly
我在我的 VOIP 应用程序中使用了 G729 编解码器,当该应用程序仅针对 armv7 时,它工作正常。被叫方可以清楚地听到我的声音。然后我转向arm64,被叫方再也听不清我的声音了。我在Caller端的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)
0x00ffffffL - 0xff000000L
的结果在32位上是1ffffff
(33554431
),但是在64位上是ffffffff01ffffff
(-4261412865
),因为long在 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)
希望这对您有所帮助。
我在我的 VOIP 应用程序中使用了 G729 编解码器,当该应用程序仅针对 armv7 时,它工作正常。被叫方可以清楚地听到我的声音。然后我转向arm64,被叫方再也听不清我的声音了。我在Caller端的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)
0x00ffffffL - 0xff000000L
的结果在32位上是1ffffff
(33554431
),但是在64位上是ffffffff01ffffff
(-4261412865
),因为long在 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)
希望这对您有所帮助。