[FFmpeg-trac] #9458(ffmpeg:reopened): ffmpeg's outputs differ a lot when compiled with gcc and clang

FFmpeg trac at avcodec.org
Mon Oct 18 23:29:58 EEST 2021


#9458: ffmpeg's outputs differ a lot when compiled with gcc and clang
------------------------------------+------------------------------------
             Reporter:  Shaohua Li  |                    Owner:  (none)
                 Type:  defect      |                   Status:  reopened
             Priority:  normal      |                Component:  ffmpeg
              Version:  git-master  |               Resolution:
             Keywords:              |               Blocked By:
             Blocking:              |  Reproduced by developer:  0
Analyzed by developer:  0           |
------------------------------------+------------------------------------
Changes (by Shaohua Li):

 * status:  closed => reopened
 * resolution:  invalid =>

Comment:

 Well, I would insist that this issue is important as clang and gcc both
 are top popular compilers. It's harmful to have inconsistent program
 results across compilers or compiler optimisations (as I have explained in
 my last comment). Inconsistent results mean that at least one (potentially
 multiple) compiled binary has incorrect semantics.

 Since I reported this issue, I've been trying to debug ffmpeg to find the
 root cause of such difference. I used gdb (with rr) to debug gcc11 and
 clang13 compiled ffmpeg_g with optflags=-O0.

 I found that in ''libavcodec/motion_est.c:914'',
 ''s->mpvencdsp.pix_sum(pix, s->linesize)'' would be evaluated differently
 by these two ffmpegs. This difference only appeared when analysing some of
 the streams. Because "pix_sum" seems to be in the form of assembly code, I
 was not able to continue my analysis. I provided detailed reproduce
 procedures below in case you're interested in.


 1) run gdb :
 {{{
 % gdb --args ffmpeg_g  -threads  1 -y -i   input_diff_1  -f mp4 output
 }}}

 2) set breakpoint at ffmpeg.c:4817:
 {{{
 % b ffmpeg.c:4817
 }}}

 3) start the program and continue until you hit the breakpoint '''11'''
 times.

 4) set breakpoint at motion_est.c:914 and continue; Note that, you need to
 make sure that when you hit this breakpoint, ''mb_x'' and ''mb_y'' should
 both be 0. This is important since ffmpeg is by default multi-threading
 and somehow ''-threads 1'' cannot make it single-threaded in gdb.

 5) check the value of ''sum''. For clang13 compiled ffmpeg, it was
 ''60160'' while for gcc11, it was ''57751''.
-- 
Ticket URL: <https://trac.ffmpeg.org/ticket/9458#comment:3>
FFmpeg <https://ffmpeg.org>
FFmpeg issue tracker


More information about the FFmpeg-trac mailing list