performance impact is less than 1%. Patch by Dan Maas (dmaas at maasdigital dot com) Originally committed as revision 5070 to svn://svn.ffmpeg.org/ffmpeg/trunktags/v0.5
@@ -253,6 +253,7 @@ static int dvvideo_init(AVCodecContext *avctx) | |||||
typedef struct BlockInfo { | typedef struct BlockInfo { | ||||
const uint8_t *shift_table; | const uint8_t *shift_table; | ||||
const uint8_t *scan_table; | const uint8_t *scan_table; | ||||
const int *iweight_table; | |||||
uint8_t pos; /* position in block */ | uint8_t pos; /* position in block */ | ||||
uint8_t dct_mode; | uint8_t dct_mode; | ||||
uint8_t partial_bit_count; | uint8_t partial_bit_count; | ||||
@@ -295,6 +296,7 @@ static void dv_decode_ac(GetBitContext *gb, BlockInfo *mb, DCTELEM *block) | |||||
int last_index = get_bits_size(gb); | int last_index = get_bits_size(gb); | ||||
const uint8_t *scan_table = mb->scan_table; | const uint8_t *scan_table = mb->scan_table; | ||||
const uint8_t *shift_table = mb->shift_table; | const uint8_t *shift_table = mb->shift_table; | ||||
const int *iweight_table = mb->iweight_table; | |||||
int pos = mb->pos; | int pos = mb->pos; | ||||
int partial_bit_count = mb->partial_bit_count; | int partial_bit_count = mb->partial_bit_count; | ||||
int level, pos1, run, vlc_len, index; | int level, pos1, run, vlc_len, index; | ||||
@@ -343,7 +345,12 @@ static void dv_decode_ac(GetBitContext *gb, BlockInfo *mb, DCTELEM *block) | |||||
break; | break; | ||||
pos1 = scan_table[pos]; | pos1 = scan_table[pos]; | ||||
block[pos1] = level << shift_table[pos1]; | |||||
level <<= shift_table[pos1]; | |||||
/* unweigh, round, and shift down */ | |||||
level = (level*iweight_table[pos] + (1 << (dv_iweight_bits-1))) >> dv_iweight_bits; | |||||
block[pos1] = level; | |||||
UPDATE_CACHE(re, gb); | UPDATE_CACHE(re, gb); | ||||
} | } | ||||
@@ -409,6 +416,7 @@ static inline void dv_decode_video_segment(DVVideoContext *s, | |||||
dct_mode = get_bits1(&gb); | dct_mode = get_bits1(&gb); | ||||
mb->dct_mode = dct_mode; | mb->dct_mode = dct_mode; | ||||
mb->scan_table = s->dv_zigzag[dct_mode]; | mb->scan_table = s->dv_zigzag[dct_mode]; | ||||
mb->iweight_table = dct_mode ? dv_iweight_248 : dv_iweight_88; | |||||
class1 = get_bits(&gb, 2); | class1 = get_bits(&gb, 2); | ||||
mb->shift_table = s->dv_idct_shift[class1 == 3][dct_mode] | mb->shift_table = s->dv_idct_shift[class1 == 3][dct_mode] | ||||
[quant + dv_quant_offset[class1]]; | [quant + dv_quant_offset[class1]]; | ||||
@@ -647,7 +655,7 @@ static always_inline PutBitContext* dv_encode_ac(EncBlockInfo* bi, PutBitContext | |||||
} | } | ||||
static always_inline void dv_set_class_number(DCTELEM* blk, EncBlockInfo* bi, | static always_inline void dv_set_class_number(DCTELEM* blk, EncBlockInfo* bi, | ||||
const uint8_t* zigzag_scan, int bias) | |||||
const uint8_t* zigzag_scan, const int *weight, int bias) | |||||
{ | { | ||||
int i, area; | int i, area; | ||||
static const int classes[] = {12, 24, 36, 0xffff}; | static const int classes[] = {12, 24, 36, 0xffff}; | ||||
@@ -664,7 +672,11 @@ static always_inline void dv_set_class_number(DCTELEM* blk, EncBlockInfo* bi, | |||||
if (level+15 > 30U) { | if (level+15 > 30U) { | ||||
bi->sign[i] = (level>>31)&1; | bi->sign[i] = (level>>31)&1; | ||||
bi->mb[i] = level= ABS(level)>>4; | |||||
/* weigh it and and shift down into range, adding for rounding */ | |||||
/* the extra division by a factor of 2^4 reverses the 8x expansion of the DCT | |||||
AND the 2x doubling of the weights */ | |||||
level = (ABS(level) * weight[i] + (1<<(dv_weight_bits+3))) >> (dv_weight_bits+4); | |||||
bi->mb[i] = level; | |||||
if(level>max) max= level; | if(level>max) max= level; | ||||
bi->bit_size[area] += dv_rl2vlc_size(i - prev - 1, level); | bi->bit_size[area] += dv_rl2vlc_size(i - prev - 1, level); | ||||
bi->next[prev]= i; | bi->next[prev]= i; | ||||
@@ -875,7 +887,9 @@ static inline void dv_encode_video_segment(DVVideoContext *s, | |||||
s->fdct[enc_blk->dct_mode](block); | s->fdct[enc_blk->dct_mode](block); | ||||
dv_set_class_number(block, enc_blk, | dv_set_class_number(block, enc_blk, | ||||
enc_blk->dct_mode ? ff_zigzag248_direct : ff_zigzag_direct, j/4); | |||||
enc_blk->dct_mode ? ff_zigzag248_direct : ff_zigzag_direct, | |||||
enc_blk->dct_mode ? dv_weight_248 : dv_weight_88, | |||||
j/4); | |||||
init_put_bits(pb, ptr, block_sizes[j]/8); | init_put_bits(pb, ptr, block_sizes[j]/8); | ||||
put_bits(pb, 9, (uint16_t)(((enc_blk->mb[0] >> 3) - 1024 + 2) >> 2)); | put_bits(pb, 9, (uint16_t)(((enc_blk->mb[0] >> 3) - 1024 + 2) >> 2)); | ||||
@@ -1256,6 +1256,51 @@ static const uint16_t dv_place_411[1350] = { | |||||
0x0834, 0x2320, 0x2f44, 0x3810, 0x1658, | 0x0834, 0x2320, 0x2f44, 0x3810, 0x1658, | ||||
}; | }; | ||||
/* DV25/50 DCT coefficient weights and inverse weights */ | |||||
/* created by dvtables.py */ | |||||
static const int dv_weight_bits = 18; | |||||
static const int dv_weight_88[64] = { | |||||
131072, 257107, 257107, 242189, 252167, 242189, 235923, 237536, | |||||
237536, 235923, 229376, 231390, 223754, 231390, 229376, 222935, | |||||
224969, 217965, 217965, 224969, 222935, 200636, 218652, 211916, | |||||
212325, 211916, 218652, 200636, 188995, 196781, 205965, 206433, | |||||
206433, 205965, 196781, 188995, 185364, 185364, 200636, 200704, | |||||
200636, 185364, 185364, 174609, 180568, 195068, 195068, 180568, | |||||
174609, 170091, 175557, 189591, 175557, 170091, 165371, 170627, | |||||
170627, 165371, 160727, 153560, 160727, 144651, 144651, 136258, | |||||
}; | |||||
static const int dv_weight_248[64] = { | |||||
131072, 242189, 257107, 237536, 229376, 200636, 242189, 223754, | |||||
224969, 196781, 262144, 242189, 229376, 200636, 257107, 237536, | |||||
211916, 185364, 235923, 217965, 229376, 211916, 206433, 180568, | |||||
242189, 223754, 224969, 196781, 211916, 185364, 235923, 217965, | |||||
200704, 175557, 222935, 205965, 200636, 185364, 195068, 170627, | |||||
229376, 211916, 206433, 180568, 200704, 175557, 222935, 205965, | |||||
175557, 153560, 188995, 174609, 165371, 144651, 200636, 185364, | |||||
195068, 170627, 175557, 153560, 188995, 174609, 165371, 144651, | |||||
}; | |||||
static const int dv_iweight_bits = 14; | |||||
static const int dv_iweight_88[64] = { | |||||
32768, 16710, 16710, 17735, 17015, 17735, 18197, 18079, | |||||
18079, 18197, 18725, 18559, 19196, 18559, 18725, 19284, | |||||
19108, 19692, 19692, 19108, 19284, 21400, 19645, 20262, | |||||
20214, 20262, 19645, 21400, 22733, 21845, 20867, 20815, | |||||
20815, 20867, 21845, 22733, 23173, 23173, 21400, 21400, | |||||
21400, 23173, 23173, 24600, 23764, 22017, 22017, 23764, | |||||
24600, 25267, 24457, 22672, 24457, 25267, 25971, 25191, | |||||
25191, 25971, 26715, 27962, 26715, 29642, 29642, 31536, | |||||
}; | |||||
static const int dv_iweight_248[64] = { | |||||
32768, 17735, 16710, 18079, 18725, 21400, 17735, 19196, | |||||
19108, 21845, 16384, 17735, 18725, 21400, 16710, 18079, | |||||
20262, 23173, 18197, 19692, 18725, 20262, 20815, 23764, | |||||
17735, 19196, 19108, 21845, 20262, 23173, 18197, 19692, | |||||
21400, 24457, 19284, 20867, 21400, 23173, 22017, 25191, | |||||
18725, 20262, 20815, 23764, 21400, 24457, 19284, 20867, | |||||
24457, 27962, 22733, 24600, 25971, 29642, 21400, 23173, | |||||
22017, 25191, 24457, 27962, 22733, 24600, 25971, 29642, | |||||
}; | |||||
static const uint16_t dv_audio_shuffle525[10][9] = { | static const uint16_t dv_audio_shuffle525[10][9] = { | ||||
{ 0, 30, 60, 20, 50, 80, 10, 40, 70 }, /* 1st channel */ | { 0, 30, 60, 20, 50, 80, 10, 40, 70 }, /* 1st channel */ | ||||
{ 6, 36, 66, 26, 56, 86, 16, 46, 76 }, | { 6, 36, 66, 26, 56, 86, 16, 46, 76 }, | ||||
@@ -133,10 +133,10 @@ stddev: 23.20 PSNR:20.81 bytes:7602176 | |||||
3533710 ./data/a-snow53.avi | 3533710 ./data/a-snow53.avi | ||||
799d3db687f6cdd7a837ec156efc171f *./data/out.yuv | 799d3db687f6cdd7a837ec156efc171f *./data/out.yuv | ||||
stddev: 0.00 PSNR:99.99 bytes:7602176 | stddev: 0.00 PSNR:99.99 bytes:7602176 | ||||
a071e3aa523e0f91fce08bdba0d47199 *./data/a-dv.dv | |||||
1352049a75c5c94f21a360888b12d75d *./data/a-dv.dv | |||||
7200000 ./data/a-dv.dv | 7200000 ./data/a-dv.dv | ||||
a99de8648a78970065b834219d9fa27a *./data/out.yuv | |||||
stddev: 9.10 PSNR:28.94 bytes:7602176 | |||||
2c7f745a74c1ac25566b6c49ed619649 *./data/out.yuv | |||||
stddev: 9.00 PSNR:29.03 bytes:7602176 | |||||
bd0db310a36ad94bcd4448abe0a88368 *./data/a-svq1.mov | bd0db310a36ad94bcd4448abe0a88368 *./data/a-svq1.mov | ||||
1379827 ./data/a-svq1.mov | 1379827 ./data/a-svq1.mov | ||||
bbff871d1475e1eee4231a08e075de2c *./data/out.yuv | bbff871d1475e1eee4231a08e075de2c *./data/out.yuv | ||||
@@ -28,9 +28,9 @@ e4ed8d635d867e2f5980fd9c73c9cf3d *./data/b-libav.mov | |||||
8bf16d40a2ec19fa36b124a928e47e23 *./data/b-libav.nut | 8bf16d40a2ec19fa36b124a928e47e23 *./data/b-libav.nut | ||||
332358 ./data/b-libav.nut | 332358 ./data/b-libav.nut | ||||
./data/b-libav.nut CRC=0xccab3a27 | ./data/b-libav.nut CRC=0xccab3a27 | ||||
5a040cc1353f17f6a7305e972c0667d0 *./data/b-libav.dv | |||||
afe55c5769eb6d1873d4106b3ef2b691 *./data/b-libav.dv | |||||
3600000 ./data/b-libav.dv | 3600000 ./data/b-libav.dv | ||||
./data/b-libav.dv CRC=0x5e1f4cdc | |||||
./data/b-libav.dv CRC=0x9292dedd | |||||
9a9da315747599f7718cc9a9a09c21ff *./data/b-libav.pbm | 9a9da315747599f7718cc9a9a09c21ff *./data/b-libav.pbm | ||||
317075 ./data/b-libav.pbm | 317075 ./data/b-libav.pbm | ||||
./data/b-libav.pbm CRC=0xb92906cb | ./data/b-libav.pbm CRC=0xb92906cb | ||||
@@ -133,10 +133,10 @@ stddev: 10.94 PSNR:27.34 bytes:7602176 | |||||
2725570 ./data/a-snow53.avi | 2725570 ./data/a-snow53.avi | ||||
dde5895817ad9d219f79a52d0bdfb001 *./data/out.yuv | dde5895817ad9d219f79a52d0bdfb001 *./data/out.yuv | ||||
stddev: 0.00 PSNR:99.99 bytes:7602176 | stddev: 0.00 PSNR:99.99 bytes:7602176 | ||||
41165e82124bf9984f784bc007f6a0ac *./data/a-dv.dv | |||||
3d7def2ed47e896790945c3c634fa4e8 *./data/a-dv.dv | |||||
7200000 ./data/a-dv.dv | 7200000 ./data/a-dv.dv | ||||
b252172f3768271ab0e87a1a2bfc553d *./data/out.yuv | |||||
stddev: 3.16 PSNR:38.13 bytes:7602176 | |||||
49020c3651d58137db4dc56ca13ff26d *./data/out.yuv | |||||
stddev: 3.06 PSNR:38.40 bytes:7602176 | |||||
5b02b6ae7ffa257a66ae9857a992fdfe *./data/a-svq1.mov | 5b02b6ae7ffa257a66ae9857a992fdfe *./data/a-svq1.mov | ||||
769527 ./data/a-svq1.mov | 769527 ./data/a-svq1.mov | ||||
44777d1ddbccd0ef7f8d08394465670c *./data/out.yuv | 44777d1ddbccd0ef7f8d08394465670c *./data/out.yuv | ||||