diff options
author | Kostya Shishkov <kostya.shishkov@gmail.com> | 2006-07-21 04:06:06 +0000 |
---|---|---|
committer | Kostya Shishkov <kostya.shishkov@gmail.com> | 2006-07-21 04:06:06 +0000 |
commit | 27ed1a0dee0f49beb202e104b47d521a700827c1 (patch) | |
tree | 94fd9032ddc29b76ee24c5fab8a917f827837cd0 /libavcodec/vc1.c | |
parent | 92ad0d9d3bfcb756963f4becf0f1c566bb5d6b79 (diff) | |
download | ffmpeg-27ed1a0dee0f49beb202e104b47d521a700827c1.tar.gz |
1000l: scale DC predictors instead of predicted value.
Originally committed as revision 5808 to svn://svn.ffmpeg.org/ffmpeg/trunk
Diffstat (limited to 'libavcodec/vc1.c')
-rw-r--r-- | libavcodec/vc1.c | 32 |
1 files changed, 20 insertions, 12 deletions
diff --git a/libavcodec/vc1.c b/libavcodec/vc1.c index a18dbfa16a..fa1d9fa351 100644 --- a/libavcodec/vc1.c +++ b/libavcodec/vc1.c @@ -1769,38 +1769,46 @@ static inline int vc1_pred_dc(MpegEncContext *s, int overlap, int pq, int n, c = dc_val[ - 1]; b = dc_val[ - 1 - wrap]; a = dc_val[ - wrap]; + /* scale predictors if needed */ + q1 = s->current_picture.qscale_table[mb_pos]; + if(c_avail && (n!= 1 && n!=3)) { + q2 = s->current_picture.qscale_table[mb_pos - 1]; + if(q2 && q2 != q1) + c = (c * s->y_dc_scale_table[q2] * vc1_dqscale[s->y_dc_scale_table[q1] - 1] + 0x20000) >> 18; + } + if(a_avail && (n!= 2 && n!=3)) { + q2 = s->current_picture.qscale_table[mb_pos - s->mb_stride]; + if(q2 && q2 != q1) + a = (a * s->y_dc_scale_table[q2] * vc1_dqscale[s->y_dc_scale_table[q1] - 1] + 0x20000) >> 18; + } + if(a_avail && c_avail && (n!=3)) { + int off = mb_pos; + if(n != 1) off--; + if(n != 2) off -= s->mb_stride; + q2 = s->current_picture.qscale_table[off]; + if(q2 && q2 != q1) + b = (b * s->y_dc_scale_table[q2] * vc1_dqscale[s->y_dc_scale_table[q1] - 1] + 0x20000) >> 18; + } if(a_avail && c_avail) { if(abs(a - b) <= abs(b - c)) { pred = c; *dir_ptr = 1;//left - q2 = s->current_picture.qscale_table[mb_pos - 1]; } else { pred = a; *dir_ptr = 0;//top - q2 = s->current_picture.qscale_table[mb_pos - s->mb_stride]; } } else if(a_avail) { pred = a; *dir_ptr = 0;//top - q2 = s->current_picture.qscale_table[mb_pos - s->mb_stride]; } else if(c_avail) { pred = c; *dir_ptr = 1;//left - q2 = s->current_picture.qscale_table[mb_pos - 1]; } else { pred = 0; *dir_ptr = 1;//left } - /* scale coeffs if needed */ - q1 = s->current_picture.qscale_table[mb_pos]; - if(n && n<4) q2=q1; - - if(q2 && q1!=q2) { - pred = (pred * s->y_dc_scale_table[q2] * vc1_dqscale[s->y_dc_scale_table[q1] - 1] + 0x20000) >> 18; - } - /* update predictor */ *dc_val_ptr = &dc_val[0]; return pred; |