comparison vc1.c @ 3508:3d6e4ef3170d libavcodec

1000l: scale DC predictors instead of predicted value.
author kostya
date Fri, 21 Jul 2006 04:06:06 +0000
parents 44e0a262d500
children da6095607f26
comparison
equal deleted inserted replaced
3507:44e0a262d500 3508:3d6e4ef3170d
1767 * C X 1767 * C X
1768 */ 1768 */
1769 c = dc_val[ - 1]; 1769 c = dc_val[ - 1];
1770 b = dc_val[ - 1 - wrap]; 1770 b = dc_val[ - 1 - wrap];
1771 a = dc_val[ - wrap]; 1771 a = dc_val[ - wrap];
1772 /* scale predictors if needed */
1773 q1 = s->current_picture.qscale_table[mb_pos];
1774 if(c_avail && (n!= 1 && n!=3)) {
1775 q2 = s->current_picture.qscale_table[mb_pos - 1];
1776 if(q2 && q2 != q1)
1777 c = (c * s->y_dc_scale_table[q2] * vc1_dqscale[s->y_dc_scale_table[q1] - 1] + 0x20000) >> 18;
1778 }
1779 if(a_avail && (n!= 2 && n!=3)) {
1780 q2 = s->current_picture.qscale_table[mb_pos - s->mb_stride];
1781 if(q2 && q2 != q1)
1782 a = (a * s->y_dc_scale_table[q2] * vc1_dqscale[s->y_dc_scale_table[q1] - 1] + 0x20000) >> 18;
1783 }
1784 if(a_avail && c_avail && (n!=3)) {
1785 int off = mb_pos;
1786 if(n != 1) off--;
1787 if(n != 2) off -= s->mb_stride;
1788 q2 = s->current_picture.qscale_table[off];
1789 if(q2 && q2 != q1)
1790 b = (b * s->y_dc_scale_table[q2] * vc1_dqscale[s->y_dc_scale_table[q1] - 1] + 0x20000) >> 18;
1791 }
1772 1792
1773 if(a_avail && c_avail) { 1793 if(a_avail && c_avail) {
1774 if(abs(a - b) <= abs(b - c)) { 1794 if(abs(a - b) <= abs(b - c)) {
1775 pred = c; 1795 pred = c;
1776 *dir_ptr = 1;//left 1796 *dir_ptr = 1;//left
1777 q2 = s->current_picture.qscale_table[mb_pos - 1];
1778 } else { 1797 } else {
1779 pred = a; 1798 pred = a;
1780 *dir_ptr = 0;//top 1799 *dir_ptr = 0;//top
1781 q2 = s->current_picture.qscale_table[mb_pos - s->mb_stride];
1782 } 1800 }
1783 } else if(a_avail) { 1801 } else if(a_avail) {
1784 pred = a; 1802 pred = a;
1785 *dir_ptr = 0;//top 1803 *dir_ptr = 0;//top
1786 q2 = s->current_picture.qscale_table[mb_pos - s->mb_stride];
1787 } else if(c_avail) { 1804 } else if(c_avail) {
1788 pred = c; 1805 pred = c;
1789 *dir_ptr = 1;//left 1806 *dir_ptr = 1;//left
1790 q2 = s->current_picture.qscale_table[mb_pos - 1];
1791 } else { 1807 } else {
1792 pred = 0; 1808 pred = 0;
1793 *dir_ptr = 1;//left 1809 *dir_ptr = 1;//left
1794 }
1795
1796 /* scale coeffs if needed */
1797 q1 = s->current_picture.qscale_table[mb_pos];
1798 if(n && n<4) q2=q1;
1799
1800 if(q2 && q1!=q2) {
1801 pred = (pred * s->y_dc_scale_table[q2] * vc1_dqscale[s->y_dc_scale_table[q1] - 1] + 0x20000) >> 18;
1802 } 1810 }
1803 1811
1804 /* update predictor */ 1812 /* update predictor */
1805 *dc_val_ptr = &dc_val[0]; 1813 *dc_val_ptr = &dc_val[0];
1806 return pred; 1814 return pred;