Mercurial > libavcodec.hg
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; |