【问题标题】:G729 codec compiled for iOS arm64 does not function properly为 iOS arm64 编译的 G729 编解码器无法正常工作
【发布时间】:2015-05-08 07:14:19
【问题描述】:

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

【问题讨论】:

标签: ios arm64 g729


【解决方案1】:

这取决于您使用的 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),因为在 ARM 处理器上,64 位上的 long 要大得多(我我正在使用 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)

希望这会有所帮助。

【讨论】:

  • 你救了我的命兄弟!挖了将近一个月。非常感谢!! :)
  • 非常感谢 - 希望我能给这个答案更多的支持
  • 需要稍作修正; 0xff000000L 和 0xfe000000L 已在解决方案中互换
  • @NickDowell:我正在为 ARM 的 G729 编译而苦苦挣扎。它给了我 asm 的错误。任何帮助!
  • @ArslanPervaiz 我刚刚按照答案(已编辑)得到了结果!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-17
相关资源
最近更新 更多