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