⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cook_fix_all.c

📁 君正早期ucos系统(只有早期的才不没有打包成库),MPLAYER,文件系统,图片解码,浏览,电子书,录音,想学ucos,识货的人就下吧 russblock fmradio explore set
💻 C
📖 第 1 页 / 共 4 页
字号:
+ * @file cookdata_fixpoint.h
+ * Cook AKA RealAudio G2 compatible decoder
+ * fixed point data types and constants
+ */
+
+#include <stdint.h>
+typedef int32_t FIXP;           /* Fixed point variable type */
+typedef uint16_t FIXPU;         /* Fixed point fraction 0<=x<1 */
+
+typedef FIXP REAL_T;
+
+
+/**
+ * Additional variables in COOKContext
+ * for fixed point routines
+ */
+typedef struct {
+    /* generatable tables */
+    /**
+     * Sine/cosine table.
+     *  x_i = 2^16 sin(i 2pi/8192), 2^16 cos(i 2pi/8192); i=0..1024
+     */
+    FIXPU sincos_lookup[2050];
+} realvars_t;
+
+
+#define cPI1_8 0xec83  /* cos( pi/8) 2^16 */
+#define cPI2_8 0xb505  /* cos(2pi/8) 2^16 */
+#define cPI3_8 0x61f8  /* cos(3pi/8) 2^16 */
+
+
+static const FIXPU pow128_tab[128] = {
+    /* x_i = 2^(15+i/128) */
+    0x8000, 0x80b2, 0x8165, 0x8219, 0x82ce, 0x8383, 0x843a, 0x84f2, 0x85ab,
+    0x8665, 0x871f, 0x87db, 0x8898, 0x8956, 0x8a15, 0x8ad5, 0x8b96, 0x8c58,
+    0x8d1b, 0x8ddf, 0x8ea4, 0x8f6b, 0x9032, 0x90fa, 0x91c4, 0x928e, 0x935a,
+    0x9427, 0x94f5, 0x95c4, 0x9694, 0x9765, 0x9838, 0x990c, 0x99e0, 0x9ab6,
+    0x9b8d, 0x9c65, 0x9d3f, 0x9e19, 0x9ef5, 0x9fd2, 0xa0b0, 0xa190, 0xa270,
+    0xa352, 0xa435, 0xa519, 0xa5ff, 0xa6e6, 0xa7ce, 0xa8b7, 0xa9a1, 0xaa8d,
+    0xab7a, 0xac69, 0xad58, 0xae49, 0xaf3b, 0xb02f, 0xb124, 0xb21a, 0xb312,
+    0xb40b, 0xb505, 0xb601, 0xb6fe, 0xb7fc, 0xb8fc, 0xb9fd, 0xbaff, 0xbc03,
+    0xbd09, 0xbe0f, 0xbf18, 0xc021, 0xc12c, 0xc239, 0xc347, 0xc456, 0xc567,
+    0xc67a, 0xc78d, 0xc8a3, 0xc9ba, 0xcad2, 0xcbec, 0xcd08, 0xce25, 0xcf43,
+    0xd063, 0xd185, 0xd2a8, 0xd3cd, 0xd4f3, 0xd61b, 0xd745, 0xd870, 0xd99d,
+    0xdacc, 0xdbfc, 0xdd2e, 0xde61, 0xdf96, 0xe0cd, 0xe205, 0xe340, 0xe47b,
+    0xe5b9, 0xe6f8, 0xe839, 0xe97c, 0xeac1, 0xec07, 0xed4f, 0xee99, 0xefe5,
+    0xf132, 0xf281, 0xf3d3, 0xf525, 0xf67a, 0xf7d1, 0xf929, 0xfa84, 0xfbe0,
+    0xfd3e, 0xfe9e
+};
+
+
+/* Set up types and include cook data.
+ */ 
+typedef FIXP Q_t[2];
+#define Q(x) {(FIXP)((float)(x) * (1<<28) + 0.5f), \
+              (FIXP)((float)(x) * (1<<28) * 0.707106781187f + 0.5f)}
+typedef FIXPU C_t;
+#define C(x) (FIXPU)((float)(x) * (1<<16) + 0.5f)
+#include "cookdata.h"
diff -urN svn/libavcodec/cookdata_float.h fixpoint/libavcodec/cookdata_float.h
--- svn/libavcodec/cookdata_float.h	2007-03-21 12:51:50.000000000 +0100
+++ fixpoint/libavcodec/cookdata_float.h	2007-03-21 11:01:58.000000000 +0100
@@ -1,5 +1,5 @@
 /*
- * COOK compatible decoder
+ * COOK compatible decoder floating point data types and constants
  * Copyright (c) 2003 Sascha Sommer
  * Copyright (c) 2005 Benjamin Larsson
  *
@@ -22,1126 +22,36 @@
  */
 
 /**
- * @file cook.c
- * Cook compatible decoder.
- * This decoder handles RealNetworks, RealAudio G2 data.
- * Cook is identified by the codec name cook in RM files.
- *
- * To use this decoder, a calling application must supply the extradata
- * bytes provided from the RM container; 8+ bytes for mono streams and
- * 16+ for stereo streams (maybe more).
- *
- * Codec technicalities (all this assume a buffer length of 1024):
- * Cook works with several different techniques to achieve its compression.
- * In the timedomain the buffer is divided into 8 pieces and quantized. If
- * two neighboring pieces have different quantization index a smooth
- * quantization curve is used to get a smooth overlap between the different
- * pieces.
- * To get to the transformdomain Cook uses a modulated lapped transform.
- * The transform domain has 50 subbands with 20 elements each. This
- * means only a maximum of 50*20=1000 coefficients are used out of the 1024
- * available.
+ * @file cookdata_float.h
+ * Cook AKA RealAudio G2 compatible decoder
+ * floating point data types and constants
  */
 
 #include <math.h>
