[FFmpeg-devel] VP8 on win64

Måns Rullgård mans
Tue Aug 24 13:09:44 CEST 2010

Michael Niedermayer <michaelni at gmx.at> writes:

> On Tue, Aug 24, 2010 at 12:13:06AM -0400, Ronald S. Bultje wrote:
>> Hi,
>> On Sun, Aug 22, 2010 at 10:34 PM, Ramiro Polla <ramiro.polla at gmail.com> wrote:
>> > On Sun, Aug 22, 2010 at 11:19 PM, Ronald S. Bultje <rsbultje at gmail.com> wrote:
>> >> On Sun, Aug 22, 2010 at 10:17 PM, Ramiro Polla <ramiro.polla at gmail.com> wrote:
>> >>> On Sun, Aug 22, 2010 at 11:06 PM, Ronald S. Bultje <rsbultje at gmail.com> wrote:
>> >>>> 2010/8/22 M?ns Rullg?rd <mans at mansr.com>:
>> >>>>> All the vp8 tests are failing on win64 with an error code of 5 rather
>> >>>>> than the more usual 1 (which is how the other tests fail). ?Does
>> >>>>> anyone a) know what code 5 means, or b) have any idea what's going
>> >>>>> wrong?
>> >>>>
>> >>>> I think attached patch fixes it, at least one of the crashes is now
>> >>>> working for me. Need better understanding of Windows to be able to
>> >>>> figure out how to run "make fate", but I'm hoping the win-experts can
>> >>>> help me with that. ;-).
>> >>>
>> >>> With that patch, only test vectors 003, 004, and 007 fail.
>> >>
>> >> Ah yes I missed the bilin ones.
>> >
>> > 3 and 7 still failed on make fate but not when I tried through gdb.
>> I've been looking into these. The problem is that on win64, for test 3
>> and 7, it only outputs the first two frames of the video instead of
>> all.
>> It turns out it drops all other frames in do_video_out() because the
>> PTS is set to zero all the way back before output_packet() is called
>> in ffmpeg.c. This is not the case on my OSX box (also 64bit), which
>> passes make fate. The input PTS from av_read_frame() is the same on
>> both systems, so something happens between the call to av_read_frame()
>> and the call to output_packet() in ffmpeg.c:transcode(). Using
>> watchpoints, I think I've tracked it down to ffmpeg.c:2598:
>> 2595            if(input_files_ts_scale[file_index][pkt.stream_index]){
>> 2596                if(pkt.pts != AV_NOPTS_VALUE)
>> 2597                    pkt.pts *=
>> input_files_ts_scale[file_index][pkt.stream_index];
>> 2598                if(pkt.dts != AV_NOPTS_VALUE)
>> 2599                    pkt.dts *=
>> input_files_ts_scale[file_index][pkt.stream_index];
>> 2600            }
>> These modify the correct pts of 2 to a system-dependent 0 on win64
>> only (but not on Linux). I think this happens because
>> input_files_ts_scale[][] is a double[][]. The value, at the time of
>> the comparison, is still 0.0 (zero), with 8 zero bytes in memory (or
>> do doubles have more on win64?), however the if does trigger and the
>> code inside is executed.
>> I don't know why this doesn't happen for other testfiles,
>> but we know
>> that general consensus is that you should never use doubles for exact
>> comparisons.
> general consensus amongth whom?

Amongst people using floating-point.  It is true that _computed_
floating-point numbers should never be compared for equality since
rounding rules mean a few bits may differ even between compliant
implementations.  To be safe, one must calculate the accuracy of the
result and do a range comparison.

However, setting a float to an exact constant (such as zero) and later
comparing with the same constant is of course safe.

>> Therefore, I think the check should be changed into
>> something more intelligent, or maybe the default values should be
>> changed to -1 so we can check for if (val > 0) instead of if (val).
>> The attached patch is a poor attempt at doing so, probably not right
>> for SVN, but it hopefully shows how to fix this bug.
> if if(0.0) is true this is a bug period


> try with all asm disabled, if it still happens the compiler is buggy
> if it doesnt happen look at the generated code and think about if it
> could be affected by asm not declaring which sse registers are clobbered

Didn't someone already say it all passes with asm disabled.  I
strongly suspect the missing clobbers here.

M?ns Rullg?rd
mans at mansr.com

More information about the ffmpeg-devel mailing list