From 26e8c5ee0e2ac1e3ee818c7ddcc9859757055557 Mon Sep 17 00:00:00 2001 From: Jean-Paul Saman Date: Fri, 30 Jan 2009 14:28:24 +0100 Subject: [PATCH 1/1] shine: Forward port of fixed integer MP3 encoder. The fixed integer MP3 encoder shine originates from the RockBox project. It was then adapted for vlc in branch 0.8.6-neuros. --- NEWS | 1 + configure.ac | 11 + modules/codec/Modules.am | 2 +- modules/codec/shine/Modules.am | 1 + modules/codec/shine/enc_base.h | 301 ++++ modules/codec/shine/shine.c | 2387 +++++++++++++++++++++++++++++++ modules/codec/shine/shine_mod.c | 221 +++ 7 files changed, 2923 insertions(+), 1 deletion(-) create mode 100644 modules/codec/shine/Modules.am create mode 100644 modules/codec/shine/enc_base.h create mode 100644 modules/codec/shine/shine.c create mode 100644 modules/codec/shine/shine_mod.c diff --git a/NEWS b/NEWS index fb073d37f3..c4ccf522aa 100644 --- a/NEWS +++ b/NEWS @@ -24,6 +24,7 @@ Demuxers: Encoders: * Dirac encoding using libdirac (supported in Ogg and in TS) + * Shine mp3 fixed point encoder Access: * RTSP authentication with Darwin Streaming Server diff --git a/configure.ac b/configure.ac index eba8e6facd..33402285f9 100644 --- a/configure.ac +++ b/configure.ac @@ -2902,6 +2902,16 @@ then VLC_ADD_PLUGIN([wma_fixed]) fi +dnl +dnl shine fixed point mp3 encoder +dnl +AC_ARG_ENABLE(shine, + [ --enable-shine shine mp3 encoding module (default disabled)]) +if test "${enable_shine}" = "yes" +then + VLC_ADD_PLUGIN([shine]) +fi + dnl dnl mad plugin dnl @@ -5917,6 +5927,7 @@ AC_CONFIG_FILES([ modules/codec/avcodec/Makefile modules/codec/cmml/Makefile modules/codec/dmo/Makefile + modules/codec/shine/Makefile modules/codec/subtitles/Makefile modules/codec/spudec/Makefile modules/codec/wmafixed/Makefile diff --git a/modules/codec/Modules.am b/modules/codec/Modules.am index 9079d638ff..1fff3e888f 100644 --- a/modules/codec/Modules.am +++ b/modules/codec/Modules.am @@ -1,4 +1,4 @@ -SUBDIRS = cmml dmo avcodec subtitles spudec wmafixed xvmc +SUBDIRS = cmml dmo avcodec shine subtitles spudec wmafixed xvmc SOURCES_a52 = a52.c SOURCES_dts = dts.c SOURCES_flac = flac.c diff --git a/modules/codec/shine/Modules.am b/modules/codec/shine/Modules.am new file mode 100644 index 0000000000..ff8af8810b --- /dev/null +++ b/modules/codec/shine/Modules.am @@ -0,0 +1 @@ +SOURCES_shine = shine_mod.c diff --git a/modules/codec/shine/enc_base.h b/modules/codec/shine/enc_base.h new file mode 100644 index 0000000000..67cb41e5d8 --- /dev/null +++ b/modules/codec/shine/enc_base.h @@ -0,0 +1,301 @@ +/*************************************************************************** + * __________ __ ___. + * Open \______ \ ____ ____ | | _\_ |__ _______ ___ + * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / + * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < + * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ + * \/ \/ \/ \/ \/ + * $Id$ + * + * Base declarations for working with software encoders + * + * Copyright (C) 2006 Michael Sevakis + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY + * KIND, either express or implied. + * + ****************************************************************************/ + +#ifndef ENC_BASE_H +#define ENC_BASE_H + +/* firmware/export/system.h */ +/* return p incremented by specified number of bytes */ +#define SKIPBYTES(p, count) ((typeof (p))((char *)(p) + (count))) + +#define P2_M1(p2) ((1 << (p2))-1) + +/* align up or down to nearest 2^p2 */ +#define ALIGN_DOWN_P2(n, p2) ((n) & ~P2_M1(p2)) +#define ALIGN_UP_P2(n, p2) ALIGN_DOWN_P2((n) + P2_M1(p2),p2) +/* end of firmware/export/system.h */ + +/** encoder config structures **/ + +/** aiff_enc.codec **/ +struct aiff_enc_config +{ +#if 0 + unsigned long sample_depth; +#endif +}; + +/** mp3_enc.codec **/ +#define MP3_BITR_CAP_8 (1 << 0) +#define MP3_BITR_CAP_16 (1 << 1) +#define MP3_BITR_CAP_24 (1 << 2) +#define MP3_BITR_CAP_32 (1 << 3) +#define MP3_BITR_CAP_40 (1 << 4) +#define MP3_BITR_CAP_48 (1 << 5) +#define MP3_BITR_CAP_56 (1 << 6) +#define MP3_BITR_CAP_64 (1 << 7) +#define MP3_BITR_CAP_80 (1 << 8) +#define MP3_BITR_CAP_96 (1 << 9) +#define MP3_BITR_CAP_112 (1 << 10) +#define MP3_BITR_CAP_128 (1 << 11) +#define MP3_BITR_CAP_144 (1 << 12) +#define MP3_BITR_CAP_160 (1 << 13) +#define MP3_BITR_CAP_192 (1 << 14) +#define MP3_BITR_CAP_224 (1 << 15) +#define MP3_BITR_CAP_256 (1 << 16) +#define MP3_BITR_CAP_320 (1 << 17) +#define MP3_ENC_NUM_BITR 18 + +/* MPEG 1 */ +#define MPEG1_SAMPR_CAPS (SAMPR_CAP_32 | SAMPR_CAP_48 | SAMPR_CAP_44) +#define MPEG1_BITR_CAPS (MP3_BITR_CAP_32 | MP3_BITR_CAP_40 | MP3_BITR_CAP_48 | \ + MP3_BITR_CAP_56 | MP3_BITR_CAP_64 | MP3_BITR_CAP_80 | \ + MP3_BITR_CAP_96 | MP3_BITR_CAP_112 | MP3_BITR_CAP_128 | \ + MP3_BITR_CAP_160 | MP3_BITR_CAP_192 | MP3_BITR_CAP_224 | \ + MP3_BITR_CAP_256 | MP3_BITR_CAP_320) + +/* MPEG 2 */ +#define MPEG2_SAMPR_CAPS (SAMPR_CAP_22 | SAMPR_CAP_24 | SAMPR_CAP_16) +#define MPEG2_BITR_CAPS (MP3_BITR_CAP_8 | MP3_BITR_CAP_16 | MP3_BITR_CAP_24 | \ + MP3_BITR_CAP_32 | MP3_BITR_CAP_40 | MP3_BITR_CAP_48 | \ + MP3_BITR_CAP_56 | MP3_BITR_CAP_64 | MP3_BITR_CAP_80 | \ + MP3_BITR_CAP_96 | MP3_BITR_CAP_112 | MP3_BITR_CAP_128 | \ + MP3_BITR_CAP_144 | MP3_BITR_CAP_160) + +#if 0 +/* MPEG 2.5 */ +#define MPEG2_5_SAMPR_CAPS (SAMPR_CAP_8 | SAMPR_CAP_12 | SAMPR_CAP_11) +#define MPEG2_5_BITR_CAPS MPEG2_BITR_CAPS +#endif + +#if 0 +/* HAVE_MPEG* defines mainly apply to the bitrate menu */ +#if (REC_SAMPR_CAPS & MPEG1_SAMPR_CAPS) || defined (HAVE_SPDIF_REC) +#define HAVE_MPEG1_SAMPR +#endif + +#if (REC_SAMPR_CAPS & MPEG2_SAMPR_CAPS) || defined (HAVE_SPDIF_REC) +#define HAVE_MPEG2_SAMPR +#endif +#endif + +#if 0 +#if (REC_SAMPR_CAPS & MPEG2_5_SAMPR_CAPS) || defined (HAVE_SPDIF_REC) +#define HAVE_MPEG2_5_SAMPR +#endif +#endif /* 0 */ + +#define MP3_ENC_SAMPR_CAPS (MPEG1_SAMPR_CAPS | MPEG2_SAMPR_CAPS) + +/* This number is count of full encoder set */ +#define MP3_ENC_NUM_SAMPR 6 + +extern const unsigned long mp3_enc_sampr[MP3_ENC_NUM_SAMPR]; +extern const unsigned long mp3_enc_bitr[MP3_ENC_NUM_BITR]; + +struct mp3_enc_config +{ + unsigned long bitrate; +}; + +#define MP3_ENC_BITRATE_CFG_DEFAULT 11 /* 128 */ +#define MP3_ENC_BITRATE_CFG_VALUE_LIST "8,16,24,32,40,48,56,64,80,96," \ + "112,128,144,160,192,224,256,320" + +/** wav_enc.codec **/ +#define WAV_ENC_SAMPR_CAPS SAMPR_CAP_ALL + +struct wav_enc_config +{ +#if 0 + unsigned long sample_depth; +#endif +}; + +/** wavpack_enc.codec **/ +#define WAVPACK_ENC_SAMPR_CAPS SAMPR_CAP_ALL + +struct wavpack_enc_config +{ +#if 0 + unsigned long sample_depth; +#endif +}; + +struct encoder_config +{ + union + { + /* states which *_enc_config member is valid */ + int rec_format; /* REC_FORMAT_* value */ + int afmt; /* AFMT_* value */ + }; + + union + { + struct mp3_enc_config mp3_enc; + struct wavpack_enc_config wavpack_enc; + struct wav_enc_config wav_enc; + }; +}; + +/** Encoder chunk macros and definitions **/ +#define CHUNKF_START_FILE 0x0001ul /* This chunk starts a new file */ +#define CHUNKF_END_FILE 0x0002ul /* This chunk ends the current file */ +#define CHUNKF_PRERECORD 0x0010ul /* This chunk is prerecord data, + a new file could start anytime */ +#define CHUNKF_ABORT 0x0020ul /* Encoder should not finish this + chunk */ +#define CHUNKF_ERROR (~0ul ^ (~0ul >> 1)) /* An error has occured + (passed to/from encoder). Use the + sign bit to check (long)flags < 0. */ +#define CHUNKF_ALLFLAGS (0x0033ul | CHUNKF_ERROR) + +/* Header at the beginning of every encoder chunk */ +#ifdef DEBUG +#define ENC_CHUNK_MAGIC H_TO_BE32(('P' << 24) | ('T' << 16) | ('Y' << 8) | 'R') +#endif +struct enc_chunk_hdr +{ +#ifdef DEBUG + unsigned long id; /* overflow detection - 'PTYR' - acronym for + "PTYR Tells You Right" ;) */ +#endif + unsigned long flags; /* in/out: flags used by encoder and file + writing */ + size_t enc_size; /* out: amount of encoder data written to + chunk */ + unsigned long num_pcm; /* out: number of PCM samples eaten during + processing + (<= size of allocated buffer) */ + unsigned char *enc_data; /* out: pointer to enc_size_written bytes + of encoded audio data in chunk */ + /* Encoder defined data follows header. Can be audio data + any other + stuff the encoder needs to handle on a per chunk basis */ +}; + +/* Paranoia: be sure header size is 4-byte aligned */ +#define ENC_CHUNK_HDR_SIZE \ + ALIGN_UP_P2(sizeof (struct enc_chunk_hdr), 2) +/* Skip the chunk header and return data */ +#define ENC_CHUNK_SKIP_HDR(t, hdr) \ + ((typeof (t))((char *)hdr + ENC_CHUNK_HDR_SIZE)) +/* Cast p to struct enc_chunk_hdr * */ +#define ENC_CHUNK_HDR(p) \ + ((struct enc_chunk_hdr *)(p)) + +enum enc_events +{ + /* File writing events - data points to enc_file_event_data */ + ENC_START_FILE = 0, /* a new file has been opened and no data has yet + been written */ + ENC_WRITE_CHUNK, /* write the current chunk to disk */ + ENC_END_FILE, /* current file about to be closed and all valid + data has been written */ + /* Encoder buffer events - data points to enc_buffer_event_data */ + ENC_REC_NEW_STREAM, /* Take steps to finish current stream and start + new */ +}; + +/** + * encoder can write extra data to the file such as headers or more encoded + * samples and must update sizes and samples accordingly. + */ +struct enc_file_event_data +{ + struct enc_chunk_hdr *chunk; /* Current chunk */ + size_t new_enc_size; /* New size of chunk */ + unsigned long new_num_pcm; /* New number of pcm in chunk */ + const char *filename; /* filename to open if ENC_START_FILE */ + int rec_file; /* Current file or < 0 if none */ + unsigned long num_pcm_samples; /* Current pcm sample count written to + file so far. */ +}; + +/** + * encoder may add some data to the end of the last and start of the next + * but must never yield when called so any encoding done should be absolutely + * minimal. + */ +struct enc_buffer_event_data +{ + unsigned long flags; /* in: One or more of: + * CHUNKF_PRERECORD + * CHUNKF_END_FILE + * CHUNKF_START_FILE + */ + struct enc_chunk_hdr *pre_chunk; /* in: pointer to first prerecord + * chunk + */ + struct enc_chunk_hdr *chunk; /* in,out: chunk were split occurs - + * first chunk of start + */ +}; + +/** Callbacks called by encoder codec **/ + +/* parameters passed to encoder by enc_get_inputs */ +struct enc_inputs +{ + unsigned long sample_rate; /* out - pcm frequency */ + int num_channels; /* out - number of audio channels */ + struct encoder_config *config; /* out - encoder settings */ +}; + +void enc_get_inputs(struct enc_inputs *inputs); + +/* parameters pass from encoder to enc_set_parameters */ +struct enc_parameters +{ + /* IN parameters */ + int afmt; /* AFMT_* id - sanity checker */ + size_t chunk_size; /* max chunk size required */ + unsigned long enc_sample_rate; /* actual sample rate used by encoder + (for recorded time calculation) */ + size_t reserve_bytes; /* number of bytes to reserve immediately + following chunks */ + void (*events_callback)(enum enc_events event, + void *data); /* pointer to events callback */ + /* OUT parameters */ + unsigned char *enc_buffer; /* pointer to enc_buffer */ + size_t buf_chunk_size; /* size of chunks in enc_buffer */ + int num_chunks; /* number of chunks allotted to encoder */ + unsigned char *reserve_buffer; /* pointer to reserve_bytes bytes */ +}; + +/* set the encoder dimensions - called by encoder codec at initialization + and termination */ +void enc_set_parameters(struct enc_parameters *params); +/* returns pointer to next write chunk in circular buffer */ +struct enc_chunk_hdr * enc_get_chunk(void); +/* releases the current chunk into the available chunks */ +void enc_finish_chunk(void); + +#define PCM_MAX_FEED_SIZE 20000 /* max pcm size passed to encoder */ + +/* passes a pointer to next chunk of unprocessed wav data */ +unsigned char * enc_get_pcm_data(size_t size); +/* puts some pcm data back in the queue */ +size_t enc_unget_pcm_data(size_t size); + +#endif /* ENC_BASE_H */ diff --git a/modules/codec/shine/shine.c b/modules/codec/shine/shine.c new file mode 100644 index 0000000000..8a1fdf6213 --- /dev/null +++ b/modules/codec/shine/shine.c @@ -0,0 +1,2387 @@ +/*************************************************************************** + * __________ __ ___. + * Open \______ \ ____ ____ | | _\_ |__ _______ ___ + * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / + * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < + * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ + * \/ \/ \/ \/ \/ + * $Id$ + * + * Copyright (C) 2006 Antonius Hellmann + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY + * KIND, either express or implied. + * + ****************************************************************************/ + +// Shine is an MP3 encoder +// Copyright (C) 1999-2000 Gabriel Bouvigne +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 of the License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Library General Public License for more details. + +#define IBSS_ATTR + +#ifdef WORDS_BIGENDIAN +#define ROCKBOX_BIG_ENDIAN +#else +#define ROCKBOX_LITTLE_ENDIAN +#endif + +#include +#include +#include +#include +#include +#include "../wmafixed/bswap.h" +#include "enc_base.h" + +#define ENC_PADDING_FRAMES1 2 +#define ENC_PADDING_FRAMES2 4 +#define ENC_DELAY_SAMP 576 +#define ENC_DELAY_SIZE (ENC_DELAY_SAMP*4) +#define SAMP_PER_FRAME1 1152 +#define SAMP_PER_FRAME2 576 +#define PCM_CHUNK_SIZE1 (SAMP_PER_FRAME1*4) +#define PCM_CHUNK_SIZE2 (SAMP_PER_FRAME2*4) +#define SAMPL2 576 +#define SBLIMIT 32 +#define HTN 16 + +#define putlong(c, s) if(s+sz <= 32) { cc = (cc << s) | c; sz+= s; } \ + else { putbits(cc, sz); cc = c; sz = s; } + +typedef struct { + int type; /* 0=(MPEG2 - 22.05,24,16kHz) 1=(MPEG1 - 44.1,48,32kHz) */ + int mode; /* 0=stereo, 1=jstereo, 2=dual, 3=mono */ + int bitrate; + int padding; + int num_bands; + long bitr_id; + int smpl_id; +} mpeg_t; + +/* Side information */ +typedef struct { + uint32_t part2_3_length; + int count1; /* number of 0-1-quadruples */ + uint32_t global_gain; + uint32_t table_select[4]; + uint32_t region_0_1; + uint32_t address1; + uint32_t address2; + uint32_t address3; + long quantStep; + long additStep; + uint32_t max_val; +} side_info_t; + +typedef struct { + side_info_t cod_info[2][2]; + mpeg_t mpg; + long frac_per_frame; + long byte_per_frame; + long slot_lag; + int sideinfo_len; + int mean_bits; + int ResvSize; + int channels; + int granules; + long samplerate; +} config_t; + +typedef struct { + int bitpos; /* current bitpos for writing */ + uint32_t bbuf[263]; +} BF_Data; + +struct huffcodetab { + int len; /* max. index */ + const uint8_t *table; /* pointer to array[len][len] */ + const uint8_t *hlen; /* pointer to array[len][len] */ +}; + +struct huffcodebig { + int len; /* max. index */ + int linbits; /* number of linbits */ + int linmax; /* max number stored in linbits */ +}; + +#define shft4(x) ((x + 8) >> 4) +#define shft9(x) ((x + 256) >> 9) +#define shft13(x) ((x + 4096) >> 13) +#define shft15(x) ((x + 16384) >> 15) +#define shft16(x) ((x + 32768) >> 16) +#define shft_n(x,n) ((x) >> n) +#define SQRT 724 /* sqrt(2) * 512 */ + +static short mfbuf [2*(1152+512)] IBSS_ATTR; /* 3328 Bytes */ +static int sb_data [2][2][18][SBLIMIT] IBSS_ATTR; /* 13824 Bytes */ +static int mdct_freq [SAMPL2] IBSS_ATTR; /* 2304 Bytes */ +static char mdct_sign [SAMPL2] IBSS_ATTR; /* 576 Bytes */ +static short enc_data [SAMPL2] IBSS_ATTR; /* 1152 Bytes */ +static uint32_t scalefac [23] IBSS_ATTR; /* 92 Bytes */ +static BF_Data CodedData IBSS_ATTR; /* 1056 Bytes */ +static int ca [8] IBSS_ATTR; /* 32 Bytes */ +static int cs [8] IBSS_ATTR; /* 32 Bytes */ +static int cx [9] IBSS_ATTR; /* 36 Bytes */ +static int win [18][4] IBSS_ATTR; /* 288 Bytes */ +static short enwindow [15*27+24] IBSS_ATTR; /* 862 Bytes */ +static short int2idx [4096] IBSS_ATTR; /* 8192 Bytes */ +static uint8_t ht_count [2][2][16] IBSS_ATTR; /* 64 Bytes */ +static uint32_t tab01 [ 16] IBSS_ATTR; /* 64 Bytes */ +static uint32_t tab23 [ 9] IBSS_ATTR; /* 36 Bytes */ +static uint32_t tab56 [ 16] IBSS_ATTR; /* 64 Bytes */ +static uint32_t tab1315 [256] IBSS_ATTR; /* 1024 Bytes */ +static uint32_t tab1624 [256] IBSS_ATTR; /* 1024 Bytes */ +static uint32_t tab789 [ 36] IBSS_ATTR; /* 144 Bytes */ +static uint32_t tabABC [ 64] IBSS_ATTR; /* 256 Bytes */ +static uint8_t t1HB [ 4] IBSS_ATTR; +static uint8_t t2HB [ 9] IBSS_ATTR; +static uint8_t t3HB [ 9] IBSS_ATTR; +static uint8_t t5HB [ 16] IBSS_ATTR; +static uint8_t t6HB [ 16] IBSS_ATTR; +static uint8_t t7HB [ 36] IBSS_ATTR; +static uint8_t t8HB [ 36] IBSS_ATTR; +static uint8_t t9HB [ 36] IBSS_ATTR; +static uint8_t t10HB [ 64] IBSS_ATTR; +static uint8_t t11HB [ 64] IBSS_ATTR; +static uint8_t t12HB [ 64] IBSS_ATTR; +static uint8_t t13HB [256] IBSS_ATTR; +static uint8_t t15HB [256] IBSS_ATTR; +static uint16_t t16HB [256] IBSS_ATTR; +static uint16_t t24HB [256] IBSS_ATTR; +static uint8_t t1l [ 8] IBSS_ATTR; +static uint8_t t2l [ 9] IBSS_ATTR; +static uint8_t t3l [ 9] IBSS_ATTR; +static uint8_t t5l [ 16] IBSS_ATTR; +static uint8_t t6l [ 16] IBSS_ATTR; +static uint8_t t7l [ 36] IBSS_ATTR; +static uint8_t t8l [ 36] IBSS_ATTR; +static uint8_t t9l [ 36] IBSS_ATTR; +static uint8_t t10l [ 64] IBSS_ATTR; +static uint8_t t11l [ 64] IBSS_ATTR; +static uint8_t t12l [ 64] IBSS_ATTR; +static uint8_t t13l [256] IBSS_ATTR; +static uint8_t t15l [256] IBSS_ATTR; +static uint8_t t16l [256] IBSS_ATTR; +static uint8_t t24l [256] IBSS_ATTR; +static struct huffcodetab ht [HTN] IBSS_ATTR; + +static unsigned pcm_chunk_size IBSS_ATTR; +static unsigned samp_per_frame IBSS_ATTR; + +static config_t cfg IBSS_ATTR; +//static char *res_buffer; +static int32_t err IBSS_ATTR; +static uint8_t band_scale_f[22]; + +static const uint8_t ht_count_const[2][2][16] = +{ { { 1, 5, 4, 5, 6, 5, 4, 4, 7, 3, 6, 0, 7, 2, 3, 1 }, /* table0 */ + { 1, 5, 5, 7, 5, 8, 7, 9, 5, 7, 7, 9, 7, 9, 9,10 } }, /* hleng0 */ + { {15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0 }, /* table1 */ + { 4, 5, 5, 6, 5, 6, 6, 7, 5, 6, 6, 7, 6, 7, 7, 8 } } }; /* hleng1 */ + +static const uint8_t t1HB_const[4] = {1,1,1,0}; +static const uint8_t t2HB_const[9] = {1,2,1,3,1,1,3,2,0}; +static const uint8_t t3HB_const[9] = {3,2,1,1,1,1,3,2,0}; +static const uint8_t t5HB_const[16] = {1,2,6,5,3,1,4,4,7,5,7,1,6,1,1,0}; +static const uint8_t t6HB_const[16] = {7,3,5,1,6,2,3,2,5,4,4,1,3,3,2,0}; + +static const uint8_t t7HB_const[36] = +{ 1, 2,10,19,16,10, 3, 3, 7,10, 5, 3,11, 4,13,17, 8, 4, + 12,11,18,15,11, 2, 7, 6, 9,14, 3, 1, 6, 4, 5, 3, 2, 0 }; + +static const uint8_t t8HB_const[36] = +{ 3, 4, 6,18,12, 5, 5, 1, 2,16, 9, 3, 7, 3, 5,14, 7, 3, + 19,17,15,13,10, 4,13, 5, 8,11, 5, 1,12, 4, 4, 1, 1, 0 }; + +static const uint8_t t9HB_const[36] = +{ 7, 5, 9,14,15, 7, 6, 4, 5, 5, 6, 7, 7, 6, 8, 8, 8, 5, + 15, 6, 9,10, 5, 1,11, 7, 9, 6, 4, 1,14, 4, 6, 2, 6, 0 }; + +static const uint8_t t10HB_const[64] = +{1,2,10,23,35,30,12,17,3,3,8,12,18,21,12,7,11,9,15,21,32, + 40,19,6,14,13,22,34,46,23,18,7,20,19,33,47,27,22,9,3,31,22, + 41,26,21,20,5,3,14,13,10,11,16,6,5,1,9,8,7,8,4,4,2,0 }; + +static const uint8_t t11HB_const[64] = +{3,4,10,24,34,33,21,15,5,3,4,10,32,17,11,10,11,7,13,18,30, + 31,20,5,25,11,19,59,27,18,12,5,35,33,31,58,30,16,7,5,28,26, + 32,19,17,15,8,14,14,12,9,13,14,9,4,1,11,4,6,6,6,3,2,0 }; + +static const uint8_t t12HB_const[64] = +{9,6,16,33,41,39,38,26,7,5,6,9,23,16,26,11,17,7,11,14,21, +30,10,7,17,10,15,12,18,28,14,5,32,13,22,19,18,16,9,5,40,17, +31,29,17,13,4,2,27,12,11,15,10,7,4,1,27,12,8,12,6,3,1,0 }; + +static const uint8_t t13HB_const[256] = +{1,5,14,21,34,51,46,71,42,52,68,52,67,44,43,19,3,4,12,19,31,26,44,33,31,24,32, + 24,31,35,22,14,15,13,23,36,59,49,77,65,29,40,30,40,27,33,42,16,22,20,37,61,56, + 79,73,64,43,76,56,37,26,31,25,14,35,16,60,57,97,75,114,91,54,73,55,41,48,53, + 23,24,58,27,50,96,76,70,93,84,77,58,79,29,74,49,41,17,47,45,78,74,115,94,90, + 79,69,83,71,50,59,38,36,15,72,34,56,95,92,85,91,90,86,73,77,65,51,44,43,42,43, + 20,30,44,55,78,72,87,78,61,46,54,37,30,20,16,53,25,41,37,44,59,54,81,66,76,57, + 54,37,18,39,11,35,33,31,57,42,82,72,80,47,58,55,21,22,26,38,22,53,25,23,38,70, + 60,51,36,55,26,34,23,27,14,9,7,34,32,28,39,49,75,30,52,48,40,52,28,18,17,9,5, + 45,21,34,64,56,50,49,45,31,19,12,15,10,7,6,3,48,23,20,39,36,35,53,21,16,23,13, + 10,6,1,4,2,16,15,17,27,25,20,29,11,17,12,16,8,1,1,0,1 }; + +static const uint8_t t15HB_const[256] = +{7,12,18,53,47,76,124,108,89,123,108,119,107,81,122,63,13,5,16,27,46,36,61,51, + 42,70,52,83,65,41,59,36,19,17,15,24,41,34,59,48,40,64,50,78,62,80,56,33,29,28, + 25,43,39,63,55,93,76,59,93,72,54,75,50,29,52,22,42,40,67,57,95,79,72,57,89,69, + 49,66,46,27,77,37,35,66,58,52,91,74,62,48,79,63,90,62,40,38,125,32,60,56,50, + 92,78,65,55,87,71,51,73,51,70,30,109,53,49,94,88,75,66,122,91,73,56,42,64,44, + 21,25,90,43,41,77,73,63,56,92,77,66,47,67,48,53,36,20,71,34,67,60,58,49,88,76, + 67,106,71,54,38,39,23,15,109,53,51,47,90,82,58,57,48,72,57,41,23,27,62,9,86, + 42,40,37,70,64,52,43,70,55,42,25,29,18,11,11,118,68,30,55,50,46,74,65,49,39, + 24,16,22,13,14,7,91,44,39,38,34,63,52,45,31,52,28,19,14,8,9,3,123,60,58,53,47, + 43,32,22,37,24,17,12,15,10,2,1,71,37,34,30,28,20,17,26,21,16,10,6,8,6,2,0}; + +static const uint16_t t16HB_const[256] = +{1,5,14,44,74,63,110,93,172,149,138,242,225,195,376,17,3,4,12,20,35,62,53,47, + 83,75,68,119,201,107,207,9,15,13,23,38,67,58,103,90,161,72,127,117,110,209, + 206,16,45,21,39,69,64,114,99,87,158,140,252,212,199,387,365,26,75,36,68,65, + 115,101,179,164,155,264,246,226,395,382,362,9,66,30,59,56,102,185,173,265,142, + 253,232,400,388,378,445,16,111,54,52,100,184,178,160,133,257,244,228,217,385, + 366,715,10,98,48,91,88,165,157,148,261,248,407,397,372,380,889,884,8,85,84,81, + 159,156,143,260,249,427,401,392,383,727,713,708,7,154,76,73,141,131,256,245, + 426,406,394,384,735,359,710,352,11,139,129,67,125,247,233,229,219,393,743,737, + 720,885,882,439,4,243,120,118,115,227,223,396,746,742,736,721,712,706,223,436, + 6,202,224,222,218,216,389,386,381,364,888,443,707,440,437,1728,4,747,211,210, + 208,370,379,734,723,714,1735,883,877,876,3459,865,2,377,369,102,187,726,722, + 358,711,709,866,1734,871,3458,870,434,0,12,10,7,11,10,17,11,9,13,12,10,7,5,3, + 1,3}; + +static const uint16_t t24HB_const[256] = +{15,13,46,80,146,262,248,434,426,669,653,649,621,517,1032,88,14,12,21,38,71, + 130,122,216,209,198,327,345,319,297,279,42,47,22,41,74,68,128,120,221,207,194, + 182,340,315,295,541,18,81,39,75,70,134,125,116,220,204,190,178,325,311,293, + 271,16,147,72,69,135,127,118,112,210,200,188,352,323,306,285,540,14,263,66, + 129,126,119,114,214,202,192,180,341,317,301,281,262,12,249,123,121,117,113, + 215,206,195,185,347,330,308,291,272,520,10,435,115,111,109,211,203,196,187, + 353,332,313,298,283,531,381,17,427,212,208,205,201,193,186,177,169,320,303, + 286,268,514,377,16,335,199,197,191,189,181,174,333,321,305,289,275,521,379, + 371,11,668,184,183,179,175,344,331,314,304,290,277,530,383,373,366,10,652,346, + 171,168,164,318,309,299,287,276,263,513,375,368,362,6,648,322,316,312,307,302, + 292,284,269,261,512,376,370,364,359,4,620,300,296,294,288,282,273,266,515,380, + 374,369,365,361,357,2,1033,280,278,274,267,264,259,382,378,372,367,363,360, + 358,356,0,43,20,19,17,15,13,11,9,7,6,4,7,5,3,1,3}; + +static const uint32_t tab1315_const[256] = +{ 0x010003,0x050005,0x070006,0x080008,0x090008,0x0a0009,0x0a000a,0x0b000a, + 0x0a000a,0x0b000b,0x0c000b,0x0c000c,0x0d000c,0x0d000c,0x0e000d,0x0e000e, + 0x040005,0x060005,0x080007,0x090008,0x0a0009,0x0a0009,0x0b000a,0x0b000a, + 0x0b000a,0x0b000b,0x0c000b,0x0c000c,0x0d000c,0x0e000c,0x0e000d,0x0e000d, + 0x070006,0x080007,0x090007,0x0a0008,0x0b0009,0x0b0009,0x0c000a,0x0c000a, + 0x0b000a,0x0c000b,0x0c000b,0x0d000c,0x0d000c,0x0e000d,0x0f000d,0x0f000d, + 0x080007,0x090008,0x0a0008,0x0b0009,0x0b0009,0x0c000a,0x0c000a,0x0c000b, + 0x0c000b,0x0d000b,0x0d000c,0x0d000c,0x0d000c,0x0e000d,0x0f000d,0x0f000d, + 0x090008,0x090008,0x0b0009,0x0b0009,0x0c000a,0x0c000a,0x0d000b,0x0d000b, + 0x0c000b,0x0d000b,0x0d000c,0x0e000c,0x0e000c,0x0f000d,0x0f000d,0x10000d, + 0x0a0009,0x0a0009,0x0b0009,0x0c000a,0x0c000a,0x0c000a,0x0d000b,0x0d000b, + 0x0d000b,0x0d000b,0x0e000c,0x0d000c,0x0f000d,0x0f000d,0x10000d,0x10000e, + 0x0a000a,0x0b0009,0x0c000a,0x0c000a,0x0d000a,0x0d000b,0x0d000b,0x0d000b, + 0x0d000b,0x0e000c,0x0e000c,0x0e000c,0x0f000d,0x0f000d,0x10000e,0x10000e, + 0x0b000a,0x0b000a,0x0c000a,0x0d000b,0x0d000b,0x0d000b,0x0e000b,0x0e000c, + 0x0e000c,0x0e000c,0x0f000c,0x0f000c,0x0f000d,0x10000d,0x12000d,0x12000e, + 0x0a000a,0x0a000a,0x0b000a,0x0c000b,0x0c000b,0x0d000b,0x0d000b,0x0e000c, + 0x0e000c,0x0e000c,0x0e000c,0x0f000d,0x0f000d,0x10000e,0x11000e,0x11000e, + 0x0b000a,0x0b000a,0x0c000b,0x0c000b,0x0d000b,0x0d000b,0x0d000c,0x0f000c, + 0x0e000c,0x0f000d,0x0f000d,0x10000d,0x10000d,0x10000e,0x12000e,0x11000e, + 0x0b000b,0x0c000b,0x0c000b,0x0d000b,0x0d000c,0x0e000c,0x0e000c,0x0f000c, + 0x0e000c,0x0f000d,0x10000d,0x0f000d,0x10000d,0x11000e,0x12000f,0x13000e, + 0x0c000b,0x0c000b,0x0c000b,0x0d000b,0x0e000c,0x0e000c,0x0e000c,0x0e000c, + 0x0f000d,0x0f000d,0x0f000d,0x10000d,0x11000e,0x11000e,0x11000e,0x12000f, + 0x0c000c,0x0d000c,0x0d000b,0x0e000c,0x0e000c,0x0f000c,0x0e000d,0x0f000d, + 0x10000d,0x10000d,0x11000d,0x11000d,0x11000e,0x12000e,0x12000f,0x12000f, + 0x0d000c,0x0d000c,0x0e000c,0x0f000c,0x0f000c,0x0f000d,0x10000d,0x10000d, + 0x10000d,0x10000e,0x10000e,0x11000e,0x12000e,0x11000e,0x12000f,0x12000f, + 0x0e000d,0x0e000d,0x0e000d,0x0f000d,0x0f000d,0x0f000d,0x11000d,0x10000d, + 0x10000e,0x13000e,0x11000e,0x11000e,0x11000f,0x13000f,0x12000e,0x12000f, + 0x0d000d,0x0e000d,0x0f000d,0x10000d,0x10000d,0x10000d,0x11000d,0x10000e, + 0x11000e,0x11000e,0x12000e,0x12000e,0x15000f,0x14000f,0x15000f,0x12000f }; + +static const uint32_t tab01_const[16] = +{ 0x10004,0x50005,0x50005,0x70006,0x50005,0x80006,0x70006,0x90007, + 0x50005,0x70006,0x70006,0x90007,0x70006,0x90007,0x90007,0xa0008 }; + +static const uint32_t tab23_const[ 9] = +{ 0x10002,0x40003,0x70007,0x40004,0x50004,0x70007,0x60006,0x70007,0x80008 }; + +static const uint32_t tab56_const[16] = +{ 0x10003,0x40004,0x70006,0x80008,0x40004,0x50004,0x80006,0x90007, + 0x70005,0x80006,0x90007,0xa0008,0x80007,0x80007,0x90008,0xa0009 }; + +static const uint32_t tab789_const[36] = +{0x00100803,0x00401004,0x00701c06,0x00902407,0x00902409,0x00a0280a,0x00401004, + 0x00601005,0x00801806,0x00902807,0x00902808,0x00a0280a,0x00701c05,0x00701806, + 0x00902007,0x00a02808,0x00a02809,0x00b02c0a,0x00802407,0x00902807,0x00a02808, + 0x00b02c09,0x00b02c09,0x00b0300a,0x00802408,0x00902408,0x00a02809,0x00b02c09, + 0x00b0300a,0x00c0300b,0x00902809,0x00a02809,0x00b02c0a,0x00c02c0a,0x00c0340b, + 0x00c0340b}; + +static const uint32_t tabABC_const[64] = +{0x00100804,0x00401004,0x00701806,0x00902008,0x00a02409,0x00a0280a,0x00a0240a, + 0x00b0280a,0x00401004,0x00601405,0x00801806,0x00902007,0x00a02809,0x00b02809, + 0x00a0240a,0x00a0280a,0x00701806,0x00801c06,0x00902007,0x00a02408,0x00b02809, + 0x00c02c0a,0x00b02809,0x00b0280a,0x00802007,0x00902007,0x00a02408,0x00b02c08, + 0x00c02809,0x00c0300a,0x00b0280a,0x00c02c0a,0x00902408,0x00a02808,0x00b02809, + 0x00c02c09,0x00c02c0a,0x00c0300a,0x00c02c0a,0x00c0300b,0x00a02409,0x00b02809, + 0x00c02c0a,0x00c0300a,0x00d0300a,0x00d0340b,0x00c0300a,0x00d0340b,0x00902409, + 0x00a02409,0x00b02409,0x00c0280a,0x00c02c0a,0x00c0300b,0x00d0300b,0x00d0300c, + 0x00a0240a,0x00a0240a,0x00b0280a,0x00c02c0b,0x00c0300b,0x00d0300b,0x00d0300b, + 0x00d0300c}; + +static const uint32_t tab1624_const[256] = +{0x00010004,0x00050005,0x00070007,0x00090008,0x000a0009,0x000a000a,0x000b000a, + 0x000b000b,0x000c000b,0x000c000c,0x000c000c,0x000d000c,0x000d000c,0x000d000c, + 0x000e000d,0x000a000a,0x00040005,0x00060006,0x00080007,0x00090008,0x000a0009, + 0x000b000a,0x000b000a,0x000b000b,0x000c000b,0x000c000b,0x000c000c,0x000d000c, + 0x000e000c,0x000d000c,0x000e000c,0x000a000a,0x00070007,0x00080007,0x00090008, + 0x000a0009,0x000b0009,0x000b000a,0x000c000a,0x000c000b,0x000d000b,0x000c000b, + 0x000d000b,0x000d000c,0x000d000c,0x000e000c,0x000e000d,0x000b0009,0x00090008, + 0x00090008,0x000a0009,0x000b0009,0x000b000a,0x000c000a,0x000c000a,0x000c000b, + 0x000d000b,0x000d000b,0x000e000b,0x000e000c,0x000e000c,0x000f000c,0x000f000c, + 0x000c0009,0x000a0009,0x000a0009,0x000b0009,0x000b000a,0x000c000a,0x000c000a, + 0x000d000a,0x000d000b,0x000d000b,0x000e000b,0x000e000c,0x000e000c,0x000f000c, + 0x000f000c,0x000f000d,0x000b0009,0x000a000a,0x000a0009,0x000b000a,0x000b000a, + 0x000c000a,0x000d000a,0x000d000b,0x000e000b,0x000d000b,0x000e000b,0x000e000c, + 0x000f000c,0x000f000c,0x000f000c,0x0010000c,0x000c0009,0x000b000a,0x000b000a, + 0x000b000a,0x000c000a,0x000d000a,0x000d000b,0x000d000b,0x000d000b,0x000e000b, + 0x000e000c,0x000e000c,0x000e000c,0x000f000c,0x000f000c,0x0010000d,0x000c0009, + 0x000b000b,0x000b000a,0x000c000a,0x000c000a,0x000d000b,0x000d000b,0x000d000b, + 0x000e000b,0x000e000c,0x000f000c,0x000f000c,0x000f000c,0x000f000c,0x0011000d, + 0x0011000d,0x000c000a,0x000b000b,0x000c000b,0x000c000b,0x000d000b,0x000d000b, + 0x000d000b,0x000e000b,0x000e000b,0x000f000b,0x000f000c,0x000f000c,0x000f000c, + 0x0010000c,0x0010000d,0x0010000d,0x000c000a,0x000c000b,0x000c000b,0x000c000b, + 0x000d000b,0x000d000b,0x000e000b,0x000e000b,0x000f000c,0x000f000c,0x000f000c, + 0x000f000c,0x0010000c,0x000f000d,0x0010000d,0x000f000d,0x000d000a,0x000c000c, + 0x000d000b,0x000c000b,0x000d000b,0x000e000b,0x000e000c,0x000e000c,0x000e000c, + 0x000f000c,0x0010000c,0x0010000c,0x0010000d,0x0011000d,0x0011000d,0x0010000d, + 0x000c000a,0x000d000c,0x000d000c,0x000d000b,0x000d000b,0x000e000b,0x000e000c, + 0x000f000c,0x0010000c,0x0010000c,0x0010000c,0x0010000c,0x0010000d,0x0010000d, + 0x000f000d,0x0010000d,0x000d000a,0x000d000c,0x000e000c,0x000e000c,0x000e000c, + 0x000e000c,0x000f000c,0x000f000c,0x000f000c,0x000f000c,0x0011000c,0x0010000d, + 0x0010000d,0x0010000d,0x0010000d,0x0012000d,0x000d000a,0x000f000c,0x000e000c, + 0x000e000c,0x000e000c,0x000f000c,0x000f000c,0x0010000c,0x0010000c,0x0010000d, + 0x0012000d,0x0011000d,0x0011000d,0x0011000d,0x0013000d,0x0011000d,0x000d000a, + 0x000e000d,0x000f000c,0x000d000c,0x000e000c,0x0010000c,0x0010000c,0x000f000c, + 0x0010000d,0x0010000d,0x0011000d,0x0012000d,0x0011000d,0x0013000d,0x0011000d, + 0x0010000d,0x000d000a,0x000a0009,0x000a0009,0x000a0009,0x000b0009,0x000b0009, + 0x000c0009,0x000c0009,0x000c0009,0x000d0009,0x000d0009,0x000d0009,0x000d000a, + 0x000d000a,0x000d000a,0x000d000a,0x000a0006}; + +static const uint8_t t1l_const[8] = {1,3,2,3,1,4,3,5}; +static const uint8_t t2l_const[9] = {1,3,6,3,3,5,5,5,6}; +static const uint8_t t3l_const[9] = {2,2,6,3,2,5,5,5,6}; +static const uint8_t t5l_const[16] = {1,3,6,7,3,3,6,7,6,6,7,8,7,6,7,8}; +static const uint8_t t6l_const[16] = {3,3,5,7,3,2,4,5,4,4,5,6,6,5,6,7}; + +static const uint8_t t7l_const[36] = +{1,3,6,8,8,9,3,4,6,7,7,8,6,5,7,8,8,9,7,7,8,9,9,9,7,7,8,9,9,10,8,8,9,10,10,10}; + +static const uint8_t t8l_const[36] = +{2,3,6,8,8,9,3,2,4,8,8,8,6,4,6,8,8,9,8,8,8,9,9,10,8,7,8,9,10,10,9,8,9,9,11,11}; + +static const uint8_t t9l_const[36] = +{3,3,5,6,8,9,3,3,4,5,6,8,4,4,5,6,7,8,6,5,6,7,7,8,7,6,7,7,8,9,8,7,8,8,9,9}; + +static const uint8_t t10l_const[64] = +{1,3,6,8,9,9,9,10,3,4,6,7,8,9,8,8,6,6,7,8,9,10,9,9,7,7,8,9,10,10,9,10,8,8,9,10, + 10,10,10,10,9,9,10,10,11,11,10,11,8,8,9,10,10,10,11,11,9,8,9,10,10,11,11,11}; + +static const uint8_t t11l_const[64] = +{2,3,5,7,8,9,8,9,3,3,4,6,8,8,7,8,5,5,6,7,8,9,8,8,7,6,7,9,8,10,8,9,8,8,8,9,9,10, + 9,10,8,8,9,10,10,11,10,11,8,7,7,8,9,10,10,10,8,7,8,9,10,10,10,10}; + +static const uint8_t t12l_const[64] = +{4,3,5,7,8,9,9,9,3,3,4,5,7,7,8,8,5,4,5,6,7,8,7,8,6,5,6,6,7,8,8,8,7,6,7,7,8, + 8,8,9,8,7,8,8,8,9,8,9,8,7,7,8,8,9,9,10,9,8,8,9,9,9,9,10}; + +static const uint8_t t13l_const[256] = +{1,4,6,7,8,9,9,10,9,10,11,11,12,12,13,13,3,4,6,7,8,8,9,9,9,9,10,10,11,12,12,12, + 6,6,7,8,9,9,10,10,9,10,10,11,11,12,13,13,7,7,8,9,9,10,10,10,10,11,11,11,11,12, + 13,13,8,7,9,9,10,10,11,11,10,11,11,12,12,13,13,14,9,8,9,10,10,10,11,11,11,11, + 12,11,13,13,14,14,9,9,10,10,11,11,11,11,11,12,12,12,13,13,14,14,10,9,10,11,11, + 11,12,12,12,12,13,13,13,14,16,16,9,8,9,10,10,11,11,12,12,12,12,13,13,14,15,15, + 10,9,10,10,11,11,11,13,12,13,13,14,14,14,16,15,10,10,10,11,11,12,12,13,12,13, + 14,13,14,15,16,17,11,10,10,11,12,12,12,12,13,13,13,14,15,15,15,16,11,11,11,12, + 12,13,12,13,14,14,15,15,15,16,16,16,12,11,12,13,13,13,14,14,14,14,14,15,16,15, + 16,16,13,12,12,13,13,13,15,14,14,17,15,15,15,17,16,16,12,12,13,14,14,14,15,14, + 15,15,16,16,19,18,19,16}; + +static const uint8_t t15l_const[256] = +{3,4,5,7,7,8,9,9,9,10,10,11,11,11,12,13,4,3,5,6,7,7,8,8,8,9,9,10,10,10,11,11,5, + 5,5,6,7,7,8,8,8,9,9,10,10,11,11,11,6,6,6,7,7,8,8,9,9,9,10,10,10,11,11,11,7,6, + 7,7,8,8,9,9,9,9,10,10,10,11,11,11,8,7,7,8,8,8,9,9,9,9,10,10,11,11,11,12,9,7,8, + 8,8,9,9,9,9,10,10,10,11,11,12,12,9,8,8,9,9,9,9,10,10,10,10,10,11,11,11,12,9,8, + 8,9,9,9,9,10,10,10,10,11,11,12,12,12,9,8,9,9,9,9,10,10,10,11,11,11,11,12,12, + 12,10,9,9,9,10,10,10,10,10,11,11,11,11,12,13,12,10,9,9,9,10,10,10,10,11,11,11, + 11,12,12,12,13,11,10,9,10,10,10,11,11,11,11,11,11,12,12,13,13,11,10,10,10,10, + 11,11,11,11,12,12,12,12,12,13,13,12,11,11,11,11,11,11,11,12,12,12,12,13,13,12, + 13,12,11,11,11,11,11,11,12,12,12,12,12,13,13,13,13}; + +static const uint8_t t16l_const[256] = +{1,4,6,8,9,9,10,10,11,11,11,12,12,12,13,9,3,4,6,7,8,9,9,9,10,10,10,11,12,11,12, + 8,6,6,7,8,9,9,10,10,11,10,11,11,11,12,12,9,8,7,8,9,9,10,10,10,11,11,12,12,12, + 13,13,10,9,8,9,9,10,10,11,11,11,12,12,12,13,13,13,9,9,8,9,9,10,11,11,12,11,12, + 12,13,13,13,14,10,10,9,9,10,11,11,11,11,12,12,12,12,13,13,14,10,10,9,10,10,11, + 11,11,12,12,13,13,13,13,15,15,10,10,10,10,11,11,11,12,12,13,13,13,13,14,14,14, + 10,11,10,10,11,11,12,12,13,13,13,13,14,13,14,13,11,11,11,10,11,12,12,12,12,13, + 14,14,14,15,15,14,10,12,11,11,11,12,12,13,14,14,14,14,14,14,13,14,11,12,12,12, + 12,12,13,13,13,13,15,14,14,14,14,16,11,14,12,12,12,13,13,14,14,14,16,15,15,15, + 17,15,11,13,13,11,12,14,14,13,14,14,15,16,15,17,15,14,11,9,8,8,9,9,10,10,10, + 11,11,11,11,11,11,11,8}; + +static const uint8_t t24l_const[256] = +{4,4,6,7,8,9,9,10,10,11,11,11,11,11,12,9,4,4,5,6,7,8,8,9,9,9,10,10,10,10,10,8, + 6,5,6,7,7,8,8,9,9,9,9,10,10,10,11,7,7,6,7,7,8,8,8,9,9,9,9,10,10,10,10,7,8,7,7, + 8,8,8,8,9,9,9,10,10,10,10,11,7,9,7,8,8,8,8,9,9,9,9,10,10,10,10,10,7,9,8,8,8,8, + 9,9,9,9,10,10,10,10,10,11,7,10,8,8,8,9,9,9,9,10,10,10,10,10,11,11,8,10,9,9,9, + 9,9,9,9,9,10,10,10,10,11,11,8,10,9,9,9,9,9,9,10,10,10,10,10,11,11,11,8,11,9,9, + 9,9,10,10,10,10,10,10,11,11,11,11,8,11,10,9,9,9,10,10,10,10,10,10,11,11,11,11, + 8,11,10,10,10,10,10,10,10,10,10,11,11,11,11,11,8,11,10,10,10,10,10,10,10,11, + 11,11,11,11,11,11,8,12,10,10,10,10,10,10,11,11,11,11,11,11,11,11,8,8,7,7,7,7, + 7,7,7,7,7,7,8,8,8,8,4}; + +static const struct huffcodetab ht_const[HTN] = +{ { 0, NULL, NULL}, /* Apparently not used */ + { 2, t1HB, t1l}, + { 3, t2HB, t2l}, + { 3, t3HB, t3l}, + { 0, NULL, NULL}, /* Apparently not used */ + { 4, t5HB, t5l}, + { 4, t6HB, t6l}, + { 6, t7HB, t7l}, + { 6, t8HB, t8l}, + { 6, t9HB, t9l}, + { 8, t10HB, t10l}, + { 8, t11HB, t11l}, + { 8, t12HB, t12l}, + {16, t13HB, t13l}, + { 0, NULL, NULL}, /* Apparently not used */ + {16, t15HB, t15l} }; + +static const struct huffcodebig ht_big[HTN] = +{ { 16, 1, 1 }, + { 16, 2, 3 }, + { 16, 3, 7 }, + { 16, 4, 15 }, + { 16, 6, 63 }, + { 16, 8, 255 }, + { 16, 10, 1023 }, + { 16, 13, 8191 }, + { 16, 4, 15 }, + { 16, 5, 31 }, + { 16, 6, 63 }, + { 16, 7, 127 }, + { 16, 8, 255 }, + { 16, 9, 511 }, + { 16, 11, 2047 }, + { 16, 13, 8191 } }; + +static const struct +{ + uint32_t region0_cnt; + uint32_t region1_cnt; +} subdv_table[23] = +{ {0, 0}, /* 0 bands */ + {0, 0}, /* 1 bands */ + {0, 0}, /* 2 bands */ + {0, 0}, /* 3 bands */ + {0, 0}, /* 4 bands */ + {0, 1}, /* 5 bands */ + {1, 1}, /* 6 bands */ + {1, 1}, /* 7 bands */ + {1, 2}, /* 8 bands */ + {2, 2}, /* 9 bands */ + {2, 3}, /* 10 bands */ + {2, 3}, /* 11 bands */ + {3, 4}, /* 12 bands */ + {3, 4}, /* 13 bands */ + {3, 4}, /* 14 bands */ + {4, 5}, /* 15 bands */ + {4, 5}, /* 16 bands */ + {4, 6}, /* 17 bands */ + {5, 6}, /* 18 bands */ + {5, 6}, /* 19 bands */ + {5, 7}, /* 20 bands */ + {6, 7}, /* 21 bands */ + {6, 7}, /* 22 bands */ +}; + +static const uint32_t sfBand[6][23] = +{ +/* Table B.2.b: 22.05 kHz */ +{0,6,12,18,24,30,36,44,54,66,80,96,116,140,168,200,238,284,336,396,464,522,576}, +/* Table B.2.c: 24 kHz */ +{0,6,12,18,24,30,36,44,54,66,80,96,114,136,162,194,232,278,330,394,464,540,576}, +/* Table B.2.a: 16 kHz */ +{0,6,12,18,24,30,36,44,45,66,80,96,116,140,168,200,238,248,336,396,464,522,576}, +/* Table B.8.b: 44.1 kHz */ +{0,4, 8,12,16,20,24,30,36,44,52,62, 74, 90,110,134,162,196,238,288,342,418,576}, +/* Table B.8.c: 48 kHz */ +{0,4, 8,12,16,20,24,30,36,42,50,60, 72, 88,106,128,156,190,230,276,330,384,576}, +/* Table B.8.a: 32 kHz */ +{0,4, 8,12,16,20,24,30,36,44,54,66, 82,102,126,156,194,240,296,364,448,550,576} }; + + +static const short int2idx_const[4096] = /* int2idx[i] = sqrt(i*sqrt(i)); */ +{ + 0, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 6, 7, 7, 8, 8, 8, 9, 9, + 9, 10, 10, 11, 11, 11, 12, 12, 12, 12, 13, 13, 13, 14, 14, 14, 15, 15, 15, 16, + 16, 16, 16, 17, 17, 17, 18, 18, 18, 19, 19, 19, 19, 20, 20, 20, 20, 21, 21, 21, + 22, 22, 22, 22, 23, 23, 23, 23, 24, 24, 24, 24, 25, 25, 25, 25, 26, 26, 26, 26, + 27, 27, 27, 27, 28, 28, 28, 28, 29, 29, 29, 29, 30, 30, 30, 30, 31, 31, 31, 31, + 32, 32, 32, 32, 33, 33, 33, 33, 34, 34, 34, 34, 34, 35, 35, 35, 35, 36, 36, 36, + 36, 36, 37, 37, 37, 37, 38, 38, 38, 38, 38, 39, 39, 39, 39, 40, 40, 40, 40, 40, + 41, 41, 41, 41, 42, 42, 42, 42, 42, 43, 43, 43, 43, 44, 44, 44, 44, 44, 45, 45, + 45, 45, 45, 46, 46, 46, 46, 46, 47, 47, 47, 47, 47, 48, 48, 48, 48, 49, 49, 49, + 49, 49, 50, 50, 50, 50, 50, 51, 51, 51, 51, 51, 52, 52, 52, 52, 52, 53, 53, 53, + 53, 53, 54, 54, 54, 54, 54, 55, 55, 55, 55, 55, 56, 56, 56, 56, 56, 57, 57, 57, + 57, 57, 58, 58, 58, 58, 58, 58, 59, 59, 59, 59, 59, 60, 60, 60, 60, 60, 61, 61, + 61, 61, 61, 62, 62, 62, 62, 62, 62, 63, 63, 63, 63, 63, 64, 64, 64, 64, 64, 65, + 65, 65, 65, 65, 65, 66, 66, 66, 66, 66, 67, 67, 67, 67, 67, 68, 68, 68, 68, 68, + 68, 69, 69, 69, 69, 69, 70, 70, 70, 70, 70, 70, 71, 71, 71, 71, 71, 72, 72, 72, + 72, 72, 72, 73, 73, 73, 73, 73, 74, 74, 74, 74, 74, 74, 75, 75, 75, 75, 75, 75, + 76, 76, 76, 76, 76, 77, 77, 77, 77, 77, 77, 78, 78, 78, 78, 78, 78, 79, 79, 79, + 79, 79, 80, 80, 80, 80, 80, 80, 81, 81, 81, 81, 81, 81, 82, 82, 82, 82, 82, 82, + 83, 83, 83, 83, 83, 84, 84, 84, 84, 84, 84, 85, 85, 85, 85, 85, 85, 86, 86, 86, + 86, 86, 86, 87, 87, 87, 87, 87, 87, 88, 88, 88, 88, 88, 88, 89, 89, 89, 89, 89, + 89, 90, 90, 90, 90, 90, 90, 91, 91, 91, 91, 91, 91, 92, 92, 92, 92, 92, 92, 93, + 93, 93, 93, 93, 93, 94, 94, 94, 94, 94, 94, 95, 95, 95, 95, 95, 95, 96, 96, 96, + 96, 96, 96, 97, 97, 97, 97, 97, 97, 98, 98, 98, 98, 98, 98, 99, 99, 99, 99, 99, + 99, 99,100,100,100,100,100,100,101,101,101,101,101,101,102,102,102,102,102,102, +103,103,103,103,103,103,104,104,104,104,104,104,104,105,105,105,105,105,105,106, +106,106,106,106,106,107,107,107,107,107,107,107,108,108,108,108,108,108,109,109, +109,109,109,109,110,110,110,110,110,110,110,111,111,111,111,111,111,112,112,112, +112,112,112,112,113,113,113,113,113,113,114,114,114,114,114,114,115,115,115,115, +115,115,115,116,116,116,116,116,116,117,117,117,117,117,117,117,118,118,118,118, +118,118,118,119,119,119,119,119,119,120,120,120,120,120,120,120,121,121,121,121, +121,121,122,122,122,122,122,122,122,123,123,123,123,123,123,123,124,124,124,124, +124,124,125,125,125,125,125,125,125,126,126,126,126,126,126,126,127,127,127,127, +127,127,128,128,128,128,128,128,128,129,129,129,129,129,129,129,130,130,130,130, +130,130,131,131,131,131,131,131,131,132,132,132,132,132,132,132,133,133,133,133, +133,133,133,134,134,134,134,134,134,134,135,135,135,135,135,135,136,136,136,136, +136,136,136,137,137,137,137,137,137,137,138,138,138,138,138,138,138,139,139,139, +139,139,139,139,140,140,140,140,140,140,140,141,141,141,141,141,141,141,142,142, +142,142,142,142,142,143,143,143,143,143,143,143,144,144,144,144,144,144,144,145, +145,145,145,145,145,145,146,146,146,146,146,146,146,147,147,147,147,147,147,147, +148,148,148,148,148,148,148,149,149,149,149,149,149,149,150,150,150,150,150,150, +150,151,151,151,151,151,151,151,152,152,152,152,152,152,152,153,153,153,153,153, +153,153,154,154,154,154,154,154,154,154,155,155,155,155,155,155,155,156,156,156, +156,156,156,156,157,157,157,157,157,157,157,158,158,158,158,158,158,158,159,159, +159,159,159,159,159,160,160,160,160,160,160,160,160,161,161,161,161,161,161,161, +162,162,162,162,162,162,162,163,163,163,163,163,163,163,163,164,164,164,164,164, +164,164,165,165,165,165,165,165,165,166,166,166,166,166,166,166,167,167,167,167, +167,167,167,167,168,168,168,168,168,168,168,169,169,169,169,169,169,169,169,170, +170,170,170,170,170,170,171,171,171,171,171,171,171,172,172,172,172,172,172,172, +172,173,173,173,173,173,173,173,174,174,174,174,174,174,174,174,175,175,175,175, +175,175,175,176,176,176,176,176,176,176,176,177,177,177,177,177,177,177,178,178, +178,178,178,178,178,178,179,179,179,179,179,179,179,180,180,180,180,180,180,180, +180,181,181,181,181,181,181,181,182,182,182,182,182,182,182,182,183,183,183,183, +183,183,183,184,184,184,184,184,184,184,184,185,185,185,185,185,185,185,186,186, +186,186,186,186,186,186,187,187,187,187,187,187,187,187,188,188,188,188,188,188, +188,189,189,189,189,189,189,189,189,190,190,190,190,190,190,190,190,191,191,191, +191,191,191,191,192,192,192,192,192,192,192,192,193,193,193,193,193,193,193,193, +194,194,194,194,194,194,194,195,195,195,195,195,195,195,195,196,196,196,196,196, +196,196,196,197,197,197,197,197,197,197,197,198,198,198,198,198,198,198,199,199, +199,199,199,199,199,199,200,200,200,200,200,200,200,200,201,201,201,201,201,201, +201,201,202,202,202,202,202,202,202,202,203,203,203,203,203,203,203,204,204,204, +204,204,204,204,204,205,205,205,205,205,205,205,205,206,206,206,206,206,206,206, +206,207,207,207,207,207,207,207,207,208,208,208,208,208,208,208,208,209,209,209, +209,209,209,209,209,210,210,210,210,210,210,210,210,211,211,211,211,211,211,211, +211,212,212,212,212,212,212,212,212,213,213,213,213,213,213,213,213,214,214,214, +214,214,214,214,214,215,215,215,215,215,215,215,215,216,216,216,216,216,216,216, +216,217,217,217,217,217,217,217,217,218,218,218,218,218,218,218,218,219,219,219, +219,219,219,219,219,220,220,220,220,220,220,220,220,221,221,221,221,221,221,221, +221,222,222,222,222,222,222,222,222,223,223,223,223,223,223,223,223,224,224,224, +224,224,224,224,224,225,225,225,225,225,225,225,225,226,226,226,226,226,226,226, +226,227,227,227,227,227,227,227,227,228,228,228,228,228,228,228,228,229,229,229, +229,229,229,229,229,229,230,230,230,230,230,230,230,230,231,231,231,231,231,231, +231,231,232,232,232,232,232,232,232,232,233,233,233,233,233,233,233,233,234,234, +234,234,234,234,234,234,234,235,235,235,235,235,235,235,235,236,236,236,236,236, +236,236,236,237,237,237,237,237,237,237,237,238,238,238,238,238,238,238,238,238, +239,239,239,239,239,239,239,239,240,240,240,240,240,240,240,240,241,241,241,241, +241,241,241,241,242,242,242,242,242,242,242,242,242,243,243,243,243,243,243,243, +243,244,244,244,244,244,244,244,244,245,245,245,245,245,245,245,245,245,246,246, +246,246,246,246,246,246,247,247,247,247,247,247,247,247,248,248,248,248,248,248, +248,248,248,249,249,249,249,249,249,249,249,250,250,250,250,250,250,250,250,250, +251,251,251,251,251,251,251,251,252,252,252,252,252,252,252,252,253,253,253,253, +253,253,253,253,253,254,254,254,254,254,254,254,254,255,255,255,255,255,255,255, +255,255,256,256,256,256,256,256,256,256,257,257,257,257,257,257,257,257,257,258, +258,258,258,258,258,258,258,259,259,259,259,259,259,259,259,259,260,260,260,260, +260,260,260,260,261,261,261,261,261,261,261,261,261,262,262,262,262,262,262,262, +262,263,263,263,263,263,263,263,263,263,264,264,264,264,264,264,264,264,265,265, +265,265,265,265,265,265,265,266,266,266,266,266,266,266,266,267,267,267,267,267, +267,267,267,267,268,268,268,268,268,268,268,268,268,269,269,269,269,269,269,269, +269,270,270,270,270,270,270,270,270,270,271,271,271,271,271,271,271,271,271,272, +272,272,272,272,272,272,272,273,273,273,273,273,273,273,273,273,274,274,274,274, +274,274,274,274,275,275,275,275,275,275,275,275,275,276,276,276,276,276,276,276, +276,276,277,277,277,277,277,277,277,277,277,278,278,278,278,278,278,278,278,279, +279,279,279,279,279,279,279,279,280,280,280,280,280,280,280,280,280,281,281,281, +281,281,281,281,281,282,282,282,282,282,282,282,282,282,283,283,283,283,283,283, +283,283,283,284,284,284,284,284,284,284,284,284,285,285,285,285,285,285,285,285, +286,286,286,286,286,286,286,286,286,287,287,287,287,287,287,287,287,287,288,288, +288,288,288,288,288,288,288,289,289,289,289,289,289,289,289,289,290,290,290,290, +290,290,290,290,291,291,291,291,291,291,291,291,291,292,292,292,292,292,292,292, +292,292,293,293,293,293,293,293,293,293,293,294,294,294,294,294,294,294,294,294, +295,295,295,295,295,295,295,295,295,296,296,296,296,296,296,296,296,296,297,297, +297,297,297,297,297,297,297,298,298,298,298,298,298,298,298,299,299,299,299,299, +299,299,299,299,300,300,300,300,300,300,300,300,300,301,301,301,301,301,301,301, +301,301,302,302,302,302,302,302,302,302,302,303,303,303,303,303,303,303,303,303, +304,304,304,304,304,304,304,304,304,305,305,305,305,305,305,305,305,305,306,306, +306,306,306,306,306,306,306,307,307,307,307,307,307,307,307,307,308,308,308,308, +308,308,308,308,308,309,309,309,309,309,309,309,309,309,310,310,310,310,310,310, +310,310,310,311,311,311,311,311,311,311,311,311,312,312,312,312,312,312,312,312, +312,313,313,313,313,313,313,313,313,313,314,314,314,314,314,314,314,314,314,315, +315,315,315,315,315,315,315,315,316,316,316,316,316,316,316,316,316,317,317,317, +317,317,317,317,317,317,318,318,318,318,318,318,318,318,318,318,319,319,319,319, +319,319,319,319,319,320,320,320,320,320,320,320,320,320,321,321,321,321,321,321, +321,321,321,322,322,322,322,322,322,322,322,322,323,323,323,323,323,323,323,323, +323,324,324,324,324,324,324,324,324,324,325,325,325,325,325,325,325,325,325,325, +326,326,326,326,326,326,326,326,326,327,327,327,327,327,327,327,327,327,328,328, +328,328,328,328,328,328,328,329,329,329,329,329,329,329,329,329,330,330,330,330, +330,330,330,330,330,330,331,331,331,331,331,331,331,331,331,332,332,332,332,332, +332,332,332,332,333,333,333,333,333,333,333,333,333,334,334,334,334,334,334,334, +334,334,335,335,335,335,335,335,335,335,335,335,336,336,336,336,336,336,336,336, +336,337,337,337,337,337,337,337,337,337,338,338,338,338,338,338,338,338,338,338, +339,339,339,339,339,339,339,339,339,340,340,340,340,340,340,340,340,340,341,341, +341,341,341,341,341,341,341,341,342,342,342,342,342,342,342,342,342,343,343,343, +343,343,343,343,343,343,344,344,344,344,344,344,344,344,344,344,345,345,345,345, +345,345,345,345,345,346,346,346,346,346,346,346,346,346,347,347,347,347,347,347, +347,347,347,347,348,348,348,348,348,348,348,348,348,349,349,349,349,349,349,349, +349,349,350,350,350,350,350,350,350,350,350,350,351,351,351,351,351,351,351,351, +351,352,352,352,352,352,352,352,352,352,352,353,353,353,353,353,353,353,353,353, +354,354,354,354,354,354,354,354,354,355,355,355,355,355,355,355,355,355,355,356, +356,356,356,356,356,356,356,356,357,357,357,357,357,357,357,357,357,357,358,358, +358,358,358,358,358,358,358,359,359,359,359,359,359,359,359,359,359,360,360,360, +360,360,360,360,360,360,361,361,361,361,361,361,361,361,361,361,362,362,362,362, +362,362,362,362,362,363,363,363,363,363,363,363,363,363,363,364,364,364,364,364, +364,364,364,364,365,365,365,365,365,365,365,365,365,365,366,366,366,366,366,366, +366,366,366,367,367,367,367,367,367,367,367,367,367,368,368,368,368,368,368,368, +368,368,369,369,369,369,369,369,369,369,369,369,370,370,370,370,370,370,370,370, +370,370,371,371,371,371,371,371,371,371,371,372,372,372,372,372,372,372,372,372, +372,373,373,373,373,373,373,373,373,373,374,374,374,374,374,374,374,374,374,374, +375,375,375,375,375,375,375,375,375,375,376,376,376,376,376,376,376,376,376,377, +377,377,377,377,377,377,377,377,377,378,378,378,378,378,378,378,378,378,379,379, +379,379,379,379,379,379,379,379,380,380,380,380,380,380,380,380,380,380,381,381, +381,381,381,381,381,381,381,382,382,382,382,382,382,382,382,382,382,383,383,383, +383,383,383,383,383,383,383,384,384,384,384,384,384,384,384,384,385,385,385,385, +385,385,385,385,385,385,386,386,386,386,386,386,386,386,386,386,387,387,387,387, +387,387,387,387,387,387,388,388,388,388,388,388,388,388,388,389,389,389,389,389, +389,389,389,389,389,390,390,390,390,390,390,390,390,390,390,391,391,391,391,391, +391,391,391,391,391,392,392,392,392,392,392,392,392,392,393,393,393,393,393,393, +393,393,393,393,394,394,394,394,394,394,394,394,394,394,395,395,395,395,395,395, +395,395,395,395,396,396,396,396,396,396,396,396,396,397,397,397,397,397,397,397, +397,397,397,398,398,398,398,398,398,398,398,398,398,399,399,399,399,399,399,399, +399,399,399,400,400,400,400,400,400,400,400,400,400,401,401,401,401,401,401,401, +401,401,402,402,402,402,402,402,402,402,402,402,403,403,403,403,403,403,403,403, +403,403,404,404,404,404,404,404,404,404,404,404,405,405,405,405,405,405,405,405, +405,405,406,406,406,406,406,406,406,406,406,406,407,407,407,407,407,407,407,407, +407,407,408,408,408,408,408,408,408,408,408,408,409,409,409,409,409,409,409,409, +409,410,410,410,410,410,410,410,410,410,410,411,411,411,411,411,411,411,411,411, +411,412,412,412,412,412,412,412,412,412,412,413,413,413,413,413,413,413,413,413, +413,414,414,414,414,414,414,414,414,414,414,415,415,415,415,415,415,415,415,415, +415,416,416,416,416,416,416,416,416,416,416,417,417,417,417,417,417,417,417,417, +417,418,418,418,418,418,418,418,418,418,418,419,419,419,419,419,419,419,419,419, +419,420,420,420,420,420,420,420,420,420,420,421,421,421,421,421,421,421,421,421, +421,422,422,422,422,422,422,422,422,422,422,423,423,423,423,423,423,423,423,423, +423,424,424,424,424,424,424,424,424,424,424,425,425,425,425,425,425,425,425,425, +425,426,426,426,426,426,426,426,426,426,426,427,427,427,427,427,427,427,427,427, +427,428,428,428,428,428,428,428,428,428,428,429,429,429,429,429,429,429,429,429, +429,430,430,430,430,430,430,430,430,430,430,431,431,431,431,431,431,431,431,431, +431,432,432,432,432,432,432,432,432,432,432,433,433,433,433,433,433,433,433,433, +433,434,434,434,434,434,434,434,434,434,434,435,435,435,435,435,435,435,435,435, +435,435,436,436,436,436,436,436,436,436,436,436,437,437,437,437,437,437,437,437, +437,437,438,438,438,438,438,438,438,438,438,438,439,439,439,439,439,439,439,439, +439,439,440,440,440,440,440,440,440,440,440,440,441,441,441,441,441,441,441,441, +441,441,442,442,442,442,442,442,442,442,442,442,443,443,443,443,443,443,443,443, +443,443,443,444,444,444,444,444,444,444,444,444,444,445,445,445,445,445,445,445, +445,445,445,446,446,446,446,446,446,446,446,446,446,447,447,447,447,447,447,447, +447,447,447,448,448,448,448,448,448,448,448,448,448,448,449,449,449,449,449,449, +449,449,449,449,450,450,450,450,450,450,450,450,450,450,451,451,451,451,451,451, +451,451,451,451,452,452,452,452,452,452,452,452,452,452,453,453,453,453,453,453, +453,453,453,453,453,454,454,454,454,454,454,454,454,454,454,455,455,455,455,455, +455,455,455,455,455,456,456,456,456,456,456,456,456,456,456,457,457,457,457,457, +457,457,457,457,457,457,458,458,458,458,458,458,458,458,458,458,459,459,459,459, +459,459,459,459,459,459,460,460,460,460,460,460,460,460,460,460,460,461,461,461, +461,461,461,461,461,461,461,462,462,462,462,462,462,462,462,462,462,463,463,463, +463,463,463,463,463,463,463,463,464,464,464,464,464,464,464,464,464,464,465,465, +465,465,465,465,465,465,465,465,466,466,466,466,466,466,466,466,466,466,466,467, +467,467,467,467,467,467,467,467,467,468,468,468,468,468,468,468,468,468,468,469, +469,469,469,469,469,469,469,469,469,469,470,470,470,470,470,470,470,470,470,470, +471,471,471,471,471,471,471,471,471,471,472,472,472,472,472,472,472,472,472,472, +472,473,473,473,473,473,473,473,473,473,473,474,474,474,474,474,474,474,474,474, +474,475,475,475,475,475,475,475,475,475,475,475,476,476,476,476,476,476,476,476, +476,476,477,477,477,477,477,477,477,477,477,477,477,478,478,478,478,478,478,478, +478,478,478,479,479,479,479,479,479,479,479,479,479,479,480,480,480,480,480,480, +480,480,480,480,481,481,481,481,481,481,481,481,481,481,482,482,482,482,482,482, +482,482,482,482,482,483,483,483,483,483,483,483,483,483,483,484,484,484,484,484, +484,484,484,484,484,484,485,485,485,485,485,485,485,485,485,485,486,486,486,486, +486,486,486,486,486,486,486,487,487,487,487,487,487,487,487,487,487,488,488,488, +488,488,488,488,488,488,488,488,489,489,489,489,489,489,489,489,489,489,490,490, +490,490,490,490,490,490,490,490,490,491,491,491,491,491,491,491,491,491,491,492, +492,492,492,492,492,492,492,492,492,492,493,493,493,493,493,493,493,493,493,493, +494,494,494,494,494,494,494,494,494,494,494,495,495,495,495,495,495,495,495,495, +495,496,496,496,496,496,496,496,496,496,496,496,497,497,497,497,497,497,497,497, +497,497,497,498,498,498,498,498,498,498,498,498,498,499,499,499,499,499,499,499, +499,499,499,499,500,500,500,500,500,500,500,500,500,500,501,501,501,501,501,501, +501,501,501,501,501,502,502,502,502,502,502,502,502,502,502,503,503,503,503,503, +503,503,503,503,503,503,504,504,504,504,504,504,504,504,504,504,504,505,505,505, +505,505,505,505,505,505,505,506,506,506,506,506,506,506,506,506,506,506,507,507, +507,507,507,507,507,507,507,507,507,508,508,508,508,508,508,508,508,508,508,509, +509,509,509,509,509,509,509,509,509,509,510,510,510,510,510,510,510,510,510,510, +510,511,511,511,511,511,511,511,511,511,511,512,512,512,512,512 }; + +static const int order[32] = +{ 0, 1, 16, 17, 8, 9, 24, 25, 4, 5, 20, 21, 12, 13, 28, 29, + 2, 3, 18, 19,10,11, 26, 27, 6, 7, 22, 23, 14, 15, 30, 31 }; + +static const unsigned long sampr_index[2][3] = +{ { 22050, 24000, 16000 }, /* MPEG 2 */ + { 44100, 48000, 32000 } }; /* MPEG 1 */ + +static const long bitr_index[2][15] = +{ {0, 8,16,24,32,40,48,56, 64, 80, 96,112,128,144,160}, /* MPEG 2 */ + {0,32,40,48,56,64,80,96,112,128,160,192,224,256,320} }; /* MPEG 1 */ + +static const int num_bands[3][15] = +{ {0,10,10,10,10,12,14,16, 20, 22, 24, 26, 28, 30, 32}, + {0,10,10,10,10,10,12,14, 18, 24, 26, 28, 30, 32, 32}, + {0,10,12,14,18,24,26,28, 30, 32, 32, 32, 32, 32, 32} }; + +static const int cx_const[9] = +{ 16135, 10531, 5604, 15396, -2845,-12551, 14189, 8192, 16384 }; + +static const int ca_const[8] = +{-16859,-15458,-10269, -5961, -3099, -1342, -465, -121 }; + +static const int cs_const[8] = +{ 28098, 28893, 31117, 32221, 32621, 32740, 32765, 32768 }; + +static const short enwindow_const[15*27+24] = +{ 0, 65, 593, 1766, 22228, 2115, 611, 62, + 8, 119, 1419, 10564,-11659,-1635,-154, -9, + -8, -119,-1419,-10564, 11659, 1635, 154, 9, 464, 100, 91, + 0, 69, 604, 1635, 23148, 2363, 643, 62, + 7, 107, 1368, 10449,-12733,-1818,-180,-11, + -7, -107,-1368,-10449, 12733, 1818, 180, 11, 420, 200, 164, + 0, 72, 608, 1465, 23979, 2600, 671, 63, + 7, 94, 1305, 10265,-13818,-2004,-207,-12, + -7, -94,-1305,-10265, 13818, 2004, 207, 12, 380, 297, 220, + 0, 76, 606, 1256, 24718, 2825, 693, 63, + 6, 81, 1232, 10016,-14908,-2192,-236,-14, + -6, -81,-1232,-10016, 14908, 2192, 236, 14, 342, 392, 262, + 0, 78, 597, 1007, 25359, 3033, 712, 63, + 6, 68, 1150, 9706,-15995,-2380,-267,-15, + -6, -68,-1150, -9706, 15995, 2380, 267, 15, 307, 483, 289, + 0, 80, 580, 719, 25901, 3224, 726, 62, + 6, 54, 1060, 9343,-17072,-2565,-299,-17, + -6, -54,-1060, -9343, 17072, 2565, 299, 17, 274, 569, 304, + -1, 82, 555, 391, 26339, 3395, 735, 61, + 5, 40, 963, 8930,-18131,-2747,-332,-19, + -5, -40, -963, -8930, 18131, 2747, 332, 19, 242, 650, 307, + -1, 83, 523, 26, 26672, 3545, 740, 60, + 5, 27, 861, 8474,-19164,-2923,-366,-21, + -5, -27, -861, -8474, 19164, 2923, 366, 21, 212, 724, 300, + -1, 83, 482, -376, 26900, 3672, 739, 58, + 4, 14, 756, 7981,-20163,-3092,-401,-24, + -4, -14, -756, -7981, 20163, 3092, 401, 24, 183, 792, 283, + -1, 82, 433, -812, 27022, 3776, 735, 56, + 4, 1, 648, 7456,-21122,-3250,-435,-26, + -4, -1, -648, -7456, 21122, 3250, 435, 26, 155, 851, 258, + -1, 81, 376, -1281, 27038, 3855, 726, 54, + 3, -11, 539, 6907,-22032,-3397,-470,-28, + -3, 11, -539, -6907, 22032, 3397, 470, 28, 128, 903, 226, + -1, 78, 312, -1778, 26951, 3910, 713, 52, + 3, -22, 430, 6338,-22887,-3530,-503,-31, + -3, 22, -430, -6338, 22887, 3530, 503, 31, 102, 946, 188, + -2, 75, 239, -2302, 26761, 3941, 696, 49, + 3, -33, 322, 5757,-23678,-3648,-537,-34, + -3, 33, -322, -5757, 23678, 3648, 537, 34, 76, 980, 145, + -2, 70, 160, -2848, 26472, 3948, 676, 47, + 3, -42, 217, 5167,-24399,-3749,-568,-36, + -3, 42, -217, -5167, 24399, 3749, 568, 36, 50, 1004, 99, + -2, 65, 74, -3412, 26087, 3931, 653, 44, + 2, -51, 115, 4577,-25045,-3830,-599,-39, + -2, 51, -115, -4577, 25045, 3830, 599, 39, 25, 1019, 50, + + 25610,3891,627,42,-3990,-18,58,-2, + 21226,-21226,10604,-10604,1860,-1860,1458,-1458,576,-576,130,-130,60,-60,8,-8 +}; + +static const int win_const[18][4] = { + { -3072, -134, -146, 3352 }, + { -2747, -362, -471, 3579 }, + { -2387, -529, -831, 3747 }, + { -2004, -632,-1214, 3850 }, + { -1609, -666,-1609, 3884 }, + { -1214, -632,-2004, 3850 }, + { -831, -529,-2387, 3747 }, + { -471, -362,-2747, 3579 }, + { -146, -134,-3072, 3352 }, + { 134,-3072,-3352, -146 }, + { 362,-2747,-3579, -471 }, + { 529,-2387,-3747, -831 }, + { 632,-2004,-3850,-1214 }, + { 666,-1609,-3884,-1609 }, + { 632,-1214,-3850,-2004 }, + { 529, -831,-3747,-2387 }, + { 362, -471,-3579,-2747 }, + { 134, -146,-3352,-3072 } }; + +/* forward declarations */ +static int HuffmanCode( short *ix, char *xr_sign, uint32_t begin, uint32_t end, int table); +static int HuffmanCod1( short *ix, char *xr_sign, uint32_t begin, uint32_t end, int table); +static void putbits(uint32_t val, uint32_t nbit); +static int find_best_2( short *ix, uint32_t start, uint32_t end, const uint32_t *table, + uint32_t len, int *bits); +static int find_best_3( short *ix, uint32_t start, uint32_t end, const uint32_t *table, + uint32_t len, int *bits); +static int count_bit1 ( short *ix, uint32_t start, uint32_t end, int *bits ); +static int count_bigv ( short *ix, uint32_t start, uint32_t end, int table0, int table1, + int *bits); + +/* implementations */ +static void encodeSideInfo( side_info_t si[2][2] ) +{ + int gr, ch, header; + uint32_t cc=0, sz=0; + + /* + * MPEG header layout: + * AAAAAAAA AAABBCCD EEEEFFGH IIJJKLMM + * A (31-21) = frame sync + * B (20-19) = MPEG type + * C (18-17) = MPEG layer + * D (16) = protection bit + * E (15-12) = bitrate index + * F (11-10) = samplerate index + * G (9) = padding bit + * H (8) = private bit + * I (7-6) = channel mode + * J (5-4) = mode extension (jstereo only) + * K (3) = copyright bit + * L (2) = original + * M (1-0) = emphasis + */ + + header = (0xfff00000) | /* frame sync (AAAAAAAAA AAA) + mp3 type (upper): 1 (B) */ + (0x01 << 17) | /* mp3 layer: 01 (CC) */ + ( 0x1 << 16) | /* mp3 crc: 1 (D) */ + ( 0x1 << 2); /* mp3 org: 1 (L) */ + header |= cfg.mpg.type << 19; + header |= cfg.mpg.bitr_id << 12; + header |= cfg.mpg.smpl_id << 10; + header |= cfg.mpg.padding << 9; + header |= cfg.mpg.mode << 6; + /* no emphasis (bits 0-1) */ + putbits( header, 32 ); + + if(cfg.mpg.type == 1) + { /* MPEG1 */ + if(cfg.channels == 2) { putlong( 0, 20); } + else { putlong( 0, 18); } + + for(gr=0; grpart2_3_length+42),12 ); /* add scale_facs array size */ + putlong( gi->address3>>1, 9 ); + putlong( gi->global_gain, 8 ); + putlong( 9, 4 ); /* set scale_facs compr type */ + putlong( gi->table_select[0], 6 ); + putlong( gi->table_select[1], 5 ); + putlong( gi->table_select[2], 5 ); + putlong( gi->region_0_1, 7 ); + putlong( 1 , 2 ); /* set scale_facs to 1bit */ + putlong( gi->table_select[3], 1 ); + } + } + else + { /* MPEG2 */ + if(cfg.channels == 2) { putlong( 0, 10); } + else { putlong( 0, 9); } + + for(ch=0; chpart2_3_length+42),12 ); /* add scale_facs array size */ + putlong( gi->address3>>1, 9 ); + putlong( gi->global_gain, 8 ); + putlong( 0xCA, 9 ); /* set scale_facs compr type */ + putlong( gi->table_select[0], 6 ); + putlong( gi->table_select[1], 5 ); + putlong( gi->table_select[2], 5 ); + putlong( gi->region_0_1 , 7 ); + putlong( 1 , 1 ); /* set scale_facs to 1bit */ + putlong( gi->table_select[3], 1 ); + } + } + /* flush remaining bits */ + putbits(cc, sz); +} + +/* Note the discussion of huffmancodebits() on pages 28 and 29 of the IS, + as well as the definitions of the side information on pages 26 and 27. */ +static void Huffmancodebits( short *ix, char *xr_sign, side_info_t *gi ) +{ + int region1 = gi->address1; + int region2 = gi->address2; + int bigvals = gi->address3; + int count1 = bigvals + (gi->count1 << 2); + int stuffBits = 0; + int bits = 0; + int i, v; + + for(i=v=0; i<32; i+=2) + v |= band_scale_f[i>>1] << (30-i); + putbits(v, 32); // store scale_facs (part1) + + for(v=0; i<42; i+=2) + v |= band_scale_f[i>>1] << (40-i); + putbits(v, 10); // store scale_facs (part2) + + if(region1 > 0) + bits += HuffmanCode(ix, xr_sign, 0 , region1, gi->table_select[0]); + + if(region2 > region1) + bits += HuffmanCode(ix, xr_sign, region1, region2, gi->table_select[1]); + + if(bigvals > region2) + bits += HuffmanCode(ix, xr_sign, region2, bigvals, gi->table_select[2]); + + if(count1 > bigvals) + bits += HuffmanCod1(ix, xr_sign, bigvals, count1, gi->table_select[3]); + + if((stuffBits = gi->part2_3_length - bits) > 0) + { + int stuffWords = stuffBits >> 5; + int remainBits = stuffBits & 31; + + if( remainBits ) + putbits( ~0, remainBits ); + + while( stuffWords-- ) + putbits( ~0, 32 ); /* Huffman code tables leed to padding ones */ + } +} + +int HuffmanCod1( short *ix, char *xr_sign, uint32_t begin, uint32_t end, int tbl) +{ + uint32_t cc=0, sz=0; + uint32_t i, d, p; + int sumbit=0, s=0, l=0, v, w, x, y; + #define sgnv xr_sign[i+0] + #define sgnw xr_sign[i+1] + #define sgnx xr_sign[i+2] + #define sgny xr_sign[i+3] + + for(i=begin; i 15 ) + { /* ESC-table is used */ + uint32_t linbits = ht_big[table-16].linbits; + uint16_t *hffcode = table < 24 ? t16HB : t24HB; + uint8_t *hlen = table < 24 ? t16l : t24l; + + for(i=begin; i 14) { xl = x - 15; x = 15; } + if(y > 14) { yl = y - 15; y = 15; } + + idx = x * 16 + y; + code = hffcode[idx]; + bit = hlen [idx]; + + if(x) + { + if(x > 14) + { + code = (code << linbits) | xl; + bit += linbits; + } + + code = (code << 1) | sign_x; + bit += 1; + } + + if(y) + { + if(y > 14) + { + if(bit + linbits + 1 > 32) + { + putlong( code, bit ); + sumbit += bit; + code = bit = 0; + } + + code = (code << linbits) | yl; + bit += linbits; + } + + code = (code << 1) | sign_y; + bit += 1; + } + + putlong( code, bit ); + sumbit += bit; + } + } + else + { /* No ESC-words */ + const struct huffcodetab *h = &ht[table]; + + for(i=begin; ilen + y; + code = h->table[idx]; + bit = h->hlen [idx]; + + if(x) + { + code = (code << 1) | sign_x; + bit += 1; + } + + if(y) + { + code = (code << 1) | sign_y; + bit += 1; + } + + putlong( code, bit ); + sumbit += bit; + } + } + + /* flush remaining bits */ + putbits(cc, sz); + + return sumbit; +} + +void putbits(uint32_t val, uint32_t nbit) +{ + int new_bitpos = CodedData.bitpos + nbit; + int ptrpos = CodedData.bitpos >> 5; + + val = val & (0xffffffff >> (32 - nbit)); + + /* data fit in one uint32_t */ + if(((new_bitpos - 1) >> 5) == ptrpos) + CodedData.bbuf[ptrpos] |= val << ((32 - new_bitpos) & 31); + else + { + CodedData.bbuf[ptrpos ] |= val >> ((new_bitpos - 32) & 31); + CodedData.bbuf[ptrpos+1] |= val << ((32 - new_bitpos) & 31); + } + + CodedData.bitpos = new_bitpos; +} + +/***************************************************************************/ +/* Choose the Huffman table that will encode ix[begin..end] with */ +/* the fewest bits. */ +/* Note: This code contains knowledge about the sizes and characteristic */ +/* of the Huffman tables as defined in the IS (Table B.7), and will not */ +/* work with any arbitrary tables. */ +/***************************************************************************/ +static int choose_table( short *ix, uint32_t begin, uint32_t end, int *bits ) +{ + uint32_t i; + int max, table0, table1; + + for(i=begin,max=0; i max) + max = ix[i]; + + if(max < 16) + { + /* tables without linbits */ + /* indx: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 */ + /* len: 0, 2, 3, 3, 0, 4, 4, 6, 6, 6, 8, 8, 8, 16, 0, 16 */ + switch(max) + { + case 0: return 0; + case 1: return count_bit1(ix, begin, end, bits); + case 2: return 2 + find_best_2(ix, begin, end, tab23, 3, bits); + case 3: return 5 + find_best_2(ix, begin, end, tab56, 4, bits); + case 4: + case 5: return 7 + find_best_3(ix, begin, end, tab789, 6, bits); + case 6: + case 7: return 10 + find_best_3(ix, begin, end, tabABC, 8, bits); + default: return 13 + find_best_2(ix, begin, end, tab1315, 16, bits) * 2; + } + } + else + { + /* tables with linbits */ + max -= 15; + + for(table0=0; table0<8; table0++) + if(ht_big[table0].linmax >= max) + break; + + for(table1=8; table1<16; table1++) + if(ht_big[table1].linmax >= max) + break; + + return 16 + count_bigv(ix, begin, end, table0, table1, bits); + } +} + +int find_best_2(short *ix, uint32_t start, uint32_t end, const uint32_t *table, + uint32_t len, int *bits) +{ + uint32_t i, sum = 0; + + for(i=start; i> 16)) + { + *bits = (sum & 0xffff); + return 1; + } + else + { + *bits = sum >> 16; + return 0; + } +} + +int find_best_3(short *ix, uint32_t start, uint32_t end, const uint32_t *table, + uint32_t len, int *bits) +{ + uint32_t i, j, sum = 0; + int sum1 = 0; + int sum2 = 0; + int sum3 = 0; + + /* avoid overflow in packed additions: 78*13 < 1024 */ + for(i=start; i end ? end : i + 2*78; + + for(sum=0; i> 20); + sum2 += (sum >> 10) & 0x3ff; + sum3 += (sum >> 0) & 0x3ff; + } + + i = 0; + if(sum1 > sum2) { sum1 = sum2; i = 1; } + if(sum1 > sum3) { sum1 = sum3; i = 2; } + + *bits = sum1; + + return i; +} + +/*************************************************************************/ +/* Function: Count the number of bits necessary to code the subregion. */ +/*************************************************************************/ +int count_bit1(short *ix, uint32_t start, uint32_t end, int *bits ) +{ + uint32_t i, sum = 0; + + for(i=start; i 14) { x = 15; bigv++; } + if(y > 14) { y = 15; bigv++; } + + sum += tab1624[x * 16 + y]; + } + + sum0 = (sum >> 16) + bigv * ht_big[table0].linbits; + sum1 = (sum & 0xffff) + bigv * ht_big[table1].linbits; + + if(sum0 <= sum1) + { + *bits = sum0; + return table0; + } + else + { + *bits = sum1; + return table1; + } +} + +/*************************************************************************/ +/* Function: Calculation of rzero, count1, address3 */ +/* (Partitions ix into big values, quadruples and zeros). */ +/*************************************************************************/ +static int calc_runlen( short *ix, side_info_t *si ) +{ + int p, i, sum = 0; + + for(i=SAMPL2; i-=2; ) + if(*(uint32_t*)&ix[i-2]) /* !!!! short *ix; !!!!! */ + break; + + si->count1 = 0; + + for( ; i>3; i-=4) + { + int v = ix[i-1]; + int w = ix[i-2]; + int x = ix[i-3]; + int y = ix[i-4]; + + if((v | w | x | y) <= 1) + { + p = (y<<3) + (x<<2) + (w<<1) + (v); + + sum += tab01[p]; + + si->count1++; + } + else break; + } + + si->address3 = i; + + if((sum >> 16) < (sum & 0xffff)) + { + si->table_select[3] = 0; + return sum >> 16; + } + else + { + si->table_select[3] = 1; + return sum & 0xffff; + } +} + + +/*************************************************************************/ +/* Function: Quantization of the vector xr ( -> ix) */ +/*************************************************************************/ +static int quantize_int(int *xr, short *ix, side_info_t *si) +{ + unsigned int i, idx, s, frac_pow[] = { 0x10000, 0xd745, 0xb505, 0x9838 }; + + s = frac_pow[si->quantStep & 3] >> si->quantStep / 4; + + /* check for possible 'out of range' values */ + if(((si->max_val + 256) >> 8) * s >= (65536 << 8)) + return 0; + + if(((si->max_val + 256) >> 8) * s < (4096 << 8)) + { /* all values fit the table size */ + for(i=SAMPL2; i--; ) + ix[i] = int2idx[(xr[i] * s + 0x8000) >> 16]; + } + else + { /* check each index wether it fits the table */ + for(i=SAMPL2; i--; ) + { + idx = (xr[i] * s + 0x08000) >> 16; + + if(idx > 4095) ix[i] = int2idx[(idx + 8) >> 4] << 3; + else ix[i] = int2idx[idx]; + } + } + + return 1; +} + +/*************************************************************************/ +/* subdivides the bigvalue region which will use separate Huffman tables */ +/*************************************************************************/ +static void subdivide(side_info_t *si) +{ + int scfb, count0, count1; + + if( !si->address3 ) + { /* no bigvalue region */ + si->region_0_1 = 0; + si->address1 = 0; + si->address2 = 0; + } + else + { + /* Calculate scale factor band index */ + for(scfb=0; scalefac[scfb] < si->address3; ) + scfb++; + + count0 = subdv_table[scfb].region0_cnt; + count1 = subdv_table[scfb].region1_cnt; + + si->region_0_1 = (count0 << 3) | count1; + si->address1 = scalefac[count0 + 1]; + si->address2 = scalefac[count0 + 1 + count1 + 1]; + } +} + +/*******************************************************************/ +/* Count the number of bits necessary to code the bigvalues region */ +/*******************************************************************/ +static int bigv_bitcount(short *ix, side_info_t *gi) +{ + int b1=0, b2=0, b3=0; + + /* Select huffman code tables for bigvalues regions */ + gi->table_select[0] = 0; + gi->table_select[1] = 0; + gi->table_select[2] = 0; + + if( gi->address1 > 0 ) /* region0 */ + gi->table_select[0] = choose_table(ix, 0 , gi->address1, &b1); + + if( gi->address2 > gi->address1 ) /* region1 */ + gi->table_select[1] = choose_table(ix, gi->address1, gi->address2, &b2); + + if( gi->address3 > gi->address2 ) /* region2 */ + gi->table_select[2] = choose_table(ix, gi->address2, gi->address3, &b3); + + return b1+b2+b3; +} + +static int quantize_and_count_bits(int *xr, short *ix, side_info_t *si) +{ + int bits = 10000; + + if(quantize_int(xr, ix, si)) + { + bits = calc_runlen(ix, si); /* rzero,count1,address3 */ + subdivide(si); /* bigvalues sfb division */ + bits += bigv_bitcount(ix,si); /* bit count */ + } + + return bits; +} + +/************************************************************************/ +/* The code selects the best quantStep for a particular set of scalefacs*/ +/************************************************************************/ +static int inner_loop(int *xr, int max_bits, side_info_t *si) +{ + int bits; + + while((bits=quantize_and_count_bits(xr, enc_data, si)) < max_bits-64) + { + if(si->quantStep == 0) + break; + + if(si->quantStep <= 2) + si->quantStep = 0; + else + si->quantStep -= 2; + } + + while(bits > max_bits) + { + si->quantStep++; + bits = quantize_and_count_bits(xr, enc_data, si); + } + + return bits; +} + +static void iteration_loop(int *xr, side_info_t *si, int gr_cnt) +{ + int remain, tar_bits, max_bits = cfg.mean_bits; + + /* distribute reserved bits to remaining granules */ + tar_bits = max_bits + (cfg.ResvSize / gr_cnt & ~7); + if(tar_bits > max_bits + max_bits/2) + tar_bits = max_bits + max_bits/2; + + si->part2_3_length = inner_loop(xr, tar_bits, si); + si->global_gain = si->quantStep + 142 - si->additStep; + + /* unused bits of the reservoir can be used for remaining granules */ + cfg.ResvSize += max_bits - si->part2_3_length; + + /* end: distribute the reserved bits to one or two granules */ + if(gr_cnt == 1) + { + si->part2_3_length += cfg.ResvSize; + /* mp3 format allows max 12bits for granule length */ + if(si->part2_3_length > 4092) + { + remain = (si->part2_3_length - 4092 + 31) >> 5; + si->part2_3_length -= remain << 5; + si[-1].part2_3_length += remain << 5; + + while(remain--) + putbits(~0, 32); + } + } +} + +/* returns sum_j=0^31 a[j]*cos(PI*j*(k+1/2)/32), 0<=k<32 */ +static void window_subband1(short *wk, int sb0[SBLIMIT], int sb1[SBLIMIT]) +{ + int k, i, u, v; + short *wp, *x1, *x2; + +#ifdef CPU_COLDFIRE + int s0, s1, t0, t1; + + for(k=0; k<18; k++, wk+=64, sb0+=SBLIMIT, sb1+=SBLIMIT) + { + wp = enwindow; + x1 = wk; + x2 = x1 - 124; + + for(i=-15; i<0; i++) + { + asm volatile( + "move.l (-224*4,%[x2]), %%d4\n" /* d4 = x2[-224] */ + "movem.l (%[wp]), %%d0-%%d3\n" /* load 8 values */ + "mac.w %%d0u, %%d4u, %%acc0\n" + "mac.w %%d0u, %%d4l, (-160*4,%[x2]), %%d4, %%acc1\n" + "mac.w %%d0l, %%d4u, %%acc0\n" + "mac.w %%d0l, %%d4l, ( -96*4,%[x2]), %%d4, %%acc1\n" + "mac.w %%d1u, %%d4u, %%acc0\n" + "mac.w %%d1u, %%d4l, ( -32*4,%[x2]), %%d4, %%acc1\n" + "mac.w %%d1l, %%d4u, %%acc0\n" + "mac.w %%d1l, %%d4l, ( 32*4,%[x2]), %%d4, %%acc1\n" + "mac.w %%d2u, %%d4u, %%acc0\n" + "mac.w %%d2u, %%d4l, ( 96*4,%[x2]), %%d4, %%acc1\n" + "mac.w %%d2l, %%d4u, %%acc0\n" + "mac.w %%d2l, %%d4l, ( 160*4,%[x2]), %%d4, %%acc1\n" + "mac.w %%d3u, %%d4u, %%acc0\n" + "mac.w %%d3u, %%d4l, ( 224*4,%[x2]), %%d4, %%acc1\n" + "mac.w %%d3l, %%d4u, %%acc0\n" + "mac.w %%d3l, %%d4l, (-256*4,%[x1]), %%d4, %%acc1\n" + "movem.l (16,%[wp]), %%d0-%%d3\n" /* load 8 values */ + "mac.w %%d0u, %%d4u, %%acc0\n" + "mac.w %%d0u, %%d4l, (-192*4,%[x1]), %%d4, %%acc1\n" + "mac.w %%d0l, %%d4u, %%acc0\n" + "mac.w %%d0l, %%d4l, (-128*4,%[x1]), %%d4, %%acc1\n" + "mac.w %%d1u, %%d4u, %%acc0\n" + "mac.w %%d1u, %%d4l, ( -64*4,%[x1]), %%d4, %%acc1\n" + "mac.w %%d1l, %%d4u, %%acc0\n" + "mac.w %%d1l, %%d4l, ( 0*4,%[x1]), %%d4, %%acc1\n" + "mac.w %%d2u, %%d4u, %%acc0\n" + "mac.w %%d2u, %%d4l, ( 64*4,%[x1]), %%d4, %%acc1\n" + "mac.w %%d2l, %%d4u, %%acc0\n" + "mac.w %%d2l, %%d4l, ( 128*4,%[x1]), %%d4, %%acc1\n" + "mac.w %%d3u, %%d4u, %%acc0\n" + "mac.w %%d3u, %%d4l, ( 192*4,%[x1]), %%d4, %%acc1\n" + "mac.w %%d3l, %%d4u, %%acc0\n" + "mac.w %%d3l, %%d4l, ( 224*4,%[x1]), %%d4, %%acc1\n" + "movclr.l %%acc0, %%d0\n" + "move.l %%d0, %[s0]\n" + "movclr.l %%acc1, %%d0\n" + "move.l %%d0, %[s1]\n" + + "movem.l (%[wp]), %%d0-%%d3\n" /* load 8 values */ + "mac.w %%d0u, %%d4u, %%acc0\n" + "mac.w %%d0u, %%d4l, ( 160*4,%[x1]), %%d4, %%acc1\n" + "mac.w %%d0l, %%d4u, %%acc0\n" + "mac.w %%d0l, %%d4l, ( 96*4,%[x1]), %%d4, %%acc1\n" + "mac.w %%d1u, %%d4u, %%acc0\n" + "mac.w %%d1u, %%d4l, ( 32*4,%[x1]), %%d4, %%acc1\n" + "mac.w %%d1l, %%d4u, %%acc0\n" + "mac.w %%d1l, %%d4l, ( -32*4,%[x1]), %%d4, %%acc1\n" + "mac.w %%d2u, %%d4u, %%acc0\n" + "mac.w %%d2u, %%d4l, ( -96*4,%[x1]), %%d4, %%acc1\n" + "mac.w %%d2l, %%d4u, %%acc0\n" + "mac.w %%d2l, %%d4l, (-160*4,%[x1]), %%d4, %%acc1\n" + "mac.w %%d3u, %%d4u, %%acc0\n" + "mac.w %%d3u, %%d4l, (-224*4,%[x1]), %%d4, %%acc1\n" + "mac.w %%d3l, %%d4u, %%acc0\n" + "mac.w %%d3l, %%d4l, ( 256*4,%[x2]), %%d4, %%acc1\n" + "movem.l (32,%[wp]), %%d0-%%d3\n" /* load 8 values */ + "mac.w %%d0u, %%d4u, %%acc0\n" + "mac.w %%d0u, %%d4l, ( 192*4,%[x2]), %%d4, %%acc1\n" + "mac.w %%d0l, %%d4u, %%acc0\n" + "mac.w %%d0l, %%d4l, ( 128*4,%[x2]), %%d4, %%acc1\n" + "mac.w %%d1u, %%d4u, %%acc0\n" + "mac.w %%d1u, %%d4l, ( 64*4,%[x2]), %%d4, %%acc1\n" + "mac.w %%d1l, %%d4u, %%acc0\n" + "mac.w %%d1l, %%d4l, ( 0*4,%[x2]), %%d4, %%acc1\n" + "mac.w %%d2u, %%d4u, %%acc0\n" + "mac.w %%d2u, %%d4l, ( -64*4,%[x2]), %%d4, %%acc1\n" + "mac.w %%d2l, %%d4u, %%acc0\n" + "mac.w %%d2l, %%d4l, (-128*4,%[x2]), %%d4, %%acc1\n" + "mac.w %%d3u, %%d4u, %%acc0\n" + "mac.w %%d3u, %%d4l, (-192*4,%[x2]), %%d4, %%acc1\n" + "mac.w %%d3l, %%d4u, %%acc0\n" + "mac.w %%d3l, %%d4l, %%acc1\n" + "movclr.l %%acc0, %%d0\n" + "move.l %%d0, %[t0]\n" + "movclr.l %%acc1, %%d0\n" + "move.l %%d0, %[t1]\n" + + : [x1] "+a" (x1), [x2] "+a" (x2), [s0] "+m" (s0), [t0] "+m" (t0), + [s1] "+m" (s1), [t1] "+m" (t1) + : [wp] "a" (wp) : "d0", "d1", "d2", "d3", "d4"); + + sb0[30+i*2] = shft4(t0) + shft13(s0) * wp[24]; + sb0[31+i*2] = shft13(t0) * wp[25] - shft13(s0) * wp[26]; + sb1[30+i*2] = shft4(t1) + shft13(s1) * wp[24]; + sb1[31+i*2] = shft13(t1) * wp[25] - shft13(s1) * wp[26]; + wp += 27; + x1 -= 2; + x2 += 2; + } + + asm volatile( + "move.l ( -32*4,%[x1]), %%d4\n" /* d4 = x1[-32] */ + "movem.l (%[wp]), %%d0-%%d3\n" /* load 8 values */ + + "mac.w %%d0u, %%d4u, %%acc0\n" + "mac.w %%d0u, %%d4l, ( -96*4,%[x1]), %%d4, %%acc1\n" + "mac.w %%d0l, %%d4u, %%acc0\n" + "mac.w %%d0l, %%d4l, (-160*4,%[x1]), %%d4, %%acc1\n" + "mac.w %%d1u, %%d4u, %%acc0\n" + "mac.w %%d1u, %%d4l, (-224*4,%[x1]), %%d4, %%acc1\n" + "mac.w %%d1l, %%d4u, %%acc0\n" + "mac.w %%d1l, %%d4l, ( 32*4,%[x1]), %%d4, %%acc1\n" + "mac.w %%d2u, %%d4u, %%acc0\n" + "mac.w %%d2u, %%d4l, ( 96*4,%[x1]), %%d4, %%acc1\n" + "mac.w %%d2l, %%d4u, %%acc0\n" + "mac.w %%d2l, %%d4l, ( 160*4,%[x1]), %%d4, %%acc1\n" + "mac.w %%d3u, %%d4u, %%acc0\n" + "mac.w %%d3u, %%d4l, ( 224*4,%[x1]), %%d4, %%acc1\n" + "mac.w %%d3l, %%d4u, %%acc0\n" + "mac.w %%d3l, %%d4l, ( -16*4,%[x1]), %%d4, %%acc1\n" + "movclr.l %%acc0, %%d0\n" + "move.l %%d0, %[s0]\n" + "movclr.l %%acc1, %%d0\n" + "move.l %%d0, %[s1]\n" + + "movem.l (16,%[wp]), %%d0-%%d3\n" /* load 8 values */ + "mac.w %%d0u, %%d4u, %%acc0\n" + "mac.w %%d0u, %%d4l, ( -48*4,%[x1]), %%d4, %%acc1\n" + "mac.w %%d1u, %%d4u, %%acc0\n" + "mac.w %%d1u, %%d4l, ( 16*4,%[x1]), %%d4, %%acc1\n" + "mac.w %%d1l, %%d4u, %%acc0\n" + "mac.w %%d1l, %%d4l, ( -80*4,%[x1]), %%d4, %%acc1\n" + "mac.w %%d2u, %%d4u, %%acc0\n" + "mac.w %%d2u, %%d4l, ( 48*4,%[x1]), %%d4, %%acc1\n" + "mac.w %%d2u, %%d4u, %%acc0\n" + "mac.w %%d2u, %%d4l, (-112*4,%[x1]), %%d4, %%acc1\n" + "mac.w %%d3u, %%d4u, %%acc0\n" + "mac.w %%d3u, %%d4l, ( 80*4,%[x1]), %%d4, %%acc1\n" + "mac.w %%d3l, %%d4u, %%acc0\n" + "mac.w %%d3l, %%d4l, (-144*4,%[x1]), %%d4, %%acc1\n" + "movem.l (32,%[wp]), %%d0-%%d3\n" /* load 8 values */ + "mac.w %%d0u, %%d4u, %%acc0\n" + "mac.w %%d0u, %%d4l, ( 112*4,%[x1]), %%d4, %%acc1\n" + "mac.w %%d0u, %%d4u, %%acc0\n" + "mac.w %%d0u, %%d4l, (-176*4,%[x1]), %%d4, %%acc1\n" + "mac.w %%d1u, %%d4u, %%acc0\n" + "mac.w %%d1u, %%d4l, ( 144*4,%[x1]), %%d4, %%acc1\n" + "mac.w %%d1l, %%d4u, %%acc0\n" + "mac.w %%d1l, %%d4l, (-208*4,%[x1]), %%d4, %%acc1\n" + "mac.w %%d2u, %%d4u, %%acc0\n" + "mac.w %%d2u, %%d4l, ( 176*4,%[x1]), %%d4, %%acc1\n" + "mac.w %%d2u, %%d4u, %%acc0\n" + "mac.w %%d2u, %%d4l, (-240*4,%[x1]), %%d4, %%acc1\n" + "mac.w %%d3u, %%d4u, %%acc0\n" + "mac.w %%d3u, %%d4l, ( 208*4,%[x1]), %%d4, %%acc1\n" + "mac.w %%d3l, %%d4u, %%acc0\n" + "mac.w %%d3l, %%d4l, %%acc1\n" + "movclr.l %%acc0, %%d0\n" + "move.l %%d0, %[t0]\n" + "movclr.l %%acc1, %%d0\n" + "move.l %%d0, %[t1]\n" + + : [x1] "+a" (x1), [s0] "+m" (s0), [t0] "+m" (t0), + [s1] "+m" (s1), [t1] "+m" (t1) + : [wp] "a" (wp) : "d0", "d1", "d2", "d3", "d4"); + + u = shft4(s0 - t0); + v = shft4(s0 + t0); + t0 = sb0[14]; + s0 = sb0[15] - t0; + + sb0[31] = v + t0; /* A0 */ + sb0[30] = u + s0; /* A1 */ + sb0[15] = u - s0; /* A2 */ + sb0[14] = v - t0; /* A3 */ + + u = shft4(s1 - t1); + v = shft4(s1 + t1); + t1 = sb1[14]; + s1 = sb1[15] - t1; + + sb1[31] = v + t1; /* A0 */ + sb1[30] = u + s1; /* A1 */ + sb1[15] = u - s1; /* A2 */ + sb1[14] = v - t1; /* A3 */ + } +#else + int ch, s, t, *a; + + for(ch=0; ch= (32000+24000)/2 ? 1 : 0; + + unsigned long dmin = ULONG_MAX; + int idmin = -1, i; + + for (i = 0; i < 3; i++) + { + unsigned long diff; + + if (sampr_index[mpeg][i] == freq) + { + idmin = i; + break; + } + + if ((long)sampr_index[mpeg][i] < (long)freq) + diff = freq - sampr_index[mpeg][i]; + else + diff = sampr_index[mpeg][i] - freq; + + if (diff < dmin) + { + dmin = diff; + idmin = i; + } + } + + *mp3_type = mpeg; + return idmin; +} + +static bool init_mp3_encoder_engine(int sample_rate, int num_channels, int bitrate) +{ + const bool stereo = num_channels > 1; + uint32_t avg_byte_per_frame; + + cfg.channels = stereo ? 2 : 1; + cfg.mpg.mode = stereo ? 0 : 3; /* 0=stereo, 3=mono */ + cfg.mpg.smpl_id = find_samplerate_index(sample_rate, &cfg.mpg.type); + cfg.samplerate = sampr_index[cfg.mpg.type][cfg.mpg.smpl_id]; + cfg.mpg.bitr_id = find_bitrate_index(cfg.mpg.type, bitrate /*, stereo */); + cfg.mpg.bitrate = bitr_index[cfg.mpg.type][cfg.mpg.bitr_id]; + cfg.mpg.num_bands = num_bands[stereo ? cfg.mpg.type : 2][cfg.mpg.bitr_id]; + + if (cfg.mpg.type == 1) + { + cfg.granules = 2; + pcm_chunk_size = PCM_CHUNK_SIZE1; + samp_per_frame = SAMP_PER_FRAME1; + } + else + { + cfg.granules = 1; + pcm_chunk_size = PCM_CHUNK_SIZE2; + samp_per_frame = SAMP_PER_FRAME2; + } + + memcpy(scalefac, sfBand[cfg.mpg.smpl_id + 3*cfg.mpg.type], sizeof(scalefac)); + memset(mfbuf , 0 , sizeof(mfbuf )); + memset(mdct_freq , 0 , sizeof(mdct_freq )); + memset(enc_data , 0 , sizeof(enc_data )); + memset(sb_data , 0 , sizeof(sb_data )); + memset(&CodedData, 0 , sizeof(CodedData )); + memcpy(ca , ca_const , sizeof(ca )); + memcpy(cs , cs_const , sizeof(cs )); + memcpy(cx , cx_const , sizeof(cx )); + memcpy(win , win_const , sizeof(win )); + memcpy(enwindow , enwindow_const , sizeof(enwindow )); + memcpy(int2idx , int2idx_const , sizeof(int2idx )); + memcpy(ht_count , ht_count_const , sizeof(ht_count )); + memcpy( tab01 , tab01_const , sizeof(tab01 )); + memcpy( tab23 , tab23_const , sizeof(tab23 )); + memcpy( tab56 , tab56_const , sizeof(tab56 )); + memcpy( tab1315 , tab1315_const , sizeof(tab1315 )); + memcpy( tab1624 , tab1624_const , sizeof(tab1624 )); + memcpy( tab789 , tab789_const , sizeof(tab789 )); + memcpy( tabABC , tabABC_const , sizeof(tabABC )); + memcpy( t1HB , t1HB_const , sizeof(t1HB )); + memcpy( t2HB , t2HB_const , sizeof(t2HB )); + memcpy( t3HB , t3HB_const , sizeof(t3HB )); + memcpy( t5HB , t5HB_const , sizeof(t5HB )); + memcpy( t6HB , t6HB_const , sizeof(t6HB )); + memcpy( t7HB , t7HB_const , sizeof(t7HB )); + memcpy( t8HB , t8HB_const , sizeof(t8HB )); + memcpy( t9HB , t9HB_const , sizeof(t9HB )); + memcpy(t10HB , t10HB_const , sizeof(t10HB )); + memcpy(t11HB , t11HB_const , sizeof(t11HB )); + memcpy(t12HB , t12HB_const , sizeof(t12HB )); + memcpy(t13HB , t13HB_const , sizeof(t13HB )); + memcpy(t15HB , t15HB_const , sizeof(t15HB )); + memcpy(t16HB , t16HB_const , sizeof(t16HB )); + memcpy(t24HB , t24HB_const , sizeof(t24HB )); + memcpy( t1l , t1l_const , sizeof(t1l )); + memcpy( t2l , t2l_const , sizeof(t2l )); + memcpy( t3l , t3l_const , sizeof(t3l )); + memcpy( t5l , t5l_const , sizeof(t5l )); + memcpy( t6l , t6l_const , sizeof(t6l )); + memcpy( t7l , t7l_const , sizeof(t7l )); + memcpy( t8l , t8l_const , sizeof(t8l )); + memcpy( t9l , t9l_const , sizeof(t9l )); + memcpy(t10l , t10l_const , sizeof(t10l )); + memcpy(t11l , t11l_const , sizeof(t11l )); + memcpy(t12l , t12l_const , sizeof(t12l )); + memcpy(t13l , t13l_const , sizeof(t13l )); + memcpy(t15l , t15l_const , sizeof(t15l )); + memcpy(t16l , t16l_const , sizeof(t16l )); + memcpy(t24l , t24l_const , sizeof(t24l )); + memcpy(ht , ht_const , sizeof(ht )); + + ht[ 0].table = NULL; ht[ 0].hlen = NULL; /* Apparently not used */ + ht[ 1].table = t1HB; ht[ 1].hlen = t1l; + ht[ 2].table = t2HB; ht[ 2].hlen = t2l; + ht[ 3].table = t3HB; ht[ 3].hlen = t3l; + ht[ 4].table = NULL; ht[ 4].hlen = NULL; /* Apparently not used */ + ht[ 5].table = t5HB; ht[ 5].hlen = t5l; + ht[ 6].table = t6HB; ht[ 6].hlen = t6l; + ht[ 7].table = t7HB; ht[ 7].hlen = t7l; + ht[ 8].table = t8HB; ht[ 8].hlen = t8l; + ht[ 9].table = t9HB; ht[ 9].hlen = t9l; + ht[10].table = t10HB; ht[10].hlen = t10l; + ht[11].table = t11HB; ht[11].hlen = t11l; + ht[12].table = t12HB; ht[12].hlen = t12l; + ht[13].table = t13HB; ht[13].hlen = t13l; + ht[14].table = NULL; ht[14].hlen = NULL; /* Apparently not used */ + ht[15].table = t15HB; ht[15].hlen = t15l; + + /* Figure average number of 'bytes' per frame */ + avg_byte_per_frame = SAMPL2 * 16000 * cfg.mpg.bitrate / (2 - cfg.mpg.type); + avg_byte_per_frame = avg_byte_per_frame / cfg.samplerate; + cfg.byte_per_frame = avg_byte_per_frame / 64; + cfg.frac_per_frame = avg_byte_per_frame & 63; + cfg.slot_lag = 0; + cfg.sideinfo_len = 32 + (cfg.mpg.type ? (cfg.channels == 1 ? 136 : 256) + : (cfg.channels == 1 ? 72 : 136)); + + return true; +} + +static inline void to_mono(uint32_t **samp) +{ + int32_t lr = **samp; + int32_t m = (int16_t)lr + (lr >> 16) + err; + err = m & 1; + m >>= 1; + *(*samp)++ = (m << 16) | (uint16_t)m; +} /* to_mono */ + +static void to_mono_mm(void) +{ + /* |llllllllllllllll|rrrrrrrrrrrrrrrr| => + * |mmmmmmmmmmmmmmmm|mmmmmmmmmmmmmmmm| + */ + uint32_t *samp = (uint32_t *)&mfbuf[2*512]; + uint32_t *samp_end = samp + samp_per_frame; + + do + { + to_mono(&samp); + to_mono(&samp); + to_mono(&samp); + to_mono(&samp); + to_mono(&samp); + to_mono(&samp); + to_mono(&samp); + to_mono(&samp); + } + while (samp < samp_end); +} /* to_mono_mm */ + +#ifdef ROCKBOX_LITTLE_ENDIAN + +/* Swaps a frame to big endian */ +static inline void byte_swap_frame32(uint32_t *dst, uint32_t *src, + size_t size) +{ + assert(dst); assert(src); + uint32_t *src_end = SKIPBYTES(src, size); + + do + { +#define swap32 bswap_32 + *dst++ = swap32(*src); src++; + *dst++ = swap32(*src); src++; + *dst++ = swap32(*src); src++; + *dst++ = swap32(*src); src++; + *dst++ = swap32(*src); src++; + *dst++ = swap32(*src); src++; + *dst++ = swap32(*src); src++; + *dst++ = swap32(*src); src++; + } + while(src < src_end); +} /* byte_swap_frame32 */ +#endif /* ROCKBOX_LITTLE_ENDIAN */ + +static void set_scale_facs(int *mdct_freq) +{ + unsigned int i, is, ie, k, s; + int max_freq_val, avrg_freq_val; + + /* calc average of first 256 frequency values */ + for(avrg_freq_val=i=0; i<256; i++) + avrg_freq_val += mdct_freq[i]; + avrg_freq_val >>= 8; + + /* if max of current band is smaller than average, increase precision */ + /* last band keeps untouched (not scaled) */ + for(is=k=0; is avrg_freq_val) + break; + + band_scale_f[k] = (unsigned char)s; + + for(i=is; s && i= 64) + { /* Padding for this frame */ + cfg.slot_lag -= 64; + cfg.mpg.padding = 1; + } + else + cfg.mpg.padding = 0; + + cfg.mean_bits = (8 * cfg.byte_per_frame + 8 * cfg.mpg.padding + - cfg.sideinfo_len) / cfg.granules / cfg.channels + - 42; // reserved for scale_facs + + /* shift out old samples */ + memcpy(mfbuf, mfbuf + 2*cfg.granules*576, 4*512); + + if (chunk->flags & CHUNKF_START_FILE) + { + /* prefix silent samples for encoder delay */ + memset(mfbuf + 2*512, 0, ENC_DELAY_SIZE); + /* read new samples to iram for further processing */ + memcpy(mfbuf + 2*512 + ENC_DELAY_SIZE/2, + buffer, pcm_chunk_size - ENC_DELAY_SIZE); + chunk->num_pcm = samp_per_frame - ENC_DELAY_SAMP; + } + else + { + /* read new samples to iram for further processing */ + memcpy(mfbuf + 2*512, buffer, pcm_chunk_size); + chunk->num_pcm = samp_per_frame; + } + + if (cfg.channels == 1) + to_mono_mm(); + + cfg.ResvSize = 0; + gr_cnt = cfg.granules * cfg.channels; + CodedData.bitpos = cfg.sideinfo_len; /* leave space for mp3 header */ + + for(gr=0; gr> 2); + for(k=1,ii=0; ii<3 && k; ii++) + { + int *mdct = mdct_freq; + int band; + + cfg.cod_info[gr][ch].additStep = 4 * (14 - shift); + + for(band=0; band=0; --k) + { + int bu, bd; + bu = shft15(mdct[k]) * ca[k] + + shft15(mdct[-1-k]) * cs[k]; + bd = shft15(mdct[k]) * cs[k] - + shft15(mdct[-1-k]) * ca[k]; + mdct[-1-k] = bu; + mdct[ k ] = bd; + } + } + } + + max = 0; + for(k=0; k<576; k++) + { + if(mdct_freq[k] < 0) + { + mdct_sign[k] = 1; /* negative */ + mdct_freq[k] = shft13(-mdct_freq[k]); + } + else + { + mdct_sign[k] = 0; /* positive */ + mdct_freq[k] = shft13(mdct_freq[k]); + } + + if(max < (uint32_t)mdct_freq[k]) + max = (uint32_t)mdct_freq[k]; + } + cfg.cod_info[gr][ch].max_val = max; + + /* calc new shift for higher integer precision */ + for(k=0; max<(uint32_t)(0x7800>>k); k++) shift--; + for( ; (max>>k)>=(uint32_t)0x10000; k++) shift++; + if(shift < 0) shift = 0; + } + + cfg.cod_info[gr][ch].quantStep += + cfg.cod_info[gr][ch].additStep; + + set_scale_facs(mdct_freq); + + /* bit and noise allocation */ + iteration_loop(mdct_freq, &cfg.cod_info[gr][ch], + gr_cnt--); + + /* write the frame to the bitstream */ + Huffmancodebits(enc_data, mdct_sign, + &cfg.cod_info[gr][ch]); + + cfg.cod_info[gr][ch].quantStep -= + cfg.cod_info[gr][ch].additStep; + + if(cfg.granules == 1) + { + memcpy(sb_data[ch][0], sb_data[ch][1], + sizeof(sb_data[ch][0])); + } + } + } + chunk->enc_size = cfg.byte_per_frame + cfg.mpg.padding; + + /* finish this chunk by adding sideinfo header data */ + CodedData.bitpos = 0; + encodeSideInfo( cfg.cod_info ); + +#ifdef ROCKBOX_BIG_ENDIAN + /* copy chunk to enc_buffer */ + memcpy(chunk->enc_data, CodedData.bbuf, chunk->enc_size); +#else + /* swap frame to big endian */ + byte_swap_frame32((uint32_t *)chunk->enc_data, CodedData.bbuf, chunk->enc_size); +#endif +} /* encode_frame */ diff --git a/modules/codec/shine/shine_mod.c b/modules/codec/shine/shine_mod.c new file mode 100644 index 0000000000..95923e94dc --- /dev/null +++ b/modules/codec/shine/shine_mod.c @@ -0,0 +1,221 @@ +/***************************************************************************** + * shine_mod.c: MP3 encoder using Shine, a fixed point implementation + ***************************************************************************** + * Copyright (C) 2008-2009 M2X + * + * Authors: Rafaël Carré + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +/***************************************************************************** + * Preamble + *****************************************************************************/ +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +/* shine.c uses a lot of static variables, so we include the C file to keep + * the scope. + * Note that it makes this decoder non reentrant, this is why we set + * b_reentrant to VLC_FALSE in the module initialisation */ +#include "shine.c" + +struct encoder_sys_t +{ + block_fifo_t *p_fifo; + + unsigned int i_buffer; + uint8_t *p_buffer; +}; + +/***************************************************************************** + * Local prototypes + *****************************************************************************/ +static int OpenEncoder ( vlc_object_t * ); +static void CloseEncoder ( vlc_object_t * ); + +static block_t *EncodeFrame ( encoder_t *, aout_buffer_t * ); + +vlc_module_begin(); + set_category( CAT_INPUT ); + set_subcategory( SUBCAT_INPUT_ACODEC ); + set_description( _("MP3 fixed point audio encoder") ); + set_capability( "encoder", 101 ); + set_callbacks( OpenEncoder, CloseEncoder ); +vlc_module_end(); + +static int OpenEncoder( vlc_object_t *p_this ) +{ + encoder_t *p_enc = (encoder_t*)p_this; + encoder_sys_t *p_sys; + + /* FIXME: what about layers 1 and 2 ? shine is an 'MP3' encoder */ + if( p_enc->fmt_out.i_codec != VLC_FOURCC('m','p','3',' ') || + p_enc->fmt_out.audio.i_channels > 2 ) + return VLC_EGENERIC; + + /* Shine is strict on its input */ + if( p_enc->fmt_in.audio.i_channels != 2 ) + { + msg_Err( p_enc, "Only stereo input is accepted, rejecting %d channels", + p_enc->fmt_in.audio.i_channels ); + return VLC_EGENERIC; + } + + p_sys = p_enc->p_sys = malloc( sizeof( encoder_sys_t ) ); + if( !p_sys ) + return VLC_ENOMEM; + memset( p_sys, 0, sizeof( encoder_sys_t ) ); + + if( !( p_sys->p_fifo = block_FifoNew() ) ) + { + free( p_sys ); + return VLC_ENOMEM; + } + + init_mp3_encoder_engine( p_enc->fmt_out.audio.i_rate, + p_enc->fmt_out.audio.i_channels, p_enc->fmt_out.i_bitrate / 1000 ); + + p_enc->pf_encode_audio = EncodeFrame; + + return VLC_SUCCESS; +} + +/* We split/pack PCM blocks to a fixed size: pcm_chunk_size bytes */ +static block_t *GetPCM( encoder_t *p_enc, aout_buffer_t *p_block ) +{ + encoder_sys_t *p_sys = p_enc->p_sys; + block_t *p_pcm_block; + + if( !p_block ) goto buffered; /* just return a block if we can */ + + /* Put the PCM samples sent by VLC in the Fifo */ + while( p_sys->i_buffer + p_block->i_nb_bytes >= pcm_chunk_size ) + { + unsigned int i_buffer = 0; + p_pcm_block = block_New( p_enc, pcm_chunk_size ); + if( !p_pcm_block ) break; + + if( p_sys->i_buffer ) + { + vlc_memcpy( p_pcm_block->p_buffer, p_sys->p_buffer, + p_sys->i_buffer ); + + i_buffer = p_sys->i_buffer; + p_sys->i_buffer = 0; + free( p_sys->p_buffer ); + } + + vlc_memcpy( p_pcm_block->p_buffer + i_buffer, + p_block->p_buffer , pcm_chunk_size - i_buffer ); + p_block->p_buffer += pcm_chunk_size - i_buffer; + + p_block->i_nb_bytes -= pcm_chunk_size - i_buffer; + + block_FifoPut( p_sys->p_fifo, p_pcm_block ); + } + + /* We hadn't enough data to make a block, put it in standby */ + if( p_block->i_nb_bytes ) + { + p_sys->p_buffer = p_sys->i_buffer ? + realloc( p_sys->p_buffer, p_block->i_nb_bytes + p_sys->i_buffer ) : + malloc( p_block->i_nb_bytes ); + + if( !p_sys->p_buffer ) + { + p_sys->i_buffer = 0; + return NULL; + } + + vlc_memcpy( p_sys->p_buffer + p_sys->i_buffer, + p_block->p_buffer, p_block->i_nb_bytes ); + + p_sys->i_buffer += p_block->i_nb_bytes; + p_block->i_nb_bytes = 0; + } + +buffered: + /* and finally get a block back */ + return block_FifoCount( p_sys->p_fifo ) > 0 ? block_FifoGet( p_sys->p_fifo ) : NULL; +} + +static block_t *EncodeFrame( encoder_t *p_enc, aout_buffer_t *p_block ) +{ + block_t *p_pcm_block; + block_t *p_chain = NULL; + unsigned int i_samples = p_block->i_nb_bytes / 4 /* s16l stereo */; + mtime_t start_date = p_block->start_date; + start_date -= i_samples * 1000000 / p_enc->fmt_out.audio.i_rate; + + do { + if( !( p_pcm_block = GetPCM( p_enc, p_block ) ) ) + break; + + p_block = NULL; /* we don't need it anymore */ + + uint32_t enc_buffer[16384]; /* storage for 65536 Bytes XXX: too much */ + struct enc_chunk_hdr *chunk = (void*) enc_buffer; + chunk->enc_data = ENC_CHUNK_SKIP_HDR(chunk->enc_data, chunk); + + encode_frame( (char*)p_pcm_block->p_buffer, chunk ); + block_Release( p_pcm_block ); + + block_t *p_mp3_block = block_New( p_enc, chunk->enc_size ); + if( !p_mp3_block ) + break; + + vlc_memcpy( p_mp3_block->p_buffer, chunk->enc_data, + chunk->enc_size ); + + /* date management */ + p_mp3_block->i_length = SAMP_PER_FRAME1 * 1000000 / + p_enc->fmt_out.audio.i_rate; + + start_date += p_mp3_block->i_length; + p_mp3_block->i_dts = p_mp3_block->i_pts = start_date; + + p_mp3_block->i_samples = SAMP_PER_FRAME1; + + block_ChainAppend( &p_chain, p_mp3_block ); + } while( p_pcm_block ); + + return p_chain; +} + +static void CloseEncoder( vlc_object_t *p_this ) +{ + encoder_sys_t *p_sys = ((encoder_t*)p_this)->p_sys; + + /* TODO: we should send the last PCM block padded with 0 + * But we don't know if other blocks will come before it's too late */ + if( p_sys->i_buffer ) + free( p_sys->p_buffer ); + + block_FifoRelease( p_sys->p_fifo ); + free( p_sys ); +} -- 2.39.2