-#include <stddef.h>
-#include <stdio.h>
-
-#include "avcodec.h"
-#include "bitstream.h"
-#include "dsputil.h"
-#include "common.h"
-#include "bytestream.h"
-#include "random.h"
-
-#include "cookdata.h"
-
-/* the different Cook versions */
-#define MONO            0x1000001
-#define STEREO          0x1000002
-#define JOINT_STEREO    0x1000003
-#define MC_COOK         0x2000000   //multichannel Cook, not supported
-
-#define SUBBAND_SIZE    20
-//#define COOKDEBUG
+typedef float REAL_T;
 
-typedef struct {
-    int *now;
-    int *previous;
-} cook_gains;
 
+/**
+ * Additional variables in COOKContext
+ * for floating point routines.
+ */
 typedef struct {
-    GetBitContext       gb;
-    /* 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;
-    /* states */
-    AVRandomState       random_state;
-
     /* transform data */
     MDCTContext         mdct_ctx;
     DECLARE_ALIGNED_16(FFTSample, mdct_tmp[1024]);  /* temporary storage for imlt */
     float*              mlt_window;
 
-    /* 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;
+    /* generatable tables */
     float               gain_table[23];
     float               pow2tab[127];
     float               rootpow2tab[127];
+} realvars_t;
 
