Mercurial > libavcodec.hg
comparison vc1.c @ 3429:fb2a69de8ded libavcodec
Enable coefficient scaling
author | kostya |
---|---|
date | Fri, 07 Jul 2006 04:51:50 +0000 |
parents | 2b5c3f1bbbc4 |
children | d0e85690841d |
comparison
equal
deleted
inserted
replaced
3428:2b5c3f1bbbc4 | 3429:fb2a69de8ded |
---|---|
1729 int16_t **dc_val_ptr, int *dir_ptr) | 1729 int16_t **dc_val_ptr, int *dir_ptr) |
1730 { | 1730 { |
1731 int a, b, c, wrap, pred, scale; | 1731 int a, b, c, wrap, pred, scale; |
1732 int16_t *dc_val; | 1732 int16_t *dc_val; |
1733 int mb_pos = s->mb_x + s->mb_y * s->mb_stride; | 1733 int mb_pos = s->mb_x + s->mb_y * s->mb_stride; |
1734 int mb_pos2, q1, q2; | 1734 int q1, q2 = 0; |
1735 | 1735 |
1736 /* find prediction - wmv3_dc_scale always used here in fact */ | 1736 /* find prediction - wmv3_dc_scale always used here in fact */ |
1737 if (n < 4) scale = s->y_dc_scale; | 1737 if (n < 4) scale = s->y_dc_scale; |
1738 else scale = s->c_dc_scale; | 1738 else scale = s->c_dc_scale; |
1739 | 1739 |
1749 | 1749 |
1750 if(a_avail && c_avail) { | 1750 if(a_avail && c_avail) { |
1751 if(abs(a - b) <= abs(b - c)) { | 1751 if(abs(a - b) <= abs(b - c)) { |
1752 pred = c; | 1752 pred = c; |
1753 *dir_ptr = 1;//left | 1753 *dir_ptr = 1;//left |
1754 q2 = s->current_picture.qscale_table[mb_pos - 1]; | |
1754 } else { | 1755 } else { |
1755 pred = a; | 1756 pred = a; |
1756 *dir_ptr = 0;//top | 1757 *dir_ptr = 0;//top |
1758 q2 = s->current_picture.qscale_table[mb_pos - s->mb_stride]; | |
1757 } | 1759 } |
1758 } else if(a_avail) { | 1760 } else if(a_avail) { |
1759 pred = a; | 1761 pred = a; |
1760 *dir_ptr = 0;//top | 1762 *dir_ptr = 0;//top |
1763 q2 = s->current_picture.qscale_table[mb_pos - s->mb_stride]; | |
1761 } else if(c_avail) { | 1764 } else if(c_avail) { |
1762 pred = c; | 1765 pred = c; |
1763 *dir_ptr = 1;//left | 1766 *dir_ptr = 1;//left |
1767 q2 = s->current_picture.qscale_table[mb_pos - 1]; | |
1764 } else { | 1768 } else { |
1765 pred = 0; | 1769 pred = 0; |
1766 *dir_ptr = 1;//left | 1770 *dir_ptr = 1;//left |
1767 } | 1771 } |
1768 | 1772 |
1769 /* scale coeffs if needed | 1773 /* scale coeffs if needed */ |
1770 mb_pos2 = mb_pos - *dir_ptr - (1 - *dir_ptr) * s->mb_stride; | 1774 q1 = s->current_picture.qscale_table[mb_pos]; |
1771 q1 = s->y_dc_scale_table[s->current_picture.qscale_table[mb_pos]]; | 1775 if(n && n<4) q2=q1; |
1772 q2 = s->y_dc_scale_table[s->current_picture.qscale_table[mb_pos2]]; | 1776 |
1773 if(q2 && q1!=q2 && ((*dir_ptr && c_avail) || (!*dir_ptr && a_avail))) { | 1777 if(q2 && q1!=q2) { |
1774 pred = (pred * q2 * vc1_dqscale[q1 - 1] + 0x20000) >> 18; | 1778 pred = (pred * s->y_dc_scale_table[q2] * vc1_dqscale[s->y_dc_scale_table[q1] - 1] + 0x20000) >> 18; |
1775 } */ | 1779 } |
1776 | 1780 |
1777 /* update predictor */ | 1781 /* update predictor */ |
1778 *dc_val_ptr = &dc_val[0]; | 1782 *dc_val_ptr = &dc_val[0]; |
1779 return pred; | 1783 return pred; |
1780 } | 1784 } |
2062 int dcdiff; | 2066 int dcdiff; |
2063 int mb_pos = s->mb_x + s->mb_y * s->mb_stride; | 2067 int mb_pos = s->mb_x + s->mb_y * s->mb_stride; |
2064 int a_avail = v->a_avail, c_avail = v->c_avail; | 2068 int a_avail = v->a_avail, c_avail = v->c_avail; |
2065 int use_pred = s->ac_pred; | 2069 int use_pred = s->ac_pred; |
2066 int scale; | 2070 int scale; |
2071 int q1, q2 = 0; | |
2067 | 2072 |
2068 /* XXX: Guard against dumb values of mquant */ | 2073 /* XXX: Guard against dumb values of mquant */ |
2069 mquant = (mquant < 1) ? 0 : ( (mquant>31) ? 31 : mquant ); | 2074 mquant = (mquant < 1) ? 0 : ( (mquant>31) ? 31 : mquant ); |
2070 | 2075 |
2071 /* Set DC scale - y and c use the same */ | 2076 /* Set DC scale - y and c use the same */ |
2132 if(dc_pred_dir) //left | 2137 if(dc_pred_dir) //left |
2133 ac_val -= 16; | 2138 ac_val -= 16; |
2134 else //top | 2139 else //top |
2135 ac_val -= 16 * s->block_wrap[n]; | 2140 ac_val -= 16 * s->block_wrap[n]; |
2136 | 2141 |
2142 q1 = s->current_picture.qscale_table[mb_pos]; | |
2143 if(dc_pred_dir && c_avail) q2 = s->current_picture.qscale_table[mb_pos - 1]; | |
2144 if(!dc_pred_dir && a_avail) q2 = s->current_picture.qscale_table[mb_pos - s->mb_stride]; | |
2145 if(n && n<4) q2 = q1; | |
2146 | |
2137 if(coded) { | 2147 if(coded) { |
2138 int last = 0, skip, value; | 2148 int last = 0, skip, value; |
2139 const int8_t *zz_table; | 2149 const int8_t *zz_table; |
2140 int k; | 2150 int k; |
2141 | 2151 |
2150 } | 2160 } |
2151 | 2161 |
2152 /* apply AC prediction if needed */ | 2162 /* apply AC prediction if needed */ |
2153 if(use_pred) { | 2163 if(use_pred) { |
2154 /* scale predictors if needed*/ | 2164 /* scale predictors if needed*/ |
2155 int mb_pos2, q1, q2; | 2165 if(q2 && q1!=q2) { |
2156 | |
2157 mb_pos2 = mb_pos - dc_pred_dir - (1 - dc_pred_dir) * s->mb_stride; | |
2158 q1 = s->current_picture.qscale_table[mb_pos]; | |
2159 q2 = s->current_picture.qscale_table[mb_pos2]; | |
2160 | |
2161 if(0 && q2 && q1!=q2 && ((dc_pred_dir && c_avail) || (!dc_pred_dir && a_avail))) { | |
2162 q1 = q1 * 2 - 1; | 2166 q1 = q1 * 2 - 1; |
2163 q2 = q2 * 2 - 1; | 2167 q2 = q2 * 2 - 1; |
2164 | 2168 |
2165 if(dc_pred_dir) { //left | 2169 if(dc_pred_dir) { //left |
2166 for(k = 1; k < 8; k++) | 2170 for(k = 1; k < 8; k++) |
2194 } | 2198 } |
2195 | 2199 |
2196 if(use_pred) i = 63; | 2200 if(use_pred) i = 63; |
2197 } else { // no AC coeffs | 2201 } else { // no AC coeffs |
2198 int k; | 2202 int k; |
2199 int mb_pos2, q1, q2; | |
2200 | |
2201 mb_pos2 = mb_pos - dc_pred_dir - (1 - dc_pred_dir) * s->mb_stride; | |
2202 q1 = s->current_picture.qscale_table[mb_pos]; | |
2203 q2 = s->current_picture.qscale_table[mb_pos2]; | |
2204 | 2203 |
2205 memset(ac_val2, 0, 16 * 2); | 2204 memset(ac_val2, 0, 16 * 2); |
2206 if(dc_pred_dir) {//left | 2205 if(dc_pred_dir) {//left |
2207 if(use_pred) { | 2206 if(use_pred) { |
2208 memcpy(ac_val2, ac_val, 8 * 2); | 2207 memcpy(ac_val2, ac_val, 8 * 2); |
2209 if(0 && q2 && q1!=q2 && c_avail) { | 2208 if(q2 && q1!=q2) { |
2210 q1 = q1 * 2 - 1; | 2209 q1 = q1 * 2 - 1; |
2211 q2 = q2 * 2 - 1; | 2210 q2 = q2 * 2 - 1; |
2212 for(k = 1; k < 8; k++) | 2211 for(k = 1; k < 8; k++) |
2213 ac_val2[k] = (ac_val2[k] * q2 * vc1_dqscale[q1 - 1] + 0x20000) >> 18; | 2212 ac_val2[k] = (ac_val2[k] * q2 * vc1_dqscale[q1 - 1] + 0x20000) >> 18; |
2214 } | 2213 } |
2215 } | 2214 } |
2216 } else {//top | 2215 } else {//top |
2217 if(use_pred) { | 2216 if(use_pred) { |
2218 memcpy(ac_val2 + 8, ac_val + 8, 8 * 2); | 2217 memcpy(ac_val2 + 8, ac_val + 8, 8 * 2); |
2219 if(0 && q2 && q1!=q2 && a_avail) { | 2218 if(q2 && q1!=q2) { |
2220 q1 = q1 * 2 - 1; | 2219 q1 = q1 * 2 - 1; |
2221 q2 = q2 * 2 - 1; | 2220 q2 = q2 * 2 - 1; |
2222 for(k = 1; k < 8; k++) | 2221 for(k = 1; k < 8; k++) |
2223 ac_val2[k + 8] = (ac_val2[k + 8] * q2 * vc1_dqscale[q1 - 1] + 0x20000) >> 18; | 2222 ac_val2[k + 8] = (ac_val2[k + 8] * q2 * vc1_dqscale[q1 - 1] + 0x20000) >> 18; |
2224 } | 2223 } |