From 90425aaf33fd2d2e6851481e5324cc5efab30776 Mon Sep 17 00:00:00 2001 From: zefie Date: Tue, 21 Apr 2026 18:54:30 -0400 Subject: [PATCH] add features to little rpcli --- zefie_wtvp_minisrv/ra_win/minimp3.h | 1865 +++++++++++++++++++++++++++ zefie_wtvp_minisrv/ra_win/rpcli.cpp | 793 +++++++++++- zefie_wtvp_minisrv/ra_win/rpcli.exe | Bin 125440 -> 217088 bytes 3 files changed, 2656 insertions(+), 2 deletions(-) create mode 100644 zefie_wtvp_minisrv/ra_win/minimp3.h diff --git a/zefie_wtvp_minisrv/ra_win/minimp3.h b/zefie_wtvp_minisrv/ra_win/minimp3.h new file mode 100644 index 00000000..3220ae1a --- /dev/null +++ b/zefie_wtvp_minisrv/ra_win/minimp3.h @@ -0,0 +1,1865 @@ +#ifndef MINIMP3_H +#define MINIMP3_H +/* + https://github.com/lieff/minimp3 + To the extent possible under law, the author(s) have dedicated all copyright and related and neighboring rights to this software to the public domain worldwide. + This software is distributed without any warranty. + See . +*/ +#include + +#define MINIMP3_MAX_SAMPLES_PER_FRAME (1152*2) + +typedef struct +{ + int frame_bytes, frame_offset, channels, hz, layer, bitrate_kbps; +} mp3dec_frame_info_t; + +typedef struct +{ + float mdct_overlap[2][9*32], qmf_state[15*2*32]; + int reserv, free_format_bytes; + unsigned char header[4], reserv_buf[511]; +} mp3dec_t; + +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + +void mp3dec_init(mp3dec_t *dec); +#ifndef MINIMP3_FLOAT_OUTPUT +typedef int16_t mp3d_sample_t; +#else /* MINIMP3_FLOAT_OUTPUT */ +typedef float mp3d_sample_t; +void mp3dec_f32_to_s16(const float *in, int16_t *out, int num_samples); +#endif /* MINIMP3_FLOAT_OUTPUT */ +int mp3dec_decode_frame(mp3dec_t *dec, const uint8_t *mp3, int mp3_bytes, mp3d_sample_t *pcm, mp3dec_frame_info_t *info); + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif /* MINIMP3_H */ +#if defined(MINIMP3_IMPLEMENTATION) && !defined(_MINIMP3_IMPLEMENTATION_GUARD) +#define _MINIMP3_IMPLEMENTATION_GUARD + +#include +#include + +#define MAX_FREE_FORMAT_FRAME_SIZE 2304 /* more than ISO spec's */ +#ifndef MAX_FRAME_SYNC_MATCHES +#define MAX_FRAME_SYNC_MATCHES 10 +#endif /* MAX_FRAME_SYNC_MATCHES */ + +#define MAX_L3_FRAME_PAYLOAD_BYTES MAX_FREE_FORMAT_FRAME_SIZE /* MUST be >= 320000/8/32000*1152 = 1440 */ + +#define MAX_BITRESERVOIR_BYTES 511 +#define SHORT_BLOCK_TYPE 2 +#define STOP_BLOCK_TYPE 3 +#define MODE_MONO 3 +#define MODE_JOINT_STEREO 1 +#define HDR_SIZE 4 +#define HDR_IS_MONO(h) (((h[3]) & 0xC0) == 0xC0) +#define HDR_IS_MS_STEREO(h) (((h[3]) & 0xE0) == 0x60) +#define HDR_IS_FREE_FORMAT(h) (((h[2]) & 0xF0) == 0) +#define HDR_IS_CRC(h) (!((h[1]) & 1)) +#define HDR_TEST_PADDING(h) ((h[2]) & 0x2) +#define HDR_TEST_MPEG1(h) ((h[1]) & 0x8) +#define HDR_TEST_NOT_MPEG25(h) ((h[1]) & 0x10) +#define HDR_TEST_I_STEREO(h) ((h[3]) & 0x10) +#define HDR_TEST_MS_STEREO(h) ((h[3]) & 0x20) +#define HDR_GET_STEREO_MODE(h) (((h[3]) >> 6) & 3) +#define HDR_GET_STEREO_MODE_EXT(h) (((h[3]) >> 4) & 3) +#define HDR_GET_LAYER(h) (((h[1]) >> 1) & 3) +#define HDR_GET_BITRATE(h) ((h[2]) >> 4) +#define HDR_GET_SAMPLE_RATE(h) (((h[2]) >> 2) & 3) +#define HDR_GET_MY_SAMPLE_RATE(h) (HDR_GET_SAMPLE_RATE(h) + (((h[1] >> 3) & 1) + ((h[1] >> 4) & 1))*3) +#define HDR_IS_FRAME_576(h) ((h[1] & 14) == 2) +#define HDR_IS_LAYER_1(h) ((h[1] & 6) == 6) + +#define BITS_DEQUANTIZER_OUT -1 +#define MAX_SCF (255 + BITS_DEQUANTIZER_OUT*4 - 210) +#define MAX_SCFI ((MAX_SCF + 3) & ~3) + +#define MINIMP3_MIN(a, b) ((a) > (b) ? (b) : (a)) +#define MINIMP3_MAX(a, b) ((a) < (b) ? (b) : (a)) + +#if !defined(MINIMP3_NO_SIMD) + +#if !defined(MINIMP3_ONLY_SIMD) && (defined(_M_X64) || defined(__x86_64__) || defined(__aarch64__) || defined(_M_ARM64)) +/* x64 always have SSE2, arm64 always have neon, no need for generic code */ +#define MINIMP3_ONLY_SIMD +#endif /* SIMD checks... */ + +#if (defined(_MSC_VER) && (defined(_M_IX86) || defined(_M_X64))) || ((defined(__i386__) || defined(__x86_64__)) && defined(__SSE2__)) +#if defined(_MSC_VER) +#include +#endif /* defined(_MSC_VER) */ +#include +#define HAVE_SSE 1 +#define HAVE_SIMD 1 +#define VSTORE _mm_storeu_ps +#define VLD _mm_loadu_ps +#define VSET _mm_set1_ps +#define VADD _mm_add_ps +#define VSUB _mm_sub_ps +#define VMUL _mm_mul_ps +#define VMAC(a, x, y) _mm_add_ps(a, _mm_mul_ps(x, y)) +#define VMSB(a, x, y) _mm_sub_ps(a, _mm_mul_ps(x, y)) +#define VMUL_S(x, s) _mm_mul_ps(x, _mm_set1_ps(s)) +#define VREV(x) _mm_shuffle_ps(x, x, _MM_SHUFFLE(0, 1, 2, 3)) +typedef __m128 f4; +#if defined(_MSC_VER) || defined(MINIMP3_ONLY_SIMD) +#define minimp3_cpuid __cpuid +#else /* defined(_MSC_VER) || defined(MINIMP3_ONLY_SIMD) */ +static __inline__ __attribute__((always_inline)) void minimp3_cpuid(int CPUInfo[], const int InfoType) +{ +#if defined(__PIC__) + __asm__ __volatile__( +#if defined(__x86_64__) + "push %%rbx\n" + "cpuid\n" + "xchgl %%ebx, %1\n" + "pop %%rbx\n" +#else /* defined(__x86_64__) */ + "xchgl %%ebx, %1\n" + "cpuid\n" + "xchgl %%ebx, %1\n" +#endif /* defined(__x86_64__) */ + : "=a" (CPUInfo[0]), "=r" (CPUInfo[1]), "=c" (CPUInfo[2]), "=d" (CPUInfo[3]) + : "a" (InfoType)); +#else /* defined(__PIC__) */ + __asm__ __volatile__( + "cpuid" + : "=a" (CPUInfo[0]), "=b" (CPUInfo[1]), "=c" (CPUInfo[2]), "=d" (CPUInfo[3]) + : "a" (InfoType)); +#endif /* defined(__PIC__)*/ +} +#endif /* defined(_MSC_VER) || defined(MINIMP3_ONLY_SIMD) */ +static int have_simd(void) +{ +#ifdef MINIMP3_ONLY_SIMD + return 1; +#else /* MINIMP3_ONLY_SIMD */ + static int g_have_simd; + int CPUInfo[4]; +#ifdef MINIMP3_TEST + static int g_counter; + if (g_counter++ > 100) + return 0; +#endif /* MINIMP3_TEST */ + if (g_have_simd) + goto end; + minimp3_cpuid(CPUInfo, 0); + g_have_simd = 1; + if (CPUInfo[0] > 0) + { + minimp3_cpuid(CPUInfo, 1); + g_have_simd = (CPUInfo[3] & (1 << 26)) + 1; /* SSE2 */ + } +end: + return g_have_simd - 1; +#endif /* MINIMP3_ONLY_SIMD */ +} +#elif defined(__ARM_NEON) || defined(__aarch64__) || defined(_M_ARM64) +#include +#define HAVE_SSE 0 +#define HAVE_SIMD 1 +#define VSTORE vst1q_f32 +#define VLD vld1q_f32 +#define VSET vmovq_n_f32 +#define VADD vaddq_f32 +#define VSUB vsubq_f32 +#define VMUL vmulq_f32 +#define VMAC(a, x, y) vmlaq_f32(a, x, y) +#define VMSB(a, x, y) vmlsq_f32(a, x, y) +#define VMUL_S(x, s) vmulq_f32(x, vmovq_n_f32(s)) +#define VREV(x) vcombine_f32(vget_high_f32(vrev64q_f32(x)), vget_low_f32(vrev64q_f32(x))) +typedef float32x4_t f4; +static int have_simd() +{ /* TODO: detect neon for !MINIMP3_ONLY_SIMD */ + return 1; +} +#else /* SIMD checks... */ +#define HAVE_SSE 0 +#define HAVE_SIMD 0 +#ifdef MINIMP3_ONLY_SIMD +#error MINIMP3_ONLY_SIMD used, but SSE/NEON not enabled +#endif /* MINIMP3_ONLY_SIMD */ +#endif /* SIMD checks... */ +#else /* !defined(MINIMP3_NO_SIMD) */ +#define HAVE_SIMD 0 +#endif /* !defined(MINIMP3_NO_SIMD) */ + +#if defined(__ARM_ARCH) && (__ARM_ARCH >= 6) && !defined(__aarch64__) && !defined(_M_ARM64) +#define HAVE_ARMV6 1 +static __inline__ __attribute__((always_inline)) int32_t minimp3_clip_int16_arm(int32_t a) +{ + int32_t x = 0; + __asm__ ("ssat %0, #16, %1" : "=r"(x) : "r"(a)); + return x; +} +#else +#define HAVE_ARMV6 0 +#endif + +typedef struct +{ + const uint8_t *buf; + int pos, limit; +} bs_t; + +typedef struct +{ + float scf[3*64]; + uint8_t total_bands, stereo_bands, bitalloc[64], scfcod[64]; +} L12_scale_info; + +typedef struct +{ + uint8_t tab_offset, code_tab_width, band_count; +} L12_subband_alloc_t; + +typedef struct +{ + const uint8_t *sfbtab; + uint16_t part_23_length, big_values, scalefac_compress; + uint8_t global_gain, block_type, mixed_block_flag, n_long_sfb, n_short_sfb; + uint8_t table_select[3], region_count[3], subblock_gain[3]; + uint8_t preflag, scalefac_scale, count1_table, scfsi; +} L3_gr_info_t; + +typedef struct +{ + bs_t bs; + uint8_t maindata[MAX_BITRESERVOIR_BYTES + MAX_L3_FRAME_PAYLOAD_BYTES]; + L3_gr_info_t gr_info[4]; + float grbuf[2][576], scf[40], syn[18 + 15][2*32]; + uint8_t ist_pos[2][39]; +} mp3dec_scratch_t; + +static void bs_init(bs_t *bs, const uint8_t *data, int bytes) +{ + bs->buf = data; + bs->pos = 0; + bs->limit = bytes*8; +} + +static uint32_t get_bits(bs_t *bs, int n) +{ + uint32_t next, cache = 0, s = bs->pos & 7; + int shl = n + s; + const uint8_t *p = bs->buf + (bs->pos >> 3); + if ((bs->pos += n) > bs->limit) + return 0; + next = *p++ & (255 >> s); + while ((shl -= 8) > 0) + { + cache |= next << shl; + next = *p++; + } + return cache | (next >> -shl); +} + +static int hdr_valid(const uint8_t *h) +{ + return h[0] == 0xff && + ((h[1] & 0xF0) == 0xf0 || (h[1] & 0xFE) == 0xe2) && + (HDR_GET_LAYER(h) != 0) && + (HDR_GET_BITRATE(h) != 15) && + (HDR_GET_SAMPLE_RATE(h) != 3); +} + +static int hdr_compare(const uint8_t *h1, const uint8_t *h2) +{ + return hdr_valid(h2) && + ((h1[1] ^ h2[1]) & 0xFE) == 0 && + ((h1[2] ^ h2[2]) & 0x0C) == 0 && + !(HDR_IS_FREE_FORMAT(h1) ^ HDR_IS_FREE_FORMAT(h2)); +} + +static unsigned hdr_bitrate_kbps(const uint8_t *h) +{ + static const uint8_t halfrate[2][3][15] = { + { { 0,4,8,12,16,20,24,28,32,40,48,56,64,72,80 }, { 0,4,8,12,16,20,24,28,32,40,48,56,64,72,80 }, { 0,16,24,28,32,40,48,56,64,72,80,88,96,112,128 } }, + { { 0,16,20,24,28,32,40,48,56,64,80,96,112,128,160 }, { 0,16,24,28,32,40,48,56,64,80,96,112,128,160,192 }, { 0,16,32,48,64,80,96,112,128,144,160,176,192,208,224 } }, + }; + return 2*halfrate[!!HDR_TEST_MPEG1(h)][HDR_GET_LAYER(h) - 1][HDR_GET_BITRATE(h)]; +} + +static unsigned hdr_sample_rate_hz(const uint8_t *h) +{ + static const unsigned g_hz[3] = { 44100, 48000, 32000 }; + return g_hz[HDR_GET_SAMPLE_RATE(h)] >> (int)!HDR_TEST_MPEG1(h) >> (int)!HDR_TEST_NOT_MPEG25(h); +} + +static unsigned hdr_frame_samples(const uint8_t *h) +{ + return HDR_IS_LAYER_1(h) ? 384 : (1152 >> (int)HDR_IS_FRAME_576(h)); +} + +static int hdr_frame_bytes(const uint8_t *h, int free_format_size) +{ + int frame_bytes = hdr_frame_samples(h)*hdr_bitrate_kbps(h)*125/hdr_sample_rate_hz(h); + if (HDR_IS_LAYER_1(h)) + { + frame_bytes &= ~3; /* slot align */ + } + return frame_bytes ? frame_bytes : free_format_size; +} + +static int hdr_padding(const uint8_t *h) +{ + return HDR_TEST_PADDING(h) ? (HDR_IS_LAYER_1(h) ? 4 : 1) : 0; +} + +#ifndef MINIMP3_ONLY_MP3 +static const L12_subband_alloc_t *L12_subband_alloc_table(const uint8_t *hdr, L12_scale_info *sci) +{ + const L12_subband_alloc_t *alloc; + int mode = HDR_GET_STEREO_MODE(hdr); + int nbands, stereo_bands = (mode == MODE_MONO) ? 0 : (mode == MODE_JOINT_STEREO) ? (HDR_GET_STEREO_MODE_EXT(hdr) << 2) + 4 : 32; + + if (HDR_IS_LAYER_1(hdr)) + { + static const L12_subband_alloc_t g_alloc_L1[] = { { 76, 4, 32 } }; + alloc = g_alloc_L1; + nbands = 32; + } else if (!HDR_TEST_MPEG1(hdr)) + { + static const L12_subband_alloc_t g_alloc_L2M2[] = { { 60, 4, 4 }, { 44, 3, 7 }, { 44, 2, 19 } }; + alloc = g_alloc_L2M2; + nbands = 30; + } else + { + static const L12_subband_alloc_t g_alloc_L2M1[] = { { 0, 4, 3 }, { 16, 4, 8 }, { 32, 3, 12 }, { 40, 2, 7 } }; + int sample_rate_idx = HDR_GET_SAMPLE_RATE(hdr); + unsigned kbps = hdr_bitrate_kbps(hdr) >> (int)(mode != MODE_MONO); + if (!kbps) /* free-format */ + { + kbps = 192; + } + + alloc = g_alloc_L2M1; + nbands = 27; + if (kbps < 56) + { + static const L12_subband_alloc_t g_alloc_L2M1_lowrate[] = { { 44, 4, 2 }, { 44, 3, 10 } }; + alloc = g_alloc_L2M1_lowrate; + nbands = sample_rate_idx == 2 ? 12 : 8; + } else if (kbps >= 96 && sample_rate_idx != 1) + { + nbands = 30; + } + } + + sci->total_bands = (uint8_t)nbands; + sci->stereo_bands = (uint8_t)MINIMP3_MIN(stereo_bands, nbands); + + return alloc; +} + +static void L12_read_scalefactors(bs_t *bs, uint8_t *pba, uint8_t *scfcod, int bands, float *scf) +{ + static const float g_deq_L12[18*3] = { +#define DQ(x) 9.53674316e-07f/x, 7.56931807e-07f/x, 6.00777173e-07f/x + DQ(3),DQ(7),DQ(15),DQ(31),DQ(63),DQ(127),DQ(255),DQ(511),DQ(1023),DQ(2047),DQ(4095),DQ(8191),DQ(16383),DQ(32767),DQ(65535),DQ(3),DQ(5),DQ(9) + }; + int i, m; + for (i = 0; i < bands; i++) + { + float s = 0; + int ba = *pba++; + int mask = ba ? 4 + ((19 >> scfcod[i]) & 3) : 0; + for (m = 4; m; m >>= 1) + { + if (mask & m) + { + int b = get_bits(bs, 6); + s = g_deq_L12[ba*3 - 6 + b % 3]*(1 << 21 >> b/3); + } + *scf++ = s; + } + } +} + +static void L12_read_scale_info(const uint8_t *hdr, bs_t *bs, L12_scale_info *sci) +{ + static const uint8_t g_bitalloc_code_tab[] = { + 0,17, 3, 4, 5,6,7, 8,9,10,11,12,13,14,15,16, + 0,17,18, 3,19,4,5, 6,7, 8, 9,10,11,12,13,16, + 0,17,18, 3,19,4,5,16, + 0,17,18,16, + 0,17,18,19, 4,5,6, 7,8, 9,10,11,12,13,14,15, + 0,17,18, 3,19,4,5, 6,7, 8, 9,10,11,12,13,14, + 0, 2, 3, 4, 5,6,7, 8,9,10,11,12,13,14,15,16 + }; + const L12_subband_alloc_t *subband_alloc = L12_subband_alloc_table(hdr, sci); + + int i, k = 0, ba_bits = 0; + const uint8_t *ba_code_tab = g_bitalloc_code_tab; + + for (i = 0; i < sci->total_bands; i++) + { + uint8_t ba; + if (i == k) + { + k += subband_alloc->band_count; + ba_bits = subband_alloc->code_tab_width; + ba_code_tab = g_bitalloc_code_tab + subband_alloc->tab_offset; + subband_alloc++; + } + ba = ba_code_tab[get_bits(bs, ba_bits)]; + sci->bitalloc[2*i] = ba; + if (i < sci->stereo_bands) + { + ba = ba_code_tab[get_bits(bs, ba_bits)]; + } + sci->bitalloc[2*i + 1] = sci->stereo_bands ? ba : 0; + } + + for (i = 0; i < 2*sci->total_bands; i++) + { + sci->scfcod[i] = sci->bitalloc[i] ? HDR_IS_LAYER_1(hdr) ? 2 : get_bits(bs, 2) : 6; + } + + L12_read_scalefactors(bs, sci->bitalloc, sci->scfcod, sci->total_bands*2, sci->scf); + + for (i = sci->stereo_bands; i < sci->total_bands; i++) + { + sci->bitalloc[2*i + 1] = 0; + } +} + +static int L12_dequantize_granule(float *grbuf, bs_t *bs, L12_scale_info *sci, int group_size) +{ + int i, j, k, choff = 576; + for (j = 0; j < 4; j++) + { + float *dst = grbuf + group_size*j; + for (i = 0; i < 2*sci->total_bands; i++) + { + int ba = sci->bitalloc[i]; + if (ba != 0) + { + if (ba < 17) + { + int half = (1 << (ba - 1)) - 1; + for (k = 0; k < group_size; k++) + { + dst[k] = (float)((int)get_bits(bs, ba) - half); + } + } else + { + unsigned mod = (2 << (ba - 17)) + 1; /* 3, 5, 9 */ + unsigned code = get_bits(bs, mod + 2 - (mod >> 3)); /* 5, 7, 10 */ + for (k = 0; k < group_size; k++, code /= mod) + { + dst[k] = (float)((int)(code % mod - mod/2)); + } + } + } + dst += choff; + choff = 18 - choff; + } + } + return group_size*4; +} + +static void L12_apply_scf_384(L12_scale_info *sci, const float *scf, float *dst) +{ + int i, k; + memcpy(dst + 576 + sci->stereo_bands*18, dst + sci->stereo_bands*18, (sci->total_bands - sci->stereo_bands)*18*sizeof(float)); + for (i = 0; i < sci->total_bands; i++, dst += 18, scf += 6) + { + for (k = 0; k < 12; k++) + { + dst[k + 0] *= scf[0]; + dst[k + 576] *= scf[3]; + } + } +} +#endif /* MINIMP3_ONLY_MP3 */ + +static int L3_read_side_info(bs_t *bs, L3_gr_info_t *gr, const uint8_t *hdr) +{ + static const uint8_t g_scf_long[8][23] = { + { 6,6,6,6,6,6,8,10,12,14,16,20,24,28,32,38,46,52,60,68,58,54,0 }, + { 12,12,12,12,12,12,16,20,24,28,32,40,48,56,64,76,90,2,2,2,2,2,0 }, + { 6,6,6,6,6,6,8,10,12,14,16,20,24,28,32,38,46,52,60,68,58,54,0 }, + { 6,6,6,6,6,6,8,10,12,14,16,18,22,26,32,38,46,54,62,70,76,36,0 }, + { 6,6,6,6,6,6,8,10,12,14,16,20,24,28,32,38,46,52,60,68,58,54,0 }, + { 4,4,4,4,4,4,6,6,8,8,10,12,16,20,24,28,34,42,50,54,76,158,0 }, + { 4,4,4,4,4,4,6,6,6,8,10,12,16,18,22,28,34,40,46,54,54,192,0 }, + { 4,4,4,4,4,4,6,6,8,10,12,16,20,24,30,38,46,56,68,84,102,26,0 } + }; + static const uint8_t g_scf_short[8][40] = { + { 4,4,4,4,4,4,4,4,4,6,6,6,8,8,8,10,10,10,12,12,12,14,14,14,18,18,18,24,24,24,30,30,30,40,40,40,18,18,18,0 }, + { 8,8,8,8,8,8,8,8,8,12,12,12,16,16,16,20,20,20,24,24,24,28,28,28,36,36,36,2,2,2,2,2,2,2,2,2,26,26,26,0 }, + { 4,4,4,4,4,4,4,4,4,6,6,6,6,6,6,8,8,8,10,10,10,14,14,14,18,18,18,26,26,26,32,32,32,42,42,42,18,18,18,0 }, + { 4,4,4,4,4,4,4,4,4,6,6,6,8,8,8,10,10,10,12,12,12,14,14,14,18,18,18,24,24,24,32,32,32,44,44,44,12,12,12,0 }, + { 4,4,4,4,4,4,4,4,4,6,6,6,8,8,8,10,10,10,12,12,12,14,14,14,18,18,18,24,24,24,30,30,30,40,40,40,18,18,18,0 }, + { 4,4,4,4,4,4,4,4,4,4,4,4,6,6,6,8,8,8,10,10,10,12,12,12,14,14,14,18,18,18,22,22,22,30,30,30,56,56,56,0 }, + { 4,4,4,4,4,4,4,4,4,4,4,4,6,6,6,6,6,6,10,10,10,12,12,12,14,14,14,16,16,16,20,20,20,26,26,26,66,66,66,0 }, + { 4,4,4,4,4,4,4,4,4,4,4,4,6,6,6,8,8,8,12,12,12,16,16,16,20,20,20,26,26,26,34,34,34,42,42,42,12,12,12,0 } + }; + static const uint8_t g_scf_mixed[8][40] = { + { 6,6,6,6,6,6,6,6,6,8,8,8,10,10,10,12,12,12,14,14,14,18,18,18,24,24,24,30,30,30,40,40,40,18,18,18,0 }, + { 12,12,12,4,4,4,8,8,8,12,12,12,16,16,16,20,20,20,24,24,24,28,28,28,36,36,36,2,2,2,2,2,2,2,2,2,26,26,26,0 }, + { 6,6,6,6,6,6,6,6,6,6,6,6,8,8,8,10,10,10,14,14,14,18,18,18,26,26,26,32,32,32,42,42,42,18,18,18,0 }, + { 6,6,6,6,6,6,6,6,6,8,8,8,10,10,10,12,12,12,14,14,14,18,18,18,24,24,24,32,32,32,44,44,44,12,12,12,0 }, + { 6,6,6,6,6,6,6,6,6,8,8,8,10,10,10,12,12,12,14,14,14,18,18,18,24,24,24,30,30,30,40,40,40,18,18,18,0 }, + { 4,4,4,4,4,4,6,6,4,4,4,6,6,6,8,8,8,10,10,10,12,12,12,14,14,14,18,18,18,22,22,22,30,30,30,56,56,56,0 }, + { 4,4,4,4,4,4,6,6,4,4,4,6,6,6,6,6,6,10,10,10,12,12,12,14,14,14,16,16,16,20,20,20,26,26,26,66,66,66,0 }, + { 4,4,4,4,4,4,6,6,4,4,4,6,6,6,8,8,8,12,12,12,16,16,16,20,20,20,26,26,26,34,34,34,42,42,42,12,12,12,0 } + }; + + unsigned tables, scfsi = 0; + int main_data_begin, part_23_sum = 0; + int sr_idx = HDR_GET_MY_SAMPLE_RATE(hdr); sr_idx -= (sr_idx != 0); + int gr_count = HDR_IS_MONO(hdr) ? 1 : 2; + + if (HDR_TEST_MPEG1(hdr)) + { + gr_count *= 2; + main_data_begin = get_bits(bs, 9); + scfsi = get_bits(bs, 7 + gr_count); + } else + { + main_data_begin = get_bits(bs, 8 + gr_count) >> gr_count; + } + + do + { + if (HDR_IS_MONO(hdr)) + { + scfsi <<= 4; + } + gr->part_23_length = (uint16_t)get_bits(bs, 12); + part_23_sum += gr->part_23_length; + gr->big_values = (uint16_t)get_bits(bs, 9); + if (gr->big_values > 288) + { + return -1; + } + gr->global_gain = (uint8_t)get_bits(bs, 8); + gr->scalefac_compress = (uint16_t)get_bits(bs, HDR_TEST_MPEG1(hdr) ? 4 : 9); + gr->sfbtab = g_scf_long[sr_idx]; + gr->n_long_sfb = 22; + gr->n_short_sfb = 0; + if (get_bits(bs, 1)) + { + gr->block_type = (uint8_t)get_bits(bs, 2); + if (!gr->block_type) + { + return -1; + } + gr->mixed_block_flag = (uint8_t)get_bits(bs, 1); + gr->region_count[0] = 7; + gr->region_count[1] = 255; + if (gr->block_type == SHORT_BLOCK_TYPE) + { + scfsi &= 0x0F0F; + if (!gr->mixed_block_flag) + { + gr->region_count[0] = 8; + gr->sfbtab = g_scf_short[sr_idx]; + gr->n_long_sfb = 0; + gr->n_short_sfb = 39; + } else + { + gr->sfbtab = g_scf_mixed[sr_idx]; + gr->n_long_sfb = HDR_TEST_MPEG1(hdr) ? 8 : 6; + gr->n_short_sfb = 30; + } + } + tables = get_bits(bs, 10); + tables <<= 5; + gr->subblock_gain[0] = (uint8_t)get_bits(bs, 3); + gr->subblock_gain[1] = (uint8_t)get_bits(bs, 3); + gr->subblock_gain[2] = (uint8_t)get_bits(bs, 3); + } else + { + gr->block_type = 0; + gr->mixed_block_flag = 0; + tables = get_bits(bs, 15); + gr->region_count[0] = (uint8_t)get_bits(bs, 4); + gr->region_count[1] = (uint8_t)get_bits(bs, 3); + gr->region_count[2] = 255; + } + gr->table_select[0] = (uint8_t)(tables >> 10); + gr->table_select[1] = (uint8_t)((tables >> 5) & 31); + gr->table_select[2] = (uint8_t)((tables) & 31); + gr->preflag = HDR_TEST_MPEG1(hdr) ? get_bits(bs, 1) : (gr->scalefac_compress >= 500); + gr->scalefac_scale = (uint8_t)get_bits(bs, 1); + gr->count1_table = (uint8_t)get_bits(bs, 1); + gr->scfsi = (uint8_t)((scfsi >> 12) & 15); + scfsi <<= 4; + gr++; + } while(--gr_count); + + if (part_23_sum + bs->pos > bs->limit + main_data_begin*8) + { + return -1; + } + + return main_data_begin; +} + +static void L3_read_scalefactors(uint8_t *scf, uint8_t *ist_pos, const uint8_t *scf_size, const uint8_t *scf_count, bs_t *bitbuf, int scfsi) +{ + int i, k; + for (i = 0; i < 4 && scf_count[i]; i++, scfsi *= 2) + { + int cnt = scf_count[i]; + if (scfsi & 8) + { + memcpy(scf, ist_pos, cnt); + } else + { + int bits = scf_size[i]; + if (!bits) + { + memset(scf, 0, cnt); + memset(ist_pos, 0, cnt); + } else + { + int max_scf = (scfsi < 0) ? (1 << bits) - 1 : -1; + for (k = 0; k < cnt; k++) + { + int s = get_bits(bitbuf, bits); + ist_pos[k] = (s == max_scf ? -1 : s); + scf[k] = s; + } + } + } + ist_pos += cnt; + scf += cnt; + } + scf[0] = scf[1] = scf[2] = 0; +} + +static float L3_ldexp_q2(float y, int exp_q2) +{ + static const float g_expfrac[4] = { 9.31322575e-10f,7.83145814e-10f,6.58544508e-10f,5.53767716e-10f }; + int e; + do + { + e = MINIMP3_MIN(30*4, exp_q2); + y *= g_expfrac[e & 3]*(1 << 30 >> (e >> 2)); + } while ((exp_q2 -= e) > 0); + return y; +} + +static void L3_decode_scalefactors(const uint8_t *hdr, uint8_t *ist_pos, bs_t *bs, const L3_gr_info_t *gr, float *scf, int ch) +{ + static const uint8_t g_scf_partitions[3][28] = { + { 6,5,5, 5,6,5,5,5,6,5, 7,3,11,10,0,0, 7, 7, 7,0, 6, 6,6,3, 8, 8,5,0 }, + { 8,9,6,12,6,9,9,9,6,9,12,6,15,18,0,0, 6,15,12,0, 6,12,9,6, 6,18,9,0 }, + { 9,9,6,12,9,9,9,9,9,9,12,6,18,18,0,0,12,12,12,0,12, 9,9,6,15,12,9,0 } + }; + const uint8_t *scf_partition = g_scf_partitions[!!gr->n_short_sfb + !gr->n_long_sfb]; + uint8_t scf_size[4], iscf[40]; + int i, scf_shift = gr->scalefac_scale + 1, gain_exp, scfsi = gr->scfsi; + float gain; + + if (HDR_TEST_MPEG1(hdr)) + { + static const uint8_t g_scfc_decode[16] = { 0,1,2,3, 12,5,6,7, 9,10,11,13, 14,15,18,19 }; + int part = g_scfc_decode[gr->scalefac_compress]; + scf_size[1] = scf_size[0] = (uint8_t)(part >> 2); + scf_size[3] = scf_size[2] = (uint8_t)(part & 3); + } else + { + static const uint8_t g_mod[6*4] = { 5,5,4,4,5,5,4,1,4,3,1,1,5,6,6,1,4,4,4,1,4,3,1,1 }; + int k, modprod, sfc, ist = HDR_TEST_I_STEREO(hdr) && ch; + sfc = gr->scalefac_compress >> ist; + for (k = ist*3*4; sfc >= 0; sfc -= modprod, k += 4) + { + for (modprod = 1, i = 3; i >= 0; i--) + { + scf_size[i] = (uint8_t)(sfc / modprod % g_mod[k + i]); + modprod *= g_mod[k + i]; + } + } + scf_partition += k; + scfsi = -16; + } + L3_read_scalefactors(iscf, ist_pos, scf_size, scf_partition, bs, scfsi); + + if (gr->n_short_sfb) + { + int sh = 3 - scf_shift; + for (i = 0; i < gr->n_short_sfb; i += 3) + { + iscf[gr->n_long_sfb + i + 0] += gr->subblock_gain[0] << sh; + iscf[gr->n_long_sfb + i + 1] += gr->subblock_gain[1] << sh; + iscf[gr->n_long_sfb + i + 2] += gr->subblock_gain[2] << sh; + } + } else if (gr->preflag) + { + static const uint8_t g_preamp[10] = { 1,1,1,1,2,2,3,3,3,2 }; + for (i = 0; i < 10; i++) + { + iscf[11 + i] += g_preamp[i]; + } + } + + gain_exp = gr->global_gain + BITS_DEQUANTIZER_OUT*4 - 210 - (HDR_IS_MS_STEREO(hdr) ? 2 : 0); + gain = L3_ldexp_q2(1 << (MAX_SCFI/4), MAX_SCFI - gain_exp); + for (i = 0; i < (int)(gr->n_long_sfb + gr->n_short_sfb); i++) + { + scf[i] = L3_ldexp_q2(gain, iscf[i] << scf_shift); + } +} + +static const float g_pow43[129 + 16] = { + 0,-1,-2.519842f,-4.326749f,-6.349604f,-8.549880f,-10.902724f,-13.390518f,-16.000000f,-18.720754f,-21.544347f,-24.463781f,-27.473142f,-30.567351f,-33.741992f,-36.993181f, + 0,1,2.519842f,4.326749f,6.349604f,8.549880f,10.902724f,13.390518f,16.000000f,18.720754f,21.544347f,24.463781f,27.473142f,30.567351f,33.741992f,36.993181f,40.317474f,43.711787f,47.173345f,50.699631f,54.288352f,57.937408f,61.644865f,65.408941f,69.227979f,73.100443f,77.024898f,81.000000f,85.024491f,89.097188f,93.216975f,97.382800f,101.593667f,105.848633f,110.146801f,114.487321f,118.869381f,123.292209f,127.755065f,132.257246f,136.798076f,141.376907f,145.993119f,150.646117f,155.335327f,160.060199f,164.820202f,169.614826f,174.443577f,179.305980f,184.201575f,189.129918f,194.090580f,199.083145f,204.107210f,209.162385f,214.248292f,219.364564f,224.510845f,229.686789f,234.892058f,240.126328f,245.389280f,250.680604f,256.000000f,261.347174f,266.721841f,272.123723f,277.552547f,283.008049f,288.489971f,293.998060f,299.532071f,305.091761f,310.676898f,316.287249f,321.922592f,327.582707f,333.267377f,338.976394f,344.709550f,350.466646f,356.247482f,362.051866f,367.879608f,373.730522f,379.604427f,385.501143f,391.420496f,397.362314f,403.326427f,409.312672f,415.320884f,421.350905f,427.402579f,433.475750f,439.570269f,445.685987f,451.822757f,457.980436f,464.158883f,470.357960f,476.577530f,482.817459f,489.077615f,495.357868f,501.658090f,507.978156f,514.317941f,520.677324f,527.056184f,533.454404f,539.871867f,546.308458f,552.764065f,559.238575f,565.731879f,572.243870f,578.774440f,585.323483f,591.890898f,598.476581f,605.080431f,611.702349f,618.342238f,625.000000f,631.675540f,638.368763f,645.079578f +}; + +static float L3_pow_43(int x) +{ + float frac; + int sign, mult = 256; + + if (x < 129) + { + return g_pow43[16 + x]; + } + + if (x < 1024) + { + mult = 16; + x <<= 3; + } + + sign = 2*x & 64; + frac = (float)((x & 63) - sign) / ((x & ~63) + sign); + return g_pow43[16 + ((x + sign) >> 6)]*(1.f + frac*((4.f/3) + frac*(2.f/9)))*mult; +} + +static void L3_huffman(float *dst, bs_t *bs, const L3_gr_info_t *gr_info, const float *scf, int layer3gr_limit) +{ + static const int16_t tabs[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 785,785,785,785,784,784,784,784,513,513,513,513,513,513,513,513,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256, + -255,1313,1298,1282,785,785,785,785,784,784,784,784,769,769,769,769,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,290,288, + -255,1313,1298,1282,769,769,769,769,529,529,529,529,529,529,529,529,528,528,528,528,528,528,528,528,512,512,512,512,512,512,512,512,290,288, + -253,-318,-351,-367,785,785,785,785,784,784,784,784,769,769,769,769,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,819,818,547,547,275,275,275,275,561,560,515,546,289,274,288,258, + -254,-287,1329,1299,1314,1312,1057,1057,1042,1042,1026,1026,784,784,784,784,529,529,529,529,529,529,529,529,769,769,769,769,768,768,768,768,563,560,306,306,291,259, + -252,-413,-477,-542,1298,-575,1041,1041,784,784,784,784,769,769,769,769,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,-383,-399,1107,1092,1106,1061,849,849,789,789,1104,1091,773,773,1076,1075,341,340,325,309,834,804,577,577,532,532,516,516,832,818,803,816,561,561,531,531,515,546,289,289,288,258, + -252,-429,-493,-559,1057,1057,1042,1042,529,529,529,529,529,529,529,529,784,784,784,784,769,769,769,769,512,512,512,512,512,512,512,512,-382,1077,-415,1106,1061,1104,849,849,789,789,1091,1076,1029,1075,834,834,597,581,340,340,339,324,804,833,532,532,832,772,818,803,817,787,816,771,290,290,290,290,288,258, + -253,-349,-414,-447,-463,1329,1299,-479,1314,1312,1057,1057,1042,1042,1026,1026,785,785,785,785,784,784,784,784,769,769,769,769,768,768,768,768,-319,851,821,-335,836,850,805,849,341,340,325,336,533,533,579,579,564,564,773,832,578,548,563,516,321,276,306,291,304,259, + -251,-572,-733,-830,-863,-879,1041,1041,784,784,784,784,769,769,769,769,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,-511,-527,-543,1396,1351,1381,1366,1395,1335,1380,-559,1334,1138,1138,1063,1063,1350,1392,1031,1031,1062,1062,1364,1363,1120,1120,1333,1348,881,881,881,881,375,374,359,373,343,358,341,325,791,791,1123,1122,-703,1105,1045,-719,865,865,790,790,774,774,1104,1029,338,293,323,308,-799,-815,833,788,772,818,803,816,322,292,307,320,561,531,515,546,289,274,288,258, + -251,-525,-605,-685,-765,-831,-846,1298,1057,1057,1312,1282,785,785,785,785,784,784,784,784,769,769,769,769,512,512,512,512,512,512,512,512,1399,1398,1383,1367,1382,1396,1351,-511,1381,1366,1139,1139,1079,1079,1124,1124,1364,1349,1363,1333,882,882,882,882,807,807,807,807,1094,1094,1136,1136,373,341,535,535,881,775,867,822,774,-591,324,338,-671,849,550,550,866,864,609,609,293,336,534,534,789,835,773,-751,834,804,308,307,833,788,832,772,562,562,547,547,305,275,560,515,290,290, + -252,-397,-477,-557,-622,-653,-719,-735,-750,1329,1299,1314,1057,1057,1042,1042,1312,1282,1024,1024,785,785,785,785,784,784,784,784,769,769,769,769,-383,1127,1141,1111,1126,1140,1095,1110,869,869,883,883,1079,1109,882,882,375,374,807,868,838,881,791,-463,867,822,368,263,852,837,836,-543,610,610,550,550,352,336,534,534,865,774,851,821,850,805,593,533,579,564,773,832,578,578,548,548,577,577,307,276,306,291,516,560,259,259, + -250,-2107,-2507,-2764,-2909,-2974,-3007,-3023,1041,1041,1040,1040,769,769,769,769,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,-767,-1052,-1213,-1277,-1358,-1405,-1469,-1535,-1550,-1582,-1614,-1647,-1662,-1694,-1726,-1759,-1774,-1807,-1822,-1854,-1886,1565,-1919,-1935,-1951,-1967,1731,1730,1580,1717,-1983,1729,1564,-1999,1548,-2015,-2031,1715,1595,-2047,1714,-2063,1610,-2079,1609,-2095,1323,1323,1457,1457,1307,1307,1712,1547,1641,1700,1699,1594,1685,1625,1442,1442,1322,1322,-780,-973,-910,1279,1278,1277,1262,1276,1261,1275,1215,1260,1229,-959,974,974,989,989,-943,735,478,478,495,463,506,414,-1039,1003,958,1017,927,942,987,957,431,476,1272,1167,1228,-1183,1256,-1199,895,895,941,941,1242,1227,1212,1135,1014,1014,490,489,503,487,910,1013,985,925,863,894,970,955,1012,847,-1343,831,755,755,984,909,428,366,754,559,-1391,752,486,457,924,997,698,698,983,893,740,740,908,877,739,739,667,667,953,938,497,287,271,271,683,606,590,712,726,574,302,302,738,736,481,286,526,725,605,711,636,724,696,651,589,681,666,710,364,467,573,695,466,466,301,465,379,379,709,604,665,679,316,316,634,633,436,436,464,269,424,394,452,332,438,363,347,408,393,448,331,422,362,407,392,421,346,406,391,376,375,359,1441,1306,-2367,1290,-2383,1337,-2399,-2415,1426,1321,-2431,1411,1336,-2447,-2463,-2479,1169,1169,1049,1049,1424,1289,1412,1352,1319,-2495,1154,1154,1064,1064,1153,1153,416,390,360,404,403,389,344,374,373,343,358,372,327,357,342,311,356,326,1395,1394,1137,1137,1047,1047,1365,1392,1287,1379,1334,1364,1349,1378,1318,1363,792,792,792,792,1152,1152,1032,1032,1121,1121,1046,1046,1120,1120,1030,1030,-2895,1106,1061,1104,849,849,789,789,1091,1076,1029,1090,1060,1075,833,833,309,324,532,532,832,772,818,803,561,561,531,560,515,546,289,274,288,258, + -250,-1179,-1579,-1836,-1996,-2124,-2253,-2333,-2413,-2477,-2542,-2574,-2607,-2622,-2655,1314,1313,1298,1312,1282,785,785,785,785,1040,1040,1025,1025,768,768,768,768,-766,-798,-830,-862,-895,-911,-927,-943,-959,-975,-991,-1007,-1023,-1039,-1055,-1070,1724,1647,-1103,-1119,1631,1767,1662,1738,1708,1723,-1135,1780,1615,1779,1599,1677,1646,1778,1583,-1151,1777,1567,1737,1692,1765,1722,1707,1630,1751,1661,1764,1614,1736,1676,1763,1750,1645,1598,1721,1691,1762,1706,1582,1761,1566,-1167,1749,1629,767,766,751,765,494,494,735,764,719,749,734,763,447,447,748,718,477,506,431,491,446,476,461,505,415,430,475,445,504,399,460,489,414,503,383,474,429,459,502,502,746,752,488,398,501,473,413,472,486,271,480,270,-1439,-1455,1357,-1471,-1487,-1503,1341,1325,-1519,1489,1463,1403,1309,-1535,1372,1448,1418,1476,1356,1462,1387,-1551,1475,1340,1447,1402,1386,-1567,1068,1068,1474,1461,455,380,468,440,395,425,410,454,364,467,466,464,453,269,409,448,268,432,1371,1473,1432,1417,1308,1460,1355,1446,1459,1431,1083,1083,1401,1416,1458,1445,1067,1067,1370,1457,1051,1051,1291,1430,1385,1444,1354,1415,1400,1443,1082,1082,1173,1113,1186,1066,1185,1050,-1967,1158,1128,1172,1097,1171,1081,-1983,1157,1112,416,266,375,400,1170,1142,1127,1065,793,793,1169,1033,1156,1096,1141,1111,1155,1080,1126,1140,898,898,808,808,897,897,792,792,1095,1152,1032,1125,1110,1139,1079,1124,882,807,838,881,853,791,-2319,867,368,263,822,852,837,866,806,865,-2399,851,352,262,534,534,821,836,594,594,549,549,593,593,533,533,848,773,579,579,564,578,548,563,276,276,577,576,306,291,516,560,305,305,275,259, + -251,-892,-2058,-2620,-2828,-2957,-3023,-3039,1041,1041,1040,1040,769,769,769,769,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,-511,-527,-543,-559,1530,-575,-591,1528,1527,1407,1526,1391,1023,1023,1023,1023,1525,1375,1268,1268,1103,1103,1087,1087,1039,1039,1523,-604,815,815,815,815,510,495,509,479,508,463,507,447,431,505,415,399,-734,-782,1262,-815,1259,1244,-831,1258,1228,-847,-863,1196,-879,1253,987,987,748,-767,493,493,462,477,414,414,686,669,478,446,461,445,474,429,487,458,412,471,1266,1264,1009,1009,799,799,-1019,-1276,-1452,-1581,-1677,-1757,-1821,-1886,-1933,-1997,1257,1257,1483,1468,1512,1422,1497,1406,1467,1496,1421,1510,1134,1134,1225,1225,1466,1451,1374,1405,1252,1252,1358,1480,1164,1164,1251,1251,1238,1238,1389,1465,-1407,1054,1101,-1423,1207,-1439,830,830,1248,1038,1237,1117,1223,1148,1236,1208,411,426,395,410,379,269,1193,1222,1132,1235,1221,1116,976,976,1192,1162,1177,1220,1131,1191,963,963,-1647,961,780,-1663,558,558,994,993,437,408,393,407,829,978,813,797,947,-1743,721,721,377,392,844,950,828,890,706,706,812,859,796,960,948,843,934,874,571,571,-1919,690,555,689,421,346,539,539,944,779,918,873,932,842,903,888,570,570,931,917,674,674,-2575,1562,-2591,1609,-2607,1654,1322,1322,1441,1441,1696,1546,1683,1593,1669,1624,1426,1426,1321,1321,1639,1680,1425,1425,1305,1305,1545,1668,1608,1623,1667,1592,1638,1666,1320,1320,1652,1607,1409,1409,1304,1304,1288,1288,1664,1637,1395,1395,1335,1335,1622,1636,1394,1394,1319,1319,1606,1621,1392,1392,1137,1137,1137,1137,345,390,360,375,404,373,1047,-2751,-2767,-2783,1062,1121,1046,-2799,1077,-2815,1106,1061,789,789,1105,1104,263,355,310,340,325,354,352,262,339,324,1091,1076,1029,1090,1060,1075,833,833,788,788,1088,1028,818,818,803,803,561,561,531,531,816,771,546,546,289,274,288,258, + -253,-317,-381,-446,-478,-509,1279,1279,-811,-1179,-1451,-1756,-1900,-2028,-2189,-2253,-2333,-2414,-2445,-2511,-2526,1313,1298,-2559,1041,1041,1040,1040,1025,1025,1024,1024,1022,1007,1021,991,1020,975,1019,959,687,687,1018,1017,671,671,655,655,1016,1015,639,639,758,758,623,623,757,607,756,591,755,575,754,559,543,543,1009,783,-575,-621,-685,-749,496,-590,750,749,734,748,974,989,1003,958,988,973,1002,942,987,957,972,1001,926,986,941,971,956,1000,910,985,925,999,894,970,-1071,-1087,-1102,1390,-1135,1436,1509,1451,1374,-1151,1405,1358,1480,1420,-1167,1507,1494,1389,1342,1465,1435,1450,1326,1505,1310,1493,1373,1479,1404,1492,1464,1419,428,443,472,397,736,526,464,464,486,457,442,471,484,482,1357,1449,1434,1478,1388,1491,1341,1490,1325,1489,1463,1403,1309,1477,1372,1448,1418,1433,1476,1356,1462,1387,-1439,1475,1340,1447,1402,1474,1324,1461,1371,1473,269,448,1432,1417,1308,1460,-1711,1459,-1727,1441,1099,1099,1446,1386,1431,1401,-1743,1289,1083,1083,1160,1160,1458,1445,1067,1067,1370,1457,1307,1430,1129,1129,1098,1098,268,432,267,416,266,400,-1887,1144,1187,1082,1173,1113,1186,1066,1050,1158,1128,1143,1172,1097,1171,1081,420,391,1157,1112,1170,1142,1127,1065,1169,1049,1156,1096,1141,1111,1155,1080,1126,1154,1064,1153,1140,1095,1048,-2159,1125,1110,1137,-2175,823,823,1139,1138,807,807,384,264,368,263,868,838,853,791,867,822,852,837,866,806,865,790,-2319,851,821,836,352,262,850,805,849,-2399,533,533,835,820,336,261,578,548,563,577,532,532,832,772,562,562,547,547,305,275,560,515,290,290,288,258 }; + static const uint8_t tab32[] = { 130,162,193,209,44,28,76,140,9,9,9,9,9,9,9,9,190,254,222,238,126,94,157,157,109,61,173,205 }; + static const uint8_t tab33[] = { 252,236,220,204,188,172,156,140,124,108,92,76,60,44,28,12 }; + static const int16_t tabindex[2*16] = { 0,32,64,98,0,132,180,218,292,364,426,538,648,746,0,1126,1460,1460,1460,1460,1460,1460,1460,1460,1842,1842,1842,1842,1842,1842,1842,1842 }; + static const uint8_t g_linbits[] = { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,2,3,4,6,8,10,13,4,5,6,7,8,9,11,13 }; + +#define PEEK_BITS(n) (bs_cache >> (32 - n)) +#define FLUSH_BITS(n) { bs_cache <<= (n); bs_sh += (n); } +#define CHECK_BITS while (bs_sh >= 0) { bs_cache |= (uint32_t)*bs_next_ptr++ << bs_sh; bs_sh -= 8; } +#define BSPOS ((bs_next_ptr - bs->buf)*8 - 24 + bs_sh) + + float one = 0.0f; + int ireg = 0, big_val_cnt = gr_info->big_values; + const uint8_t *sfb = gr_info->sfbtab; + const uint8_t *bs_next_ptr = bs->buf + bs->pos/8; + uint32_t bs_cache = (((bs_next_ptr[0]*256u + bs_next_ptr[1])*256u + bs_next_ptr[2])*256u + bs_next_ptr[3]) << (bs->pos & 7); + int pairs_to_decode, np, bs_sh = (bs->pos & 7) - 8; + bs_next_ptr += 4; + + while (big_val_cnt > 0) + { + int tab_num = gr_info->table_select[ireg]; + int sfb_cnt = gr_info->region_count[ireg++]; + const int16_t *codebook = tabs + tabindex[tab_num]; + int linbits = g_linbits[tab_num]; + if (linbits) + { + do + { + np = *sfb++ / 2; + pairs_to_decode = MINIMP3_MIN(big_val_cnt, np); + one = *scf++; + do + { + int j, w = 5; + int leaf = codebook[PEEK_BITS(w)]; + while (leaf < 0) + { + FLUSH_BITS(w); + w = leaf & 7; + leaf = codebook[PEEK_BITS(w) - (leaf >> 3)]; + } + FLUSH_BITS(leaf >> 8); + + for (j = 0; j < 2; j++, dst++, leaf >>= 4) + { + int lsb = leaf & 0x0F; + if (lsb == 15) + { + lsb += PEEK_BITS(linbits); + FLUSH_BITS(linbits); + CHECK_BITS; + *dst = one*L3_pow_43(lsb)*((int32_t)bs_cache < 0 ? -1: 1); + } else + { + *dst = g_pow43[16 + lsb - 16*(bs_cache >> 31)]*one; + } + FLUSH_BITS(lsb ? 1 : 0); + } + CHECK_BITS; + } while (--pairs_to_decode); + } while ((big_val_cnt -= np) > 0 && --sfb_cnt >= 0); + } else + { + do + { + np = *sfb++ / 2; + pairs_to_decode = MINIMP3_MIN(big_val_cnt, np); + one = *scf++; + do + { + int j, w = 5; + int leaf = codebook[PEEK_BITS(w)]; + while (leaf < 0) + { + FLUSH_BITS(w); + w = leaf & 7; + leaf = codebook[PEEK_BITS(w) - (leaf >> 3)]; + } + FLUSH_BITS(leaf >> 8); + + for (j = 0; j < 2; j++, dst++, leaf >>= 4) + { + int lsb = leaf & 0x0F; + *dst = g_pow43[16 + lsb - 16*(bs_cache >> 31)]*one; + FLUSH_BITS(lsb ? 1 : 0); + } + CHECK_BITS; + } while (--pairs_to_decode); + } while ((big_val_cnt -= np) > 0 && --sfb_cnt >= 0); + } + } + + for (np = 1 - big_val_cnt;; dst += 4) + { + const uint8_t *codebook_count1 = (gr_info->count1_table) ? tab33 : tab32; + int leaf = codebook_count1[PEEK_BITS(4)]; + if (!(leaf & 8)) + { + leaf = codebook_count1[(leaf >> 3) + (bs_cache << 4 >> (32 - (leaf & 3)))]; + } + FLUSH_BITS(leaf & 7); + if (BSPOS > layer3gr_limit) + { + break; + } +#define RELOAD_SCALEFACTOR if (!--np) { np = *sfb++/2; if (!np) break; one = *scf++; } +#define DEQ_COUNT1(s) if (leaf & (128 >> s)) { dst[s] = ((int32_t)bs_cache < 0) ? -one : one; FLUSH_BITS(1) } + RELOAD_SCALEFACTOR; + DEQ_COUNT1(0); + DEQ_COUNT1(1); + RELOAD_SCALEFACTOR; + DEQ_COUNT1(2); + DEQ_COUNT1(3); + CHECK_BITS; + } + + bs->pos = layer3gr_limit; +} + +static void L3_midside_stereo(float *left, int n) +{ + int i = 0; + float *right = left + 576; +#if HAVE_SIMD + if (have_simd()) + { + for (; i < n - 3; i += 4) + { + f4 vl = VLD(left + i); + f4 vr = VLD(right + i); + VSTORE(left + i, VADD(vl, vr)); + VSTORE(right + i, VSUB(vl, vr)); + } +#ifdef __GNUC__ + /* Workaround for spurious -Waggressive-loop-optimizations warning from gcc. + * For more info see: https://github.com/lieff/minimp3/issues/88 + */ + if (__builtin_constant_p(n % 4 == 0) && n % 4 == 0) + return; +#endif + } +#endif /* HAVE_SIMD */ + for (; i < n; i++) + { + float a = left[i]; + float b = right[i]; + left[i] = a + b; + right[i] = a - b; + } +} + +static void L3_intensity_stereo_band(float *left, int n, float kl, float kr) +{ + int i; + for (i = 0; i < n; i++) + { + left[i + 576] = left[i]*kr; + left[i] = left[i]*kl; + } +} + +static void L3_stereo_top_band(const float *right, const uint8_t *sfb, int nbands, int max_band[3]) +{ + int i, k; + + max_band[0] = max_band[1] = max_band[2] = -1; + + for (i = 0; i < nbands; i++) + { + for (k = 0; k < sfb[i]; k += 2) + { + if (right[k] != 0 || right[k + 1] != 0) + { + max_band[i % 3] = i; + break; + } + } + right += sfb[i]; + } +} + +static void L3_stereo_process(float *left, const uint8_t *ist_pos, const uint8_t *sfb, const uint8_t *hdr, int max_band[3], int mpeg2_sh) +{ + static const float g_pan[7*2] = { 0,1,0.21132487f,0.78867513f,0.36602540f,0.63397460f,0.5f,0.5f,0.63397460f,0.36602540f,0.78867513f,0.21132487f,1,0 }; + unsigned i, max_pos = HDR_TEST_MPEG1(hdr) ? 7 : 64; + + for (i = 0; sfb[i]; i++) + { + unsigned ipos = ist_pos[i]; + if ((int)i > max_band[i % 3] && ipos < max_pos) + { + float kl, kr, s = HDR_TEST_MS_STEREO(hdr) ? 1.41421356f : 1; + if (HDR_TEST_MPEG1(hdr)) + { + kl = g_pan[2*ipos]; + kr = g_pan[2*ipos + 1]; + } else + { + kl = 1; + kr = L3_ldexp_q2(1, (ipos + 1) >> 1 << mpeg2_sh); + if (ipos & 1) + { + kl = kr; + kr = 1; + } + } + L3_intensity_stereo_band(left, sfb[i], kl*s, kr*s); + } else if (HDR_TEST_MS_STEREO(hdr)) + { + L3_midside_stereo(left, sfb[i]); + } + left += sfb[i]; + } +} + +static void L3_intensity_stereo(float *left, uint8_t *ist_pos, const L3_gr_info_t *gr, const uint8_t *hdr) +{ + int max_band[3], n_sfb = gr->n_long_sfb + gr->n_short_sfb; + int i, max_blocks = gr->n_short_sfb ? 3 : 1; + + L3_stereo_top_band(left + 576, gr->sfbtab, n_sfb, max_band); + if (gr->n_long_sfb) + { + max_band[0] = max_band[1] = max_band[2] = MINIMP3_MAX(MINIMP3_MAX(max_band[0], max_band[1]), max_band[2]); + } + for (i = 0; i < max_blocks; i++) + { + int default_pos = HDR_TEST_MPEG1(hdr) ? 3 : 0; + int itop = n_sfb - max_blocks + i; + int prev = itop - max_blocks; + ist_pos[itop] = max_band[i] >= prev ? default_pos : ist_pos[prev]; + } + L3_stereo_process(left, ist_pos, gr->sfbtab, hdr, max_band, gr[1].scalefac_compress & 1); +} + +static void L3_reorder(float *grbuf, float *scratch, const uint8_t *sfb) +{ + int i, len; + float *src = grbuf, *dst = scratch; + + for (;0 != (len = *sfb); sfb += 3, src += 2*len) + { + for (i = 0; i < len; i++, src++) + { + *dst++ = src[0*len]; + *dst++ = src[1*len]; + *dst++ = src[2*len]; + } + } + memcpy(grbuf, scratch, (dst - scratch)*sizeof(float)); +} + +static void L3_antialias(float *grbuf, int nbands) +{ + static const float g_aa[2][8] = { + {0.85749293f,0.88174200f,0.94962865f,0.98331459f,0.99551782f,0.99916056f,0.99989920f,0.99999316f}, + {0.51449576f,0.47173197f,0.31337745f,0.18191320f,0.09457419f,0.04096558f,0.01419856f,0.00369997f} + }; + + for (; nbands > 0; nbands--, grbuf += 18) + { + int i = 0; +#if HAVE_SIMD + if (have_simd()) for (; i < 8; i += 4) + { + f4 vu = VLD(grbuf + 18 + i); + f4 vd = VLD(grbuf + 14 - i); + f4 vc0 = VLD(g_aa[0] + i); + f4 vc1 = VLD(g_aa[1] + i); + vd = VREV(vd); + VSTORE(grbuf + 18 + i, VSUB(VMUL(vu, vc0), VMUL(vd, vc1))); + vd = VADD(VMUL(vu, vc1), VMUL(vd, vc0)); + VSTORE(grbuf + 14 - i, VREV(vd)); + } +#endif /* HAVE_SIMD */ +#ifndef MINIMP3_ONLY_SIMD + for(; i < 8; i++) + { + float u = grbuf[18 + i]; + float d = grbuf[17 - i]; + grbuf[18 + i] = u*g_aa[0][i] - d*g_aa[1][i]; + grbuf[17 - i] = u*g_aa[1][i] + d*g_aa[0][i]; + } +#endif /* MINIMP3_ONLY_SIMD */ + } +} + +static void L3_dct3_9(float *y) +{ + float s0, s1, s2, s3, s4, s5, s6, s7, s8, t0, t2, t4; + + s0 = y[0]; s2 = y[2]; s4 = y[4]; s6 = y[6]; s8 = y[8]; + t0 = s0 + s6*0.5f; + s0 -= s6; + t4 = (s4 + s2)*0.93969262f; + t2 = (s8 + s2)*0.76604444f; + s6 = (s4 - s8)*0.17364818f; + s4 += s8 - s2; + + s2 = s0 - s4*0.5f; + y[4] = s4 + s0; + s8 = t0 - t2 + s6; + s0 = t0 - t4 + t2; + s4 = t0 + t4 - s6; + + s1 = y[1]; s3 = y[3]; s5 = y[5]; s7 = y[7]; + + s3 *= 0.86602540f; + t0 = (s5 + s1)*0.98480775f; + t4 = (s5 - s7)*0.34202014f; + t2 = (s1 + s7)*0.64278761f; + s1 = (s1 - s5 - s7)*0.86602540f; + + s5 = t0 - s3 - t2; + s7 = t4 - s3 - t0; + s3 = t4 + s3 - t2; + + y[0] = s4 - s7; + y[1] = s2 + s1; + y[2] = s0 - s3; + y[3] = s8 + s5; + y[5] = s8 - s5; + y[6] = s0 + s3; + y[7] = s2 - s1; + y[8] = s4 + s7; +} + +static void L3_imdct36(float *grbuf, float *overlap, const float *window, int nbands) +{ + int i, j; + static const float g_twid9[18] = { + 0.73727734f,0.79335334f,0.84339145f,0.88701083f,0.92387953f,0.95371695f,0.97629601f,0.99144486f,0.99904822f,0.67559021f,0.60876143f,0.53729961f,0.46174861f,0.38268343f,0.30070580f,0.21643961f,0.13052619f,0.04361938f + }; + + for (j = 0; j < nbands; j++, grbuf += 18, overlap += 9) + { + float co[9], si[9]; + co[0] = -grbuf[0]; + si[0] = grbuf[17]; + for (i = 0; i < 4; i++) + { + si[8 - 2*i] = grbuf[4*i + 1] - grbuf[4*i + 2]; + co[1 + 2*i] = grbuf[4*i + 1] + grbuf[4*i + 2]; + si[7 - 2*i] = grbuf[4*i + 4] - grbuf[4*i + 3]; + co[2 + 2*i] = -(grbuf[4*i + 3] + grbuf[4*i + 4]); + } + L3_dct3_9(co); + L3_dct3_9(si); + + si[1] = -si[1]; + si[3] = -si[3]; + si[5] = -si[5]; + si[7] = -si[7]; + + i = 0; + +#if HAVE_SIMD + if (have_simd()) for (; i < 8; i += 4) + { + f4 vovl = VLD(overlap + i); + f4 vc = VLD(co + i); + f4 vs = VLD(si + i); + f4 vr0 = VLD(g_twid9 + i); + f4 vr1 = VLD(g_twid9 + 9 + i); + f4 vw0 = VLD(window + i); + f4 vw1 = VLD(window + 9 + i); + f4 vsum = VADD(VMUL(vc, vr1), VMUL(vs, vr0)); + VSTORE(overlap + i, VSUB(VMUL(vc, vr0), VMUL(vs, vr1))); + VSTORE(grbuf + i, VSUB(VMUL(vovl, vw0), VMUL(vsum, vw1))); + vsum = VADD(VMUL(vovl, vw1), VMUL(vsum, vw0)); + VSTORE(grbuf + 14 - i, VREV(vsum)); + } +#endif /* HAVE_SIMD */ + for (; i < 9; i++) + { + float ovl = overlap[i]; + float sum = co[i]*g_twid9[9 + i] + si[i]*g_twid9[0 + i]; + overlap[i] = co[i]*g_twid9[0 + i] - si[i]*g_twid9[9 + i]; + grbuf[i] = ovl*window[0 + i] - sum*window[9 + i]; + grbuf[17 - i] = ovl*window[9 + i] + sum*window[0 + i]; + } + } +} + +static void L3_idct3(float x0, float x1, float x2, float *dst) +{ + float m1 = x1*0.86602540f; + float a1 = x0 - x2*0.5f; + dst[1] = x0 + x2; + dst[0] = a1 + m1; + dst[2] = a1 - m1; +} + +static void L3_imdct12(float *x, float *dst, float *overlap) +{ + static const float g_twid3[6] = { 0.79335334f,0.92387953f,0.99144486f, 0.60876143f,0.38268343f,0.13052619f }; + float co[3], si[3]; + int i; + + L3_idct3(-x[0], x[6] + x[3], x[12] + x[9], co); + L3_idct3(x[15], x[12] - x[9], x[6] - x[3], si); + si[1] = -si[1]; + + for (i = 0; i < 3; i++) + { + float ovl = overlap[i]; + float sum = co[i]*g_twid3[3 + i] + si[i]*g_twid3[0 + i]; + overlap[i] = co[i]*g_twid3[0 + i] - si[i]*g_twid3[3 + i]; + dst[i] = ovl*g_twid3[2 - i] - sum*g_twid3[5 - i]; + dst[5 - i] = ovl*g_twid3[5 - i] + sum*g_twid3[2 - i]; + } +} + +static void L3_imdct_short(float *grbuf, float *overlap, int nbands) +{ + for (;nbands > 0; nbands--, overlap += 9, grbuf += 18) + { + float tmp[18]; + memcpy(tmp, grbuf, sizeof(tmp)); + memcpy(grbuf, overlap, 6*sizeof(float)); + L3_imdct12(tmp, grbuf + 6, overlap + 6); + L3_imdct12(tmp + 1, grbuf + 12, overlap + 6); + L3_imdct12(tmp + 2, overlap, overlap + 6); + } +} + +static void L3_change_sign(float *grbuf) +{ + int b, i; + for (b = 0, grbuf += 18; b < 32; b += 2, grbuf += 36) + for (i = 1; i < 18; i += 2) + grbuf[i] = -grbuf[i]; +} + +static void L3_imdct_gr(float *grbuf, float *overlap, unsigned block_type, unsigned n_long_bands) +{ + static const float g_mdct_window[2][18] = { + { 0.99904822f,0.99144486f,0.97629601f,0.95371695f,0.92387953f,0.88701083f,0.84339145f,0.79335334f,0.73727734f,0.04361938f,0.13052619f,0.21643961f,0.30070580f,0.38268343f,0.46174861f,0.53729961f,0.60876143f,0.67559021f }, + { 1,1,1,1,1,1,0.99144486f,0.92387953f,0.79335334f,0,0,0,0,0,0,0.13052619f,0.38268343f,0.60876143f } + }; + if (n_long_bands) + { + L3_imdct36(grbuf, overlap, g_mdct_window[0], n_long_bands); + grbuf += 18*n_long_bands; + overlap += 9*n_long_bands; + } + if (block_type == SHORT_BLOCK_TYPE) + L3_imdct_short(grbuf, overlap, 32 - n_long_bands); + else + L3_imdct36(grbuf, overlap, g_mdct_window[block_type == STOP_BLOCK_TYPE], 32 - n_long_bands); +} + +static void L3_save_reservoir(mp3dec_t *h, mp3dec_scratch_t *s) +{ + int pos = (s->bs.pos + 7)/8u; + int remains = s->bs.limit/8u - pos; + if (remains > MAX_BITRESERVOIR_BYTES) + { + pos += remains - MAX_BITRESERVOIR_BYTES; + remains = MAX_BITRESERVOIR_BYTES; + } + if (remains > 0) + { + memmove(h->reserv_buf, s->maindata + pos, remains); + } + h->reserv = remains; +} + +static int L3_restore_reservoir(mp3dec_t *h, bs_t *bs, mp3dec_scratch_t *s, int main_data_begin) +{ + int frame_bytes = (bs->limit - bs->pos)/8; + int bytes_have = MINIMP3_MIN(h->reserv, main_data_begin); + memcpy(s->maindata, h->reserv_buf + MINIMP3_MAX(0, h->reserv - main_data_begin), MINIMP3_MIN(h->reserv, main_data_begin)); + memcpy(s->maindata + bytes_have, bs->buf + bs->pos/8, frame_bytes); + bs_init(&s->bs, s->maindata, bytes_have + frame_bytes); + return h->reserv >= main_data_begin; +} + +static void L3_decode(mp3dec_t *h, mp3dec_scratch_t *s, L3_gr_info_t *gr_info, int nch) +{ + int ch; + + for (ch = 0; ch < nch; ch++) + { + int layer3gr_limit = s->bs.pos + gr_info[ch].part_23_length; + L3_decode_scalefactors(h->header, s->ist_pos[ch], &s->bs, gr_info + ch, s->scf, ch); + L3_huffman(s->grbuf[ch], &s->bs, gr_info + ch, s->scf, layer3gr_limit); + } + + if (HDR_TEST_I_STEREO(h->header)) + { + L3_intensity_stereo(s->grbuf[0], s->ist_pos[1], gr_info, h->header); + } else if (HDR_IS_MS_STEREO(h->header)) + { + L3_midside_stereo(s->grbuf[0], 576); + } + + for (ch = 0; ch < nch; ch++, gr_info++) + { + int aa_bands = 31; + int n_long_bands = (gr_info->mixed_block_flag ? 2 : 0) << (int)(HDR_GET_MY_SAMPLE_RATE(h->header) == 2); + + if (gr_info->n_short_sfb) + { + aa_bands = n_long_bands - 1; + L3_reorder(s->grbuf[ch] + n_long_bands*18, s->syn[0], gr_info->sfbtab + gr_info->n_long_sfb); + } + + L3_antialias(s->grbuf[ch], aa_bands); + L3_imdct_gr(s->grbuf[ch], h->mdct_overlap[ch], gr_info->block_type, n_long_bands); + L3_change_sign(s->grbuf[ch]); + } +} + +static void mp3d_DCT_II(float *grbuf, int n) +{ + static const float g_sec[24] = { + 10.19000816f,0.50060302f,0.50241929f,3.40760851f,0.50547093f,0.52249861f,2.05778098f,0.51544732f,0.56694406f,1.48416460f,0.53104258f,0.64682180f,1.16943991f,0.55310392f,0.78815460f,0.97256821f,0.58293498f,1.06067765f,0.83934963f,0.62250412f,1.72244716f,0.74453628f,0.67480832f,5.10114861f + }; + int i, k = 0; +#if HAVE_SIMD + if (have_simd()) for (; k < n; k += 4) + { + f4 t[4][8], *x; + float *y = grbuf + k; + + for (x = t[0], i = 0; i < 8; i++, x++) + { + f4 x0 = VLD(&y[i*18]); + f4 x1 = VLD(&y[(15 - i)*18]); + f4 x2 = VLD(&y[(16 + i)*18]); + f4 x3 = VLD(&y[(31 - i)*18]); + f4 t0 = VADD(x0, x3); + f4 t1 = VADD(x1, x2); + f4 t2 = VMUL_S(VSUB(x1, x2), g_sec[3*i + 0]); + f4 t3 = VMUL_S(VSUB(x0, x3), g_sec[3*i + 1]); + x[0] = VADD(t0, t1); + x[8] = VMUL_S(VSUB(t0, t1), g_sec[3*i + 2]); + x[16] = VADD(t3, t2); + x[24] = VMUL_S(VSUB(t3, t2), g_sec[3*i + 2]); + } + for (x = t[0], i = 0; i < 4; i++, x += 8) + { + f4 x0 = x[0], x1 = x[1], x2 = x[2], x3 = x[3], x4 = x[4], x5 = x[5], x6 = x[6], x7 = x[7], xt; + xt = VSUB(x0, x7); x0 = VADD(x0, x7); + x7 = VSUB(x1, x6); x1 = VADD(x1, x6); + x6 = VSUB(x2, x5); x2 = VADD(x2, x5); + x5 = VSUB(x3, x4); x3 = VADD(x3, x4); + x4 = VSUB(x0, x3); x0 = VADD(x0, x3); + x3 = VSUB(x1, x2); x1 = VADD(x1, x2); + x[0] = VADD(x0, x1); + x[4] = VMUL_S(VSUB(x0, x1), 0.70710677f); + x5 = VADD(x5, x6); + x6 = VMUL_S(VADD(x6, x7), 0.70710677f); + x7 = VADD(x7, xt); + x3 = VMUL_S(VADD(x3, x4), 0.70710677f); + x5 = VSUB(x5, VMUL_S(x7, 0.198912367f)); /* rotate by PI/8 */ + x7 = VADD(x7, VMUL_S(x5, 0.382683432f)); + x5 = VSUB(x5, VMUL_S(x7, 0.198912367f)); + x0 = VSUB(xt, x6); xt = VADD(xt, x6); + x[1] = VMUL_S(VADD(xt, x7), 0.50979561f); + x[2] = VMUL_S(VADD(x4, x3), 0.54119611f); + x[3] = VMUL_S(VSUB(x0, x5), 0.60134488f); + x[5] = VMUL_S(VADD(x0, x5), 0.89997619f); + x[6] = VMUL_S(VSUB(x4, x3), 1.30656302f); + x[7] = VMUL_S(VSUB(xt, x7), 2.56291556f); + } + + if (k > n - 3) + { +#if HAVE_SSE +#define VSAVE2(i, v) _mm_storel_pi((__m64 *)(void*)&y[i*18], v) +#else /* HAVE_SSE */ +#define VSAVE2(i, v) vst1_f32((float32_t *)&y[i*18], vget_low_f32(v)) +#endif /* HAVE_SSE */ + for (i = 0; i < 7; i++, y += 4*18) + { + f4 s = VADD(t[3][i], t[3][i + 1]); + VSAVE2(0, t[0][i]); + VSAVE2(1, VADD(t[2][i], s)); + VSAVE2(2, VADD(t[1][i], t[1][i + 1])); + VSAVE2(3, VADD(t[2][1 + i], s)); + } + VSAVE2(0, t[0][7]); + VSAVE2(1, VADD(t[2][7], t[3][7])); + VSAVE2(2, t[1][7]); + VSAVE2(3, t[3][7]); + } else + { +#define VSAVE4(i, v) VSTORE(&y[i*18], v) + for (i = 0; i < 7; i++, y += 4*18) + { + f4 s = VADD(t[3][i], t[3][i + 1]); + VSAVE4(0, t[0][i]); + VSAVE4(1, VADD(t[2][i], s)); + VSAVE4(2, VADD(t[1][i], t[1][i + 1])); + VSAVE4(3, VADD(t[2][1 + i], s)); + } + VSAVE4(0, t[0][7]); + VSAVE4(1, VADD(t[2][7], t[3][7])); + VSAVE4(2, t[1][7]); + VSAVE4(3, t[3][7]); + } + } else +#endif /* HAVE_SIMD */ +#ifdef MINIMP3_ONLY_SIMD + {} /* for HAVE_SIMD=1, MINIMP3_ONLY_SIMD=1 case we do not need non-intrinsic "else" branch */ +#else /* MINIMP3_ONLY_SIMD */ + for (; k < n; k++) + { + float t[4][8], *x, *y = grbuf + k; + + for (x = t[0], i = 0; i < 8; i++, x++) + { + float x0 = y[i*18]; + float x1 = y[(15 - i)*18]; + float x2 = y[(16 + i)*18]; + float x3 = y[(31 - i)*18]; + float t0 = x0 + x3; + float t1 = x1 + x2; + float t2 = (x1 - x2)*g_sec[3*i + 0]; + float t3 = (x0 - x3)*g_sec[3*i + 1]; + x[0] = t0 + t1; + x[8] = (t0 - t1)*g_sec[3*i + 2]; + x[16] = t3 + t2; + x[24] = (t3 - t2)*g_sec[3*i + 2]; + } + for (x = t[0], i = 0; i < 4; i++, x += 8) + { + float x0 = x[0], x1 = x[1], x2 = x[2], x3 = x[3], x4 = x[4], x5 = x[5], x6 = x[6], x7 = x[7], xt; + xt = x0 - x7; x0 += x7; + x7 = x1 - x6; x1 += x6; + x6 = x2 - x5; x2 += x5; + x5 = x3 - x4; x3 += x4; + x4 = x0 - x3; x0 += x3; + x3 = x1 - x2; x1 += x2; + x[0] = x0 + x1; + x[4] = (x0 - x1)*0.70710677f; + x5 = x5 + x6; + x6 = (x6 + x7)*0.70710677f; + x7 = x7 + xt; + x3 = (x3 + x4)*0.70710677f; + x5 -= x7*0.198912367f; /* rotate by PI/8 */ + x7 += x5*0.382683432f; + x5 -= x7*0.198912367f; + x0 = xt - x6; xt += x6; + x[1] = (xt + x7)*0.50979561f; + x[2] = (x4 + x3)*0.54119611f; + x[3] = (x0 - x5)*0.60134488f; + x[5] = (x0 + x5)*0.89997619f; + x[6] = (x4 - x3)*1.30656302f; + x[7] = (xt - x7)*2.56291556f; + + } + for (i = 0; i < 7; i++, y += 4*18) + { + y[0*18] = t[0][i]; + y[1*18] = t[2][i] + t[3][i] + t[3][i + 1]; + y[2*18] = t[1][i] + t[1][i + 1]; + y[3*18] = t[2][i + 1] + t[3][i] + t[3][i + 1]; + } + y[0*18] = t[0][7]; + y[1*18] = t[2][7] + t[3][7]; + y[2*18] = t[1][7]; + y[3*18] = t[3][7]; + } +#endif /* MINIMP3_ONLY_SIMD */ +} + +#ifndef MINIMP3_FLOAT_OUTPUT +static int16_t mp3d_scale_pcm(float sample) +{ +#if HAVE_ARMV6 + int32_t s32 = (int32_t)(sample + .5f); + s32 -= (s32 < 0); + int16_t s = (int16_t)minimp3_clip_int16_arm(s32); +#else + if (sample >= 32766.5) return (int16_t) 32767; + if (sample <= -32767.5) return (int16_t)-32768; + int16_t s = (int16_t)(sample + .5f); + s -= (s < 0); /* away from zero, to be compliant */ +#endif + return s; +} +#else /* MINIMP3_FLOAT_OUTPUT */ +static float mp3d_scale_pcm(float sample) +{ + return sample*(1.f/32768.f); +} +#endif /* MINIMP3_FLOAT_OUTPUT */ + +static void mp3d_synth_pair(mp3d_sample_t *pcm, int nch, const float *z) +{ + float a; + a = (z[14*64] - z[ 0]) * 29; + a += (z[ 1*64] + z[13*64]) * 213; + a += (z[12*64] - z[ 2*64]) * 459; + a += (z[ 3*64] + z[11*64]) * 2037; + a += (z[10*64] - z[ 4*64]) * 5153; + a += (z[ 5*64] + z[ 9*64]) * 6574; + a += (z[ 8*64] - z[ 6*64]) * 37489; + a += z[ 7*64] * 75038; + pcm[0] = mp3d_scale_pcm(a); + + z += 2; + a = z[14*64] * 104; + a += z[12*64] * 1567; + a += z[10*64] * 9727; + a += z[ 8*64] * 64019; + a += z[ 6*64] * -9975; + a += z[ 4*64] * -45; + a += z[ 2*64] * 146; + a += z[ 0*64] * -5; + pcm[16*nch] = mp3d_scale_pcm(a); +} + +static void mp3d_synth(float *xl, mp3d_sample_t *dstl, int nch, float *lins) +{ + int i; + float *xr = xl + 576*(nch - 1); + mp3d_sample_t *dstr = dstl + (nch - 1); + + static const float g_win[] = { + -1,26,-31,208,218,401,-519,2063,2000,4788,-5517,7134,5959,35640,-39336,74992, + -1,24,-35,202,222,347,-581,2080,1952,4425,-5879,7640,5288,33791,-41176,74856, + -1,21,-38,196,225,294,-645,2087,1893,4063,-6237,8092,4561,31947,-43006,74630, + -1,19,-41,190,227,244,-711,2085,1822,3705,-6589,8492,3776,30112,-44821,74313, + -1,17,-45,183,228,197,-779,2075,1739,3351,-6935,8840,2935,28289,-46617,73908, + -1,16,-49,176,228,153,-848,2057,1644,3004,-7271,9139,2037,26482,-48390,73415, + -2,14,-53,169,227,111,-919,2032,1535,2663,-7597,9389,1082,24694,-50137,72835, + -2,13,-58,161,224,72,-991,2001,1414,2330,-7910,9592,70,22929,-51853,72169, + -2,11,-63,154,221,36,-1064,1962,1280,2006,-8209,9750,-998,21189,-53534,71420, + -2,10,-68,147,215,2,-1137,1919,1131,1692,-8491,9863,-2122,19478,-55178,70590, + -3,9,-73,139,208,-29,-1210,1870,970,1388,-8755,9935,-3300,17799,-56778,69679, + -3,8,-79,132,200,-57,-1283,1817,794,1095,-8998,9966,-4533,16155,-58333,68692, + -4,7,-85,125,189,-83,-1356,1759,605,814,-9219,9959,-5818,14548,-59838,67629, + -4,7,-91,117,177,-106,-1428,1698,402,545,-9416,9916,-7154,12980,-61289,66494, + -5,6,-97,111,163,-127,-1498,1634,185,288,-9585,9838,-8540,11455,-62684,65290 + }; + float *zlin = lins + 15*64; + const float *w = g_win; + + zlin[4*15] = xl[18*16]; + zlin[4*15 + 1] = xr[18*16]; + zlin[4*15 + 2] = xl[0]; + zlin[4*15 + 3] = xr[0]; + + zlin[4*31] = xl[1 + 18*16]; + zlin[4*31 + 1] = xr[1 + 18*16]; + zlin[4*31 + 2] = xl[1]; + zlin[4*31 + 3] = xr[1]; + + mp3d_synth_pair(dstr, nch, lins + 4*15 + 1); + mp3d_synth_pair(dstr + 32*nch, nch, lins + 4*15 + 64 + 1); + mp3d_synth_pair(dstl, nch, lins + 4*15); + mp3d_synth_pair(dstl + 32*nch, nch, lins + 4*15 + 64); + +#if HAVE_SIMD + if (have_simd()) for (i = 14; i >= 0; i--) + { +#define VLOAD(k) f4 w0 = VSET(*w++); f4 w1 = VSET(*w++); f4 vz = VLD(&zlin[4*i - 64*k]); f4 vy = VLD(&zlin[4*i - 64*(15 - k)]); +#define V0(k) { VLOAD(k) b = VADD(VMUL(vz, w1), VMUL(vy, w0)) ; a = VSUB(VMUL(vz, w0), VMUL(vy, w1)); } +#define V1(k) { VLOAD(k) b = VADD(b, VADD(VMUL(vz, w1), VMUL(vy, w0))); a = VADD(a, VSUB(VMUL(vz, w0), VMUL(vy, w1))); } +#define V2(k) { VLOAD(k) b = VADD(b, VADD(VMUL(vz, w1), VMUL(vy, w0))); a = VADD(a, VSUB(VMUL(vy, w1), VMUL(vz, w0))); } + f4 a, b; + zlin[4*i] = xl[18*(31 - i)]; + zlin[4*i + 1] = xr[18*(31 - i)]; + zlin[4*i + 2] = xl[1 + 18*(31 - i)]; + zlin[4*i + 3] = xr[1 + 18*(31 - i)]; + zlin[4*i + 64] = xl[1 + 18*(1 + i)]; + zlin[4*i + 64 + 1] = xr[1 + 18*(1 + i)]; + zlin[4*i - 64 + 2] = xl[18*(1 + i)]; + zlin[4*i - 64 + 3] = xr[18*(1 + i)]; + + V0(0) V2(1) V1(2) V2(3) V1(4) V2(5) V1(6) V2(7) + + { +#ifndef MINIMP3_FLOAT_OUTPUT +#if HAVE_SSE + static const f4 g_max = { 32767.0f, 32767.0f, 32767.0f, 32767.0f }; + static const f4 g_min = { -32768.0f, -32768.0f, -32768.0f, -32768.0f }; + __m128i pcm8 = _mm_packs_epi32(_mm_cvtps_epi32(_mm_max_ps(_mm_min_ps(a, g_max), g_min)), + _mm_cvtps_epi32(_mm_max_ps(_mm_min_ps(b, g_max), g_min))); + dstr[(15 - i)*nch] = _mm_extract_epi16(pcm8, 1); + dstr[(17 + i)*nch] = _mm_extract_epi16(pcm8, 5); + dstl[(15 - i)*nch] = _mm_extract_epi16(pcm8, 0); + dstl[(17 + i)*nch] = _mm_extract_epi16(pcm8, 4); + dstr[(47 - i)*nch] = _mm_extract_epi16(pcm8, 3); + dstr[(49 + i)*nch] = _mm_extract_epi16(pcm8, 7); + dstl[(47 - i)*nch] = _mm_extract_epi16(pcm8, 2); + dstl[(49 + i)*nch] = _mm_extract_epi16(pcm8, 6); +#else /* HAVE_SSE */ + int16x4_t pcma, pcmb; + a = VADD(a, VSET(0.5f)); + b = VADD(b, VSET(0.5f)); + pcma = vqmovn_s32(vqaddq_s32(vcvtq_s32_f32(a), vreinterpretq_s32_u32(vcltq_f32(a, VSET(0))))); + pcmb = vqmovn_s32(vqaddq_s32(vcvtq_s32_f32(b), vreinterpretq_s32_u32(vcltq_f32(b, VSET(0))))); + vst1_lane_s16(dstr + (15 - i)*nch, pcma, 1); + vst1_lane_s16(dstr + (17 + i)*nch, pcmb, 1); + vst1_lane_s16(dstl + (15 - i)*nch, pcma, 0); + vst1_lane_s16(dstl + (17 + i)*nch, pcmb, 0); + vst1_lane_s16(dstr + (47 - i)*nch, pcma, 3); + vst1_lane_s16(dstr + (49 + i)*nch, pcmb, 3); + vst1_lane_s16(dstl + (47 - i)*nch, pcma, 2); + vst1_lane_s16(dstl + (49 + i)*nch, pcmb, 2); +#endif /* HAVE_SSE */ + +#else /* MINIMP3_FLOAT_OUTPUT */ + + static const f4 g_scale = { 1.0f/32768.0f, 1.0f/32768.0f, 1.0f/32768.0f, 1.0f/32768.0f }; + a = VMUL(a, g_scale); + b = VMUL(b, g_scale); +#if HAVE_SSE + _mm_store_ss(dstr + (15 - i)*nch, _mm_shuffle_ps(a, a, _MM_SHUFFLE(1, 1, 1, 1))); + _mm_store_ss(dstr + (17 + i)*nch, _mm_shuffle_ps(b, b, _MM_SHUFFLE(1, 1, 1, 1))); + _mm_store_ss(dstl + (15 - i)*nch, _mm_shuffle_ps(a, a, _MM_SHUFFLE(0, 0, 0, 0))); + _mm_store_ss(dstl + (17 + i)*nch, _mm_shuffle_ps(b, b, _MM_SHUFFLE(0, 0, 0, 0))); + _mm_store_ss(dstr + (47 - i)*nch, _mm_shuffle_ps(a, a, _MM_SHUFFLE(3, 3, 3, 3))); + _mm_store_ss(dstr + (49 + i)*nch, _mm_shuffle_ps(b, b, _MM_SHUFFLE(3, 3, 3, 3))); + _mm_store_ss(dstl + (47 - i)*nch, _mm_shuffle_ps(a, a, _MM_SHUFFLE(2, 2, 2, 2))); + _mm_store_ss(dstl + (49 + i)*nch, _mm_shuffle_ps(b, b, _MM_SHUFFLE(2, 2, 2, 2))); +#else /* HAVE_SSE */ + vst1q_lane_f32(dstr + (15 - i)*nch, a, 1); + vst1q_lane_f32(dstr + (17 + i)*nch, b, 1); + vst1q_lane_f32(dstl + (15 - i)*nch, a, 0); + vst1q_lane_f32(dstl + (17 + i)*nch, b, 0); + vst1q_lane_f32(dstr + (47 - i)*nch, a, 3); + vst1q_lane_f32(dstr + (49 + i)*nch, b, 3); + vst1q_lane_f32(dstl + (47 - i)*nch, a, 2); + vst1q_lane_f32(dstl + (49 + i)*nch, b, 2); +#endif /* HAVE_SSE */ +#endif /* MINIMP3_FLOAT_OUTPUT */ + } + } else +#endif /* HAVE_SIMD */ +#ifdef MINIMP3_ONLY_SIMD + {} /* for HAVE_SIMD=1, MINIMP3_ONLY_SIMD=1 case we do not need non-intrinsic "else" branch */ +#else /* MINIMP3_ONLY_SIMD */ + for (i = 14; i >= 0; i--) + { +#define LOAD(k) float w0 = *w++; float w1 = *w++; float *vz = &zlin[4*i - k*64]; float *vy = &zlin[4*i - (15 - k)*64]; +#define S0(k) { int j; LOAD(k); for (j = 0; j < 4; j++) b[j] = vz[j]*w1 + vy[j]*w0, a[j] = vz[j]*w0 - vy[j]*w1; } +#define S1(k) { int j; LOAD(k); for (j = 0; j < 4; j++) b[j] += vz[j]*w1 + vy[j]*w0, a[j] += vz[j]*w0 - vy[j]*w1; } +#define S2(k) { int j; LOAD(k); for (j = 0; j < 4; j++) b[j] += vz[j]*w1 + vy[j]*w0, a[j] += vy[j]*w1 - vz[j]*w0; } + float a[4], b[4]; + + zlin[4*i] = xl[18*(31 - i)]; + zlin[4*i + 1] = xr[18*(31 - i)]; + zlin[4*i + 2] = xl[1 + 18*(31 - i)]; + zlin[4*i + 3] = xr[1 + 18*(31 - i)]; + zlin[4*(i + 16)] = xl[1 + 18*(1 + i)]; + zlin[4*(i + 16) + 1] = xr[1 + 18*(1 + i)]; + zlin[4*(i - 16) + 2] = xl[18*(1 + i)]; + zlin[4*(i - 16) + 3] = xr[18*(1 + i)]; + + S0(0) S2(1) S1(2) S2(3) S1(4) S2(5) S1(6) S2(7) + + dstr[(15 - i)*nch] = mp3d_scale_pcm(a[1]); + dstr[(17 + i)*nch] = mp3d_scale_pcm(b[1]); + dstl[(15 - i)*nch] = mp3d_scale_pcm(a[0]); + dstl[(17 + i)*nch] = mp3d_scale_pcm(b[0]); + dstr[(47 - i)*nch] = mp3d_scale_pcm(a[3]); + dstr[(49 + i)*nch] = mp3d_scale_pcm(b[3]); + dstl[(47 - i)*nch] = mp3d_scale_pcm(a[2]); + dstl[(49 + i)*nch] = mp3d_scale_pcm(b[2]); + } +#endif /* MINIMP3_ONLY_SIMD */ +} + +static void mp3d_synth_granule(float *qmf_state, float *grbuf, int nbands, int nch, mp3d_sample_t *pcm, float *lins) +{ + int i; + for (i = 0; i < nch; i++) + { + mp3d_DCT_II(grbuf + 576*i, nbands); + } + + memcpy(lins, qmf_state, sizeof(float)*15*64); + + for (i = 0; i < nbands; i += 2) + { + mp3d_synth(grbuf + i, pcm + 32*nch*i, nch, lins + i*64); + } +#ifndef MINIMP3_NONSTANDARD_BUT_LOGICAL + if (nch == 1) + { + for (i = 0; i < 15*64; i += 2) + { + qmf_state[i] = lins[nbands*64 + i]; + } + } else +#endif /* MINIMP3_NONSTANDARD_BUT_LOGICAL */ + { + memcpy(qmf_state, lins + nbands*64, sizeof(float)*15*64); + } +} + +static int mp3d_match_frame(const uint8_t *hdr, int mp3_bytes, int frame_bytes) +{ + int i, nmatch; + for (i = 0, nmatch = 0; nmatch < MAX_FRAME_SYNC_MATCHES; nmatch++) + { + i += hdr_frame_bytes(hdr + i, frame_bytes) + hdr_padding(hdr + i); + if (i + HDR_SIZE > mp3_bytes) + return nmatch > 0; + if (!hdr_compare(hdr, hdr + i)) + return 0; + } + return 1; +} + +static int mp3d_find_frame(const uint8_t *mp3, int mp3_bytes, int *free_format_bytes, int *ptr_frame_bytes) +{ + int i, k; + for (i = 0; i < mp3_bytes - HDR_SIZE; i++, mp3++) + { + if (hdr_valid(mp3)) + { + int frame_bytes = hdr_frame_bytes(mp3, *free_format_bytes); + int frame_and_padding = frame_bytes + hdr_padding(mp3); + + for (k = HDR_SIZE; !frame_bytes && k < MAX_FREE_FORMAT_FRAME_SIZE && i + 2*k < mp3_bytes - HDR_SIZE; k++) + { + if (hdr_compare(mp3, mp3 + k)) + { + int fb = k - hdr_padding(mp3); + int nextfb = fb + hdr_padding(mp3 + k); + if (i + k + nextfb + HDR_SIZE > mp3_bytes || !hdr_compare(mp3, mp3 + k + nextfb)) + continue; + frame_and_padding = k; + frame_bytes = fb; + *free_format_bytes = fb; + } + } + if ((frame_bytes && i + frame_and_padding <= mp3_bytes && + mp3d_match_frame(mp3, mp3_bytes - i, frame_bytes)) || + (!i && frame_and_padding == mp3_bytes)) + { + *ptr_frame_bytes = frame_and_padding; + return i; + } + *free_format_bytes = 0; + } + } + *ptr_frame_bytes = 0; + return mp3_bytes; +} + +void mp3dec_init(mp3dec_t *dec) +{ + dec->header[0] = 0; +} + +int mp3dec_decode_frame(mp3dec_t *dec, const uint8_t *mp3, int mp3_bytes, mp3d_sample_t *pcm, mp3dec_frame_info_t *info) +{ + int i = 0, igr, frame_size = 0, success = 1; + const uint8_t *hdr; + bs_t bs_frame[1]; + mp3dec_scratch_t scratch; + + if (mp3_bytes > 4 && dec->header[0] == 0xff && hdr_compare(dec->header, mp3)) + { + frame_size = hdr_frame_bytes(mp3, dec->free_format_bytes) + hdr_padding(mp3); + if (frame_size != mp3_bytes && (frame_size + HDR_SIZE > mp3_bytes || !hdr_compare(mp3, mp3 + frame_size))) + { + frame_size = 0; + } + } + if (!frame_size) + { + memset(dec, 0, sizeof(mp3dec_t)); + i = mp3d_find_frame(mp3, mp3_bytes, &dec->free_format_bytes, &frame_size); + if (!frame_size || i + frame_size > mp3_bytes) + { + info->frame_bytes = i; + return 0; + } + } + + hdr = mp3 + i; + memcpy(dec->header, hdr, HDR_SIZE); + info->frame_bytes = i + frame_size; + info->frame_offset = i; + info->channels = HDR_IS_MONO(hdr) ? 1 : 2; + info->hz = hdr_sample_rate_hz(hdr); + info->layer = 4 - HDR_GET_LAYER(hdr); + info->bitrate_kbps = hdr_bitrate_kbps(hdr); + + if (!pcm) + { + return hdr_frame_samples(hdr); + } + + bs_init(bs_frame, hdr + HDR_SIZE, frame_size - HDR_SIZE); + if (HDR_IS_CRC(hdr)) + { + get_bits(bs_frame, 16); + } + + if (info->layer == 3) + { + int main_data_begin = L3_read_side_info(bs_frame, scratch.gr_info, hdr); + if (main_data_begin < 0 || bs_frame->pos > bs_frame->limit) + { + mp3dec_init(dec); + return 0; + } + success = L3_restore_reservoir(dec, bs_frame, &scratch, main_data_begin); + if (success) + { + for (igr = 0; igr < (HDR_TEST_MPEG1(hdr) ? 2 : 1); igr++, pcm += 576*info->channels) + { + memset(scratch.grbuf[0], 0, 576*2*sizeof(float)); + L3_decode(dec, &scratch, scratch.gr_info + igr*info->channels, info->channels); + mp3d_synth_granule(dec->qmf_state, scratch.grbuf[0], 18, info->channels, pcm, scratch.syn[0]); + } + } + L3_save_reservoir(dec, &scratch); + } else + { +#ifdef MINIMP3_ONLY_MP3 + return 0; +#else /* MINIMP3_ONLY_MP3 */ + L12_scale_info sci[1]; + L12_read_scale_info(hdr, bs_frame, sci); + + memset(scratch.grbuf[0], 0, 576*2*sizeof(float)); + for (i = 0, igr = 0; igr < 3; igr++) + { + if (12 == (i += L12_dequantize_granule(scratch.grbuf[0] + i, bs_frame, sci, info->layer | 1))) + { + i = 0; + L12_apply_scf_384(sci, sci->scf + igr, scratch.grbuf[0]); + mp3d_synth_granule(dec->qmf_state, scratch.grbuf[0], 12, info->channels, pcm, scratch.syn[0]); + memset(scratch.grbuf[0], 0, 576*2*sizeof(float)); + pcm += 384*info->channels; + } + if (bs_frame->pos > bs_frame->limit) + { + mp3dec_init(dec); + return 0; + } + } +#endif /* MINIMP3_ONLY_MP3 */ + } + return success*hdr_frame_samples(dec->header); +} + +#ifdef MINIMP3_FLOAT_OUTPUT +void mp3dec_f32_to_s16(const float *in, int16_t *out, int num_samples) +{ + int i = 0; +#if HAVE_SIMD + int aligned_count = num_samples & ~7; + for(; i < aligned_count; i += 8) + { + static const f4 g_scale = { 32768.0f, 32768.0f, 32768.0f, 32768.0f }; + f4 a = VMUL(VLD(&in[i ]), g_scale); + f4 b = VMUL(VLD(&in[i+4]), g_scale); +#if HAVE_SSE + static const f4 g_max = { 32767.0f, 32767.0f, 32767.0f, 32767.0f }; + static const f4 g_min = { -32768.0f, -32768.0f, -32768.0f, -32768.0f }; + __m128i pcm8 = _mm_packs_epi32(_mm_cvtps_epi32(_mm_max_ps(_mm_min_ps(a, g_max), g_min)), + _mm_cvtps_epi32(_mm_max_ps(_mm_min_ps(b, g_max), g_min))); + out[i ] = _mm_extract_epi16(pcm8, 0); + out[i+1] = _mm_extract_epi16(pcm8, 1); + out[i+2] = _mm_extract_epi16(pcm8, 2); + out[i+3] = _mm_extract_epi16(pcm8, 3); + out[i+4] = _mm_extract_epi16(pcm8, 4); + out[i+5] = _mm_extract_epi16(pcm8, 5); + out[i+6] = _mm_extract_epi16(pcm8, 6); + out[i+7] = _mm_extract_epi16(pcm8, 7); +#else /* HAVE_SSE */ + int16x4_t pcma, pcmb; + a = VADD(a, VSET(0.5f)); + b = VADD(b, VSET(0.5f)); + pcma = vqmovn_s32(vqaddq_s32(vcvtq_s32_f32(a), vreinterpretq_s32_u32(vcltq_f32(a, VSET(0))))); + pcmb = vqmovn_s32(vqaddq_s32(vcvtq_s32_f32(b), vreinterpretq_s32_u32(vcltq_f32(b, VSET(0))))); + vst1_lane_s16(out+i , pcma, 0); + vst1_lane_s16(out+i+1, pcma, 1); + vst1_lane_s16(out+i+2, pcma, 2); + vst1_lane_s16(out+i+3, pcma, 3); + vst1_lane_s16(out+i+4, pcmb, 0); + vst1_lane_s16(out+i+5, pcmb, 1); + vst1_lane_s16(out+i+6, pcmb, 2); + vst1_lane_s16(out+i+7, pcmb, 3); +#endif /* HAVE_SSE */ + } +#endif /* HAVE_SIMD */ + for(; i < num_samples; i++) + { + float sample = in[i] * 32768.0f; + if (sample >= 32766.5) + out[i] = (int16_t) 32767; + else if (sample <= -32767.5) + out[i] = (int16_t)-32768; + else + { + int16_t s = (int16_t)(sample + .5f); + s -= (s < 0); /* away from zero, to be compliant */ + out[i] = s; + } + } +} +#endif /* MINIMP3_FLOAT_OUTPUT */ +#endif /* MINIMP3_IMPLEMENTATION && !_MINIMP3_IMPLEMENTATION_GUARD */ diff --git a/zefie_wtvp_minisrv/ra_win/rpcli.cpp b/zefie_wtvp_minisrv/ra_win/rpcli.cpp index 7fc5b9b9..bebf17d6 100644 --- a/zefie_wtvp_minisrv/ra_win/rpcli.cpp +++ b/zefie_wtvp_minisrv/ra_win/rpcli.cpp @@ -15,11 +15,18 @@ #include #include #include +#include #include #import "prct3260.ocx" no_namespace named_guids raw_interfaces_only +#define MINIMP3_IMPLEMENTATION +#include "minimp3.h" + static void die(const char *msg); +static void cleanup_temp_input(void); + +static char g_temp_input_path[MAX_PATH] = {0}; static BSTR ansi_to_bstr(const char *s) { int wlen; @@ -89,15 +96,421 @@ static void die_last_error(IProducerControl *ctl, const char *fallback) { fprintf(stderr, "error: %s (code=%ld)\n", fallback, lastError); } + cleanup_temp_input(); ExitProcess(1); } // Simple helper: print and exit static void die(const char *msg) { fprintf(stderr, "error: %s\n", msg); + cleanup_temp_input(); ExitProcess(1); } +static void cleanup_temp_input(void) { + if (g_temp_input_path[0]) { + DeleteFileA(g_temp_input_path); + g_temp_input_path[0] = '\0'; + } +} + +static const char *path_ext(const char *path) { + const char *dot; + + if (!path) { + return NULL; + } + + dot = strrchr(path, '.'); + return dot ? dot : NULL; +} + +static int is_mpeg_audio_input(const char *path) { + const char *ext = path_ext(path); + + if (!ext) { + return 0; + } + + return _stricmp(ext, ".mp1") == 0 || + _stricmp(ext, ".mp2") == 0 || + _stricmp(ext, ".mp3") == 0; +} + +static int is_wav_input(const char *path) { + const char *ext = path_ext(path); + + if (!ext) { + return 0; + } + + return _stricmp(ext, ".wav") == 0; +} + +static double gain_db_to_scale(double gainDb) { + return pow(10.0, gainDb / 20.0); +} + +static int parse_gain_db(const char *s, double *gainDbOut) { + char *end = NULL; + double value; + + if (!s || !*s || !gainDbOut) { + return 0; + } + + value = strtod(s, &end); + if (!end || *end != '\0') { + return 0; + } + + *gainDbOut = value; + return 1; +} + +static short apply_gain_sample(short sample, double gainScale) { + double scaled = (double)sample * gainScale; + if (scaled > 32767.0) { + return 32767; + } + if (scaled < -32768.0) { + return -32768; + } + return (short)(scaled >= 0.0 ? scaled + 0.5 : scaled - 0.5); +} + +static void write_u16le(unsigned char *dst, unsigned value) { + dst[0] = (unsigned char)(value & 0xffu); + dst[1] = (unsigned char)((value >> 8) & 0xffu); +} + +static void write_u32le(unsigned char *dst, unsigned value) { + dst[0] = (unsigned char)(value & 0xffu); + dst[1] = (unsigned char)((value >> 8) & 0xffu); + dst[2] = (unsigned char)((value >> 16) & 0xffu); + dst[3] = (unsigned char)((value >> 24) & 0xffu); +} + +static void fill_wav_header(unsigned char *header, + unsigned dataBytes, + int sampleRate, + int channels, + int bitsPerSample) { + unsigned byteRate = (unsigned)(sampleRate * channels * bitsPerSample / 8); + unsigned blockAlign = (unsigned)(channels * bitsPerSample / 8); + + memcpy(header + 0, "RIFF", 4); + write_u32le(header + 4, 36u + dataBytes); + memcpy(header + 8, "WAVE", 4); + memcpy(header + 12, "fmt ", 4); + write_u32le(header + 16, 16u); + write_u16le(header + 20, 1u); + write_u16le(header + 22, (unsigned)channels); + write_u32le(header + 24, (unsigned)sampleRate); + write_u32le(header + 28, byteRate); + write_u16le(header + 32, blockAlign); + write_u16le(header + 34, (unsigned)bitsPerSample); + memcpy(header + 36, "data", 4); + write_u32le(header + 40, dataBytes); +} + +static unsigned char *read_entire_file(const char *path, size_t *sizeOut) { + FILE *fp; + unsigned char *data; + __int64 fileSize; + + if (!sizeOut) { + return NULL; + } + + *sizeOut = 0; + fp = fopen(path, "rb"); + if (!fp) { + return NULL; + } + + if (_fseeki64(fp, 0, SEEK_END) != 0) { + fclose(fp); + return NULL; + } + + fileSize = _ftelli64(fp); + if (fileSize < 0) { + fclose(fp); + return NULL; + } + + if (_fseeki64(fp, 0, SEEK_SET) != 0) { + fclose(fp); + return NULL; + } + + data = (unsigned char *)malloc((size_t)fileSize); + if (!data) { + fclose(fp); + return NULL; + } + + if (fileSize > 0 && fread(data, 1, (size_t)fileSize, fp) != (size_t)fileSize) { + free(data); + fclose(fp); + return NULL; + } + + fclose(fp); + *sizeOut = (size_t)fileSize; + return data; +} + +static int make_temp_wav_path(char *pathBuf, size_t pathBufSize) { + char tempDir[MAX_PATH]; + char tempFile[MAX_PATH]; + char *dot; + + if (!pathBuf || pathBufSize < MAX_PATH) { + return 0; + } + + if (!GetTempPathA((DWORD)sizeof(tempDir), tempDir)) { + return 0; + } + + if (!GetTempFileNameA(tempDir, "rpc", 0, tempFile)) { + return 0; + } + + DeleteFileA(tempFile); + dot = strrchr(tempFile, '.'); + if (dot) { + strcpy(dot, ".wav"); + } + + strcpy(pathBuf, tempFile); + return 1; +} + +static int decode_mpeg_audio_to_wav(const char *inputPath, + char *outputPath, + size_t outputPathSize, + double gainScale) { + unsigned char *inputData = NULL; + size_t inputSize = 0; + mp3dec_t dec; + size_t pos = 0; + FILE *out = NULL; + unsigned char wavHeader[44] = {0}; + unsigned dataBytes = 0; + int sampleRate = 0; + int channels = 0; + int haveAudio = 0; + + if (!make_temp_wav_path(outputPath, outputPathSize)) { + return 0; + } + + inputData = read_entire_file(inputPath, &inputSize); + if (!inputData) { + return 0; + } + + out = fopen(outputPath, "wb"); + if (!out) { + free(inputData); + return 0; + } + + if (fwrite(wavHeader, 1, sizeof(wavHeader), out) != sizeof(wavHeader)) { + fclose(out); + DeleteFileA(outputPath); + free(inputData); + return 0; + } + + mp3dec_init(&dec); + while (pos < inputSize) { + mp3dec_frame_info_t info; + mp3d_sample_t pcm[MINIMP3_MAX_SAMPLES_PER_FRAME]; + int samples = mp3dec_decode_frame(&dec, inputData + pos, (int)(inputSize - pos), pcm, &info); + + if (info.frame_bytes <= 0) { + ++pos; + continue; + } + + pos += (size_t)info.frame_bytes; + if (samples <= 0) { + continue; + } + + if (!haveAudio) { + sampleRate = info.hz; + channels = info.channels; + haveAudio = 1; + } else if (sampleRate != info.hz || channels != info.channels) { + fclose(out); + DeleteFileA(outputPath); + free(inputData); + die("mpeg input changed sample rate or channel count mid-stream"); + } + + if (gainScale != 1.0) { + int sampleIndex; + for (sampleIndex = 0; sampleIndex < samples; ++sampleIndex) { + pcm[sampleIndex] = apply_gain_sample(pcm[sampleIndex], gainScale); + } + } + + if (fwrite(pcm, sizeof(mp3d_sample_t), (size_t)samples, out) != (size_t)samples) { + fclose(out); + DeleteFileA(outputPath); + free(inputData); + return 0; + } + dataBytes += (unsigned)(samples * sizeof(mp3d_sample_t)); + } + + free(inputData); + + if (!haveAudio) { + fclose(out); + DeleteFileA(outputPath); + return 0; + } + + fill_wav_header(wavHeader, dataBytes, sampleRate, channels, 16); + if (fseek(out, 0, SEEK_SET) != 0 || fwrite(wavHeader, 1, sizeof(wavHeader), out) != sizeof(wavHeader)) { + fclose(out); + DeleteFileA(outputPath); + return 0; + } + + fclose(out); + return 1; +} + +static int find_wav_data_chunk(const unsigned char *data, + size_t size, + size_t *fmtOffset, + unsigned *fmtSize, + size_t *dataOffset, + unsigned *dataSize) { + size_t pos = 12; + + if (!data || size < 44 || memcmp(data, "RIFF", 4) != 0 || memcmp(data + 8, "WAVE", 4) != 0) { + return 0; + } + + *fmtOffset = 0; + *fmtSize = 0; + *dataOffset = 0; + *dataSize = 0; + + while (pos + 8 <= size) { + unsigned chunkSize = (unsigned)data[pos + 4] | + ((unsigned)data[pos + 5] << 8) | + ((unsigned)data[pos + 6] << 16) | + ((unsigned)data[pos + 7] << 24); + size_t chunkData = pos + 8; + + if (chunkData + chunkSize > size) { + return 0; + } + + if (memcmp(data + pos, "fmt ", 4) == 0) { + *fmtOffset = chunkData; + *fmtSize = chunkSize; + } else if (memcmp(data + pos, "data", 4) == 0) { + *dataOffset = chunkData; + *dataSize = chunkSize; + } + + pos = chunkData + chunkSize + (chunkSize & 1u); + } + + return *fmtOffset != 0 && *dataOffset != 0; +} + +static int rewrite_wav_with_gain(const char *inputPath, + char *outputPath, + size_t outputPathSize, + double gainScale) { + unsigned char *data = NULL; + size_t size = 0; + size_t fmtOffset; + unsigned fmtSize; + size_t dataOffset; + unsigned dataSize; + unsigned short formatTag; + unsigned short channels; + unsigned sampleRate; + unsigned short bitsPerSample; + FILE *out = NULL; + unsigned char header[44] = {0}; + unsigned sampleCount; + unsigned i; + + if (!make_temp_wav_path(outputPath, outputPathSize)) { + return 0; + } + + data = read_entire_file(inputPath, &size); + if (!data) { + return 0; + } + + if (!find_wav_data_chunk(data, size, &fmtOffset, &fmtSize, &dataOffset, &dataSize) || fmtSize < 16) { + free(data); + return 0; + } + + formatTag = (unsigned short)(data[fmtOffset] | (data[fmtOffset + 1] << 8)); + channels = (unsigned short)(data[fmtOffset + 2] | (data[fmtOffset + 3] << 8)); + sampleRate = (unsigned)data[fmtOffset + 4] | + ((unsigned)data[fmtOffset + 5] << 8) | + ((unsigned)data[fmtOffset + 6] << 16) | + ((unsigned)data[fmtOffset + 7] << 24); + bitsPerSample = (unsigned short)(data[fmtOffset + 14] | (data[fmtOffset + 15] << 8)); + + if (formatTag != 1 || bitsPerSample != 16 || channels == 0) { + free(data); + return 0; + } + + out = fopen(outputPath, "wb"); + if (!out) { + free(data); + return 0; + } + + fill_wav_header(header, dataSize, (int)sampleRate, (int)channels, 16); + if (fwrite(header, 1, sizeof(header), out) != sizeof(header)) { + fclose(out); + DeleteFileA(outputPath); + free(data); + return 0; + } + + sampleCount = dataSize / 2u; + for (i = 0; i < sampleCount; ++i) { + short sample = (short)((unsigned short)data[dataOffset + i * 2] | + ((unsigned short)data[dataOffset + i * 2 + 1] << 8)); + short scaled = apply_gain_sample(sample, gainScale); + unsigned char outBytes[2]; + outBytes[0] = (unsigned char)(scaled & 0xff); + outBytes[1] = (unsigned char)(((unsigned short)scaled >> 8) & 0xff); + if (fwrite(outBytes, 1, 2, out) != 2) { + fclose(out); + DeleteFileA(outputPath); + free(data); + return 0; + } + } + + fclose(out); + free(data); + return 1; +} + // Map rating string to something we can store as a property static const char *rating_to_str(const char *r) { if (_stricmp(r, "G") == 0) return "G"; @@ -136,6 +549,16 @@ typedef struct { char name[512]; } selected_codec_t; +typedef struct { + char title[256]; + char artist[256]; + char album[256]; + char year[64]; + char genre[128]; + char comment[512]; + char copyright[256]; +} id3_metadata_t; + static target_t parse_target(const char *s) { if (!s) return TGT_WEBTV; if (_stricmp(s, "WebTV") == 0) return TGT_WEBTV; @@ -192,6 +615,313 @@ static int parse_codec_index(const char *s) { return (int)value; } +static void trim_trailing_space(char *s) { + size_t len; + + if (!s) { + return; + } + + len = strlen(s); + while (len > 0) { + char ch = s[len - 1]; + if (ch != ' ' && ch != '\t' && ch != '\r' && ch != '\n' && ch != '\0') { + break; + } + s[len - 1] = '\0'; + --len; + } +} + +static void copy_latin1_text(char *dst, size_t dstSize, const unsigned char *src, size_t srcSize) { + size_t i; + size_t out = 0; + + if (!dst || dstSize == 0) { + return; + } + + dst[0] = '\0'; + if (!src || srcSize == 0) { + return; + } + + for (i = 0; i < srcSize && out + 1 < dstSize; ++i) { + unsigned char ch = src[i]; + if (ch == 0) { + break; + } + dst[out++] = (char)ch; + } + dst[out] = '\0'; + trim_trailing_space(dst); +} + +static void copy_utf16_text(char *dst, size_t dstSize, const unsigned char *src, size_t srcSize, int bigEndian) { + wchar_t *wideBuf; + size_t chars; + size_t i; + + if (!dst || dstSize == 0) { + return; + } + + dst[0] = '\0'; + if (!src || srcSize < 2) { + return; + } + + chars = srcSize / 2; + wideBuf = (wchar_t *)malloc((chars + 1) * sizeof(wchar_t)); + if (!wideBuf) { + return; + } + + for (i = 0; i < chars; ++i) { + unsigned value; + if (bigEndian) { + value = ((unsigned)src[i * 2] << 8) | (unsigned)src[i * 2 + 1]; + } else { + value = (unsigned)src[i * 2] | ((unsigned)src[i * 2 + 1] << 8); + } + wideBuf[i] = (wchar_t)value; + if (value == 0) { + chars = i; + break; + } + } + wideBuf[chars] = L'\0'; + + WideCharToMultiByte(CP_ACP, 0, wideBuf, -1, dst, (int)dstSize, NULL, NULL); + trim_trailing_space(dst); + free(wideBuf); +} + +static void decode_id3_text_payload(const unsigned char *src, size_t srcSize, char *dst, size_t dstSize) { + unsigned char enc; + + if (!dst || dstSize == 0) { + return; + } + + dst[0] = '\0'; + if (!src || srcSize == 0) { + return; + } + + enc = src[0]; + src += 1; + srcSize -= 1; + + switch (enc) { + case 0: + case 3: + copy_latin1_text(dst, dstSize, src, srcSize); + break; + case 1: + if (srcSize >= 2 && src[0] == 0xFE && src[1] == 0xFF) { + copy_utf16_text(dst, dstSize, src + 2, srcSize - 2, 1); + } else if (srcSize >= 2 && src[0] == 0xFF && src[1] == 0xFE) { + copy_utf16_text(dst, dstSize, src + 2, srcSize - 2, 0); + } else { + copy_utf16_text(dst, dstSize, src, srcSize, 0); + } + break; + case 2: + copy_utf16_text(dst, dstSize, src, srcSize, 1); + break; + default: + break; + } +} + +static unsigned read_synchsafe32(const unsigned char *src) { + return ((unsigned)(src[0] & 0x7f) << 21) | + ((unsigned)(src[1] & 0x7f) << 14) | + ((unsigned)(src[2] & 0x7f) << 7) | + (unsigned)(src[3] & 0x7f); +} + +static unsigned read_be32(const unsigned char *src) { + return ((unsigned)src[0] << 24) | + ((unsigned)src[1] << 16) | + ((unsigned)src[2] << 8) | + (unsigned)src[3]; +} + +static void assign_if_empty(char *dst, size_t dstSize, const char *src) { + if (!dst || dstSize == 0 || !src || !src[0] || dst[0]) { + return; + } + strncpy(dst, src, dstSize - 1); + dst[dstSize - 1] = '\0'; +} + +static void parse_id3v1_tag(const unsigned char *data, size_t size, id3_metadata_t *meta) { + if (!data || size < 128 || !meta) { + return; + } + + if (memcmp(data + size - 128, "TAG", 3) != 0) { + return; + } + + assign_if_empty(meta->title, sizeof(meta->title), ""); + copy_latin1_text(meta->title, sizeof(meta->title), data + size - 125, 30); + copy_latin1_text(meta->artist, sizeof(meta->artist), data + size - 95, 30); + copy_latin1_text(meta->album, sizeof(meta->album), data + size - 65, 30); + copy_latin1_text(meta->year, sizeof(meta->year), data + size - 35, 4); + copy_latin1_text(meta->comment, sizeof(meta->comment), data + size - 31, 30); +} + +static void parse_id3v2_comment(const unsigned char *payload, size_t payloadSize, char *dst, size_t dstSize) { + unsigned char enc; + size_t offset; + + if (!payload || payloadSize < 5) { + return; + } + + enc = payload[0]; + offset = 4; + + if (enc == 0 || enc == 3) { + while (offset < payloadSize && payload[offset] != 0) { + ++offset; + } + if (offset < payloadSize) { + ++offset; + } + } else { + while (offset + 1 < payloadSize && (payload[offset] != 0 || payload[offset + 1] != 0)) { + offset += 2; + } + if (offset + 1 < payloadSize) { + offset += 2; + } + } + + if (offset < payloadSize) { + unsigned char *tmp = (unsigned char *)malloc(payloadSize - offset + 1); + if (!tmp) { + return; + } + tmp[0] = enc; + memcpy(tmp + 1, payload + offset, payloadSize - offset); + decode_id3_text_payload(tmp, payloadSize - offset + 1, dst, dstSize); + free(tmp); + } +} + +static void parse_id3v2_tag(const unsigned char *data, size_t size, id3_metadata_t *meta) { + unsigned version; + unsigned flags; + size_t tagSize; + size_t pos; + + if (!data || size < 10 || !meta) { + return; + } + + if (memcmp(data, "ID3", 3) != 0) { + return; + } + + version = data[3]; + flags = data[5]; + tagSize = read_synchsafe32(data + 6); + pos = 10; + + if ((flags & 0x40) != 0 && size >= pos + 4) { + unsigned extSize = version == 4 ? read_synchsafe32(data + pos) : read_be32(data + pos); + pos += extSize; + } + + while (pos + 10 <= size && pos < tagSize + 10) { + char frameId[5]; + unsigned frameSize; + const unsigned char *payload; + + memcpy(frameId, data + pos, 4); + frameId[4] = '\0'; + if (frameId[0] == 0) { + break; + } + + frameSize = version == 4 ? read_synchsafe32(data + pos + 4) : read_be32(data + pos + 4); + pos += 10; + if (frameSize == 0 || pos + frameSize > size) { + break; + } + + payload = data + pos; + if (strcmp(frameId, "TIT2") == 0) { + decode_id3_text_payload(payload, frameSize, meta->title, sizeof(meta->title)); + } else if (strcmp(frameId, "TPE1") == 0) { + decode_id3_text_payload(payload, frameSize, meta->artist, sizeof(meta->artist)); + } else if (strcmp(frameId, "TALB") == 0) { + decode_id3_text_payload(payload, frameSize, meta->album, sizeof(meta->album)); + } else if (strcmp(frameId, "TYER") == 0 || strcmp(frameId, "TDRC") == 0) { + decode_id3_text_payload(payload, frameSize, meta->year, sizeof(meta->year)); + } else if (strcmp(frameId, "TCON") == 0) { + decode_id3_text_payload(payload, frameSize, meta->genre, sizeof(meta->genre)); + } else if (strcmp(frameId, "TCOP") == 0) { + decode_id3_text_payload(payload, frameSize, meta->copyright, sizeof(meta->copyright)); + } else if (strcmp(frameId, "COMM") == 0) { + parse_id3v2_comment(payload, frameSize, meta->comment, sizeof(meta->comment)); + } + + pos += frameSize; + } +} + +static void id3_meta_to_description(const id3_metadata_t *meta, char *dst, size_t dstSize) { + int wrote = 0; + + if (!dst || dstSize == 0) { + return; + } + + dst[0] = '\0'; + if (!meta) { + return; + } + + if (meta->album[0]) { + _snprintf(dst + strlen(dst), dstSize - strlen(dst), "%sAlbum: %s", wrote ? " | " : "", meta->album); + wrote = 1; + } + if (meta->year[0]) { + _snprintf(dst + strlen(dst), dstSize - strlen(dst), "%sYear: %s", wrote ? " | " : "", meta->year); + wrote = 1; + } + if (meta->comment[0]) { + _snprintf(dst + strlen(dst), dstSize - strlen(dst), "%s%s", wrote ? " | " : "", meta->comment); + } +} + +static int load_id3_metadata(const char *path, id3_metadata_t *meta) { + unsigned char *data; + size_t size; + + if (!path || !meta) { + return 0; + } + + memset(meta, 0, sizeof(*meta)); + data = read_entire_file(path, &size); + if (!data) { + return 0; + } + + parse_id3v2_tag(data, size, meta); + parse_id3v1_tag(data, size, meta); + free(data); + + return meta->title[0] || meta->artist[0] || meta->album[0] || meta->year[0] || + meta->genre[0] || meta->comment[0] || meta->copyright[0]; +} + static int get_audio_codec_by_index(IProducerControl *ctl, int codecIndex, selected_codec_t *selected) { IEnumIDispatch *enumDisp = NULL; HRESULT hr; @@ -445,11 +1175,13 @@ static void set_clip_properties(IProducerControl *ctl, static void usage(void) { fprintf(stderr, - "Usage: rpcli [options] input.wav [output.ra]\n" + "Usage: rpcli [options] input.(wav|mp1|mp2|mp3) [output.ra]\n" "Options:\n" " --ra5 | --g2 Set PlayerCompatibility (default: G2 / PLAYER_6)\n" " --codec-list List available audio codecs and exit\n" " --codec N Select codec list entry N; mutually exclusive with --target\n" + " --gain DB Apply PCM gain in dB before encoding; negative values reduce level\n" + " --id3 Fill unset metadata fields from ID3 tags when present\n" " --mode voice|voice-bgm|stereo|music (default: music)\n" " --target WebTV|56k|ISDN|Cable|PC (default: WebTV)\n" " --title TEXT\n" @@ -473,8 +1205,16 @@ int main(int argc, char **argv) { int player_is_ra5 = 0; int do_codec_list = 0; int codec_index = -1; + int use_gain = 0; + int use_id3 = 0; int target_was_explicit = 0; selected_codec_t selected_codec; + id3_metadata_t id3_meta; + char id3_description[640] = {0}; + const char *encoder_input = NULL; + char decoded_input[MAX_PATH] = {0}; + double gain_db = 0.0; + double gain_scale = 1.0; const char *infile = NULL; char outbuf[MAX_PATH] = {0}; @@ -494,6 +1234,13 @@ int main(int argc, char **argv) { if (codec_index < 0) { die("--codec requires a non-negative integer"); } + } else if (strcmp(argv[i], "--gain") == 0 && i+1 < argc) { + if (!parse_gain_db(argv[++i], &gain_db)) { + die("--gain requires a numeric dB value"); + } + use_gain = 1; + } else if (strcmp(argv[i], "--id3") == 0) { + use_id3 = 1; } else if (strcmp(argv[i], "--mode") == 0 && i+1 < argc) { mode = argv[++i]; } else if (strcmp(argv[i], "--target") == 0 && i+1 < argc) { @@ -534,6 +1281,10 @@ int main(int argc, char **argv) { die("--codec is mutually exclusive with --target"); } + if (use_gain) { + gain_scale = gain_db_to_scale(gain_db); + } + if (!outfile && infile) { // derive output: input + ".ra" const char *p = strrchr(infile, '.'); @@ -544,6 +1295,24 @@ int main(int argc, char **argv) { outfile = outbuf; } + memset(&id3_meta, 0, sizeof(id3_meta)); + if (use_id3 && !load_id3_metadata(infile, &id3_meta)) { + fprintf(stderr, "warning: no usable ID3 metadata found in %s\n", infile); + } + + if (use_id3) { + if (!title && id3_meta.title[0]) title = id3_meta.title; + if (!author && id3_meta.artist[0]) author = id3_meta.artist; + if (!copyright && id3_meta.copyright[0]) copyright = id3_meta.copyright; + if (!keywords && id3_meta.genre[0]) keywords = id3_meta.genre; + if (!description) { + id3_meta_to_description(&id3_meta, id3_description, sizeof(id3_description)); + if (id3_description[0]) { + description = id3_description; + } + } + } + HRESULT hr = CoInitializeEx(NULL, COINIT_APARTMENTTHREADED); if (FAILED(hr)) die("CoInitialize failed"); @@ -569,6 +1338,25 @@ int main(int argc, char **argv) { selected_codec.codecId = -1; selected_codec.flavorId = -1; + encoder_input = infile; + if (is_mpeg_audio_input(infile)) { + if (!decode_mpeg_audio_to_wav(infile, decoded_input, sizeof(decoded_input), gain_scale)) { + ctl->Release(); + CoUninitialize(); + die("failed to decode mpeg audio input with minimp3"); + } + strcpy(g_temp_input_path, decoded_input); + encoder_input = g_temp_input_path; + } else if (use_gain && is_wav_input(infile)) { + if (!rewrite_wav_with_gain(infile, decoded_input, sizeof(decoded_input), gain_scale)) { + ctl->Release(); + CoUninitialize(); + die("failed to apply gain to wav input; only PCM 16-bit WAV is supported"); + } + strcpy(g_temp_input_path, decoded_input); + encoder_input = g_temp_input_path; + } + if (codec_index >= 0 && !get_audio_codec_by_index(ctl, codec_index, &selected_codec)) { ctl->Release(); CoUninitialize(); @@ -578,7 +1366,7 @@ int main(int argc, char **argv) { // Input properties ctl->put_InputType(INPUT_SOURCE_FILE); { - BSTR b = ansi_to_bstr(infile); + BSTR b = ansi_to_bstr(encoder_input); ctl->put_InputFilename(b); SysFreeString(b); } @@ -664,6 +1452,7 @@ int main(int argc, char **argv) { if (selected_codec.cookie) selected_codec.cookie->Release(); ctl->Release(); CoUninitialize(); + cleanup_temp_input(); printf("Encoded %s -> %s\n", infile, outfile); return 0; diff --git a/zefie_wtvp_minisrv/ra_win/rpcli.exe b/zefie_wtvp_minisrv/ra_win/rpcli.exe index 7839abcfae0a807034bfc7838d469d0885ff4aa5..fa3cf1a6f03034403d1e35826be2d42c06224322 100644 GIT binary patch literal 217088 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�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 yMy#F&A@(M$?9%p;`om|W+N#^|bKK?)IeeD1M delta 40715 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