-    /* data buffers */
-
-    uint8_t*            decoded_bytes_buffer;
-    DECLARE_ALIGNED_16(float,mono_mdct_output[2048]);
-    float               mono_previous_buffer1[1024];
-    float               mono_previous_buffer2[1024];
-    float               decode_buffer_1[1024];
-    float               decode_buffer_2[1024];
-} COOKContext;
-
-/* debug functions */
-
-#ifdef COOKDEBUG
-static void dump_float_table(float* table, int size, int delimiter) {
-    int i=0;
-    av_log(NULL,AV_LOG_ERROR,"\n[%d]: ",i);
-    for (i=0 ; i<size ; i++) {
-        av_log(NULL, AV_LOG_ERROR, "%5.1f, ", table[i]);
-        if ((i+1)%delimiter == 0) av_log(NULL,AV_LOG_ERROR,"\n[%d]: ",i+1);
-    }
-}
-
-static void dump_int_table(int* table, int size, int delimiter) {
-    int i=0;
-    av_log(NULL,AV_LOG_ERROR,"\n[%d]: ",i);
-    for (i=0 ; i<size ; i++) {
-        av_log(NULL, AV_LOG_ERROR, "%d, ", table[i]);
-        if ((i+1)%delimiter == 0) av_log(NULL,AV_LOG_ERROR,"\n[%d]: ",i+1);
-    }
-}
-
-static void dump_short_table(short* table, int size, int delimiter) {
-    int i=0;
-    av_log(NULL,AV_LOG_ERROR,"\n[%d]: ",i);
-    for (i=0 ; i<size ; i++) {
-        av_log(NULL, AV_LOG_ERROR, "%d, ", table[i]);
-        if ((i+1)%delimiter == 0) av_log(NULL,AV_LOG_ERROR,"\n[%d]: ",i+1);
-    }
-}
-
-#endif
-
-/*************** init functions ***************/
-
-/* table generator */
-static void init_pow2table(COOKContext *q){
-    int i;
-    q->pow2tab[63] = 1.0;
-    for (i=1 ; i<64 ; i++){
-        q->pow2tab[63+i]=(float)((uint64_t)1<<i);
-        q->pow2tab[63-i]=1.0/(float)((uint64_t)1<<i);
-    }
-}
-
-/* table generator */
-static void init_rootpow2table(COOKContext *q){
-    int i;
-    q->rootpow2tab[63] = 1.0;
-    for (i=1 ; i<64 ; i++){
-        q->rootpow2tab[63+i]=sqrt((float)((uint64_t)1<<i));
-        q->rootpow2tab[63-i]=sqrt(1.0/(float)((uint64_t)1<<i));
-    }
-}
-
-/* table generator */
-static void init_gain_table(COOKContext *q) {
-    int i;
-    q->gain_size_factor = q->samples_per_channel/8;
-    for (i=0 ; i<23 ; i++) {
-        q->gain_table[i] = pow((double)q->pow2tab[i+52] ,
-                               (1.0/(double)q->gain_size_factor));
-    }
-}
-
-
-static int init_cook_vlc_tables(COOKContext *q) {
-    int i, result;
-
-    result = 0;
-    for (i=0 ; i<13 ; i++) {
-        result &= init_vlc (&q->envelope_quant_index[i], 9, 24,
-            envelope_quant_index_huffbits[i], 1, 1,
-            envelope_quant_index_huffcodes[i], 2, 2, 0);
-    }
-    av_log(NULL,AV_LOG_DEBUG,"sqvh VLC init\n");
-    for (i=0 ; i<7 ; i++) {
-        result &= init_vlc (&q->sqvh[i], vhvlcsize_tab[i], vhsize_tab[i],
-            cvh_huffbits[i], 1, 1,
-            cvh_huffcodes[i], 2, 2, 0);
-    }
-
-    if (q->nb_channels==2 && q->joint_stereo==1){
-        result &= init_vlc (&q->ccpl, 6, (1<<q->js_vlc_bits)-1,
-            ccpl_huffbits[q->js_vlc_bits-2], 1, 1,
-            ccpl_huffcodes[q->js_vlc_bits-2], 2, 2, 0);
-        av_log(NULL,AV_LOG_DEBUG,"Joint-stereo VLC used.\n");
-    }
-
-    av_log(NULL,AV_LOG_DEBUG,"VLC tables initialized.\n");
-    return result;
-}
-
-static int init_cook_mlt(COOKContext *q) {
-    int j;
-    float alpha;
-    int mlt_size = q->samples_per_channel;
-
-    if ((q->mlt_window = av_malloc(sizeof(float)*mlt_size)) == 0)
-      return -1;
-
-    /* Initialize the MLT window: simple sine window. */
-    alpha = M_PI / (2.0 * (float)mlt_size);
-    for(j=0 ; j<mlt_size ; j++)
-        q->mlt_window[j] = sin((j + 0.5) * alpha) * sqrt(2.0 / q->samples_per_channel);
-
-    /* Initialize the MDCT. */
-    if (ff_mdct_init(&q->mdct_ctx, av_log2(mlt_size)+1, 1)) {
-      av_free(q->mlt_window);
-      return -1;
-    }
-    av_log(NULL,AV_LOG_DEBUG,"MDCT initialized, order = %d.\n",
-           av_log2(mlt_size)+1);
-
-    return 0;
-}
-
-/*************** init functions end ***********/
-
-/**
- * Cook indata decoding, every 32 bits are XORed with 0x37c511f2.
- * Why? No idea, some checksum/error detection method maybe.
- *
- * Out buffer size: extra bytes are needed to cope with
- * padding/missalignment.
- * Subpackets passed to the decoder can contain two, consecutive
- * half-subpackets, of identical but arbitrary size.
- *          1234 1234 1234 1234  extraA extraB
- * Case 1:  AAAA BBBB              0      0
- * Case 2:  AAAA ABBB BB--         3      3
- * Case 3:  AAAA AABB BBBB         2      2
- * Case 4:  AAAA AAAB BBBB BB--    1      5
- *
- * Nice way to waste CPU cycles.
- *
- * @param inbuffer  pointer to byte array of indata
- * @param out       pointer to byte array of outdata
- * @param bytes     number of bytes
- */
-#define DECODE_BYTES_PAD1(bytes) (3 - ((bytes)+3) % 4)
-#define DECODE_BYTES_PAD2(bytes) ((bytes) % 4 + DECODE_BYTES_PAD1(2 * (bytes)))
-
-static inline int decode_bytes(uint8_t* inbuffer, uint8_t* out, int bytes){
-    int i, off;
-    uint32_t c;
-    uint32_t* buf;
-    uint32_t* obuf = (uint32_t*) out;
-    /* FIXME: 64 bit platforms would be able to do 64 bits at a time.
-     * I'm too lazy though, should be something like
-     * for(i=0 ; i<bitamount/64 ; i++)
-     *     (int64_t)out[i] = 0x37c511f237c511f2^be2me_64(int64_t)in[i]);
-     * Buffer alignment needs to be checked. */
-
-    off = (int)((long)inbuffer & 3);
-    buf = (uint32_t*) (inbuffer - off);
-    c = be2me_32((0x37c511f2 >> (off*8)) | (0x37c511f2 << (32-(off*8))));
-    bytes += 3 + off;
-    for (i = 0; i < bytes/4; i++)
-        obuf[i] = c ^ buf[i];
-
-    return off;
-}
-
-/**
- * Cook uninit
- */
-
-static int cook_decode_close(AVCodecContext *avctx)
-{
-    int i;
-    COOKContext *q = avctx->priv_data;
-    av_log(avctx,AV_LOG_DEBUG, "Deallocating memory.\n");
-
-    /* Free allocated memory buffers. */
-    av_free(q->mlt_window);
-    av_free(q->decoded_bytes_buffer);
-
-    /* Free the transform. */
-    ff_mdct_end(&q->mdct_ctx);
-
-    /* Free the VLC tables. */
-    for (i=0 ; i<13 ; i++) {
-        free_vlc(&q->envelope_quant_index[i]);
-    }
-    for (i=0 ; i<7 ; i++) {
-        free_vlc(&q->sqvh[i]);
-    }
-    if(q->nb_channels==2 && q->joint_stereo==1 ){
-        free_vlc(&q->ccpl);
-    }
-
-    av_log(NULL,AV_LOG_DEBUG,"Memory deallocated.\n");
-
-    return 0;
-}
-
-/**
- * Fill the gain array for the timedomain quantization.
- *
- * @param q                 pointer to the COOKContext
- * @param gaininfo[9]       array of gain indices
- */
-
-static void decode_gain_info(GetBitContext *gb, int *gaininfo)
-{
-    int i, n;
-
-    while (get_bits1(gb)) {}
-    n = get_bits_count(gb) - 1;     //amount of elements*2 to update
-
-    i = 0;
-    while (n--) {
-        int index = get_bits(gb, 3);
-        int gain = get_bits1(gb) ? get_bits(gb, 4) - 7 : -1;
-
-        while (i <= index) gaininfo[i++] = gain;
-    }
-    while (i <= 8) gaininfo[i++] = 0;
-}
-
-/**
- * Create the quant index table needed for the envelope.
- *
- * @param q                 pointer to the COOKContext
- * @param quant_index_table pointer to the array
- */
-
-static void decode_envelope(COOKContext *q, int* quant_index_table) {
-    int i,j, vlc_index;
-    int bitbias;
-
-    bitbias = get_bits_count(&q->gb);
-    quant_index_table[0]= get_bits(&q->gb,6) - 6;       //This is used later in categorize
-
-    for (i=1 ; i < q->total_subbands ; i++){
-        vlc_index=i;
-        if (i >= q->js_subband_start * 2) {
-            vlc_index-=q->js_subband_start;
-        } else {
-            vlc_index/=2;
-            if(vlc_index < 1) vlc_index = 1;
-        }
-        if (vlc_index>13) vlc_index = 13;           //the VLC tables >13 are identical to No. 13
-
-        j = get_vlc2(&q->gb, q->envelope_quant_index[vlc_index-1].table,
-                     q->envelope_quant_index[vlc_index-1].bits,2);
-        quant_index_table[i] = quant_index_table[i-1] + j - 12;    //differential encoding
-    }
-}
-
-/**

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -