diff mbox

[FFmpeg-devel] speedhq: fix decoding artifacts

Message ID E1cfA5f-0006Z7-34@pannekake.samfundet.no
State Accepted
Commit e3c14eaa54c87d4d8771bc75cb24b0b537fbcd19
Headers show

Commit Message

Steinar H. Gunderson Feb. 18, 2017, 6:41 p.m. UTC
The quantization table is stored in the natural order, but when we
access it, we use an index that's in zigzag order, causing us to read
the wrong value. This causes artifacts, especially in areas with
horizontal or vertical edges. The artifacts look a lot like the
DCT ringing artifacts you'd expect to see from a low-bitrate file,
but when comparing to NewTek's own decoder, it's obvious they're not
supposed to be there.

Fix by simply storing the scaled quantization table in zigzag order.
Performance is unchanged.
---
 libavcodec/speedhq.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

Comments

Paul B Mahol Feb. 18, 2017, 7:37 p.m. UTC | #1
On 2/18/17, Steinar H. Gunderson <steinar+ffmpeg@gunderson.no> wrote:
> The quantization table is stored in the natural order, but when we
> access it, we use an index that's in zigzag order, causing us to read
> the wrong value. This causes artifacts, especially in areas with
> horizontal or vertical edges. The artifacts look a lot like the
> DCT ringing artifacts you'd expect to see from a low-bitrate file,
> but when comparing to NewTek's own decoder, it's obvious they're not
> supposed to be there.
>
> Fix by simply storing the scaled quantization table in zigzag order.
> Performance is unchanged.
> ---
>  libavcodec/speedhq.c | 2 +-
>  1 file changed, 1 insertion(+), 1 deletion(-)
>
> diff --git a/libavcodec/speedhq.c b/libavcodec/speedhq.c
> index 45ee37a4e6..60efb0222b 100644
> --- a/libavcodec/speedhq.c
> +++ b/libavcodec/speedhq.c
> @@ -409,7 +409,7 @@ static int decode_speedhq_field(const SHQContext *s,
> const uint8_t *buf, int buf
>  static void compute_quant_matrix(int *output, int qscale)
>  {
>      int i;
> -    for (i = 0; i < 64; i++) output[i] = unscaled_quant_matrix[i] * qscale;
> +    for (i = 0; i < 64; i++) output[i] =
> unscaled_quant_matrix[ff_zigzag_direct[i]] * qscale;
>  }
>
>  static int speedhq_decode_frame(AVCodecContext *avctx,
> --
> 2.11.0
>
> _______________________________________________
> ffmpeg-devel mailing list
> ffmpeg-devel@ffmpeg.org
> http://ffmpeg.org/mailman/listinfo/ffmpeg-devel
>

lgtm
Michael Niedermayer Feb. 20, 2017, 11:43 p.m. UTC | #2
On Sat, Feb 18, 2017 at 08:37:26PM +0100, Paul B Mahol wrote:
> On 2/18/17, Steinar H. Gunderson <steinar+ffmpeg@gunderson.no> wrote:
> > The quantization table is stored in the natural order, but when we
> > access it, we use an index that's in zigzag order, causing us to read
> > the wrong value. This causes artifacts, especially in areas with
> > horizontal or vertical edges. The artifacts look a lot like the
> > DCT ringing artifacts you'd expect to see from a low-bitrate file,
> > but when comparing to NewTek's own decoder, it's obvious they're not
> > supposed to be there.
> >
> > Fix by simply storing the scaled quantization table in zigzag order.
> > Performance is unchanged.
> > ---
> >  libavcodec/speedhq.c | 2 +-
> >  1 file changed, 1 insertion(+), 1 deletion(-)
> >
> > diff --git a/libavcodec/speedhq.c b/libavcodec/speedhq.c
> > index 45ee37a4e6..60efb0222b 100644
> > --- a/libavcodec/speedhq.c
> > +++ b/libavcodec/speedhq.c
> > @@ -409,7 +409,7 @@ static int decode_speedhq_field(const SHQContext *s,
> > const uint8_t *buf, int buf
> >  static void compute_quant_matrix(int *output, int qscale)
> >  {
> >      int i;
> > -    for (i = 0; i < 64; i++) output[i] = unscaled_quant_matrix[i] * qscale;
> > +    for (i = 0; i < 64; i++) output[i] =
> > unscaled_quant_matrix[ff_zigzag_direct[i]] * qscale;
> >  }
> >
> >  static int speedhq_decode_frame(AVCodecContext *avctx,
> > --
> > 2.11.0
> >
> > _______________________________________________
> > ffmpeg-devel mailing list
> > ffmpeg-devel@ffmpeg.org
> > http://ffmpeg.org/mailman/listinfo/ffmpeg-devel
> >
> 
> lgtm

applied

thx

[...]
diff mbox

Patch

diff --git a/libavcodec/speedhq.c b/libavcodec/speedhq.c
index 45ee37a4e6..60efb0222b 100644
--- a/libavcodec/speedhq.c
+++ b/libavcodec/speedhq.c
@@ -409,7 +409,7 @@  static int decode_speedhq_field(const SHQContext *s, const uint8_t *buf, int buf
 static void compute_quant_matrix(int *output, int qscale)
 {
     int i;
-    for (i = 0; i < 64; i++) output[i] = unscaled_quant_matrix[i] * qscale;
+    for (i = 0; i < 64; i++) output[i] = unscaled_quant_matrix[ff_zigzag_direct[i]] * qscale;
 }
 
 static int speedhq_decode_frame(AVCodecContext *avctx,