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 }