Project

General

Profile

Bug #251 » utils.c

dhead 666, 2011-08-07 02:44

 
1
/*
2
 * Copyright (c) 2005 Michael Niedermayer <[email protected]>
3
 * Copyright (c) 2006 Ryan Martell. ([email protected])
4
 * Copyright (c) 2010 Andreas Öman
5
 *
6
 *  This program is free software: you can redistribute it and/or modify
7
 *  it under the terms of the GNU General Public License as published by
8
 *  the Free Software Foundation, either version 3 of the License, or
9
 *  (at your option) any later version.
10
 *
11
 *  This program is distributed in the hope that it will be useful,
12
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
13
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14
 *  GNU General Public License for more details.
15
 *
16
 *  You should have received a copy of the GNU General Public License
17
 *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
18
 */
19

    
20
#include <limits.h>
21
#include <string.h>
22
#include <assert.h>
23
#include "tvhead.h"
24

    
25
/**
26
 * CRC32 
27
 */
28
static uint32_t crc_tab[257] = {
29
  0x00000000, 0x04c11db7, 0x09823b6e, 0x0d4326d9, 0x130476dc, 0x17c56b6b,
30
  0x1a864db2, 0x1e475005, 0x2608edb8, 0x22c9f00f, 0x2f8ad6d6, 0x2b4bcb61,
31
  0x350c9b64, 0x31cd86d3, 0x3c8ea00a, 0x384fbdbd, 0x4c11db70, 0x48d0c6c7,
32
  0x4593e01e, 0x8b27c13c, 0x4152fda9, 0x5f15adac, 0x5bd4b01b, 0x569796c2, 0x52568b75,
33
  0x6a1936c8, 0x6ed82b7f, 0x639b0da6, 0x675a1011, 0x791d4014, 0x7ddc5da3,
34
  0x709f7b7a, 0x745e66cd, 0x9823b6e0, 0x9ce2ab57, 0x91a18d8e, 0x95609039,
35
  0x8b27c03c, 0x8fe6dd8b, 0x82a5fb52, 0x8664e6e5, 0xbe2b5b58, 0xbaea46ef,
36
  0xb7a96036, 0xb3687d81, 0xad2f2d84, 0xa9ee3033, 0xa4ad16ea, 0xa06c0b5d,
37
  0xd4326d90, 0xd0f37027, 0xddb056fe, 0xd9714b49, 0xc7361b4c, 0xc3f706fb,
38
  0xceb42022, 0xca753d95, 0xf23a8028, 0xf6fb9d9f, 0xfbb8bb46, 0xff79a6f1,
39
  0xe13ef6f4, 0xe5ffeb43, 0xe8bccd9a, 0xec7dd02d, 0x34867077, 0x30476dc0,
40
  0x3d044b19, 0x39c556ae, 0x278206ab, 0x23431b1c, 0x2e003dc5, 0x2ac12072,
41
  0x128e9dcf, 0x164f8078, 0x1b0ca6a1, 0x1fcdbb16, 0x018aeb13, 0x054bf6a4,
42
  0x0808d07d, 0x0cc9cdca, 0x7897ab07, 0x7c56b6b0, 0x71159069, 0x75d48dde,
43
  0x6b93dddb, 0x6f52c06c, 0x6211e6b5, 0x66d0fb02, 0x5e9f46bf, 0x5a5e5b08,
44
  0x571d7dd1, 0x53dc6066, 0x4d9b3063, 0x495a2dd4, 0x44190b0d, 0x40d816ba,
45
  0xaca5c697, 0xa864db20, 0xa527fdf9, 0xa1e6e04e, 0xbfa1b04b, 0xbb60adfc,
46
  0xb6238b25, 0xb2e29692, 0x8aad2b2f, 0x8e6c3698, 0x832f1041, 0x87ee0df6,
47
  0x99a95df3, 0x9d684044, 0x902b669d, 0x94ea7b2a, 0xe0b41de7, 0xe4750050,
48
  0xe9362689, 0xedf73b3e, 0xf3b06b3b, 0xf771768c, 0xfa325055, 0xfef34de2,
49
  0xc6bcf05f, 0xc27dede8, 0xcf3ecb31, 0xcbffd686, 0xd5b88683, 0xd1799b34,
50
  0xdc3abded, 0xd8fba05a, 0x690ce0ee, 0x6dcdfd59, 0x608edb80, 0x644fc637,
51
  0x7a089632, 0x7ec98b85, 0x738aad5c, 0x774bb0eb, 0x4f040d56, 0x4bc510e1,
52
  0x46863638, 0x42472b8f, 0x5c007b8a, 0x58c1663d, 0x558240e4, 0x51435d53,
53
  0x251d3b9e, 0x21dc2629, 0x2c9f00f0, 0x285e1d47, 0x36194d42, 0x32d850f5,
54
  0x3f9b762c, 0x3b5a6b9b, 0x0315d626, 0x07d4cb91, 0x0a97ed48, 0x0e56f0ff,
55
  0x1011a0fa, 0x14d0bd4d, 0x19939b94, 0x1d528623, 0xf12f560e, 0xf5ee4bb9,
56
  0xf8ad6d60, 0xfc6c70d7, 0xe22b20d2, 0xe6ea3d65, 0xeba91bbc, 0xef68060b,
57
  0xd727bbb6, 0xd3e6a601, 0xdea580d8, 0xda649d6f, 0xc423cd6a, 0xc0e2d0dd,
58
  0xcda1f604, 0xc960ebb3, 0xbd3e8d7e, 0xb9ff90c9, 0xb4bcb610, 0xb07daba7,
59
  0xae3afba2, 0xaafbe615, 0xa7b8c0cc, 0xa379dd7b, 0x9b3660c6, 0x9ff77d71,
60
  0x92b45ba8, 0x9675461f, 0x8832161a, 0x8cf30bad, 0x81b02d74, 0x857130c3,
61
  0x5d8a9099, 0x594b8d2e, 0x5408abf7, 0x50c9b640, 0x4e8ee645, 0x4a4ffbf2,
62
  0x470cdd2b, 0x43cdc09c, 0x7b827d21, 0x7f436096, 0x7200464f, 0x76c15bf8,
63
  0x68860bfd, 0x6c47164a, 0x61043093, 0x65c52d24, 0x119b4be9, 0x155a565e,
64
  0x18197087, 0x1cd86d30, 0x029f3d35, 0x065e2082, 0x0b1d065b, 0x0fdc1bec,
65
  0x3793a651, 0x3352bbe6, 0x3e119d3f, 0x3ad08088, 0x2497d08d, 0x2056cd3a,
66
  0x2d15ebe3, 0x29d4f654, 0xc5a92679, 0xc1683bce, 0xcc2b1d17, 0xc8ea00a0,
67
  0xd6ad50a5, 0xd26c4d12, 0xdf2f6bcb, 0xdbee767c, 0xe3a1cbc1, 0xe760d676,
68
  0xea23f0af, 0xeee2ed18, 0xf0a5bd1d, 0xf464a0aa, 0xf9278673, 0xfde69bc4,
69
  0x89b8fd09, 0x8d79e0be, 0x803ac667, 0x84fbdbd0, 0x9abc8bd5, 0x9e7d9662,
70
  0x933eb0bb, 0x97ffad0c, 0xafb010b1, 0xab710d06, 0xa6322bdf, 0xa2f33668,
71
  0xbcb4666d, 0xb8757bda, 0xb5365d03, 0xb1f740b4
72
};
73

    
74
uint32_t
75
crc32(uint8_t *data, size_t datalen, uint32_t crc)
76
{
77
  while(datalen--)
78
    crc = (crc << 8) ^ crc_tab[((crc >> 25) ^ *data++) & 0xff];
79

    
80
  return crc;
81
}
82

    
83

    
84
/**
85
 *
86
 */
