diff options
author | Sean Bartell <wingedtachikoma@gmail.com> | 2011-06-25 21:32:25 -0400 |
---|---|---|
committer | Nils Wallménius <nils@rockbox.org> | 2012-04-25 22:13:20 +0200 |
commit | f40bfc9267b13b54e6379dfe7539447662879d24 (patch) | |
tree | 9b20069d5e62809ff434061ad730096836f916f2 /lib/rbcodec/codecs/libcook/cook.h | |
parent | a0009907de7a0107d49040d8a180f140e2eff299 (diff) | |
download | rockbox-f40bfc9267b13b54e6379dfe7539447662879d24.tar.gz rockbox-f40bfc9267b13b54e6379dfe7539447662879d24.zip |
Add codecs to librbcodec.
Change-Id: Id7f4717d51ed02d67cb9f9cb3c0ada4a81843f97
Reviewed-on: http://gerrit.rockbox.org/137
Reviewed-by: Nils Wallménius <nils@rockbox.org>
Tested-by: Nils Wallménius <nils@rockbox.org>
Diffstat (limited to 'lib/rbcodec/codecs/libcook/cook.h')
-rw-r--r-- | lib/rbcodec/codecs/libcook/cook.h | 131 |
1 files changed, 131 insertions, 0 deletions
diff --git a/lib/rbcodec/codecs/libcook/cook.h b/lib/rbcodec/codecs/libcook/cook.h new file mode 100644 index 0000000000..fcb437a0e1 --- /dev/null +++ b/lib/rbcodec/codecs/libcook/cook.h @@ -0,0 +1,131 @@ +/* + * COOK compatible decoder + * Copyright (c) 2003 Sascha Sommer + * Copyright (c) 2005 Benjamin Larsson + * + * This file is taken from FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * FFmpeg 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ +#ifndef _COOK_H +#define _COOK_H + +#include <inttypes.h> +#include "ffmpeg_get_bits.h" +#include "../librm/rm.h" +#include "cookdata_fixpoint.h" + +#include "codeclib.h" + +#if (CONFIG_CPU == PP5022) || (CONFIG_CPU == PP5024) || (CONFIG_CPU == MCF5250) +/* PP5022/24, MCF5250 have large IRAM */ +#define IBSS_ATTR_COOK_LARGE_IRAM IBSS_ATTR +#define ICODE_ATTR_COOK_LARGE_IRAM ICODE_ATTR +#define ICONST_ATTR_COOK_LARGE_IRAM ICONST_ATTR +#define IBSS_ATTR_COOK_VLCBUF +#define ICODE_ATTR_COOK_DECODE + +#elif defined(CPU_S5L870X) +/* S5L870X have even larger IRAM and it is faster to use ICODE_ATTR. */ +#define IBSS_ATTR_COOK_LARGE_IRAM IBSS_ATTR +#define ICODE_ATTR_COOK_LARGE_IRAM ICODE_ATTR +#define ICONST_ATTR_COOK_LARGE_IRAM ICONST_ATTR +#define IBSS_ATTR_COOK_VLCBUF IBSS_ATTR +#define ICODE_ATTR_COOK_DECODE ICODE_ATTR + +#else +/* other CPUs IRAM is not large enough */ +#define IBSS_ATTR_COOK_LARGE_IRAM +#define ICODE_ATTR_COOK_LARGE_IRAM +#define ICONST_ATTR_COOK_LARGE_IRAM +#define IBSS_ATTR_COOK_VLCBUF +#define ICODE_ATTR_COOK_DECODE + +#endif + +typedef struct { + int *now; + int *previous; +} cook_gains; + +typedef struct cook { + /* + * The following 2 functions provide the lowlevel arithmetic on + * the internal audio buffers. + */ + void (* scalar_dequant)(struct cook *q, int index, int quant_index, + int* subband_coef_index, int* subband_coef_sign, + REAL_T* mlt_p); + + void (* interpolate) (struct cook *q, REAL_T* buffer, + int gain_index, int gain_index_next); + + GetBitContext gb; + int frame_number; + int block_align; + int extradata_size; + /* stream data */ + int nb_channels; + int joint_stereo; + int bit_rate; + int sample_rate; + int samples_per_channel; + int samples_per_frame; + int subbands; + int log2_numvector_size; + int numvector_size; //1 << log2_numvector_size; + int js_subband_start; + int total_subbands; + int num_vectors; + int bits_per_subpacket; + int cookversion; + int mdct_nbits; /* is this the same as one of above? */ + /* states */ + int random_state; + + /* gain buffers */ + cook_gains gains1; + cook_gains gains2; + int gain_1[9]; + int gain_2[9]; + int gain_3[9]; + int gain_4[9]; + + /* VLC data */ + int js_vlc_bits; + VLC envelope_quant_index[13]; + VLC sqvh[7]; //scalar quantization + VLC ccpl; //channel coupling + + /* generatable tables and related variables */ + int gain_size_factor; + + /* data buffers */ + + uint8_t decoded_bytes_buffer[1024] MEM_ALIGN_ATTR; + REAL_T mono_mdct_output[2048] MEM_ALIGN_ATTR; + REAL_T mono_previous_buffer1[1024] MEM_ALIGN_ATTR; + REAL_T mono_previous_buffer2[1024] MEM_ALIGN_ATTR; + REAL_T decode_buffer_1[1024] MEM_ALIGN_ATTR; + REAL_T decode_buffer_2[1024] MEM_ALIGN_ATTR; + /* static allocation for joint decode */ + REAL_T decode_buffer_0[1060] MEM_ALIGN_ATTR; +} COOKContext; + +int cook_decode_init(RMContext *rmctx, COOKContext *q); +int cook_decode_frame(RMContext *rmctx,COOKContext *q, + int32_t *outbuffer, int *data_size, + const uint8_t *inbuffer, int buf_size); +#endif /*_COOK_H */ |