Mercurial > libavcodec.hg
comparison h263.c @ 648:dddcff6841f2 libavcodec
optimizing mpeg4_encode_block(), generates allso slightly shorter bitstream as some codes can be represented as esc1 and esc2 and esc2 is shorter for a few of them
author | michaelni |
---|---|
date | Sat, 07 Sep 2002 00:16:30 +0000 |
parents | 2be2cc8fd0a1 |
children | 850098147a3c |
comparison
equal
deleted
inserted
replaced
647:22b22723805e | 648:dddcff6841f2 |
---|---|
46 | 46 |
47 static void h263_encode_block(MpegEncContext * s, DCTELEM * block, | 47 static void h263_encode_block(MpegEncContext * s, DCTELEM * block, |
48 int n); | 48 int n); |
49 static void h263_encode_motion(MpegEncContext * s, int val, int fcode); | 49 static void h263_encode_motion(MpegEncContext * s, int val, int fcode); |
50 static void h263p_encode_umotion(MpegEncContext * s, int val); | 50 static void h263p_encode_umotion(MpegEncContext * s, int val); |
51 static void mpeg4_encode_block(MpegEncContext * s, DCTELEM * block, | 51 static inline void mpeg4_encode_block(MpegEncContext * s, DCTELEM * block, |
52 int n, int dc, UINT8 *scan_table, | 52 int n, int dc, UINT8 *scan_table, |
53 PutBitContext *dc_pb, PutBitContext *ac_pb); | 53 PutBitContext *dc_pb, PutBitContext *ac_pb); |
54 static int h263_decode_motion(MpegEncContext * s, int pred, int fcode); | 54 static int h263_decode_motion(MpegEncContext * s, int pred, int fcode); |
55 static int h263p_decode_umotion(MpegEncContext * s, int pred); | 55 static int h263p_decode_umotion(MpegEncContext * s, int pred); |
56 static int h263_decode_block(MpegEncContext * s, DCTELEM * block, | 56 static int h263_decode_block(MpegEncContext * s, DCTELEM * block, |
69 static UINT8 fcode_tab[MAX_MV*2+1]; | 69 static UINT8 fcode_tab[MAX_MV*2+1]; |
70 static UINT8 umv_fcode_tab[MAX_MV*2+1]; | 70 static UINT8 umv_fcode_tab[MAX_MV*2+1]; |
71 | 71 |
72 static UINT16 uni_DCtab_lum [512][2]; | 72 static UINT16 uni_DCtab_lum [512][2]; |
73 static UINT16 uni_DCtab_chrom[512][2]; | 73 static UINT16 uni_DCtab_chrom[512][2]; |
74 static UINT32 uni_mpeg4_intra_rl_bits[64*64*2*2]; | |
75 static UINT8 uni_mpeg4_intra_rl_len [64*64*2*2]; | |
76 static UINT32 uni_mpeg4_inter_rl_bits[64*64*2*2]; | |
77 static UINT8 uni_mpeg4_inter_rl_len [64*64*2*2]; | |
78 #define UNI_MPEG4_ENC_INDEX(last,run,level) ((last)*128 + (run)*256 + (level)) | |
79 //#define UNI_MPEG4_ENC_INDEX(last,run,level) ((last)*128*64 + (run) + (level)*64) | |
80 | |
81 /* mpeg4 | |
82 inter | |
83 max level: 24/6 | |
84 max run: 53/63 | |
85 | |
86 intra | |
87 max level: 53/16 | |
88 max run: 29/41 | |
89 */ | |
74 | 90 |
75 int h263_get_picture_format(int width, int height) | 91 int h263_get_picture_format(int width, int height) |
76 { | 92 { |
77 int format; | 93 int format; |
78 | 94 |
1083 uni_DCtab_chrom[level+256][1]= uni_len; | 1099 uni_DCtab_chrom[level+256][1]= uni_len; |
1084 | 1100 |
1085 } | 1101 } |
1086 } | 1102 } |
1087 | 1103 |
1104 static void init_uni_mpeg4_rl_tab(RLTable *rl, UINT32 *bits_tab, UINT8 *len_tab){ | |
1105 int slevel, run, last; | |
1106 | |
1107 assert(MAX_LEVEL >= 64); | |
1108 assert(MAX_RUN >= 63); | |
1109 | |
1110 for(slevel=-64; slevel<64; slevel++){ | |
1111 if(slevel==0) continue; | |
1112 for(run=0; run<64; run++){ | |
1113 for(last=0; last<=1; last++){ | |
1114 const int index= UNI_MPEG4_ENC_INDEX(last, run, slevel+64); | |
1115 int level= slevel < 0 ? -slevel : slevel; | |
1116 int sign= slevel < 0 ? 1 : 0; | |
1117 int bits, len, code; | |
1118 int level1, run1; | |
1119 | |
1120 len_tab[index]= 100; | |
1121 | |
1122 /* ESC0 */ | |
1123 code= get_rl_index(rl, last, run, level); | |
1124 bits= rl->table_vlc[code][0]; | |
1125 len= rl->table_vlc[code][1]; | |
1126 bits=bits*2+sign; len++; | |
1127 | |
1128 if(code!=rl->n && len < len_tab[index]){ | |
1129 bits_tab[index]= bits; | |
1130 len_tab [index]= len; | |
1131 } | |
1132 #if 1 | |
1133 /* ESC1 */ | |
1134 bits= rl->table_vlc[rl->n][0]; | |
1135 len= rl->table_vlc[rl->n][1]; | |
1136 bits=bits*2; len++; //esc1 | |
1137 level1= level - rl->max_level[last][run]; | |
1138 if(level1>0){ | |
1139 code= get_rl_index(rl, last, run, level1); | |
1140 bits<<= rl->table_vlc[code][1]; | |
1141 len += rl->table_vlc[code][1]; | |
1142 bits += rl->table_vlc[code][0]; | |
1143 bits=bits*2+sign; len++; | |
1144 | |
1145 if(code!=rl->n && len < len_tab[index]){ | |
1146 bits_tab[index]= bits; | |
1147 len_tab [index]= len; | |
1148 } | |
1149 } | |
1150 #endif | |
1151 #if 1 | |
1152 /* ESC2 */ | |
1153 bits= rl->table_vlc[rl->n][0]; | |
1154 len= rl->table_vlc[rl->n][1]; | |
1155 bits=bits*4+2; len+=2; //esc2 | |
1156 run1 = run - rl->max_run[last][level] - 1; | |
1157 if(run1>=0){ | |
1158 code= get_rl_index(rl, last, run1, level); | |
1159 bits<<= rl->table_vlc[code][1]; | |
1160 len += rl->table_vlc[code][1]; | |
1161 bits += rl->table_vlc[code][0]; | |
1162 bits=bits*2+sign; len++; | |
1163 | |
1164 if(code!=rl->n && len < len_tab[index]){ | |
1165 bits_tab[index]= bits; | |
1166 len_tab [index]= len; | |
1167 } | |
1168 } | |
1169 #endif | |
1170 /* ESC3 */ | |
1171 bits= rl->table_vlc[rl->n][0]; | |
1172 len = rl->table_vlc[rl->n][1]; | |
1173 bits=bits*4+3; len+=2; //esc3 | |
1174 bits=bits*2+last; len++; | |
1175 bits=bits*64+run; len+=6; | |
1176 bits=bits*2+1; len++; //marker | |
1177 bits=bits*4096+(slevel&0xfff); len+=12; | |
1178 bits=bits*2+1; len++; //marker | |
1179 | |
1180 if(len < len_tab[index]){ | |
1181 bits_tab[index]= bits; | |
1182 len_tab [index]= len; | |
1183 } | |
1184 } | |
1185 } | |
1186 } | |
1187 } | |
1188 | |
1088 void h263_encode_init(MpegEncContext *s) | 1189 void h263_encode_init(MpegEncContext *s) |
1089 { | 1190 { |
1090 static int done = 0; | 1191 static int done = 0; |
1091 | 1192 |
1092 if (!done) { | 1193 if (!done) { |
1095 init_uni_dc_tab(); | 1196 init_uni_dc_tab(); |
1096 | 1197 |
1097 init_rl(&rl_inter); | 1198 init_rl(&rl_inter); |
1098 init_rl(&rl_intra); | 1199 init_rl(&rl_intra); |
1099 init_rl(&rl_intra_aic); | 1200 init_rl(&rl_intra_aic); |
1201 | |
1202 init_uni_mpeg4_rl_tab(&rl_intra, uni_mpeg4_intra_rl_bits, uni_mpeg4_intra_rl_len); | |
1203 init_uni_mpeg4_rl_tab(&rl_inter, uni_mpeg4_inter_rl_bits, uni_mpeg4_inter_rl_len); | |
1100 | 1204 |
1101 init_mv_penalty_and_fcode(s); | 1205 init_mv_penalty_and_fcode(s); |
1102 } | 1206 } |
1103 s->mv_penalty= mv_penalty; //FIXME exact table for msmpeg4 & h263p | 1207 s->mv_penalty= mv_penalty; //FIXME exact table for msmpeg4 & h263p |
1104 | 1208 |
1527 put_bits(&s->pb, 1, 1); | 1631 put_bits(&s->pb, 1, 1); |
1528 } | 1632 } |
1529 #endif | 1633 #endif |
1530 } | 1634 } |
1531 | 1635 |
1532 static void mpeg4_encode_block(MpegEncContext * s, DCTELEM * block, int n, int intra_dc, | 1636 static inline void mpeg4_encode_block(MpegEncContext * s, DCTELEM * block, int n, int intra_dc, |
1533 UINT8 *scan_table, PutBitContext *dc_pb, PutBitContext *ac_pb) | 1637 UINT8 *scan_table, PutBitContext *dc_pb, PutBitContext *ac_pb) |
1534 { | 1638 { |
1535 int level, run, last, i, j, last_index, last_non_zero, sign, slevel; | 1639 int last, i, last_non_zero, sign; |
1536 int code; | 1640 int code; |
1537 const RLTable *rl; | 1641 const RLTable *rl; |
1538 | 1642 UINT32 *bits_tab; |
1539 if (s->mb_intra) { | 1643 UINT8 *len_tab; |
1644 const int last_index = s->block_last_index[n]; | |
1645 | |
1646 if (s->mb_intra) { //Note gcc (3.2.1 at least) will optimize this away | |
1540 /* mpeg4 based DC predictor */ | 1647 /* mpeg4 based DC predictor */ |
1541 mpeg4_encode_dc(dc_pb, intra_dc, n); | 1648 mpeg4_encode_dc(dc_pb, intra_dc, n); |
1649 if(last_index<1) return; | |
1542 i = 1; | 1650 i = 1; |
1543 rl = &rl_intra; | 1651 rl = &rl_intra; |
1652 bits_tab= uni_mpeg4_intra_rl_bits; | |
1653 len_tab = uni_mpeg4_intra_rl_len; | |
1544 } else { | 1654 } else { |
1655 if(last_index<0) return; | |
1545 i = 0; | 1656 i = 0; |
1546 rl = &rl_inter; | 1657 rl = &rl_inter; |
1658 bits_tab= uni_mpeg4_inter_rl_bits; | |
1659 len_tab = uni_mpeg4_inter_rl_len; | |
1547 } | 1660 } |
1548 | 1661 |
1549 /* AC coefs */ | 1662 /* AC coefs */ |
1550 last_index = s->block_last_index[n]; | |
1551 last_non_zero = i - 1; | 1663 last_non_zero = i - 1; |
1664 #if 1 | |
1665 for (; i < last_index; i++) { | |
1666 int level = block[ scan_table[i] ]; | |
1667 if (level) { | |
1668 int run = i - last_non_zero - 1; | |
1669 level+=64; | |
1670 if((level&(~127)) == 0){ | |
1671 const int index= UNI_MPEG4_ENC_INDEX(0, run, level); | |
1672 put_bits(ac_pb, len_tab[index], bits_tab[index]); | |
1673 }else{ //ESC3 | |
1674 put_bits(ac_pb, 7+2+1+6+1+12+1, (3<<23)+(3<<21)+(0<<20)+(run<<14)+(1<<13)+(((level-64)&0xfff)<<1)+1); | |
1675 } | |
1676 last_non_zero = i; | |
1677 } | |
1678 } | |
1679 /*if(i<=last_index)*/{ | |
1680 int level = block[ scan_table[i] ]; | |
1681 int run = i - last_non_zero - 1; | |
1682 level+=64; | |
1683 if((level&(~127)) == 0){ | |
1684 const int index= UNI_MPEG4_ENC_INDEX(1, run, level); | |
1685 put_bits(ac_pb, len_tab[index], bits_tab[index]); | |
1686 }else{ //ESC3 | |
1687 put_bits(ac_pb, 7+2+1+6+1+12+1, (3<<23)+(3<<21)+(1<<20)+(run<<14)+(1<<13)+(((level-64)&0xfff)<<1)+1); | |
1688 } | |
1689 } | |
1690 #else | |
1552 for (; i <= last_index; i++) { | 1691 for (; i <= last_index; i++) { |
1553 j = scan_table[i]; | 1692 const int slevel = block[ scan_table[i] ]; |
1554 level = block[j]; | 1693 if (slevel) { |
1555 if (level) { | 1694 int level; |
1556 run = i - last_non_zero - 1; | 1695 int run = i - last_non_zero - 1; |
1557 last = (i == last_index); | 1696 last = (i == last_index); |
1558 sign = 0; | 1697 sign = 0; |
1559 slevel = level; | 1698 level = slevel; |
1560 if (level < 0) { | 1699 if (level < 0) { |
1561 sign = 1; | 1700 sign = 1; |
1562 level = -level; | 1701 level = -level; |
1563 } | 1702 } |
1564 code = get_rl_index(rl, last, run, level); | 1703 code = get_rl_index(rl, last, run, level); |
1603 put_bits(ac_pb, 1, sign); | 1742 put_bits(ac_pb, 1, sign); |
1604 } | 1743 } |
1605 last_non_zero = i; | 1744 last_non_zero = i; |
1606 } | 1745 } |
1607 } | 1746 } |
1747 #endif | |
1608 } | 1748 } |
1609 | 1749 |
1610 | 1750 |
1611 | 1751 |
1612 /***********************************************/ | 1752 /***********************************************/ |
3829 //if(s->pict_type!=I_TYPE) return FRAME_SKIPED; | 3969 //if(s->pict_type!=I_TYPE) return FRAME_SKIPED; |
3830 if(s->pict_type==B_TYPE && s->low_delay && s->vol_control_parameters==0){ | 3970 if(s->pict_type==B_TYPE && s->low_delay && s->vol_control_parameters==0){ |
3831 printf("low_delay flag set, but shouldnt, clearing it\n"); | 3971 printf("low_delay flag set, but shouldnt, clearing it\n"); |
3832 s->low_delay=0; | 3972 s->low_delay=0; |
3833 } | 3973 } |
3834 // printf("pic: %d, qpel:%d\n", s->pict_type, s->quarter_sample); | 3974 // printf("pic: %d, qpel:%d part:%d resync:%d\n", s->pict_type, s->quarter_sample, s->data_partitioning, s->resync_marker); |
3835 time_incr=0; | 3975 time_incr=0; |
3836 while (get_bits1(&s->gb) != 0) | 3976 while (get_bits1(&s->gb) != 0) |
3837 time_incr++; | 3977 time_incr++; |
3838 | 3978 |
3839 check_marker(&s->gb, "before time_increment"); | 3979 check_marker(&s->gb, "before time_increment"); |
3933 }else | 4073 }else |
3934 s->f_code=1; | 4074 s->f_code=1; |
3935 | 4075 |
3936 if (s->pict_type == B_TYPE) { | 4076 if (s->pict_type == B_TYPE) { |
3937 s->b_code = get_bits(&s->gb, 3); | 4077 s->b_code = get_bits(&s->gb, 3); |
3938 //printf("b-code %d\n", s->b_code); | |
3939 }else | 4078 }else |
3940 s->b_code=1; | 4079 s->b_code=1; |
3941 | 4080 |
3942 //printf("quant:%d fcode:%d bcode:%d type:%d\n", s->qscale, s->f_code, s->b_code, s->pict_type); | 4081 //printf("quant:%d fcode:%d bcode:%d type:%d size:%d\n", s->qscale, s->f_code, s->b_code, s->pict_type, s->gb.size); |
3943 if(!s->scalability){ | 4082 if(!s->scalability){ |
3944 if (s->shape!=RECT_SHAPE && s->pict_type!=I_TYPE) { | 4083 if (s->shape!=RECT_SHAPE && s->pict_type!=I_TYPE) { |
3945 skip_bits1(&s->gb); // vop shape coding type | 4084 skip_bits1(&s->gb); // vop shape coding type |
3946 } | 4085 } |
3947 }else{ | 4086 }else{ |
3960 printf("looks like this file was encoded with (divx4/(old)xvid/opendivx) -> forcing low_delay flag\n"); | 4099 printf("looks like this file was encoded with (divx4/(old)xvid/opendivx) -> forcing low_delay flag\n"); |
3961 s->low_delay=1; | 4100 s->low_delay=1; |
3962 } | 4101 } |
3963 | 4102 |
3964 s->picture_number++; // better than pic number==0 allways ;) | 4103 s->picture_number++; // better than pic number==0 allways ;) |
3965 //printf("done\n"); | |
3966 | 4104 |
3967 s->y_dc_scale_table= ff_mpeg4_y_dc_scale_table; //FIXME add short header support | 4105 s->y_dc_scale_table= ff_mpeg4_y_dc_scale_table; //FIXME add short header support |
3968 s->c_dc_scale_table= ff_mpeg4_c_dc_scale_table; | 4106 s->c_dc_scale_table= ff_mpeg4_c_dc_scale_table; |
3969 | 4107 |
3970 if(s->divx_version==0 || s->divx_version < 500){ | 4108 if(s->divx_version==0 || s->divx_version < 500){ |