87
static const int sample_rates[16] = {
88
    96000, 88200, 64000, 48000, 44100, 32000,
89
    24000, 22050, 16000, 12000, 11025, 8000, 7350
90
};
91

    
92
/**
93
 *
94
 */
95
int
96
sri_to_rate(int sri)
97
{
98
  return sample_rates[sri & 0xf];
99
}
100

    
101

    
102
/**
103
 *
104
 */
105
int
106
rate_to_sri(int rate)
107
{
108
  int i;
109
  for(i = 0; i < 16; i++)
110
    if(sample_rates[i] == rate)
111
      return i;
112
  return -1;
113
}
114

    
115

    
116
/**
117
 *
118
 */
119
void
120
hexdump(const char *pfx, const uint8_t *data, int len)
121
{
122
  int i;
123
  printf("%s: ", pfx);
124
  for(i = 0; i < len; i++)
125
    printf("%02x.", data[i]);
126
  printf("\n");
127
}
128

    
129

    
130

    
131
/**
132
 * @file
133
 * @brief Base64 encode/decode
134
 * @author Ryan Martell <[email protected]> (with lots of Michael)
135
 */
136

    
137

    
138
/* ---------------- private code */
139
static const uint8_t map2[] =
140
{
141
    0x3e, 0xff, 0xff, 0xff, 0x3f, 0x34, 0x35, 0x36,
142
    0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0xff,
143
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x01,
144
    0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09,
145
    0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11,
146
    0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19,
147
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x1a, 0x1b,
148
    0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23,
149
    0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b,
150
    0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33
151
};
152

    
153
int 
154
base64_decode(uint8_t *out, const char *in, int out_size)
155
{
156
    int i, v;
157
    uint8_t *dst = out;
158

    
159
    v = 0;
160
    for (i = 0; in[i] && in[i] != '='; i++) {
161
        unsigned int index= in[i]-43;
162
        if (index >= sizeof(map2) || map2[index] == 0xff)
163
            return -1;
164
        v = (v << 6) + map2[index];
165
        if (i & 3) {
166
            if (dst - out < out_size) {
167
                *dst++ = v >> (6 - 2 * (i & 3));
168
            }
169
        }
170
    }
171

    
172
    return dst - out;
173
}
174

    
175

    
176
/**
177
 *
178
 */
