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){