comparison h263.c @ 293:6eaf5da091fa libavcodec

optimizing mpeg4_encode_dc
author michaelni
date Mon, 25 Mar 2002 15:36:16 +0000
parents 73a9ce3d9715
children 944632089814
comparison
equal deleted inserted replaced
292:73a9ce3d9715 293:6eaf5da091fa
54 extern UINT32 inverse[256]; 54 extern UINT32 inverse[256];
55 55
56 static UINT16 mv_penalty[MAX_FCODE+1][MAX_MV*2+1]; 56 static UINT16 mv_penalty[MAX_FCODE+1][MAX_MV*2+1];
57 static UINT8 fcode_tab[MAX_MV*2+1]; 57 static UINT8 fcode_tab[MAX_MV*2+1];
58 static UINT8 umv_fcode_tab[MAX_MV*2+1]; 58 static UINT8 umv_fcode_tab[MAX_MV*2+1];
59
60 static UINT16 uni_DCtab_lum [512][2];
61 static UINT16 uni_DCtab_chrom[512][2];
59 62
60 int h263_get_picture_format(int width, int height) 63 int h263_get_picture_format(int width, int height)
61 { 64 {
62 int format; 65 int format;
63 66
704 for(mv=0; mv<MAX_MV*2+1; mv++){ 707 for(mv=0; mv<MAX_MV*2+1; mv++){
705 umv_fcode_tab[mv]= 1; 708 umv_fcode_tab[mv]= 1;
706 } 709 }
707 } 710 }
708 711
712 static void init_uni_dc_tab()
713 {
714 int level, uni_code, uni_len;
715
716 for(level=-255; level<256; level++){
717 int size, v, l;
718 /* find number of bits */
719 size = 0;
720 v = abs(level);
721 while (v) {
722 v >>= 1;
723 size++;
724 }
725
726 if (level < 0)
727 l= (-level) ^ ((1 << size) - 1);
728 else
729 l= level;
730
731 /* luminance */
732 uni_code= DCtab_lum[size][0];
733 uni_len = DCtab_lum[size][1];
734
735 if (size > 0) {
736 uni_code<<=size; uni_code|=l;
737 uni_len+=size;
738 if (size > 8){
739 uni_code<<=1; uni_code|=1;
740 uni_len++;
741 }
742 }
743 uni_DCtab_lum[level+256][0]= uni_code;
744 uni_DCtab_lum[level+256][1]= uni_len;
745
746 /* chrominance */
747 uni_code= DCtab_chrom[size][0];
748 uni_len = DCtab_chrom[size][1];
749
750 if (size > 0) {
751 uni_code<<=size; uni_code|=l;
752 uni_len+=size;
753 if (size > 8){
754 uni_code<<=1; uni_code|=1;
755 uni_len++;
756 }
757 }
758 uni_DCtab_chrom[level+256][0]= uni_code;
759 uni_DCtab_chrom[level+256][1]= uni_len;
760
761 }
762 }
763
709 void h263_encode_init(MpegEncContext *s) 764 void h263_encode_init(MpegEncContext *s)
710 { 765 {
711 static int done = 0; 766 static int done = 0;
712 767
713 if (!done) { 768 if (!done) {
714 done = 1; 769 done = 1;
770
771 init_uni_dc_tab();
772
715 init_rl(&rl_inter); 773 init_rl(&rl_inter);
716 init_rl(&rl_intra); 774 init_rl(&rl_intra);
717 775
718 init_mv_penalty_and_fcode(s); 776 init_mv_penalty_and_fcode(s);
719 } 777 }
1031 block[block_permute_op(i)] -= ac_val[i + 8]; 1089 block[block_permute_op(i)] -= ac_val[i + 8];
1032 } 1090 }
1033 } 1091 }
1034 } 1092 }
1035 1093
1036
1037 static inline void mpeg4_encode_dc(MpegEncContext * s, int level, int n) 1094 static inline void mpeg4_encode_dc(MpegEncContext * s, int level, int n)
1038 { 1095 {
1096 #if 1
1097 level+=256;
1098 if (n < 4) {
1099 /* luminance */
1100 put_bits(&s->pb, uni_DCtab_lum[level][1], uni_DCtab_lum[level][0]);
1101 } else {
1102 /* chrominance */
1103 put_bits(&s->pb, uni_DCtab_chrom[level][1], uni_DCtab_chrom[level][0]);
1104 }
1105 #else
1039 int size, v; 1106 int size, v;
1040 /* find number of bits */ 1107 /* find number of bits */
1041 size = 0; 1108 size = 0;
1042 v = abs(level); 1109 v = abs(level);
1043 while (v) { 1110 while (v) {
1059 level = (-level) ^ ((1 << size) - 1); 1126 level = (-level) ^ ((1 << size) - 1);
1060 put_bits(&s->pb, size, level); 1127 put_bits(&s->pb, size, level);
1061 if (size > 8) 1128 if (size > 8)
1062 put_bits(&s->pb, 1, 1); 1129 put_bits(&s->pb, 1, 1);
1063 } 1130 }
1131 #endif
1064 } 1132 }
1065 1133
1066 static void mpeg4_encode_block(MpegEncContext * s, DCTELEM * block, int n, int intra_dc, UINT8 *scan_table) 1134 static void mpeg4_encode_block(MpegEncContext * s, DCTELEM * block, int n, int intra_dc, UINT8 *scan_table)
1067 { 1135 {
1068 int level, run, last, i, j, last_index, last_non_zero, sign, slevel; 1136 int level, run, last, i, j, last_index, last_non_zero, sign, slevel;