comparison dv.c @ 3146:dcae1bde37ac libavcodec

size[0-3] are not initialized (and can get random negative trash values), so the comparison with vs_total_ac_bits is messed up on the first couple loop iterations, leading to AC underflows. the b->prev[] pointers were not being maintained correctly. We potentially have to update b->prev[] both before and after the area whose VLC length is getting adjusted. this also might fix the ppc regression failure? patch by (Dan Maas <dmaas maasdigital com>)
author michael
date Sat, 25 Feb 2006 22:58:26 +0000
parents ef36cc95e4ab
children 99263b3a00e1
comparison
equal deleted inserted replaced
3145:ede5c3c0a0eb 3146:dcae1bde37ac
729 { 729 {
730 int size[5]; 730 int size[5];
731 int i, j, k, a, prev, a2; 731 int i, j, k, a, prev, a2;
732 EncBlockInfo* b; 732 EncBlockInfo* b;
733 733
734 size[4]= 1<<24; 734 size[0] = size[1] = size[2] = size[3] = size[4] = 1<<24;
735 do { 735 do {
736 b = blks; 736 b = blks;
737 for (i=0; i<5; i++) { 737 for (i=0; i<5; i++) {
738 if (!qnos[i]) 738 if (!qnos[i])
739 continue; 739 continue;
751 if (b->mb[k]) { 751 if (b->mb[k]) {
752 b->bit_size[a] += dv_rl2vlc_size(k - prev - 1, b->mb[k]); 752 b->bit_size[a] += dv_rl2vlc_size(k - prev - 1, b->mb[k]);
753 prev= k; 753 prev= k;
754 } else { 754 } else {
755 if(b->next[k] >= mb_area_start[a+1] && b->next[k]<64){ 755 if(b->next[k] >= mb_area_start[a+1] && b->next[k]<64){
756 for(a2=a+1; b->next[k] >= mb_area_start[a2+1]; a2++); 756 for(a2=a+1; b->next[k] >= mb_area_start[a2+1]; a2++)
757 b->prev[a2] = prev;
757 assert(a2<4); 758 assert(a2<4);
758 assert(b->mb[b->next[k]]); 759 assert(b->mb[b->next[k]]);
759 b->bit_size[a2] += dv_rl2vlc_size(b->next[k] - prev - 1, b->mb[b->next[k]]) 760 b->bit_size[a2] += dv_rl2vlc_size(b->next[k] - prev - 1, b->mb[b->next[k]])
760 -dv_rl2vlc_size(b->next[k] - k - 1, b->mb[b->next[k]]); 761 -dv_rl2vlc_size(b->next[k] - k - 1, b->mb[b->next[k]]);
762 for(; (b->prev[a2]==k) && (a2<4); a2++)
763 b->prev[a2] = prev;
761 } 764 }
762 b->next[prev] = b->next[k]; 765 b->next[prev] = b->next[k];
763 } 766 }
764 } 767 }
765 b->prev[a+1]= prev; 768 b->prev[a+1]= prev;