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

📄 dolby_adapt.c

📁 网络MPEG4IP流媒体开发源代码
💻 C
📖 第 1 页 / 共 2 页
字号:
/************************* MPEG-2 NBC Audio Decoder ************************** *                                                                           *"This software module was originally developed byAT&T, Dolby Laboratories, Fraunhofer Gesellschaft IIS in the course ofdevelopment of the MPEG-2 NBC/MPEG-4 Audio standard ISO/IEC 13818-7,14496-1,2 and 3. This software module is an implementation of a part of one or moreMPEG-2 NBC/MPEG-4 Audio tools as specified by the MPEG-2 NBC/MPEG-4Audio standard. ISO/IEC  gives users of the MPEG-2 NBC/MPEG-4 Audiostandards free license to this software module or modifications thereof for use inhardware or software products claiming conformance to the MPEG-2 NBC/MPEG-4Audio  standards. Those intending to use this software module in hardware orsoftware products are advised that this use may infringe existing patents.The original developer of this software module and his/her company, the subsequenteditors and their companies, and ISO/IEC have no liability for use of this softwaremodule or modifications thereof in an implementation. Copyright is not released fornon MPEG-2 NBC/MPEG-4 Audio conforming products.The original developerretains full right to use the code for his/her  own purpose, assign or donate thecode to a third party and to inhibit third party from using the code for nonMPEG-2 NBC/MPEG-4 Audio conforming products. This copyright notice mustbe included in all copies or derivative works."Copyright(c)1996. *                                                                           * ****************************************************************************//* * $Id$ */#include "all.h"#include "block.h"#include "util.h"#define NORM_TYPE 0#define START_TYPE 1#define SHORT_TYPE 2#define STOP_TYPE 3/**   Interleave Definitions for start and stop blocks**   Start block contains 1 576-pt spectrum (A) and 4 128-pt spectra (B-E)*     Input spectra are interleaved in repeating segements of 17 bins,*       9 bins from A (A0-A8), and 2 bins from each of the shorts.*     Within the segments the bins are interleaved as:*       A0 A1 A2 A3 A4 B0 C0 D0 E0 A5 A6 A7 A8 B1 C1 D1 E1**   Stop block contains 3 128-pt spectra (A-C) and 1 576-pt spectrum (D)*     Input spectra are interleaved in repeating segements of 15 bins,*       2 bins from each of the shorts, and 9 bins from D (D0-D8).*     Within the segments the bins are interleaved as:*       A0 B0 C0 D0 D1 D2 D3 D4 A1 B1 C1 D5 D6 D7 D8*     The last 64 bins are (should be) set to 0.*/#define N_SHORT_IN_START 4#define START_OFFSET 0#define SHORT_IN_START_OFFSET 5#define N_SHORT_IN_STOP 3#define STOP_OFFSET 3#define SHORT_IN_STOP_OFFSET 0#define N_SHORT_IN_4STOP    4/*******************************************************************************   unfold*   create full spectrum by reflecting-inverting first half over to second*   input: see below*   output: see below*   local static: none*   globals: none******************************************************************************/void unfold (    Float *data_in, /* input: 1/2 spectrum */    Float *data_out,    /* output: full spectrum */    int inLeng)         /* input: length of input vector */{    register int   i;    /* fill transBuff w/ full MDCT sequence from freqInPtr */    i=0;    do    {      data_out[i] = *data_in;      data_out[2*inLeng-i-1] = -(*data_in);      data_in++;      i++;      data_out[i] = *data_in;      data_out[2*inLeng-i-1] = -(*data_in);      data_in++;      i++;      data_out[i] = *data_in;      data_out[2*inLeng-i-1] = -(*data_in);      data_in++;      i++;      data_out[i] = *data_in;      data_out[2*inLeng-i-1] = -(*data_in);      data_in++;      i++;    }while (i<inLeng);} /* end of unfold *//*******************************************************************************   freq2time_adapt*   transform freq. domain data to time domain.*   Overlap and add transform output to recreate time sequence.*   Blocks composed of multiple segments (i.e. all but long) have*     input spectrums interleaved.*   input: see below*   output: see below*   local static:*     timeBuff      time domain data fifo*   globals: none******************************************************************************/void freq2time_adapt(faacDecHandle hDecoder,    byte blockType,         /* input: blockType 0-3                     */    Wnd_Shape *wnd_shape,   /* input/output                             */    Float *freqInPtr,       /* input: interleaved spectrum              */    Float *timeBuff,        /* transform state needed for each channel  */    Float *ftimeOutPtr)     /* output: 1/2 block of new time values     */{    Float *transBuff, *transBuffPtr;    int             i, j;    Float           *timeBuffPtr, *destPtr;    Float *timeOutPtr;    transBuff = AllocMemory(2*BLOCK_LEN_LONG*sizeof(Float));    timeOutPtr = AllocMemory(BLOCK_LEN_LONG*sizeof(Float));    if (blockType == NORM_TYPE)  {        unfold (freqInPtr, transBuff, BLOCK_LEN_LONG);        /* Do 1 LONG transform */        ITransformBlock (hDecoder, transBuff, LONG_BLOCK, wnd_shape, timeBuff); /* ch ); */        transBuffPtr = transBuff;        timeBuffPtr = timeBuff;     /*   [ch];  */        destPtr = timeOutPtr;    /* idimkovic: reduce loop overhead by unrolling */    for (i = BLOCK_LEN_LONG/16 - 1; i >= 0; --i)    {            *destPtr++ = *transBuffPtr++ + *timeBuffPtr++;            *destPtr++ = *transBuffPtr++ + *timeBuffPtr++;            *destPtr++ = *transBuffPtr++ + *timeBuffPtr++;            *destPtr++ = *transBuffPtr++ + *timeBuffPtr++;            *destPtr++ = *transBuffPtr++ + *timeBuffPtr++;            *destPtr++ = *transBuffPtr++ + *timeBuffPtr++;            *destPtr++ = *transBuffPtr++ + *timeBuffPtr++;            *destPtr++ = *transBuffPtr++ + *timeBuffPtr++;            *destPtr++ = *transBuffPtr++ + *timeBuffPtr++;            *destPtr++ = *transBuffPtr++ + *timeBuffPtr++;            *destPtr++ = *transBuffPtr++ + *timeBuffPtr++;            *destPtr++ = *transBuffPtr++ + *timeBuffPtr++;            *destPtr++ = *transBuffPtr++ + *timeBuffPtr++;            *destPtr++ = *transBuffPtr++ + *timeBuffPtr++;            *destPtr++ = *transBuffPtr++ + *timeBuffPtr++;            *destPtr++ = *transBuffPtr++ + *timeBuffPtr++;        }    /* Save second half as old data */        timeBuffPtr = timeBuff;     /*       [ch];      */    for (i = BLOCK_LEN_LONG/16 - 1; i >= 0; --i)  {      *timeBuffPtr++ = *transBuffPtr++; *timeBuffPtr++ = *transBuffPtr++;      *timeBuffPtr++ = *transBuffPtr++; *timeBuffPtr++ = *transBuffPtr++;      *timeBuffPtr++ = *transBuffPtr++; *timeBuffPtr++ = *transBuffPtr++;      *timeBuffPtr++ = *transBuffPtr++; *timeBuffPtr++ = *transBuffPtr++;      *timeBuffPtr++ = *transBuffPtr++; *timeBuffPtr++ = *transBuffPtr++;      *timeBuffPtr++ = *transBuffPtr++; *timeBuffPtr++ = *transBuffPtr++;      *timeBuffPtr++ = *transBuffPtr++; *timeBuffPtr++ = *transBuffPtr++;      *timeBuffPtr++ = *transBuffPtr++; *timeBuffPtr++ = *transBuffPtr++;        }    }    else if (blockType == SHORT_TYPE)    {        /* Do 8 SHORT transforms */        if (hDecoder->dolbyShortOffset_f2t)            destPtr = timeBuff + 4 * BLOCK_LEN_SHORT;       /* DBS */        else            destPtr = timeBuff + (BLOCK_LEN_LONG - BLOCK_LEN_SHORT) / 2;    /*  448 */        for (i = 0; i < 8; i++) {            unfold (freqInPtr, transBuff, BLOCK_LEN_SHORT );            /*was freqinPtr++, 8 .. mfd */            freqInPtr += BLOCK_LEN_SHORT;   /*  added mfd   */            ITransformBlock (hDecoder, transBuff, SHORT_BLOCK, wnd_shape, timeBuff);            /* Add first half of short window and old data */            transBuffPtr = transBuff;      for (j = BLOCK_LEN_SHORT/16-1; j >= 0; --j)  {        *destPtr++ += *transBuffPtr++; *destPtr++ += *transBuffPtr++;        *destPtr++ += *transBuffPtr++; *destPtr++ += *transBuffPtr++;        *destPtr++ += *transBuffPtr++; *destPtr++ += *transBuffPtr++;        *destPtr++ += *transBuffPtr++; *destPtr++ += *transBuffPtr++;        *destPtr++ += *transBuffPtr++; *destPtr++ += *transBuffPtr++;        *destPtr++ += *transBuffPtr++; *destPtr++ += *transBuffPtr++;        *destPtr++ += *transBuffPtr++; *destPtr++ += *transBuffPtr++;        *destPtr++ += *transBuffPtr++; *destPtr++ += *transBuffPtr++;            }            /* Save second half of short window */      for (j = BLOCK_LEN_SHORT/16-1; j >= 0; --j)  {        *destPtr++ = *transBuffPtr++;  *destPtr++ = *transBuffPtr++;        *destPtr++ = *transBuffPtr++;  *destPtr++ = *transBuffPtr++;        *destPtr++ = *transBuffPtr++;  *destPtr++ = *transBuffPtr++;        *destPtr++ = *transBuffPtr++;  *destPtr++ = *transBuffPtr++;        *destPtr++ = *transBuffPtr++;  *destPtr++ = *transBuffPtr++;        *destPtr++ = *transBuffPtr++;  *destPtr++ = *transBuffPtr++;        *destPtr++ = *transBuffPtr++;  *destPtr++ = *transBuffPtr++;        *destPtr++ = *transBuffPtr++;  *destPtr++ = *transBuffPtr++;            }            destPtr -= BLOCK_LEN_SHORT;        }        /* Copy data to output buffer */        destPtr = timeOutPtr;        timeBuffPtr = timeBuff;     /*       [ch];      */    for (i = BLOCK_LEN_LONG/16 - 1; i >= 0; --i)  {      *destPtr++ = *timeBuffPtr++; *destPtr++ = *timeBuffPtr++;      *destPtr++ = *timeBuffPtr++; *destPtr++ = *timeBuffPtr++;      *destPtr++ = *timeBuffPtr++; *destPtr++ = *timeBuffPtr++;      *destPtr++ = *timeBuffPtr++; *destPtr++ = *timeBuffPtr++;      *destPtr++ = *timeBuffPtr++; *destPtr++ = *timeBuffPtr++;      *destPtr++ = *timeBuffPtr++; *destPtr++ = *timeBuffPtr++;      *destPtr++ = *timeBuffPtr++; *destPtr++ = *timeBuffPtr++;      *destPtr++ = *timeBuffPtr++; *destPtr++ = *timeBuffPtr++;        }        /* Update timeBuff fifo */        destPtr = timeBuff;     /*       [ch];      */    for (i = BLOCK_LEN_LONG/16 - 1; i >= 0; --i)  {      *destPtr++ = *timeBuffPtr++; *destPtr++ = *timeBuffPtr++;      *destPtr++ = *timeBuffPtr++; *destPtr++ = *timeBuffPtr++;      *destPtr++ = *timeBuffPtr++; *destPtr++ = *timeBuffPtr++;      *destPtr++ = *timeBuffPtr++; *destPtr++ = *timeBuffPtr++;      *destPtr++ = *timeBuffPtr++; *destPtr++ = *timeBuffPtr++;      *destPtr++ = *timeBuffPtr++; *destPtr++ = *timeBuffPtr++;      *destPtr++ = *timeBuffPtr++; *destPtr++ = *timeBuffPtr++;      *destPtr++ = *timeBuffPtr++; *destPtr++ = *timeBuffPtr++;     }    }    else if (blockType == START_TYPE)  {        unfold(freqInPtr, transBuff, BLOCK_LEN_LONG);        ITransformBlock (hDecoder, transBuff, START_FLAT_BLOCK, wnd_shape, timeBuff);        /* Add first half and old data */        transBuffPtr = transBuff;        timeBuffPtr = timeBuff;        destPtr = timeOutPtr;    for (i = BLOCK_LEN_LONG/16 - 1; i >= 0; --i)  {            *destPtr++ = *transBuffPtr++ + *timeBuffPtr++;            *destPtr++ = *transBuffPtr++ + *timeBuffPtr++;            *destPtr++ = *transBuffPtr++ + *timeBuffPtr++;            *destPtr++ = *transBuffPtr++ + *timeBuffPtr++;            *destPtr++ = *transBuffPtr++ + *timeBuffPtr++;            *destPtr++ = *transBuffPtr++ + *timeBuffPtr++;            *destPtr++ = *transBuffPtr++ + *timeBuffPtr++;            *destPtr++ = *transBuffPtr++ + *timeBuffPtr++;            *destPtr++ = *transBuffPtr++ + *timeBuffPtr++;            *destPtr++ = *transBuffPtr++ + *timeBuffPtr++;

⌨️ 快捷键说明

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