114 #ifndef __FLUMP3DEC_H__
115 #define __FLUMP3DEC_H__
123 #define G_GINT64_FORMAT "lld"
124 #define G_GUINT64_FORMAT "llu"
126 #define GST_LOG(f, ...) do { printf(f "\n", __VA_ARGS__); } while (0)
127 #define GST_DEBUG(f, ...) do { printf(f "\n", __VA_ARGS__); } while (0)
128 #define GST_WARNING(f, ...) do { printf(f "\n", __VA_ARGS__); } while (0)
130 #define GST_LOG(f, ...) do {} while (0)
131 #define GST_DEBUG(f, ...) do {} while (0)
132 #define GST_WARNING(f, ...) do {} while (0)
144 #define MIN(a, b) ((a) < (b) ? (a) : (b))
147 #define g_assert(cond) assert(cond)
148 #define g_return_if_fail(cond) { if (!(cond)) return; }
149 #define g_return_val_if_fail(cond, val) { if (!(cond)) return (val); }
151 namespace flump3dec {
154 typedef unsigned char guchar;
156 typedef unsigned int guint;
157 typedef float gfloat;
158 typedef double gdouble;
159 typedef int gboolean;
160 typedef size_t gsize;
162 typedef int8_t gint8;
163 typedef uint8_t guint8;
164 typedef int16_t gint16;
165 typedef uint16_t guint16;
166 typedef int32_t gint32;
167 typedef uint32_t guint32;
168 typedef int64_t gint64;
169 typedef uint64_t guint64;
172 #define ENABLE_OPT_BS 1
175 #define MAX_LENGTH 32
177 #define BS_BYTE_SIZE 8
180 #define BS_ACUM_SIZE 32
182 #define BS_ACUM_SIZE 8
185 typedef struct BSReader
198 typedef struct Bit_stream_struc
207 Bit_stream_struc *bs_new ();
210 void bs_free (Bit_stream_struc * bs);
214 bs_reset (Bit_stream_struc * bs)
216 memcpy (&bs->read, &bs->master, sizeof (BSReader));
221 bs_flush (Bit_stream_struc * bs)
223 g_return_if_fail (bs != NULL);
225 bs->master.cur_bit = 8;
227 bs->master.cur_used = 0;
228 bs->master.cur_byte = NULL;
229 bs->master.data = NULL;
230 bs->master.bitpos = 0;
236 gboolean bs_set_data (Bit_stream_struc * bs,
const guint8 * data, gsize size);
239 void bs_consume (Bit_stream_struc * bs, guint32 Nbits);
242 static inline gsize bs_bits_avail (Bit_stream_struc * bs)
244 return ((bs->read.size - bs->read.cur_used) * 8 + (bs->read.cur_bit - 8));
248 void bs_getbytes (Bit_stream_struc * bs, guint8 * out, guint32 N);
251 void bs_skipbits (Bit_stream_struc * bs, guint32 N);
254 static inline gsize bs_get_consumed (Bit_stream_struc * bs)
256 return bs->master.cur_used;
260 static inline guint64
261 bs_pos (Bit_stream_struc * bs)
263 return bs->master.bitpos;
267 static inline guint64
268 bs_read_pos (Bit_stream_struc * bs)
270 return bs->read.bitpos;
275 gboolean bs_seek_sync (Bit_stream_struc * bs);
281 static inline guint32
282 bs_getbits (Bit_stream_struc * bs, guint32 N)
287 g_assert (N <= MAX_LENGTH);
295 if (bs->read.cur_bit == 0) {
296 bs->read.cur_bit = 8;
302 if ((bs->read.cur_used >= bs->read.size)) {
303 GST_WARNING (
"Attempted to read beyond data");
308 k = MIN (j, bs->read.cur_bit);
313 mask = (1 << bs->read.cur_bit) - 1;
314 tmp = bs->read.cur_byte[0] & mask;
317 tmp = tmp >> (bs->read.cur_bit - k);
320 bs->read.cur_bit -= k;
322 bs->read.bitpos += k;
332 static inline guint32
333 bs_get1bit (Bit_stream_struc * bs)
335 return bs_getbits (bs, 1);
339 static inline guint32
340 bs_getbits_aligned (Bit_stream_struc * bs, guint32 N)
344 align = bs->read.cur_bit;
345 if (align != 8 && align != 0)
346 bs_getbits (bs, align);
348 return bs_getbits (bs, N);
352 #define MPEG_VERSION_1 0x03
353 #define MPEG_VERSION_2 0x02
354 #define MPEG_VERSION_2_5 0x00
362 gboolean error_protection;
388 guint side_info_slots;
391 typedef struct mp3tl mp3tl;
399 MP3TL_ERR_UNSUPPORTED_STREAM,
410 mp3tl *mp3tl_new (Bit_stream_struc * bs, Mp3TlMode mode);
412 void mp3tl_free (mp3tl * tl);
414 void mp3tl_set_eos (mp3tl * tl, gboolean more_data);
415 Mp3TlRetcode mp3tl_sync (mp3tl * tl);
416 Mp3TlRetcode mp3tl_gather_frame (mp3tl * tl, guint64 * _offset, gint * _length);
417 Mp3TlRetcode mp3tl_decode_header (mp3tl * tl,
const fr_header ** ret_hdr);
418 Mp3TlRetcode mp3tl_skip_frame (mp3tl * tl);
419 Mp3TlRetcode mp3tl_decode_frame (mp3tl * tl, guint8 * samples, guint bufsize);
420 const char *mp3tl_get_err_reason (mp3tl * tl);
421 void mp3tl_flush (mp3tl * tl);
423 Mp3TlRetcode mp3tl_skip_id3 (mp3tl * tl);
424 Mp3TlRetcode mp3tl_skip_xing (mp3tl * tl,
const fr_header * hdr);