summaryrefslogtreecommitdiff
path: root/libavcodec/bitstream.c
diff options
context:
space:
mode:
authorAurelien Jacobs <aurel@gnuage.org>2007-07-06 14:13:25 +0000
committerAurelien Jacobs <aurel@gnuage.org>2007-07-06 14:13:25 +0000
commit98f7b56bb6562db841219a42ea4e15d43a835c93 (patch)
tree610fa0bffb5ad5a5ede46e21b6b6c3d883f62489 /libavcodec/bitstream.c
parent3662aa766f8ca086d8a23a9372d51706c86c2ec7 (diff)
move ff_copy_bits to bitstream.c
Originally committed as revision 9503 to svn://svn.ffmpeg.org/ffmpeg/trunk
Diffstat (limited to 'libavcodec/bitstream.c')
-rw-r--r--libavcodec/bitstream.c24
1 files changed, 24 insertions, 0 deletions
diff --git a/libavcodec/bitstream.c b/libavcodec/bitstream.c
index 8e5d15aceb..79a3f6c2f1 100644
--- a/libavcodec/bitstream.c
+++ b/libavcodec/bitstream.c
@@ -60,6 +60,30 @@ void ff_put_string(PutBitContext * pbc, char *s, int put_zero)
put_bits(pbc, 8, 0);
}
+void ff_copy_bits(PutBitContext *pb, uint8_t *src, int length)
+{
+ const uint16_t *srcw= (uint16_t*)src;
+ int words= length>>4;
+ int bits= length&15;
+ int i;
+
+ if(length==0) return;
+
+ if(words < 16){
+ for(i=0; i<words; i++) put_bits(pb, 16, be2me_16(srcw[i]));
+ }else if(put_bits_count(pb)&7){
+ for(i=0; i<words; i++) put_bits(pb, 16, be2me_16(srcw[i]));
+ }else{
+ for(i=0; put_bits_count(pb)&31; i++)
+ put_bits(pb, 8, src[i]);
+ flush_put_bits(pb);
+ memcpy(pbBufPtr(pb), src+i, 2*words-i);
+ skip_put_bytes(pb, 2*words-i);
+ }
+
+ put_bits(pb, bits, be2me_16(srcw[words])>>(16-bits));
+}
+
/* VLC decoding */
//#define DEBUG_VLC