• Ico Doornekamp's avatar
    avformat/rtpdec_jpeg: fix low contrast image on low quality setting · e3e6a2cf
    Ico Doornekamp authored
    Original mail and my own followup on ffmpeg-user earlier today:
    
    I have a device sending out a MJPEG/RTP stream on a low quality setting.
    Decoding and displaying the video with libavformat results in a washed
    out, low contrast, greyish image. Playing the same stream with VLC results
    in proper color representation.
    
    Screenshots for comparison:
    
      http://zevv.nl/div/libav/shot-ffplay.jpg
      http://zevv.nl/div/libav/shot-vlc.jpg
    
    A pcap capture of a few seconds of video and SDP file for playing the
    stream are available at
    
      http://zevv.nl/div/libav/mjpeg.pcap
      http://zevv.nl/div/libav/mjpeg.sdp
    
    I believe the problem might be in the calculation of the quantization
    tables in the function create_default_qtables(), the attached patch
    solves the issue for me.
    
    The problem is that the argument 'q' is of the type uint8_t. According to the
    JPEG standard, if 1 <= q <= 50, the scale factor 'S' should be 5000 / Q.
    Because the create_default_qtables() reuses the variable 'q' to store the
    result of this calculation, for small values of q < 19, q wil subsequently
    overflow and give wrong results in the calculated quantization tables. The
    patch below uses a new variable 'S' (same name as in RFC2435) with the proper
    range to store the result of the division.
    Signed-off-by: 's avatarMichael Niedermayer <michael@niedermayer.cc>
    e3e6a2cf
Name
Last commit
Last update
compat Loading commit data...
doc Loading commit data...
libavcodec Loading commit data...
libavdevice Loading commit data...
libavfilter Loading commit data...
libavformat Loading commit data...
libavresample 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...
.travis.yml 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...
arch.mak Loading commit data...
cmdutils.c Loading commit data...
cmdutils.h Loading commit data...
cmdutils_common_opts.h Loading commit data...
cmdutils_opencl.c Loading commit data...
common.mak Loading commit data...
configure Loading commit data...
ffmpeg.c Loading commit data...
ffmpeg.h Loading commit data...
ffmpeg_dxva2.c Loading commit data...
ffmpeg_filter.c Loading commit data...
ffmpeg_opt.c Loading commit data...
ffmpeg_qsv.c Loading commit data...
ffmpeg_vdpau.c Loading commit data...
ffmpeg_videotoolbox.c Loading commit data...
ffplay.c Loading commit data...
ffprobe.c Loading commit data...
ffserver.c Loading commit data...
ffserver_config.c Loading commit data...
ffserver_config.h Loading commit data...
library.mak Loading commit data...
version.sh Loading commit data...