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

📄 dca.c

📁 ffmpeg的完整源代码和作者自己写的文档。不但有在Linux的工程哦
💻 C
📖 第 1 页 / 共 3 页
字号:
/* * DCA compatible decoder * Copyright (C) 2004 Gildas Bazin * Copyright (C) 2004 Benjamin Zores * Copyright (C) 2006 Benjamin Larsson * Copyright (C) 2007 Konstantin Shishkov * * This file is part of 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 *//** * @file dca.c */#include <math.h>#include <stddef.h>#include <stdio.h>#include "avcodec.h"#include "dsputil.h"#include "bitstream.h"#include "dcadata.h"#include "dcahuff.h"#include "dca.h"//#define TRACE#define DCA_PRIM_CHANNELS_MAX (5)#define DCA_SUBBANDS (32)#define DCA_ABITS_MAX (32)      /* Should be 28 */#define DCA_SUBSUBFAMES_MAX (4)#define DCA_LFE_MAX (3)enum DCAMode {    DCA_MONO = 0,    DCA_CHANNEL,    DCA_STEREO,    DCA_STEREO_SUMDIFF,    DCA_STEREO_TOTAL,    DCA_3F,    DCA_2F1R,    DCA_3F1R,    DCA_2F2R,    DCA_3F2R,    DCA_4F2R};#define DCA_DOLBY 101           /* FIXME */#define DCA_CHANNEL_BITS 6#define DCA_CHANNEL_MASK 0x3F#define DCA_LFE 0x80#define HEADER_SIZE 14#define CONVERT_BIAS 384#define DCA_MAX_FRAME_SIZE 16383/** Bit allocation */typedef struct {    int offset;                 ///< code values offset    int maxbits[8];             ///< max bits in VLC    int wrap;                   ///< wrap for get_vlc2()    VLC vlc[8];                 ///< actual codes} BitAlloc;static BitAlloc dca_bitalloc_index;    ///< indexes for samples VLC selectstatic BitAlloc dca_tmode;             ///< transition mode VLCsstatic BitAlloc dca_scalefactor;       ///< scalefactor VLCsstatic BitAlloc dca_smpl_bitalloc[11]; ///< samples VLCs/** Pre-calculated cosine modulation coefs for the QMF */static float cos_mod[544];static av_always_inline int get_bitalloc(GetBitContext *gb, BitAlloc *ba, int idx){    return get_vlc2(gb, ba->vlc[idx].table, ba->vlc[idx].bits, ba->wrap) + ba->offset;}typedef struct {    AVCodecContext *avctx;    /* Frame header */    int frame_type;             ///< type of the current frame    int samples_deficit;        ///< deficit sample count    int crc_present;            ///< crc is present in the bitstream    int sample_blocks;          ///< number of PCM sample blocks    int frame_size;             ///< primary frame byte size    int amode;                  ///< audio channels arrangement    int sample_rate;            ///< audio sampling rate    int bit_rate;               ///< transmission bit rate    int downmix;                ///< embedded downmix enabled    int dynrange;               ///< embedded dynamic range flag    int timestamp;              ///< embedded time stamp flag    int aux_data;               ///< auxiliary data flag    int hdcd;                   ///< source material is mastered in HDCD    int ext_descr;              ///< extension audio descriptor flag    int ext_coding;             ///< extended coding flag    int aspf;                   ///< audio sync word insertion flag    int lfe;                    ///< low frequency effects flag    int predictor_history;      ///< predictor history flag    int header_crc;             ///< header crc check bytes    int multirate_inter;        ///< multirate interpolator switch    int version;                ///< encoder software revision    int copy_history;           ///< copy history    int source_pcm_res;         ///< source pcm resolution    int front_sum;              ///< front sum/difference flag    int surround_sum;           ///< surround sum/difference flag    int dialog_norm;            ///< dialog normalisation parameter    /* Primary audio coding header */    int subframes;              ///< number of subframes    int prim_channels;          ///< number of primary audio channels    int subband_activity[DCA_PRIM_CHANNELS_MAX];    ///< subband activity count    int vq_start_subband[DCA_PRIM_CHANNELS_MAX];    ///< high frequency vq start subband    int joint_intensity[DCA_PRIM_CHANNELS_MAX];     ///< joint intensity coding index    int transient_huffman[DCA_PRIM_CHANNELS_MAX];   ///< transient mode code book    int scalefactor_huffman[DCA_PRIM_CHANNELS_MAX]; ///< scale factor code book    int bitalloc_huffman[DCA_PRIM_CHANNELS_MAX];    ///< bit allocation quantizer select    int quant_index_huffman[DCA_PRIM_CHANNELS_MAX][DCA_ABITS_MAX]; ///< quantization index codebook select    float scalefactor_adj[DCA_PRIM_CHANNELS_MAX][DCA_ABITS_MAX];   ///< scale factor adjustment    /* Primary audio coding side information */    int subsubframes;           ///< number of subsubframes    int partial_samples;        ///< partial subsubframe samples count    int prediction_mode[DCA_PRIM_CHANNELS_MAX][DCA_SUBBANDS];    ///< prediction mode (ADPCM used or not)    int prediction_vq[DCA_PRIM_CHANNELS_MAX][DCA_SUBBANDS];      ///< prediction VQ coefs    int bitalloc[DCA_PRIM_CHANNELS_MAX][DCA_SUBBANDS];           ///< bit allocation index    int transition_mode[DCA_PRIM_CHANNELS_MAX][DCA_SUBBANDS];    ///< transition mode (transients)    int scale_factor[DCA_PRIM_CHANNELS_MAX][DCA_SUBBANDS][2];    ///< scale factors (2 if transient)    int joint_huff[DCA_PRIM_CHANNELS_MAX];                       ///< joint subband scale factors codebook    int joint_scale_factor[DCA_PRIM_CHANNELS_MAX][DCA_SUBBANDS]; ///< joint subband scale factors    int downmix_coef[DCA_PRIM_CHANNELS_MAX][2];                  ///< stereo downmix coefficients    int dynrange_coef;                                           ///< dynamic range coefficient    int high_freq_vq[DCA_PRIM_CHANNELS_MAX][DCA_SUBBANDS];       ///< VQ encoded high frequency subbands    float lfe_data[2 * DCA_SUBSUBFAMES_MAX * DCA_LFE_MAX *                   2 /*history */ ];    ///< Low frequency effect data    int lfe_scale_factor;    /* Subband samples history (for ADPCM) */    float subband_samples_hist[DCA_PRIM_CHANNELS_MAX][DCA_SUBBANDS][4];    float subband_fir_hist[DCA_PRIM_CHANNELS_MAX][512];    float subband_fir_noidea[DCA_PRIM_CHANNELS_MAX][64];    int output;                 ///< type of output    int bias;                   ///< output bias    DECLARE_ALIGNED_16(float, samples[1536]);  /* 6 * 256 = 1536, might only need 5 */    DECLARE_ALIGNED_16(int16_t, tsamples[1536]);    uint8_t dca_buffer[DCA_MAX_FRAME_SIZE];    int dca_buffer_size;        ///< how much data is in the dca_buffer    GetBitContext gb;    /* Current position in DCA frame */    int current_subframe;    int current_subsubframe;    int debug_flag;             ///< used for suppressing repeated error messages output    DSPContext dsp;} DCAContext;static void dca_init_vlcs(void){    static int vlcs_inited = 0;    int i, j;    if (vlcs_inited)        return;    dca_bitalloc_index.offset = 1;    dca_bitalloc_index.wrap = 2;    for (i = 0; i < 5; i++)        init_vlc(&dca_bitalloc_index.vlc[i], bitalloc_12_vlc_bits[i], 12,                 bitalloc_12_bits[i], 1, 1,                 bitalloc_12_codes[i], 2, 2, 1);    dca_scalefactor.offset = -64;    dca_scalefactor.wrap = 2;    for (i = 0; i < 5; i++)        init_vlc(&dca_scalefactor.vlc[i], SCALES_VLC_BITS, 129,                 scales_bits[i], 1, 1,                 scales_codes[i], 2, 2, 1);    dca_tmode.offset = 0;    dca_tmode.wrap = 1;    for (i = 0; i < 4; i++)        init_vlc(&dca_tmode.vlc[i], tmode_vlc_bits[i], 4,                 tmode_bits[i], 1, 1,                 tmode_codes[i], 2, 2, 1);    for(i = 0; i < 10; i++)        for(j = 0; j < 7; j++){            if(!bitalloc_codes[i][j]) break;            dca_smpl_bitalloc[i+1].offset = bitalloc_offsets[i];            dca_smpl_bitalloc[i+1].wrap = 1 + (j > 4);            init_vlc(&dca_smpl_bitalloc[i+1].vlc[j], bitalloc_maxbits[i][j],                     bitalloc_sizes[i],                     bitalloc_bits[i][j], 1, 1,                     bitalloc_codes[i][j], 2, 2, 1);        }    vlcs_inited = 1;}static inline void get_array(GetBitContext *gb, int *dst, int len, int bits){    while(len--)        *dst++ = get_bits(gb, bits);}static int dca_parse_frame_header(DCAContext * s){    int i, j;    static const float adj_table[4] = { 1.0, 1.1250, 1.2500, 1.4375 };    static const int bitlen[11] = { 0, 1, 2, 2, 2, 2, 3, 3, 3, 3, 3 };    static const int thr[11] = { 0, 1, 3, 3, 3, 3, 7, 7, 7, 7, 7 };    s->bias = CONVERT_BIAS;    init_get_bits(&s->gb, s->dca_buffer, s->dca_buffer_size * 8);    /* Sync code */    get_bits(&s->gb, 32);    /* Frame header */    s->frame_type        = get_bits(&s->gb, 1);    s->samples_deficit   = get_bits(&s->gb, 5) + 1;    s->crc_present       = get_bits(&s->gb, 1);    s->sample_blocks     = get_bits(&s->gb, 7) + 1;    s->frame_size        = get_bits(&s->gb, 14) + 1;    if (s->frame_size < 95)        return -1;    s->amode             = get_bits(&s->gb, 6);    s->sample_rate       = dca_sample_rates[get_bits(&s->gb, 4)];    if (!s->sample_rate)        return -1;    s->bit_rate          = dca_bit_rates[get_bits(&s->gb, 5)];    if (!s->bit_rate)        return -1;    s->downmix           = get_bits(&s->gb, 1);    s->dynrange          = get_bits(&s->gb, 1);    s->timestamp         = get_bits(&s->gb, 1);    s->aux_data          = get_bits(&s->gb, 1);    s->hdcd              = get_bits(&s->gb, 1);    s->ext_descr         = get_bits(&s->gb, 3);    s->ext_coding        = get_bits(&s->gb, 1);    s->aspf              = get_bits(&s->gb, 1);    s->lfe               = get_bits(&s->gb, 2);    s->predictor_history = get_bits(&s->gb, 1);    /* TODO: check CRC */    if (s->crc_present)        s->header_crc    = get_bits(&s->gb, 16);    s->multirate_inter   = get_bits(&s->gb, 1);    s->version           = get_bits(&s->gb, 4);    s->copy_history      = get_bits(&s->gb, 2);    s->source_pcm_res    = get_bits(&s->gb, 3);    s->front_sum         = get_bits(&s->gb, 1);    s->surround_sum      = get_bits(&s->gb, 1);    s->dialog_norm       = get_bits(&s->gb, 4);    /* FIXME: channels mixing levels */    s->output = s->amode;    if(s->lfe) s->output |= DCA_LFE;#ifdef TRACE    av_log(s->avctx, AV_LOG_DEBUG, "frame type: %i\n", s->frame_type);    av_log(s->avctx, AV_LOG_DEBUG, "samples deficit: %i\n", s->samples_deficit);    av_log(s->avctx, AV_LOG_DEBUG, "crc present: %i\n", s->crc_present);    av_log(s->avctx, AV_LOG_DEBUG, "sample blocks: %i (%i samples)\n",           s->sample_blocks, s->sample_blocks * 32);    av_log(s->avctx, AV_LOG_DEBUG, "frame size: %i bytes\n", s->frame_size);    av_log(s->avctx, AV_LOG_DEBUG, "amode: %i (%i channels)\n",           s->amode, dca_channels[s->amode]);    av_log(s->avctx, AV_LOG_DEBUG, "sample rate: %i (%i Hz)\n",           s->sample_rate, dca_sample_rates[s->sample_rate]);    av_log(s->avctx, AV_LOG_DEBUG, "bit rate: %i (%i bits/s)\n",           s->bit_rate, dca_bit_rates[s->bit_rate]);    av_log(s->avctx, AV_LOG_DEBUG, "downmix: %i\n", s->downmix);    av_log(s->avctx, AV_LOG_DEBUG, "dynrange: %i\n", s->dynrange);    av_log(s->avctx, AV_LOG_DEBUG, "timestamp: %i\n", s->timestamp);    av_log(s->avctx, AV_LOG_DEBUG, "aux_data: %i\n", s->aux_data);    av_log(s->avctx, AV_LOG_DEBUG, "hdcd: %i\n", s->hdcd);    av_log(s->avctx, AV_LOG_DEBUG, "ext descr: %i\n", s->ext_descr);    av_log(s->avctx, AV_LOG_DEBUG, "ext coding: %i\n", s->ext_coding);    av_log(s->avctx, AV_LOG_DEBUG, "aspf: %i\n", s->aspf);    av_log(s->avctx, AV_LOG_DEBUG, "lfe: %i\n", s->lfe);    av_log(s->avctx, AV_LOG_DEBUG, "predictor history: %i\n",           s->predictor_history);    av_log(s->avctx, AV_LOG_DEBUG, "header crc: %i\n", s->header_crc);    av_log(s->avctx, AV_LOG_DEBUG, "multirate inter: %i\n",           s->multirate_inter);    av_log(s->avctx, AV_LOG_DEBUG, "version number: %i\n", s->version);    av_log(s->avctx, AV_LOG_DEBUG, "copy history: %i\n", s->copy_history);    av_log(s->avctx, AV_LOG_DEBUG,           "source pcm resolution: %i (%i bits/sample)\n",           s->source_pcm_res, dca_bits_per_sample[s->source_pcm_res]);    av_log(s->avctx, AV_LOG_DEBUG, "front sum: %i\n", s->front_sum);    av_log(s->avctx, AV_LOG_DEBUG, "surround sum: %i\n", s->surround_sum);    av_log(s->avctx, AV_LOG_DEBUG, "dialog norm: %i\n", s->dialog_norm);    av_log(s->avctx, AV_LOG_DEBUG, "\n");#endif    /* Primary audio coding header */    s->subframes         = get_bits(&s->gb, 4) + 1;    s->prim_channels     = get_bits(&s->gb, 3) + 1;    for (i = 0; i < s->prim_channels; i++) {        s->subband_activity[i] = get_bits(&s->gb, 5) + 2;        if (s->subband_activity[i] > DCA_SUBBANDS)            s->subband_activity[i] = DCA_SUBBANDS;    }    for (i = 0; i < s->prim_channels; i++) {        s->vq_start_subband[i] = get_bits(&s->gb, 5) + 1;        if (s->vq_start_subband[i] > DCA_SUBBANDS)            s->vq_start_subband[i] = DCA_SUBBANDS;    }    get_array(&s->gb, s->joint_intensity,     s->prim_channels, 3);    get_array(&s->gb, s->transient_huffman,   s->prim_channels, 2);    get_array(&s->gb, s->scalefactor_huffman, s->prim_channels, 3);    get_array(&s->gb, s->bitalloc_huffman,    s->prim_channels, 3);    /* Get codebooks quantization indexes */    memset(s->quant_index_huffman, 0, sizeof(s->quant_index_huffman));    for (j = 1; j < 11; j++)        for (i = 0; i < s->prim_channels; i++)            s->quant_index_huffman[i][j] = get_bits(&s->gb, bitlen[j]);    /* Get scale factor adjustment */    for (j = 0; j < 11; j++)        for (i = 0; i < s->prim_channels; i++)            s->scalefactor_adj[i][j] = 1;    for (j = 1; j < 11; j++)        for (i = 0; i < s->prim_channels; i++)            if (s->quant_index_huffman[i][j] < thr[j])                s->scalefactor_adj[i][j] = adj_table[get_bits(&s->gb, 2)];    if (s->crc_present) {        /* Audio header CRC check */        get_bits(&s->gb, 16);    }    s->current_subframe = 0;    s->current_subsubframe = 0;#ifdef TRACE    av_log(s->avctx, AV_LOG_DEBUG, "subframes: %i\n", s->subframes);    av_log(s->avctx, AV_LOG_DEBUG, "prim channels: %i\n", s->prim_channels);    for(i = 0; i < s->prim_channels; i++){        av_log(s->avctx, AV_LOG_DEBUG, "subband activity: %i\n", s->subband_activity[i]);        av_log(s->avctx, AV_LOG_DEBUG, "vq start subband: %i\n", s->vq_start_subband[i]);        av_log(s->avctx, AV_LOG_DEBUG, "joint intensity: %i\n", s->joint_intensity[i]);        av_log(s->avctx, AV_LOG_DEBUG, "transient mode codebook: %i\n", s->transient_huffman[i]);        av_log(s->avctx, AV_LOG_DEBUG, "scale factor codebook: %i\n", s->scalefactor_huffman[i]);        av_log(s->avctx, AV_LOG_DEBUG, "bit allocation quantizer: %i\n", s->bitalloc_huffman[i]);        av_log(s->avctx, AV_LOG_DEBUG, "quant index huff:");        for (j = 0; j < 11; j++)            av_log(s->avctx, AV_LOG_DEBUG, " %i",                   s->quant_index_huffman[i][j]);        av_log(s->avctx, AV_LOG_DEBUG, "\n");        av_log(s->avctx, AV_LOG_DEBUG, "scalefac adj:");        for (j = 0; j < 11; j++)            av_log(s->avctx, AV_LOG_DEBUG, " %1.3f", s->scalefactor_adj[i][j]);        av_log(s->avctx, AV_LOG_DEBUG, "\n");    }#endif    return 0;}static inline int get_scale(GetBitContext *gb, int level, int value){   if (level < 5) {       /* huffman encoded */       value += get_bitalloc(gb, &dca_scalefactor, level);   } else if(level < 8)       value = get_bits(gb, level + 1);   return value;}static int dca_subframe_header(DCAContext * s){    /* Primary audio coding side information */    int j, k;    s->subsubframes = get_bits(&s->gb, 2) + 1;    s->partial_samples = get_bits(&s->gb, 3);    for (j = 0; j < s->prim_channels; j++) {        for (k = 0; k < s->subband_activity[j]; k++)            s->prediction_mode[j][k] = get_bits(&s->gb, 1);    }    /* Get prediction codebook */    for (j = 0; j < s->prim_channels; j++) {        for (k = 0; k < s->subband_activity[j]; k++) {            if (s->prediction_mode[j][k] > 0) {                /* (Prediction coefficient VQ address) */                s->prediction_vq[j][k] = get_bits(&s->gb, 12);            }

⌨️ 快捷键说明

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