Mercurial > libavcodec.hg
comparison h263.c @ 692:852b5a416161 libavcodec
fixing ac prediction encoding with adaptive quantization
author | michaelni |
---|---|
date | Tue, 24 Sep 2002 09:15:46 +0000 |
parents | a1c69cb685b3 |
children | 3525da287ee2 |
comparison
equal
deleted
inserted
replaced
691:199b324b2693 | 692:852b5a416161 |
---|---|
279 INT16 *ac_val, *ac_val1; | 279 INT16 *ac_val, *ac_val1; |
280 | 280 |
281 ac_val = s->ac_val[0][0] + s->block_index[n] * 16; | 281 ac_val = s->ac_val[0][0] + s->block_index[n] * 16; |
282 ac_val1= ac_val; | 282 ac_val1= ac_val; |
283 if(dir[n]){ | 283 if(dir[n]){ |
284 const int xy= s->mb_x + s->mb_y*s->mb_width - s->mb_width; | |
285 /* top prediction */ | |
284 ac_val-= s->block_wrap[n]*16; | 286 ac_val-= s->block_wrap[n]*16; |
285 for(i=1; i<8; i++){ | 287 if(s->mb_y==0 || s->qscale == s->qscale_table[xy] || n==2 || n==3){ |
286 const int level= block[n][block_permute_op(i )]; | 288 /* same qscale */ |
287 score0+= ABS(level); | 289 for(i=1; i<8; i++){ |
288 score1+= ABS(level - ac_val[i+8]); | 290 const int level= block[n][block_permute_op(i )]; |
289 ac_val1[i ]= block[n][block_permute_op(i<<3)]; | 291 score0+= ABS(level); |
290 ac_val1[i+8]= level; | 292 score1+= ABS(level - ac_val[i+8]); |
293 ac_val1[i ]= block[n][block_permute_op(i<<3)]; | |
294 ac_val1[i+8]= level; | |
295 } | |
296 }else{ | |
297 /* different qscale, we must rescale */ | |
298 for(i=1; i<8; i++){ | |
299 const int level= block[n][block_permute_op(i )]; | |
300 score0+= ABS(level); | |
301 score1+= ABS(level - ROUNDED_DIV(ac_val[i + 8]*s->qscale_table[xy], s->qscale)); | |
302 ac_val1[i ]= block[n][block_permute_op(i<<3)]; | |
303 ac_val1[i+8]= level; | |
304 } | |
291 } | 305 } |
292 }else{ | 306 }else{ |
307 const int xy= s->mb_x-1 + s->mb_y*s->mb_width; | |
308 /* left prediction */ | |
293 ac_val-= 16; | 309 ac_val-= 16; |
294 for(i=1; i<8; i++){ | 310 if(s->mb_x==0 || s->qscale == s->qscale_table[xy] || n==1 || n==3){ |
295 const int level= block[n][block_permute_op(i<<3)]; | 311 /* same qscale */ |
296 score0+= ABS(level); | 312 for(i=1; i<8; i++){ |
297 score1+= ABS(level - ac_val[i]); | 313 const int level= block[n][block_permute_op(i<<3)]; |
298 ac_val1[i ]= level; | 314 score0+= ABS(level); |
299 ac_val1[i+8]= block[n][block_permute_op(i )]; | 315 score1+= ABS(level - ac_val[i]); |
316 ac_val1[i ]= level; | |
317 ac_val1[i+8]= block[n][block_permute_op(i )]; | |
318 } | |
319 }else{ | |
320 /* different qscale, we must rescale */ | |
321 for(i=1; i<8; i++){ | |
322 const int level= block[n][block_permute_op(i<<3)]; | |
323 score0+= ABS(level); | |
324 score1+= ABS(level - ROUNDED_DIV(ac_val[i]*s->qscale_table[xy], s->qscale)); | |
325 ac_val1[i ]= level; | |
326 ac_val1[i+8]= block[n][block_permute_op(i )]; | |
327 } | |
300 } | 328 } |
301 } | 329 } |
302 } | 330 } |
303 | 331 |
304 return score0 > score1 ? 1 : 0; | 332 return score0 > score1 ? 1 : 0; |
1676 | 1704 |
1677 /* find prediction */ | 1705 /* find prediction */ |
1678 ac_val = s->ac_val[0][0] + s->block_index[n] * 16; | 1706 ac_val = s->ac_val[0][0] + s->block_index[n] * 16; |
1679 | 1707 |
1680 if (dir == 0) { | 1708 if (dir == 0) { |
1709 const int xy= s->mb_x-1 + s->mb_y*s->mb_width; | |
1681 /* left prediction */ | 1710 /* left prediction */ |
1682 ac_val -= 16; | 1711 ac_val -= 16; |
1683 for(i=1;i<8;i++) { | 1712 if(s->mb_x==0 || s->qscale == s->qscale_table[xy] || n==1 || n==3){ |
1684 block[block_permute_op(i*8)] -= ac_val[i]; | 1713 /* same qscale */ |
1714 for(i=1;i<8;i++) { | |
1715 block[block_permute_op(i*8)] -= ac_val[i]; | |
1716 } | |
1717 }else{ | |
1718 /* different qscale, we must rescale */ | |
1719 for(i=1;i<8;i++) { | |
1720 block[block_permute_op(i*8)] -= ROUNDED_DIV(ac_val[i]*s->qscale_table[xy], s->qscale); | |
1721 } | |
1685 } | 1722 } |
1686 } else { | 1723 } else { |
1724 const int xy= s->mb_x + s->mb_y*s->mb_width - s->mb_width; | |
1687 /* top prediction */ | 1725 /* top prediction */ |
1688 ac_val -= 16 * s->block_wrap[n]; | 1726 ac_val -= 16 * s->block_wrap[n]; |
1689 for(i=1;i<8;i++) { | 1727 if(s->mb_y==0 || s->qscale == s->qscale_table[xy] || n==2 || n==3){ |
1690 block[block_permute_op(i)] -= ac_val[i + 8]; | 1728 /* same qscale */ |
1729 for(i=1;i<8;i++) { | |
1730 block[block_permute_op(i)] -= ac_val[i + 8]; | |
1731 } | |
1732 }else{ | |
1733 /* different qscale, we must rescale */ | |
1734 for(i=1;i<8;i++) { | |
1735 block[block_permute_op(i)] -= ROUNDED_DIV(ac_val[i + 8]*s->qscale_table[xy], s->qscale); | |
1736 } | |
1691 } | 1737 } |
1692 } | 1738 } |
1693 } | 1739 } |
1694 | 1740 |
1695 static inline void mpeg4_encode_dc(PutBitContext * s, int level, int n) | 1741 static inline void mpeg4_encode_dc(PutBitContext * s, int level, int n) |