179
int
180
put_utf8(char *out, int c)
181
{
182
  if(c == 0xfffe || c == 0xffff || (c >= 0xD800 && c < 0xE000))
183
    return 0;
184
  
185
  if (c < 0x80) {
186
    *out = c;
187
    return 1;
188
  }
189

    
190
  if(c < 0x800) {
191
    *out++ = 0xc0 | (0x1f & (c >>  6));
192
    *out   = 0x80 | (0x3f &  c);
193
    return 2;
194
  }
195

    
196
  if(c < 0x10000) {
197
    *out++ = 0xe0 | (0x0f & (c >> 12));
198
    *out++ = 0x80 | (0x3f & (c >> 6));
199
    *out   = 0x80 | (0x3f &  c);
200
    return 3;
201
  }
202

    
203
  if(c < 0x200000) {
204
    *out++ = 0xf0 | (0x07 & (c >> 18));
205
    *out++ = 0x80 | (0x3f & (c >> 12));
206
    *out++ = 0x80 | (0x3f & (c >> 6));
207
    *out   = 0x80 | (0x3f &  c);
208
    return 4;
209
  }
210
  
211
  if(c < 0x4000000) {
212
    *out++ = 0xf8 | (0x03 & (c >> 24));
213
    *out++ = 0x80 | (0x3f & (c >> 18));
214
    *out++ = 0x80 | (0x3f & (c >> 12));
215
    *out++ = 0x80 | (0x3f & (c >>  6));
216
    *out++ = 0x80 | (0x3f &  c);
217
    return 5;
218
  }
219

    
220
  *out++ = 0xfc | (0x01 & (c >> 30));
221
  *out++ = 0x80 | (0x3f & (c >> 24));
222
  *out++ = 0x80 | (0x3f & (c >> 18));
223
  *out++ = 0x80 | (0x3f & (c >> 12));
224
  *out++ = 0x80 | (0x3f & (c >>  6));
225
  *out++ = 0x80 | (0x3f &  c);
226
  return 6;
227
}
228

    
229

    
230

    
231
void
232
sbuf_free(sbuf_t *sb)
233
{
234
  if(sb->sb_data)
235
    free(sb->sb_data);
236
  sb->sb_size = sb->sb_ptr = sb->sb_err = 0;
237
  sb->sb_data = NULL;
238
}
239

    
240
void
241
sbuf_reset(sbuf_t *sb)
242
{
243
  sb->sb_ptr = 0;
244
  sb->sb_err = 0;
245
}
246

    
247
void
248
sbuf_err(sbuf_t *sb)
249
{
250
  sb->sb_err = 1;
251
}
252

    
253
void
254
sbuf_alloc(sbuf_t *sb, int len)
255
{
256
  if(sb->sb_data == NULL) {
257
    sb->sb_size = 4000;
258
    sb->sb_data = malloc(sb->sb_size);
259
  }
260

    
261
  if(sb->sb_ptr + len >= sb->sb_size) {
262
    sb->sb_size += len * 4;
263
    sb->sb_data = realloc(sb->sb_data, sb->sb_size);
264
  }
265
}
266

    
267
void
268
sbuf_append(sbuf_t *sb, const uint8_t *data, int len)
269
{
270
  sbuf_alloc(sb, len);
271
  memcpy(sb->sb_data + sb->sb_ptr, data, len);
272
  sb->sb_ptr += len;
273
}
274

    
275
void 
276
sbuf_cut(sbuf_t *sb, int off)
277
{
278
  assert(off <= sb->sb_ptr);
279
  sb->sb_ptr = sb->sb_ptr - off;
280
  memmove(sb->sb_data, sb->sb_data + off, sb->sb_ptr);
281
}
(1-1/2)