Mercurial > mplayer.hg
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 } |