comparison liba52/bitstream.c @ 18720:4bad7f00556e

sync with liba52 0.7.4, patch by Emanuele Giaquinta >emanuele.giaquinta ! gmail * com< part 1: functional changes
author rathann
date Thu, 15 Jun 2006 22:58:06 +0000
parents f580a7755ac5
children 722ac20fac5f
comparison
equal deleted inserted replaced
18719:5d01eb066fa3 18720:4bad7f00556e
1 /* 1 /*
2 * bitstream.c 2 * bitstream.c
3 * Copyright (C) 2000-2001 Michel Lespinasse <walken@zoy.org> 3 * Copyright (C) 2000-2002 Michel Lespinasse <walken@zoy.org>
4 * Copyright (C) 1999-2000 Aaron Holtzman <aholtzma@ess.engr.uvic.ca> 4 * Copyright (C) 1999-2000 Aaron Holtzman <aholtzma@ess.engr.uvic.ca>
5 * 5 *
6 * This file is part of a52dec, a free ATSC A-52 stream decoder. 6 * This file is part of a52dec, a free ATSC A-52 stream decoder.
7 * See http://liba52.sourceforge.net/ for updates. 7 * See http://liba52.sourceforge.net/ for updates.
8 * 8 *
35 35
36 #define BUFFER_SIZE 4096 36 #define BUFFER_SIZE 4096
37 37
38 #ifdef ALT_BITSTREAM_READER 38 #ifdef ALT_BITSTREAM_READER
39 int indx=0; 39 int indx=0;
40 uint32_t * buffer_start;
41 #else
42 static uint32_t * buffer_start;
43 #endif 40 #endif
44 41
45 uint32_t bits_left; 42 void a52_bitstream_set_ptr (a52_state_t * state, uint8_t * buf)
46 uint32_t current_word;
47
48 void bitstream_set_ptr (uint8_t * buf)
49 { 43 {
50 int align; 44 int align;
51 45
52 align = (int)buf & 3; 46 align = (long)buf & 3;
53 buffer_start = (uint32_t *) (buf - align); 47 state->buffer_start = (uint32_t *) (buf - align);
54 bits_left = 0; 48 state->bits_left = 0;
55 #ifdef ALT_BITSTREAM_READER 49 #ifdef ALT_BITSTREAM_READER
56 indx=0; 50 indx=0;
57 #endif 51 #endif
58 bitstream_get (align * 8); 52 bitstream_get (state, align * 8);
59 } 53 }
60 54
61 static inline void 55 static inline void bitstream_fill_current (a52_state_t * state)
62 bitstream_fill_current(void)
63 { 56 {
64 uint32_t tmp; 57 uint32_t tmp;
65 58
66 tmp = *(buffer_start++); 59 tmp = *(state->buffer_start++);
67 current_word = swab32 (tmp); 60 state->current_word = swab32 (tmp);
68 } 61 }
69 62
70 /* 63 /*
71 * The fast paths for _get is in the 64 * The fast paths for _get is in the
72 * bitstream.h header file so it can be inlined. 65 * bitstream.h header file so it can be inlined.
74 * The "bottom half" of this routine is suffixed _bh 67 * The "bottom half" of this routine is suffixed _bh
75 * 68 *
76 * -ah 69 * -ah
77 */ 70 */
78 71
79 uint32_t 72 uint32_t a52_bitstream_get_bh (a52_state_t * state, uint32_t num_bits)
80 bitstream_get_bh(uint32_t num_bits)
81 { 73 {
82 uint32_t result; 74 uint32_t result;
83 75
84 num_bits -= bits_left; 76 num_bits -= state->bits_left;
85 result = (current_word << (32 - bits_left)) >> (32 - bits_left); 77 result = ((state->current_word << (32 - state->bits_left)) >>
78 (32 - state->bits_left));
86 79
87 bitstream_fill_current(); 80 bitstream_fill_current (state);
88 81
89 if(num_bits != 0) 82 if(num_bits != 0)
90 result = (result << num_bits) | (current_word >> (32 - num_bits)); 83 result = (result << num_bits) | (state->current_word >> (32 - num_bits));
91 84
92 bits_left = 32 - num_bits; 85 state->bits_left = 32 - num_bits;
93 86
94 return result; 87 return result;
95 } 88 }
96 89
97 int32_t 90 int32_t a52_bitstream_get_bh_2 (a52_state_t * state, uint32_t num_bits)
98 bitstream_get_bh_2(uint32_t num_bits)
99 { 91 {
100 int32_t result; 92 int32_t result;
101 93
102 num_bits -= bits_left; 94 num_bits -= state->bits_left;
103 result = (((int32_t)current_word) << (32 - bits_left)) >> (32 - bits_left); 95 result = ((((int32_t)state->current_word) << (32 - state->bits_left)) >>
96 (32 - state->bits_left));
104 97
105 bitstream_fill_current(); 98 bitstream_fill_current(state);
106 99
107 if(num_bits != 0) 100 if(num_bits != 0)
108 result = (result << num_bits) | (current_word >> (32 - num_bits)); 101 result = (result << num_bits) | (state->current_word >> (32 - num_bits));
109 102
110 bits_left = 32 - num_bits; 103 state->bits_left = 32 - num_bits;
111 104
112 return result; 105 return result;
113 } 106 }