summaryrefslogtreecommitdiff
path: root/apps/codecs/libwavpack/bits.c
diff options
context:
space:
mode:
Diffstat (limited to 'apps/codecs/libwavpack/bits.c')
-rw-r--r--apps/codecs/libwavpack/bits.c163
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
49static void bs_read (Bitstream *bs) 49static 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
81static void bs_write (Bitstream *bs);
82
83void 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
94static 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
103ulong 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
79void little_endian_to_native (void *data, char *format) 118void 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}