• Andreas Rheinhardt's avatar
    avcodec/h264_slice: Fix decoding undamaged input with slices · c4fcfa47
    Andreas Rheinhardt authored
    ff_er_frame_start() initializes ERContext.error_count
    to three times the number of macroblocks to decode.
    Later ff_er_add_slice() reduces this number by the amount
    of macroblocks whose AC resp. DC resp. MV have been finished
    (so every correctly decoded MB counts three times).
    So the frame has been decoded correctly if error_count is zero
    at the end.
    
    The H.264 decoder uses multiple ERContexts when using
    slice threading and therefore combines these error counts:
    The first slice's ERContext is intended to be initialized
    by ff_er_frame_start(), error_count of all the other
    slice contexts is intended to be zeroed initially and
    all afterwards all the error_counts are summed.
    
    Yet commit 43b43421
    (probably unintentionally) changed the code to set
    the first slice's error_count to zero as well.
    This leads to bogus error messages in case one decodes
    an input video using multiple slices with slice threading
    with error concealment enabled (which is not the default)
    ("concealing 0 DC, 0 AC, 0 MV errors in [IPB] frame");
    furthermore the returned frame is marked as corrupt as well
    (ffmpeg reports "corrupt decoded frame in stream %d" for this).
    
    This can be fixed easily given that only the first ERContext
    is really used since 7be2d2a7:
    Don't reset the error_count; and don't sum the error counts as well.
    Reviewed-by: 's avatarMichael Niedermayer <michael@niedermayer.cc>
    Signed-off-by: 's avatarAndreas Rheinhardt <andreas.rheinhardt@outlook.com>
    c4fcfa47
Name
Last commit
Last update
compat Loading commit data...
doc Loading commit data...
ffbuild Loading commit data...
fftools Loading commit data...
libavcodec Loading commit data...
libavdevice Loading commit data...
libavfilter Loading commit data...
libavformat Loading commit data...
libavutil Loading commit data...
libpostproc Loading commit data...
libswresample Loading commit data...
libswscale Loading commit data...
presets Loading commit data...
tests Loading commit data...
tools Loading commit data...
.gitattributes Loading commit data...
.gitignore Loading commit data...
.mailmap Loading commit data...
.travis.yml Loading commit data...
CONTRIBUTING.md Loading commit data...
COPYING.GPLv2 Loading commit data...
COPYING.GPLv3 Loading commit data...
COPYING.LGPLv2.1 Loading commit data...
COPYING.LGPLv3 Loading commit data...
CREDITS Loading commit data...
Changelog Loading commit data...
INSTALL.md Loading commit data...
LICENSE.md Loading commit data...
MAINTAINERS Loading commit data...
Makefile Loading commit data...
README.md Loading commit data...
RELEASE Loading commit data...
configure Loading commit data...