Browse Source

rtpdec_jpeg: fix low contrast image on low quality setting

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.

Instead, use a new variable 'S' (same name as in RFC2435) with the
proper range to store the result of the division.

Signed-off-by: Martin Storsjö <martin@martin.st>
tags/n3.1
Ico Doornekamp Martin Storsjö 9 years ago
parent
commit
edf54887e2
1 changed files with 4 additions and 3 deletions
  1. +4
    -3
      libavformat/rtpdec_jpeg.c

+ 4
- 3
libavformat/rtpdec_jpeg.c View File

@@ -186,16 +186,17 @@ static void create_default_qtables(uint8_t *qtables, uint8_t q)
{
int factor = q;
int i;
uint16_t S;

factor = av_clip(q, 1, 99);

if (q < 50)
q = 5000 / factor;
S = 5000 / factor;
else
q = 200 - factor * 2;
S = 200 - factor * 2;

for (i = 0; i < 128; i++) {
int val = (default_quantizers[i] * q + 50) / 100;
int val = (default_quantizers[i] * S + 50) / 100;

/* Limit the quantizers to 1 <= q <= 255. */
val = av_clip(val, 1, 255);


Loading…
Cancel
Save