El códec G729 comstackdo para iOS arm64 no funciona correctamente

Utilicé el códec G729 en mi aplicación VOIP, cuando el objective de la aplicación solo es armv7, funciona bien. El Callee puede oír mi voz claramente. Luego me vuelvo hacia el arm64, el que ya no tiene mi voz clara. Grabo los datos brutos de voz de input antes y después del códec G729 tanto en el dispositivo armv7 como en el dispositivo arm64 en el lado del llamante, y luego vuelvo a convertir los datos codificados G729. Me parece que la voz trasera convertida del dispositivo armv7 es mucho mejor que el dispositivo arm64.

    Esto depende de la implementación del G729 que está utilizando, pero si usa el de Samuel Vinson, creo que encontré el problema.

    En lpc.c hay una comparación entre un resultado y una resta entre dos valores en las líneas 643 y 698, respectivamente:

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

    El resultado de 0x00ffffffL - 0xff000000L es 1ffffff ( 33554431 ) en 32 bits, pero ffffffff01ffffff ( -4261412865 ) en 64 bits, porque el largo es mucho más grande en 64 bits en un procesador ARM (estoy probando con un iPhone 4, armv7, 32 bit y un iPhone 5s, arm64, 64 bits).

    Entonces, básicamente, en 64 bits, la comparación siempre fallara la verificación, ya que el segundo término siempre es negativo y un UWord32 siempre será positivo.

    Mi solución es usar los resultados codificados de la resta en 32 bits, por lo que al usar 0x3ffffffL para el primer condicional y 0x1ffffffL para el segundo, corrige el problema de calidad de voz para mí:

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

    Espero que esto ayude.