comparison msmpeg4.c @ 706:e65798d228ea libavcodec

idct permutation cleanup, idct can be selected per context now fixing some threadunsafe code
author michaelni
date Sun, 29 Sep 2002 22:44:22 +0000
parents 76e9b51cccda
children 4cf7173a004e
comparison
equal deleted inserted replaced
705:107a56aa74f5 706:e65798d228ea
162 s->y_dc_scale_table= wmv1_y_dc_scale_table; 162 s->y_dc_scale_table= wmv1_y_dc_scale_table;
163 s->c_dc_scale_table= wmv1_c_dc_scale_table; 163 s->c_dc_scale_table= wmv1_c_dc_scale_table;
164 break; 164 break;
165 } 165 }
166 166
167
167 if(s->msmpeg4_version==4){ 168 if(s->msmpeg4_version==4){
168 s->intra_scantable = wmv1_scantable[1]; 169 int i;
169 s->intra_h_scantable= wmv1_scantable[2]; 170 ff_init_scantable(s, &s->intra_scantable , wmv1_scantable[1]);
170 s->intra_v_scantable= wmv1_scantable[3]; 171 ff_init_scantable(s, &s->intra_h_scantable, wmv1_scantable[2]);
171 s->inter_scantable = wmv1_scantable[0]; 172 ff_init_scantable(s, &s->intra_v_scantable, wmv1_scantable[3]);
172 }else{ 173 ff_init_scantable(s, &s->inter_scantable , wmv1_scantable[0]);
173 s->intra_scantable = zigzag_direct; 174 }
174 s->intra_h_scantable= ff_alternate_horizontal_scan; 175 //Note the default tables are set in common_init in mpegvideo.c
175 s->intra_v_scantable= ff_alternate_vertical_scan;
176 s->inter_scantable = zigzag_direct;
177 }
178 176
179 if(!inited){ 177 if(!inited){
180 int i; 178 int i;
181 inited=1; 179 inited=1;
182 180
183 init_h263_dc_for_msmpeg4(); 181 init_h263_dc_for_msmpeg4();
184
185 /* permute for IDCT */
186 for(i=0; i<WMV1_SCANTABLE_COUNT; i++){
187 int k;
188 for(k=0;k<64;k++) {
189 int j = wmv1_scantable[i][k];
190 wmv1_scantable[i][k]= block_permute_op(j);
191 }
192 }
193 } 182 }
194 } 183 }
195 184
196 /* build the table which associate a (x,y) motion vector to a vlc */ 185 /* build the table which associate a (x,y) motion vector to a vlc */
197 static void init_mv_table(MVTable *tab) 186 static void init_mv_table(MVTable *tab)
934 rl = &rl_table[s->rl_table_index]; 923 rl = &rl_table[s->rl_table_index];
935 } else { 924 } else {
936 rl = &rl_table[3 + s->rl_chroma_table_index]; 925 rl = &rl_table[3 + s->rl_chroma_table_index];
937 } 926 }
938 run_diff = 0; 927 run_diff = 0;
939 scantable= s->intra_scantable; 928 scantable= s->intra_scantable.permutated;
940 set_stat(ST_INTRA_AC); 929 set_stat(ST_INTRA_AC);
941 } else { 930 } else {
942 i = 0; 931 i = 0;
943 rl = &rl_table[3 + s->rl_table_index]; 932 rl = &rl_table[3 + s->rl_table_index];
944 if(s->msmpeg4_version<=2) 933 if(s->msmpeg4_version<=2)
945 run_diff = 0; 934 run_diff = 0;
946 else 935 else
947 run_diff = 1; 936 run_diff = 1;
948 scantable= s->inter_scantable; 937 scantable= s->inter_scantable.permutated;
949 set_stat(ST_INTER_AC); 938 set_stat(ST_INTER_AC);
950 } 939 }
951 940
952 /* recalculate block_last_index for M$ wmv1 */ 941 /* recalculate block_last_index for M$ wmv1 */
953 if(scantable!=zigzag_direct && s->block_last_index[n]>0){ 942 if(s->msmpeg4_version==4 && s->block_last_index[n]>0){
954 for(last_index=63; last_index>=0; last_index--){ 943 for(last_index=63; last_index>=0; last_index--){
955 if(block[scantable[last_index]]) break; 944 if(block[scantable[last_index]]) break;
956 } 945 }
957 }else 946 }else
958 last_index = s->block_last_index[n]; 947 last_index = s->block_last_index[n];
1702 if (!coded) { 1691 if (!coded) {
1703 goto not_coded; 1692 goto not_coded;
1704 } 1693 }
1705 if (s->ac_pred) { 1694 if (s->ac_pred) {
1706 if (dc_pred_dir == 0) 1695 if (dc_pred_dir == 0)
1707 scan_table = s->intra_v_scantable; /* left */ 1696 scan_table = s->intra_v_scantable.permutated; /* left */
1708 else 1697 else
1709 scan_table = s->intra_h_scantable; /* top */ 1698 scan_table = s->intra_h_scantable.permutated; /* top */
1710 } else { 1699 } else {
1711 scan_table = s->intra_scantable; 1700 scan_table = s->intra_scantable.permutated;
1712 } 1701 }
1713 set_stat(ST_INTRA_AC); 1702 set_stat(ST_INTRA_AC);
1714 rl_vlc= rl->rl_vlc[0]; 1703 rl_vlc= rl->rl_vlc[0];
1715 } else { 1704 } else {
1716 qmul = s->qscale << 1; 1705 qmul = s->qscale << 1;
1725 1714
1726 if (!coded) { 1715 if (!coded) {
1727 s->block_last_index[n] = i; 1716 s->block_last_index[n] = i;
1728 return 0; 1717 return 0;
1729 } 1718 }
1730 scan_table = s->inter_scantable; 1719 scan_table = s->inter_scantable.permutated;
1731 set_stat(ST_INTER_AC); 1720 set_stat(ST_INTER_AC);
1732 rl_vlc= rl->rl_vlc[s->qscale]; 1721 rl_vlc= rl->rl_vlc[s->qscale];
1733 } 1722 }
1734 { 1723 {
1735 OPEN_READER(re, &s->gb); 1724 OPEN_READER(re, &s->gb);