0

我有一个 Theora 视频解码器库和应用程序在 windows(英特尔 x86 架构)上使用 VS-2008 编译。我使用这个设置来解码 theora 比特流(*.ogg 文件)。此解码器库的源代码来自 FFMPEG v0.5 源包,经过一些修改,使其可以在 windows-VS-2008 组合上编译。

现在,当我使用我使用 gcc 构建的 linux(Intel x86 架构)上的 ffmpeg(V0.5)应用程序解码相同的 theora 比特流并获得一些解码的输出 yuv 文件时,该输出文件与从获得的输出有 1 位差异windows-VS2008 设置,以及输出文件的几个字节,不是全部。我希望 2 个输出是位匹配的。

我怀疑以下因素:

a.) 两个编译器 gcc 和 MS-VS2008 之间的某些数据类型不匹配?

b.)我已经验证代码没有使用任何运行时数学库函数,如 log、pow、exp、cos 等......但我的代码仍然有一些操作,如 (a+b+c)/3.Could这是一个问题吗?

这个“除以三”或任何其他数字的实现在两种设置中可能不同。

c.)某种舍入/截断效果发生不同?

d.) 我是否会遗漏 Linux 中作为 makefile/configure 选项存在的任何宏,而 Windows 设置中没有该宏?

但我无法缩小问题范围并解决它。

1.)我的怀疑是否有效,或者是否存在任何其他问题可能导致这两种不同设置产生的输出出现这些 1 位差异。

2.) 我该如何调试和解决这个问题?

我想,这种 linux-gcc 设置和 Windows MS 编译器之间输出差异的场景对于任何通用代码来说都是正确的(不一定特定于我的视频解码器应用程序)

任何指示都会对此有所帮助。

谢谢,

-广告

4

3 回答 3

1

我认为,这种行为可能来自 x87/sse2 数学。你使用什么版本的 gcc?您使用浮点(32 位)还是双精度(64 位)?x87 上的数学在内部具有更多的精度位(82),而不是可以存储在内存中

尝试 gcc -ffloat-store 的标志;-msse2 -mfpmath=sse

msvc 的标志/fp:fast /arch:SSE2

于 2010-02-10T10:14:29.300 回答
0

1、可能是一些浮点库的不同优化

2、有问题吗?

编辑:
查看 VS 上的“/fprecise”选项(http://msdn.microsoft.com/en-us/library/e7s85ffb.aspx)或 gcc 上的“-fprecise-math”。

于 2010-02-09T19:48:59.847 回答
0

关于 b),整数和浮点除法完全在 C99 中指定。C99 为整数指定向零舍入(早期标准为左舍入方向实现定义),而 IEEE 754 为浮点指定。

听说 VS2008 没有声称实现 C99,这并没有真正帮助。实现定义至少意味着您可以编写一些测试用例并确保在您的编译器中做出了哪个决定。

如果您真的关心这一点,如何检测代码以将详细跟踪输出到单独的文件并检查跟踪的第一个区别?嘿,也许跟踪甚至已经存在用于调试目的!

于 2010-02-09T19:51:20.963 回答