cook_fix_all_new.c
来自「君正早期ucos系统(只有早期的才不没有打包成库),MPLAYER,文件系统,图」· C语言 代码 · 共 1,811 行 · 第 1/5 页
C
1,811 行
-#define PRINT(a,b) av_log(NULL,AV_LOG_ERROR," %s = %d\n", a, b);
- av_log(NULL,AV_LOG_ERROR,"COOKextradata\n");
- av_log(NULL,AV_LOG_ERROR,"cookversion=%x\n",q->cookversion);
- if (q->cookversion > STEREO) {
- PRINT("js_subband_start",q->js_subband_start);
- PRINT("js_vlc_bits",q->js_vlc_bits);
- }
- av_log(NULL,AV_LOG_ERROR,"COOKContext\n");
- PRINT("nb_channels",q->nb_channels);
- PRINT("bit_rate",q->bit_rate);
- PRINT("sample_rate",q->sample_rate);
- PRINT("samples_per_channel",q->samples_per_channel);
- PRINT("samples_per_frame",q->samples_per_frame);
- PRINT("subbands",q->subbands);
- PRINT("random_state",q->random_state);
- PRINT("js_subband_start",q->js_subband_start);
- PRINT("log2_numvector_size",q->log2_numvector_size);
- PRINT("numvector_size",q->numvector_size);
- PRINT("total_subbands",q->total_subbands);
-}
-#endif
-
-/**
- * Cook initialization
- *
- * @param avctx pointer to the AVCodecContext
- */
-
-static int cook_decode_init(AVCodecContext *avctx)
-{
- COOKContext *q = avctx->priv_data;
- uint8_t *edata_ptr = avctx->extradata;
-
- /* Take care of the codec specific extradata. */
- if (avctx->extradata_size <= 0) {
- av_log(avctx,AV_LOG_ERROR,"Necessary extradata missing!\n");
- return -1;
- } else {
- /* 8 for mono, 16 for stereo, ? for multichannel
- Swap to right endianness so we don't need to care later on. */
- av_log(avctx,AV_LOG_DEBUG,"codecdata_length=%d\n",avctx->extradata_size);
- if (avctx->extradata_size >= 8){
- q->cookversion = bytestream_get_be32(&edata_ptr);
- q->samples_per_frame = bytestream_get_be16(&edata_ptr);
- q->subbands = bytestream_get_be16(&edata_ptr);
- }
- if (avctx->extradata_size >= 16){
- bytestream_get_be32(&edata_ptr); //Unknown unused
- q->js_subband_start = bytestream_get_be16(&edata_ptr);
- q->js_vlc_bits = bytestream_get_be16(&edata_ptr);
- }
- }
-
- /* Take data from the AVCodecContext (RM container). */
- q->sample_rate = avctx->sample_rate;
- q->nb_channels = avctx->channels;
- q->bit_rate = avctx->bit_rate;
-
- /* Initialize RNG. */
- av_init_random(1, &q->random_state);
-
- /* Initialize extradata related variables. */
- q->samples_per_channel = q->samples_per_frame / q->nb_channels;
- q->bits_per_subpacket = avctx->block_align * 8;
-
- /* Initialize default data states. */
- q->log2_numvector_size = 5;
- q->total_subbands = q->subbands;
-
- /* Initialize version-dependent variables */
- av_log(NULL,AV_LOG_DEBUG,"q->cookversion=%x\n",q->cookversion);
- q->joint_stereo = 0;
- switch (q->cookversion) {
- case MONO:
- if (q->nb_channels != 1) {
- av_log(avctx,AV_LOG_ERROR,"Container channels != 1, report sample!\n");
- return -1;
- }
- av_log(avctx,AV_LOG_DEBUG,"MONO\n");
- break;
- case STEREO:
- if (q->nb_channels != 1) {
- q->bits_per_subpacket = q->bits_per_subpacket/2;
- }
- av_log(avctx,AV_LOG_DEBUG,"STEREO\n");
- break;
- case JOINT_STEREO:
- if (q->nb_channels != 2) {
- av_log(avctx,AV_LOG_ERROR,"Container channels != 2, report sample!\n");
- return -1;
- }
- av_log(avctx,AV_LOG_DEBUG,"JOINT_STEREO\n");
- if (avctx->extradata_size >= 16){
- q->total_subbands = q->subbands + q->js_subband_start;
- q->joint_stereo = 1;
- }
- if (q->samples_per_channel > 256) {
- q->log2_numvector_size = 6;
- }
- if (q->samples_per_channel > 512) {
- q->log2_numvector_size = 7;
- }
- break;
- case MC_COOK:
- av_log(avctx,AV_LOG_ERROR,"MC_COOK not supported!\n");
- return -1;
- break;
- default:
- av_log(avctx,AV_LOG_ERROR,"Unknown Cook version, report sample!\n");
- return -1;
- break;
- }
-
- /* Initialize variable relations */
- q->numvector_size = (1 << q->log2_numvector_size);
-
- /* Generate tables */
- init_rootpow2table(q);
- init_pow2table(q);
- init_gain_table(q);
-
- if (init_cook_vlc_tables(q) != 0)
- return -1;
-
-
- if(avctx->block_align >= UINT_MAX/2)
- return -1;
-
- /* Pad the databuffer with:
- DECODE_BYTES_PAD1 or DECODE_BYTES_PAD2 for decode_bytes(),
- FF_INPUT_BUFFER_PADDING_SIZE, for the bitstreamreader. */
- if (q->nb_channels==2 && q->joint_stereo==0) {
- q->decoded_bytes_buffer =
- av_mallocz(avctx->block_align/2
- + DECODE_BYTES_PAD2(avctx->block_align/2)
- + FF_INPUT_BUFFER_PADDING_SIZE);
- } else {
- q->decoded_bytes_buffer =
- av_mallocz(avctx->block_align
- + DECODE_BYTES_PAD1(avctx->block_align)
- + FF_INPUT_BUFFER_PADDING_SIZE);
- }
- if (q->decoded_bytes_buffer == NULL)
- return -1;
-
- q->gains1.now = q->gain_1;
- q->gains1.previous = q->gain_2;
- q->gains2.now = q->gain_3;
- q->gains2.previous = q->gain_4;
-
- /* Initialize transform. */
- if ( init_cook_mlt(q) != 0 )
- return -1;
-
- /* Try to catch some obviously faulty streams, othervise it might be exploitable */
- if (q->total_subbands > 53) {
- av_log(avctx,AV_LOG_ERROR,"total_subbands > 53, report sample!\n");
- return -1;
- }
- if (q->subbands > 50) {
- av_log(avctx,AV_LOG_ERROR,"subbands > 50, report sample!\n");
- return -1;
- }
- if ((q->samples_per_channel == 256) || (q->samples_per_channel == 512) || (q->samples_per_channel == 1024)) {
- } else {
- av_log(avctx,AV_LOG_ERROR,"unknown amount of samples_per_channel = %d, report sample!\n",q->samples_per_channel);
- return -1;
- }
- if ((q->js_vlc_bits > 6) || (q->js_vlc_bits < 0)) {
- av_log(avctx,AV_LOG_ERROR,"q->js_vlc_bits = %d, only >= 0 and <= 6 allowed!\n",q->js_vlc_bits);
- return -1;
- }
-
-#ifdef COOKDEBUG
- dump_cook_context(q);
-#endif
- return 0;
-}
-
-
-AVCodec cook_decoder =
-{
- .name = "cook",
- .type = CODEC_TYPE_AUDIO,
- .id = CODEC_ID_COOK,
- .priv_data_size = sizeof(COOKContext),
- .init = cook_decode_init,
- .close = cook_decode_close,
- .decode = cook_decode_frame,
-};
+/* Set up types and include cook data.
+ */
+typedef float Q_t;
+#define Q(x) (x)
+typedef float C_t;
+#define C(x) (x)
+#include "cookdata.h"
diff -urN svn/libavcodec/cookdata.h fixpoint/libavcodec/cookdata.h
--- svn/libavcodec/cookdata.h 2007-03-12 15:21:31.000000000 +0100
+++ fixpoint/libavcodec/cookdata.h 2007-03-18 22:31:46.000000000 +0100
@@ -32,20 +32,25 @@
52,47,43,37,29,22,16,0,
};
-static const float dither_tab[8] = {
- 0.0, 0.0, 0.0, 0.0, 0.0, 0.176777, 0.25, 0.707107,
+static const Q_t dither_tab[8] = {
+ Q(0.0), Q(0.0), Q(0.0), Q(0.0), Q(0.0), Q(0.176777), Q(0.25), Q(0.707107)
};
-static const float randsign[2] = {1.0, -1.0};
-
-static const float quant_centroid_tab[7][14] = {
- { 0.000, 0.392, 0.761, 1.120, 1.477, 1.832, 2.183, 2.541, 2.893, 3.245, 3.598, 3.942, 4.288, 4.724 },
- { 0.000, 0.544, 1.060, 1.563, 2.068, 2.571, 3.072, 3.562, 4.070, 4.620, 0.000, 0.000, 0.000, 0.000 },
- { 0.000, 0.746, 1.464, 2.180, 2.882, 3.584, 4.316, 0.000, 0.000, 0.000, 0.000, 0.000, 0.000, 0.000 },
- { 0.000, 1.006, 2.000, 2.993, 3.985, 0.000, 0.000, 0.000, 0.000, 0.000, 0.000, 0.000, 0.000, 0.000 },
- { 0.000, 1.321, 2.703, 3.983, 0.000, 0.000, 0.000, 0.000, 0.000, 0.000, 0.000, 0.000, 0.000, 0.000 },
- { 0.000, 1.657, 3.491, 0.000, 0.000, 0.000, 0.000, 0.000, 0.000, 0.000, 0.000, 0.000, 0.000, 0.000 },
- { 0.000, 1.964, 0.000, 0.000, 0.000, 0.000, 0.000, 0.000, 0.000, 0.000, 0.000, 0.000, 0.000, 0.000 }
+static const Q_t quant_centroid_tab[7][14] = {
+ { Q(0.000), Q(0.392), Q(0.761), Q(1.120), Q(1.477), Q(1.832), Q(2.183),
+ Q(2.541), Q(2.893), Q(3.245), Q(3.598), Q(3.942), Q(4.288), Q(4.724) },
+ { Q(0.000), Q(0.544), Q(1.060), Q(1.563), Q(2.068), Q(2.571), Q(3.072),
+ Q(3.562), Q(4.070), Q(4.620), Q(0.000), Q(0.000), Q(0.000), Q(0.000) },
+ { Q(0.000), Q(0.746), Q(1.464), Q(2.180), Q(2.882), Q(3.584), Q(4.316),
+ Q(0.000), Q(0.000), Q(0.000), Q(0.000), Q(0.000), Q(0.000), Q(0.000) },
+ { Q(0.000), Q(1.006), Q(2.000), Q(2.993), Q(3.985), Q(0.000), Q(0.000),
+ Q(0.000), Q(0.000), Q(0.000), Q(0.000), Q(0.000), Q(0.000), Q(0.000) },
+ { Q(0.000), Q(1.321), Q(2.703), Q(3.983), Q(0.000), Q(0.000), Q(0.000),
+ Q(0.000), Q(0.000), Q(0.000), Q(0.000), Q(0.000), Q(0.000), Q(0.000) },
+ { Q(0.000), Q(1.657), Q(3.491), Q(0.000), Q(0.000), Q(0.000), Q(0.000),
+ Q(0.000), Q(0.000), Q(0.000), Q(0.000), Q(0.000), Q(0.000), Q(0.000) },
+ { Q(0.000), Q(1.964), Q(0.000), Q(0.000), Q(0.000), Q(0.000), Q(0.000),
+ Q(0.000), Q(0.000), Q(0.000), Q(0.000), Q(0.000), Q(0.000), Q(0.000) }
};
static const int invradix_tab[7] = {
@@ -508,52 +513,62 @@
19,
};
-static const float cplscale2[3] = {
-0.953020632266998,0.70710676908493,0.302905440330505,
+static const C_t cplscale2[3] = {
+ C(0.953020632266998), C(0.707106769084930), C(0.302905440330505)
};
-static const float cplscale3[7] = {
-0.981279790401459,0.936997592449188,0.875934481620789,0.70710676908493,
-0.482430040836334,0.349335819482803,0.192587479948997,
-};
-
-static const float cplscale4[15] = {
-0.991486728191376,0.973249018192291,0.953020632266998,0.930133521556854,
-0.903453230857849,0.870746195316315,0.826180458068848,0.70710676908493,
-0.563405573368073,0.491732746362686,0.428686618804932,0.367221474647522,
-0.302905440330505,0.229752898216248,0.130207896232605,
-};
-
-static const float cplscale5[31] = {
-0.995926380157471,0.987517595291138,0.978726446628571,0.969505727291107,
-0.95979779958725,0.949531257152557,0.938616216182709,0.926936149597168,
-0.914336204528809,0.900602877140045,0.885426938533783,0.868331849575043,
-0.84851086139679,0.824381768703461,0.791833400726318,0.70710676908493,
-0.610737144947052,0.566034197807312,0.529177963733673,0.495983630418777,
-0.464778542518616,0.434642940759659,0.404955863952637,0.375219136476517,
-0.344963222742081,0.313672333955765,0.280692428350449,0.245068684220314,
-0.205169528722763,0.157508864998817,0.0901700109243393,
-};
-
-static const float cplscale6[63] = {
-0.998005926609039,0.993956744670868,0.989822506904602,0.985598564147949,
-0.981279790401459,0.976860702037811,0.972335040569305,0.967696130275726,
-0.962936460971832,0.958047747612000,0.953020632266998,0.947844684123993,
-0.942508161067963,0.936997592449188,0.931297719478607,0.925390899181366,
-0.919256627559662,0.912870943546295,0.906205296516418,0.899225592613220,
-0.891890347003937,0.884148240089417,0.875934481620789,0.867165684700012,
-0.857730865478516,0.847477376461029,0.836184680461884,0.823513329029083,
-0.808890223503113,0.791194140911102,0.767520070075989,0.707106769084930,
-0.641024887561798,0.611565053462982,0.587959706783295,0.567296981811523,
-0.548448026180267,0.530831515789032,0.514098942279816,0.498019754886627,
-0.482430040836334,0.467206478118896,0.452251672744751,0.437485188245773,
-0.422837972640991,0.408248275518417,0.393658757209778,0.379014074802399,
-0.364258885383606,0.349335819482803,0.334183186292648,0.318732559680939,
-0.302905440330505,0.286608695983887,0.269728302955627,0.252119421958923,
-0.233590632677078,0.213876649737358,0.192587479948997,0.169101938605309,
-0.142307326197624,0.109772264957428,0.0631198287010193,
+static const C_t cplscale3[7] = {
+ C(0.981279790401459), C(0.936997592449188), C(0.875934481620789),
+ C(0.707106769084930), C(0.482430040836334), C(0.349335819482803),
+ C(0.192587479948997)
+};
+
+static const C_t cplscale4[15] = {
+ C(0.991486728191376), C(0.973249018192291), C(0.953020632266998),
+ C(0.930133521556854), C(0.903453230857849), C(0.870746195316315),
+ C(0.826180458068848), C(0.707106769084930), C(0.563405573368073),
+ C(0.491732746362686), C(0.428686618804932), C(0.367221474647522),
+ C(0.302905440330505), C(0.229752898216248), C(0.130207896232605)
+};
+
+static const C_t cplscale5[31] = {
+ C(0.995926380157471), C(0.987517595291138), C(0.978726446628571),
+ C(0.969505727291107), C(0.959797799587250), C(0.949531257152557),
+ C(0.938616216182709), C(0.926936149597168), C(0.914336204528809),
+ C(0.900602877140045), C(0.885426938533783), C(0.868331849575043),
+ C(0.848510861396790), C(0.824381768703461), C(0.791833400726318),
+ C(0.707106769084930), C(0.610737144947052), C(0.566034197807312),
+ C(0.529177963733673), C(0.495983630418777), C(0.464778542518616),
+ C(0.434642940759659), C(0.404955863952637), C(0.375219136476517),
+ C(0.344963222742081), C(0.313672333955765), C(0.280692428350449),
+ C(0.245068684220314), C(0.205169528722763), C(0.157508864998817),
+ C(0.0901700109243393)
+};
+
+static const C_t cplscale6[63] = {
+ C(0.998005926609039), C(0.993956744670868), C(0.989822506904602),
+ C(0.985598564147949), C(0.981279790401459), C(0.976860702037811),
+ C(0.972335040569305), C(0.967696130275726), C(0.962936460971832),
+ C(0.958047747612000), C(0.953020632266998), C(0.947844684123993),
+ C(0.942508161067963), C(0.936997592449188), C(0.931297719478607),
+ C(0.925390899181366), C(0.919256627559662), C(0.912870943546295),
+ C(0.906205296516418), C(0.899225592613220), C(0.891890347003937),
+ C(0.884148240089417), C(0.875934481620789), C(0.867165684700012),
+ C(0.857730865478516), C(0.847477376461029), C(0.836184680461884),
+ C(0.823513329029083), C(0.808890223503113), C(0.791194140911102),
+ C(0.767520070075989), C(0.707106769084930), C(0.641024887561798),
+ C(0.611565053462982), C(0.587959706783295), C(0.567296981811523),
+ C(0.548448026180267), C(0.530831515789032), C(0.514098942279816),
+ C(0.498019754886627), C(0.482430040836334), C(0.467206478118896),
+ C(0.452251672744751), C(0.437485188245773), C(0.422837972640991),
+ C(0.408248275518417), C(0.393658757209778), C(0.379014074802399),
+ C(0.364258885383606), C(0.349335819482803), C(0.334183186292648),
+ C(0.318732559680939), C(0.302905440330505), C(0.286608695983887),
+ C(0.269728302955627), C(0.252119421958923), C(0.233590632677078),
+ C(0.213876649737358), C(0.192587479948997), C(0.169101938605309),
+ C(0.142307326197624), C(0.109772264957428), C(0.0631198287010193)
};
-static const float* cplscales[5] = {
+static const C_t* cplscales[5] = {
cplscale2, cplscale3, cplscale4, cplscale5, cplscale6,
};
diff -urN svn/libavcodec/cook_fixp_mdct.h fixpoint/libavcodec/cook_fixp_mdct.h
--- svn/libavcodec/cook_fixp_mdct.h 1970-01-01 01:00:00.000000000 +0100
+++ fixpoint/libavcodec/cook_fixp_mdct.h 2007-03-21 11:33:34.000000000 +0100
@@ -0,0 +1,551 @@
+/*
+ * The following (normalized modified discrete cosine transform)
+ * is taken from the OggVorbis 'TREMOR' source code.
+ *
+ * It has been modified for the ffmpeg cook fixed point decoder.
+ */
+
+/********************************************************************
+ * *
+ * THE OggVorbis 'TREMOR' SOURCE CODE IS (C) COPYRIGHT 1994-2002 *
+ * BY THE Xiph.Org FOUNDATION http://
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?