Mercurial > libavcodec.hg
comparison bitstream.c @ 9905:f3ff182e9ecf libavcodec
Fix potentially unaligned accesses in ff_copy_bits()
A pointer should never be assigned a value which may have less than the
required alignment of the target type. Compilers may assume pointer
values have the required alignment, and emit normal load/store instructions.
Unaligned pointers should use a character type or compiler-specific
type modifiers.
| author | mru |
|---|---|
| date | Wed, 01 Jul 2009 17:48:22 +0000 |
| parents | 932543edc1d2 |
| children | fd9dfd5aa5e9 |
comparison
equal
deleted
inserted
replaced
| 9904:efd0c5014ac7 | 9905:f3ff182e9ecf |
|---|---|
| 76 put_bits(pbc, 8, 0); | 76 put_bits(pbc, 8, 0); |
| 77 } | 77 } |
| 78 | 78 |
| 79 void ff_copy_bits(PutBitContext *pb, const uint8_t *src, int length) | 79 void ff_copy_bits(PutBitContext *pb, const uint8_t *src, int length) |
| 80 { | 80 { |
| 81 const uint16_t *srcw= (const uint16_t*)src; | |
| 82 int words= length>>4; | 81 int words= length>>4; |
| 83 int bits= length&15; | 82 int bits= length&15; |
| 84 int i; | 83 int i; |
| 85 | 84 |
| 86 if(length==0) return; | 85 if(length==0) return; |
| 87 | 86 |
| 88 if(CONFIG_SMALL || words < 16 || put_bits_count(pb)&7){ | 87 if(CONFIG_SMALL || words < 16 || put_bits_count(pb)&7){ |
| 89 for(i=0; i<words; i++) put_bits(pb, 16, AV_RB16(&srcw[i])); | 88 for(i=0; i<words; i++) put_bits(pb, 16, AV_RB16(src + 2*i)); |
| 90 }else{ | 89 }else{ |
| 91 for(i=0; put_bits_count(pb)&31; i++) | 90 for(i=0; put_bits_count(pb)&31; i++) |
| 92 put_bits(pb, 8, src[i]); | 91 put_bits(pb, 8, src[i]); |
| 93 flush_put_bits(pb); | 92 flush_put_bits(pb); |
| 94 memcpy(put_bits_ptr(pb), src+i, 2*words-i); | 93 memcpy(put_bits_ptr(pb), src+i, 2*words-i); |
| 95 skip_put_bytes(pb, 2*words-i); | 94 skip_put_bytes(pb, 2*words-i); |
| 96 } | 95 } |
| 97 | 96 |
| 98 put_bits(pb, bits, AV_RB16(&srcw[words])>>(16-bits)); | 97 put_bits(pb, bits, AV_RB16(src + 2*words)>>(16-bits)); |
| 99 } | 98 } |
| 100 | 99 |
| 101 /* VLC decoding */ | 100 /* VLC decoding */ |
| 102 | 101 |
| 103 //#define DEBUG_VLC | 102 //#define DEBUG_VLC |
