[FFmpeg-cvslog] avcodec/vc1: fix mquant calculation

Jerome Borsboom git at videolan.org
Sun Apr 29 05:16:07 EEST 2018


ffmpeg | branch: master | Jerome Borsboom <jerome.borsboom at carpalis.nl> | Sat Apr 28 17:15:32 2018 +0200| [19c3df0cd6ddc21a666e67a0c98b7823a2730003] | committer: Michael Niedermayer

avcodec/vc1: fix mquant calculation

In vc1_decode_i_blocks_adv mquant needs to be reset to its default value for
each macroblock, instead of once at the beginning of the slice.

DQPROFILE specifies which macroblocks can have an alternative quantizer step
size. When DQPROFILE specifies edges, the selection is applicable to the edges
of the picture. Slice edges are not selected by DQPROFILE.

Signed-off-by: Jerome Borsboom <jerome.borsboom at carpalis.nl>
Signed-off-by: Michael Niedermayer <michael at niedermayer.cc>

> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=19c3df0cd6ddc21a666e67a0c98b7823a2730003
---

 libavcodec/vc1_block.c | 5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)

diff --git a/libavcodec/vc1_block.c b/libavcodec/vc1_block.c
index 7cabe49eda..ace1b3eedb 100644
--- a/libavcodec/vc1_block.c
+++ b/libavcodec/vc1_block.c
@@ -177,7 +177,7 @@ static void vc1_put_signed_blocks_clamped(VC1Context *v)
             edges = 15;                                        \
         if ((edges&1) && !s->mb_x)                             \
             mquant = -v->altpq;                                \
-        if ((edges&2) && s->first_slice_line)                  \
+        if ((edges&2) && !s->mb_y)                             \
             mquant = -v->altpq;                                \
         if ((edges&4) && s->mb_x == (s->mb_width - 1))         \
             mquant = -v->altpq;                                \
@@ -2626,7 +2626,7 @@ static void vc1_decode_i_blocks_adv(VC1Context *v)
     int cbp, val;
     uint8_t *coded_val;
     int mb_pos;
-    int mquant = v->pq;
+    int mquant;
     int mqdiff;
     GetBitContext *gb = &s->gb;
 
@@ -2671,6 +2671,7 @@ static void vc1_decode_i_blocks_adv(VC1Context *v)
         init_block_index(v);
         for (;s->mb_x < s->mb_width; s->mb_x++) {
             int16_t (*block)[64] = v->block[v->cur_blk_idx];
+            mquant = v->pq;
             ff_update_block_index(s);
             s->bdsp.clear_blocks(block[0]);
             mb_pos = s->mb_x + s->mb_y * s->mb_stride;



More information about the ffmpeg-cvslog mailing list