diff options
Diffstat (limited to 'apps/codecs/libwavpack/bits.c')
-rw-r--r-- | apps/codecs/libwavpack/bits.c | 163 |
1 files changed, 101 insertions, 62 deletions
diff --git a/apps/codecs/libwavpack/bits.c b/apps/codecs/libwavpack/bits.c index 1fe6aacf75..bf056a9392 100644 --- a/apps/codecs/libwavpack/bits.c +++ b/apps/codecs/libwavpack/bits.c | |||
@@ -31,12 +31,12 @@ void bs_open_read (Bitstream *bs, uchar *buffer_start, uchar *buffer_end, read_s | |||
31 | bs->end = buffer_end; | 31 | bs->end = buffer_end; |
32 | 32 | ||
33 | if (file) { | 33 | if (file) { |
34 | bs->ptr = bs->end - 1; | 34 | bs->ptr = bs->end - 1; |
35 | bs->file_bytes = file_bytes; | 35 | bs->file_bytes = file_bytes; |
36 | bs->file = file; | 36 | bs->file = file; |
37 | } | 37 | } |
38 | else | 38 | else |
39 | bs->ptr = bs->buf - 1; | 39 | bs->ptr = bs->buf - 1; |
40 | 40 | ||
41 | bs->wrap = bs_read; | 41 | bs->wrap = bs_read; |
42 | } | 42 | } |
@@ -49,31 +49,70 @@ void bs_open_read (Bitstream *bs, uchar *buffer_start, uchar *buffer_end, read_s | |||
49 | static void bs_read (Bitstream *bs) | 49 | static void bs_read (Bitstream *bs) |
50 | { | 50 | { |
51 | if (bs->file && bs->file_bytes) { | 51 | if (bs->file && bs->file_bytes) { |
52 | ulong bytes_read, bytes_to_read = bs->end - bs->buf; | 52 | ulong bytes_read, bytes_to_read = bs->end - bs->buf; |
53 | 53 | ||
54 | if (bytes_to_read > bs->file_bytes) | 54 | if (bytes_to_read > bs->file_bytes) |
55 | bytes_to_read = bs->file_bytes; | 55 | bytes_to_read = bs->file_bytes; |
56 | 56 | ||
57 | bytes_read = bs->file (bs->buf, bytes_to_read); | 57 | bytes_read = bs->file (bs->buf, bytes_to_read); |
58 | 58 | ||
59 | if (bytes_read) { | 59 | if (bytes_read) { |
60 | bs->end = bs->buf + bytes_read; | 60 | bs->end = bs->buf + bytes_read; |
61 | bs->file_bytes -= bytes_read; | 61 | bs->file_bytes -= bytes_read; |
62 | } | 62 | } |
63 | else { | 63 | else { |
64 | memset (bs->buf, -1, bs->end - bs->buf); | 64 | memset (bs->buf, -1, bs->end - bs->buf); |
65 | bs->error = 1; | 65 | bs->error = 1; |
66 | } | 66 | } |
67 | } | 67 | } |
68 | else | 68 | else |
69 | bs->error = 1; | 69 | bs->error = 1; |
70 | 70 | ||
71 | if (bs->error) | 71 | if (bs->error) |
72 | memset (bs->buf, -1, bs->end - bs->buf); | 72 | memset (bs->buf, -1, bs->end - bs->buf); |
73 | 73 | ||
74 | bs->ptr = bs->buf; | 74 | bs->ptr = bs->buf; |
75 | } | 75 | } |
76 | 76 | ||
77 | // Open the specified BitStream using the specified buffer pointers. It is | ||
78 | // assumed that enough buffer space has been allocated for all data that will | ||
79 | // be written, otherwise an error will be generated. | ||
80 | |||
81 | static void bs_write (Bitstream *bs); | ||
82 | |||
83 | void bs_open_write (Bitstream *bs, uchar *buffer_start, uchar *buffer_end) | ||
84 | { | ||
85 | bs->error = bs->sr = bs->bc = 0; | ||
86 | bs->ptr = bs->buf = buffer_start; | ||
87 | bs->end = buffer_end; | ||
88 | bs->wrap = bs_write; | ||
89 | } | ||
90 | |||
91 | // This function is only called from the putbit() and putbits() macros when | ||
92 | // the buffer is full, which is now flagged as an error. | ||
93 | |||
94 | static void bs_write (Bitstream *bs) | ||
95 | { | ||
96 | bs->ptr = bs->buf; | ||
97 | bs->error = 1; | ||
98 | } | ||
99 | |||
100 | // This function forces a flushing write of the specified BitStream, and | ||
101 | // returns the total number of bytes written into the buffer. | ||
102 | |||
103 | ulong bs_close_write (Bitstream *bs) | ||
104 | { | ||
105 | ulong bytes_written; | ||
106 | |||
107 | if (bs->error) | ||
108 | return (ulong) -1; | ||
109 | |||
110 | while (bs->bc || ((bs->ptr - bs->buf) & 1)) putbit_1 (bs); | ||
111 | bytes_written = bs->ptr - bs->buf; | ||
112 | CLEAR (*bs); | ||
113 | return bytes_written; | ||
114 | } | ||
115 | |||
77 | /////////////////////// Endian Correction Routines //////////////////////////// | 116 | /////////////////////// Endian Correction Routines //////////////////////////// |
78 | 117 | ||
79 | void little_endian_to_native (void *data, char *format) | 118 | void little_endian_to_native (void *data, char *format) |
@@ -82,27 +121,27 @@ void little_endian_to_native (void *data, char *format) | |||
82 | long temp; | 121 | long temp; |
83 | 122 | ||
84 | while (*format) { | 123 | while (*format) { |
85 | switch (*format) { | 124 | switch (*format) { |
86 | case 'L': | 125 | case 'L': |
87 | temp = cp [0] + ((long) cp [1] << 8) + ((long) cp [2] << 16) + ((long) cp [3] << 24); | 126 | temp = cp [0] + ((long) cp [1] << 8) + ((long) cp [2] << 16) + ((long) cp [3] << 24); |
88 | * (long *) cp = temp; | 127 | * (long *) cp = temp; |
89 | cp += 4; | 128 | cp += 4; |
90 | break; | 129 | break; |
91 | 130 | ||
92 | case 'S': | 131 | case 'S': |
93 | temp = cp [0] + (cp [1] << 8); | 132 | temp = cp [0] + (cp [1] << 8); |
94 | * (short *) cp = (short) temp; | 133 | * (short *) cp = (short) temp; |
95 | cp += 2; | 134 | cp += 2; |
96 | break; | 135 | break; |
97 | 136 | ||
98 | default: | 137 | default: |
99 | if (*format >= '0' && *format <= '9') | 138 | if (*format >= '0' && *format <= '9') |
100 | cp += *format - '0'; | 139 | cp += *format - '0'; |
101 | 140 | ||
102 | break; | 141 | break; |
103 | } | 142 | } |
104 | 143 | ||
105 | format++; | 144 | format++; |
106 | } | 145 | } |
107 | } | 146 | } |
108 | 147 | ||
@@ -112,28 +151,28 @@ void native_to_little_endian (void *data, char *format) | |||
112 | long temp; | 151 | long temp; |
113 | 152 | ||
114 | while (*format) { | 153 | while (*format) { |
115 | switch (*format) { | 154 | switch (*format) { |
116 | case 'L': | 155 | case 'L': |
117 | temp = * (long *) cp; | 156 | temp = * (long *) cp; |
118 | *cp++ = (uchar) temp; | 157 | *cp++ = (uchar) temp; |
119 | *cp++ = (uchar) (temp >> 8); | 158 | *cp++ = (uchar) (temp >> 8); |
120 | *cp++ = (uchar) (temp >> 16); | 159 | *cp++ = (uchar) (temp >> 16); |
121 | *cp++ = (uchar) (temp >> 24); | 160 | *cp++ = (uchar) (temp >> 24); |
122 | break; | 161 | break; |
123 | 162 | ||
124 | case 'S': | 163 | case 'S': |
125 | temp = * (short *) cp; | 164 | temp = * (short *) cp; |
126 | *cp++ = (uchar) temp; | 165 | *cp++ = (uchar) temp; |
127 | *cp++ = (uchar) (temp >> 8); | 166 | *cp++ = (uchar) (temp >> 8); |
128 | break; | 167 | break; |
129 | 168 | ||
130 | default: | 169 | default: |
131 | if (*format >= '0' && *format <= '9') | 170 | if (*format >= '0' && *format <= '9') |
132 | cp += *format - '0'; | 171 | cp += *format - '0'; |
133 | 172 | ||
134 | break; | 173 | break; |
135 | } | 174 | } |
136 | 175 | ||
137 | format++; | 176 | format++; |
138 | } | 177 | } |
139 | } | 178 | } |