35#define LOG_MODULE "latm"
41#if (defined (__GNUC__) && (__GNUC__ >= 4)) || defined (__clang__)
42# if defined (__i386) || defined (__i386__)
43# define BEBF_X86_32_ASM
45# define bebf_UNUSED __attribute__((unused))
46# ifdef WORDS_BIGENDIAN
47# define bebf_ADJ32(v) (v)
49# define bebf_ADJ32(v) ((uint32_t)__builtin_bswap32 ((int32_t)(v)))
53# ifdef WORDS_BIGENDIAN
54# define bebf_ADJ32(v) (v)
56# define bebf_ADJ32(v) (((v) >> 24) | (((v) & 0xff0000) >> 8) | (((v) & 0xff00) << 8) | ((v) << 24))
80 const uint32_t *p = (
const uint32_t *)(((uintptr_t)bebf->
readstart + (nbits >> 3)) & ~(uintptr_t)3);
81 uint32_t n = (int32_t)nbits - (((
const uint8_t *)p - bebf->
readstart) << 3);
83 if (p < bebf->readstop) {
100 uint32_t n = (64 - bebf->
readbits) & 7;
115 bebf->
readstop = (
const uint32_t *)(((uintptr_t)rp + nbytes + 3) & ~(uintptr_t)3);
149 return b >> (32 - nbits);
169 return b >> (32 - nbits);
206 uint32_t _pat = pattern << (32 - pbits);
207 uint32_t _mask = ~0U << (32 - pbits);
224 if (((bebf->
readcache >> 32) & _mask) == _pat)
274 const uint32_t *p = bebf->
readptr;
302 uint32_t b = bebf->
readcache >> (64 - n);
318 uint32_t words = nbits >> 5;
319 switch ((64 - bebf->
readbits) & 31) {
321#ifdef BEBF_X86_32_ASM
322# define bebf_shift(nn) { \
323 uint32_t hi = bebf->readcache >> 32, lo = bebf->readcache, dummy; \
325 __asm__ __volatile__ ( \
327 "shldl\t%5, %0, %1\n\t" \
329 "movl\t(%2), %0\n\t" \
331 "movl\t%4, (%3)\n\t" \
333 "leal\t4(%3), %3\n\t" \
334 "shldl\t%6, %0, %1\n\t" \
336 : "=r" (lo), "=r" (hi), "=r" (p), "=r" (q), "=r" (dummy) \
337 : "I" (nn), "I" (32 - nn), "0" (lo), "1" (hi), "2" (p), "3" (q) \
340 bebf->readcache = ((uint64_t)hi << 32) | lo; \
343# define bebf_shift(nn) { \
344 uint64_t b = bebf->readcache; \
345 do {*q++ = bebf_ADJ32 (b >> 32); b <<= nn; b |= bebf_ADJ32 (*p++); b <<= 32 - nn;} while (--words); \
346 bebf->readcache = b; \
378 memcpy (q, (
const uint8_t *)p - ((64 - bebf->
readbits) >> 3), words << 2);
431#define AOTF_SHORT 0x0001
432#define AOTF_CORE 0x0002
433#define AOTF_EXT1 0x0004
434#define AOTF_LAYER 0x0008
435#define AOTF_CHAN 0x0010
436#define AOTF_SUBFR 0x0020
437#define AOTF_RESIL 0x0040
438#define AOTF_LDSBR 0x0080
439#define AOTF_ELD 0x0100
440#define AOTF_EPCNF 0x0200
477#define BEBF_LATM_GOT_CONF 1
478#define BEBF_LATM_GOT_FRAME 2
505 static const uint32_t rates[16] = {
506 96000, 88200, 64000, 48000, 44100, 32000, 24000, 22050, 16000, 12000, 11025, 8000, 7350, 0, 0, 0
508 static const uint8_t channels[16] = { 0, 1, 2, 3, 4, 5, 6, 8, 0, 0, 0, 0, 0, 0, 0, 0 };
510 uint32_t n, ext1_flag, flags, ret = 0;
522 latm->
sbr = latm->
ps = -1;
548 if (latm->
ps == -1) {
587 int front, side, back, lfe, data, coupling, n;
591 front = n >> (4 + 4 + 2 + 3 + 4);
592 side = (n >> ( 4 + 2 + 3 + 4)) & 15;
593 back = (n >> ( 2 + 3 + 4)) & 15;
594 lfe = (n >> ( 3 + 4)) & 3;
595 data = (n >> 4 ) & 7;
637 size_t l = (conf_pos2 - conf_pos + 7) >> 3;
640 latm->
confbuflen = (3 * l / 2 + 7) & ~(
size_t)7;
658 bebf_seek (&latm->
bebf, nbits ? conf_pos + nbits : conf_pos2);
679 if ((n >> 13) != 0x2b7)
775 latm->
fbuflen = (3 * n / 2 + 7) & ~(
size_t)7;
793 memset (latm, 0,
sizeof (*latm));
822#define BEBF_TEST_MAX (2 * (0x1fff + 3))
828 if ((word & 0xfff60000) == 0xfff00000)
do {
833 size = ((word << 11) | ((uint32_t)in[0] << 3) | (in[1] >> 5)) & 0x1fff;
834 if ((size < 7) || (n < size + 7 - 4))
836 if ((in[size - 4] != 0xff) || ((in[size + 1 - 4] & 0xf6) != 0xf0))
840 if ((word & 0xffe00000) == 0x56e00000)
do {
842 int size = ((word >> 8) & 0x1fff) + 3;
843 if (n < size + 3 - 4)
845 if ((in[size - 4] != 0x56) || ((in[size + 1 - 4] & 0xe0) != 0xe0))
861 const uint8_t *p = in;
862 int n = *nbytes, size;
867 if ((p[1] & 0xe0) == 0xe0)
876 if ((n == 1) && (p[0] != 0x56))
880 size = ((((uint32_t)p[1] << 8) | p[2]) & 0x1fff) + 3;
#define AOTF_CORE
Definition latm.c:432
#define AOTF_RESIL
Definition latm.c:437
static void bebf_latm_open(bebf_latm_t *latm)
Definition latm.c:792
#define AOTF_SUBFR
Definition latm.c:436
static uint32_t bebf_sniff(bebf_t *bebf, uint32_t nbits)
Definition latm.c:158
static void bebf_put(bebf_t *bebf, uint32_t bits, uint32_t nbits)
Definition latm.c:241
#define AOTF_LAYER
Definition latm.c:434
#define AOTF_EXT1
Definition latm.c:433
static void bebf_skip(bebf_t *bebf, uint32_t nbits)
Definition latm.c:177
static void bebf_latm_close(bebf_latm_t *latm)
Definition latm.c:796
#define AOTF_CHAN
Definition latm.c:435
static uint32_t bebf_get(bebf_t *bebf, uint32_t nbits)
Definition latm.c:137
bebf_latm_parser_status_t
Definition latm.c:805
@ BEBF_LATM_IS_RAW
Definition latm.c:807
@ BEBF_LATM_IS_UNKNOWN
Definition latm.c:810
@ BEBF_LATM_IS_LATM
Definition latm.c:809
@ BEBF_LATM_IS_ADTS
Definition latm.c:808
@ BEBF_LATM_NEED_MORE_DATA
Definition latm.c:806
static int bebf_latm_configure(bebf_latm_t *latm, uint32_t nbits)
Definition latm.c:503
static void bebf_copy(bebf_t *bebf, uint32_t nbits)
Definition latm.c:273
#define AOTF_SHORT
Definition latm.c:431
static void bebf_seek(bebf_t *bebf, uint32_t nbits)
Definition latm.c:79
#define AOTF_LDSBR
Definition latm.c:438
static const uint32_t bebf_latm_flags[40]
Definition latm.c:442
#define AOTF_EPCNF
Definition latm.c:440
#define BEBF_LATM_GOT_CONF
Definition latm.c:477
static bebf_latm_parser_status_t bebf_latm_test(const uint8_t *in, int nbytes)
Definition latm.c:819
static size_t bebf_flush(bebf_t *bebf)
Definition latm.c:256
#define bebf_UNUSED
Definition latm.c:52
static void bebf_align(bebf_t *bebf)
Definition latm.c:99
bebf_aot_t
Definition latm.c:402
@ AOT_ALS
Definition latm.c:427
@ AOT_L3
Definition latm.c:426
@ AOT_AAC_LTP
Definition latm.c:406
@ AOT_ER_AAC_LD
Definition latm.c:417
@ AOT_ER_CELP
Definition latm.c:418
@ AOT_HVXC
Definition latm.c:411
@ AOT_ER_AAC_ELD
Definition latm.c:428
@ AOT_ER_AAC_LC
Definition latm.c:412
@ AOT_L2
Definition latm.c:425
@ AOT_SSC
Definition latm.c:422
@ AOT_ER_HVXC
Definition latm.c:419
@ AOT_ER_TWINVQ
Definition latm.c:415
@ AOT_AAC_SCALABLE
Definition latm.c:408
@ AOT_SBR
Definition latm.c:407
@ AOT_TWINVQ
Definition latm.c:409
@ AOT_ER_PARAM
Definition latm.c:421
@ AOT_L1
Definition latm.c:424
@ AOT_CELP
Definition latm.c:410
@ AOT_ER_BSAC
Definition latm.c:416
@ AOT_AAC_SSR
Definition latm.c:405
@ AOT_AAC_LC
Definition latm.c:404
@ AOT_ER_AAC_LTP
Definition latm.c:413
@ AOT_ER_AAC_SCALABLE
Definition latm.c:414
@ AOT_ER_HILN
Definition latm.c:420
@ AOT_PS
Definition latm.c:423
@ AOT_AAC_MAIN
Definition latm.c:403
#define AOTF_ELD
Definition latm.c:439
static int bebf_latm_parse(bebf_latm_t *latm, const uint8_t *in, int *nbytes)
Definition latm.c:860
static int bebf_sync(bebf_t *bebf, uint32_t pattern, uint32_t pbits)
Definition latm.c:205
#define bebf_ADJ32(v)
Definition latm.c:56
#define BEBF_LATM_GOT_FRAME
Definition latm.c:478
static int bebf_latm_demux(bebf_latm_t *latm, const uint8_t *in, uint32_t nbytes)
Definition latm.c:673
static void bebf_set_write(bebf_t *bebf, uint8_t *wp)
Definition latm.c:124
static void bebf_set_read(bebf_t *bebf, const uint8_t *rp, uint32_t nbytes)
Definition latm.c:113
static uint32_t bebf_tell(bebf_t *bebf)
Definition latm.c:194
uint32_t framelen
Definition latm.c:483
uint32_t channel_conf
Definition latm.c:492
uint32_t samplerate_index2
Definition latm.c:490
uint32_t samplerate_index
Definition latm.c:489
uint32_t frame_len_type
Definition latm.c:487
uint8_t * config
Definition latm.c:484
uint8_t * frame
Definition latm.c:482
uint32_t conflen
Definition latm.c:485
int32_t ps
Definition latm.c:494
bebf_aot_t object_type
Definition latm.c:488
int32_t sbr
Definition latm.c:494
uint32_t samplerate
Definition latm.c:489
bebf_aot_t object_type2
Definition latm.c:488
uint32_t fbuflen
Definition latm.c:483
bebf_t bebf
Definition latm.c:481
uint32_t channel_conf2
Definition latm.c:493
uint32_t numchannels
Definition latm.c:492
uint32_t samplerate2
Definition latm.c:490
uint32_t confbuflen
Definition latm.c:485
uint32_t version
Definition latm.c:486
uint32_t samples
Definition latm.c:491
uint32_t frame_len
Definition latm.c:487
uint64_t readcache
Definition latm.c:65
int32_t writebits
Definition latm.c:68
uint8_t * writestart
Definition latm.c:71
int32_t readbits
Definition latm.c:68
const uint32_t * readstop
Definition latm.c:66
uint32_t * writeptr
Definition latm.c:70
uint64_t writecache
Definition latm.c:69
const uint8_t * readstart
Definition latm.c:67
const uint32_t * readptr
Definition latm.c:66
uint32_t v
Definition utils.c:1157
NULL
Definition xine_plugin.c:78