dolby_adapt.c
上传用户:sun1608
上传日期:2007-02-02
资源大小:6116k
文件大小:23k
源码类别:

流媒体/Mpeg4/MP4

开发平台:

Visual C++

  1. /************************* MPEG-2 NBC Audio Decoder **************************
  2.  *                                                                           *
  3. "This software module was originally developed by
  4. AT&T, Dolby Laboratories, Fraunhofer Gesellschaft IIS in the course of
  5. development of the MPEG-2 NBC/MPEG-4 Audio standard ISO/IEC 13818-7,
  6. 14496-1,2 and 3. This software module is an implementation of a part of one or more
  7. MPEG-2 NBC/MPEG-4 Audio tools as specified by the MPEG-2 NBC/MPEG-4
  8. Audio standard. ISO/IEC  gives users of the MPEG-2 NBC/MPEG-4 Audio
  9. standards free license to this software module or modifications thereof for use in
  10. hardware or software products claiming conformance to the MPEG-2 NBC/MPEG-4
  11. Audio  standards. Those intending to use this software module in hardware or
  12. software products are advised that this use may infringe existing patents.
  13. The original developer of this software module and his/her company, the subsequent
  14. editors and their companies, and ISO/IEC have no liability for use of this software
  15. module or modifications thereof in an implementation. Copyright is not released for
  16. non MPEG-2 NBC/MPEG-4 Audio conforming products.The original developer
  17. retains full right to use the code for his/her  own purpose, assign or donate the
  18. code to a third party and to inhibit third party from using the code for non
  19. MPEG-2 NBC/MPEG-4 Audio conforming products. This copyright notice must
  20. be included in all copies or derivative works."
  21. Copyright(c)1996.
  22.  *                                                                           *
  23.  ****************************************************************************/
  24. /*
  25.  * $Id: dolby_adapt.c,v 1.5 2002/01/09 22:25:41 wmay Exp $
  26.  */
  27. #ifdef WIN32
  28. #include <windows.h>
  29. #endif
  30. #include <stdio.h>
  31. #include <stdlib.h>
  32. #include "all.h"
  33. #include "block.h"
  34. #include "util.h"
  35. #define NORM_TYPE 0
  36. #define START_TYPE 1
  37. #define SHORT_TYPE 2
  38. #define STOP_TYPE 3
  39. /*
  40. *   Interleave Definitions for start and stop blocks
  41. *
  42. *   Start block contains 1 576-pt spectrum (A) and 4 128-pt spectra (B-E)
  43. *     Input spectra are interleaved in repeating segements of 17 bins,
  44. *       9 bins from A (A0-A8), and 2 bins from each of the shorts.
  45. *     Within the segments the bins are interleaved as:
  46. *       A0 A1 A2 A3 A4 B0 C0 D0 E0 A5 A6 A7 A8 B1 C1 D1 E1
  47. *
  48. *   Stop block contains 3 128-pt spectra (A-C) and 1 576-pt spectrum (D)
  49. *     Input spectra are interleaved in repeating segements of 15 bins,
  50. *       2 bins from each of the shorts, and 9 bins from D (D0-D8).
  51. *     Within the segments the bins are interleaved as:
  52. *       A0 B0 C0 D0 D1 D2 D3 D4 A1 B1 C1 D5 D6 D7 D8
  53. *     The last 64 bins are (should be) set to 0.
  54. */
  55. #define N_SHORT_IN_START 4
  56. #define START_OFFSET 0
  57. #define SHORT_IN_START_OFFSET 5
  58. #define N_SHORT_IN_STOP 3
  59. #define STOP_OFFSET 3
  60. #define SHORT_IN_STOP_OFFSET 0
  61. #define N_SHORT_IN_4STOP    4
  62. /*****************************************************************************
  63. *
  64. *   unfold
  65. *   create full spectrum by reflecting-inverting first half over to second
  66. *   input: see below
  67. *   output: see below
  68. *   local static: none
  69. *   globals: none
  70. *
  71. *****************************************************************************/
  72. void unfold (
  73.     Float *data_in, /* input: 1/2 spectrum */
  74.     Float *data_out,    /* output: full spectrum */
  75.     int inLeng)         /* input: length of input vector */
  76. {
  77.     register int   i;
  78.     /* fill transBuff w/ full MDCT sequence from freqInPtr */
  79.     i=0;
  80.     do
  81.     {
  82.       data_out[i] = *data_in;
  83.       data_out[2*inLeng-i-1] = -(*data_in);
  84.       data_in++;
  85.       i++;
  86.       data_out[i] = *data_in;
  87.       data_out[2*inLeng-i-1] = -(*data_in);
  88.       data_in++;
  89.       i++;
  90.       data_out[i] = *data_in;
  91.       data_out[2*inLeng-i-1] = -(*data_in);
  92.       data_in++;
  93.       i++;
  94.       data_out[i] = *data_in;
  95.       data_out[2*inLeng-i-1] = -(*data_in);
  96.       data_in++;
  97.       i++;
  98.     }while (i<inLeng);
  99. } /* end of unfold */
  100. /*****************************************************************************
  101. *
  102. *   freq2time_adapt
  103. *   transform freq. domain data to time domain.
  104. *   Overlap and add transform output to recreate time sequence.
  105. *   Blocks composed of multiple segments (i.e. all but long) have
  106. *     input spectrums interleaved.
  107. *   input: see below
  108. *   output: see below
  109. *   local static:
  110. *     timeBuff      time domain data fifo
  111. *   globals: none
  112. *
  113. *****************************************************************************/
  114. void freq2time_adapt(faacDecHandle hDecoder,
  115.     byte blockType,         /* input: blockType 0-3                     */
  116.     Wnd_Shape *wnd_shape,   /* input/output                             */
  117.     Float *freqInPtr,       /* input: interleaved spectrum              */
  118.     Float *timeBuff,        /* transform state needed for each channel  */
  119.     Float *ftimeOutPtr)     /* output: 1/2 block of new time values     */
  120. {
  121.     Float *transBuff, *transBuffPtr;
  122.     int             i, j;
  123.     Float           *timeBuffPtr, *destPtr;
  124.     Float *timeOutPtr;
  125.     transBuff = AllocMemory(2*BLOCK_LEN_LONG*sizeof(Float));
  126.     timeOutPtr = AllocMemory(BLOCK_LEN_LONG*sizeof(Float));
  127.     if (blockType == NORM_TYPE)  {
  128.         unfold (freqInPtr, transBuff, BLOCK_LEN_LONG);
  129.         /* Do 1 LONG transform */
  130.         ITransformBlock (hDecoder, transBuff, LONG_BLOCK, wnd_shape, timeBuff); /* ch ); */
  131.         transBuffPtr = transBuff;
  132.         timeBuffPtr = timeBuff;     /*   [ch];  */
  133.         destPtr = timeOutPtr;
  134.     /* idimkovic: reduce loop overhead by unrolling */
  135.     for (i = BLOCK_LEN_LONG/16 - 1; i >= 0; --i)
  136.     {
  137.             *destPtr++ = *transBuffPtr++ + *timeBuffPtr++;
  138.             *destPtr++ = *transBuffPtr++ + *timeBuffPtr++;
  139.             *destPtr++ = *transBuffPtr++ + *timeBuffPtr++;
  140.             *destPtr++ = *transBuffPtr++ + *timeBuffPtr++;
  141.             *destPtr++ = *transBuffPtr++ + *timeBuffPtr++;
  142.             *destPtr++ = *transBuffPtr++ + *timeBuffPtr++;
  143.             *destPtr++ = *transBuffPtr++ + *timeBuffPtr++;
  144.             *destPtr++ = *transBuffPtr++ + *timeBuffPtr++;
  145.             *destPtr++ = *transBuffPtr++ + *timeBuffPtr++;
  146.             *destPtr++ = *transBuffPtr++ + *timeBuffPtr++;
  147.             *destPtr++ = *transBuffPtr++ + *timeBuffPtr++;
  148.             *destPtr++ = *transBuffPtr++ + *timeBuffPtr++;
  149.             *destPtr++ = *transBuffPtr++ + *timeBuffPtr++;
  150.             *destPtr++ = *transBuffPtr++ + *timeBuffPtr++;
  151.             *destPtr++ = *transBuffPtr++ + *timeBuffPtr++;
  152.             *destPtr++ = *transBuffPtr++ + *timeBuffPtr++;
  153.         }
  154.     /* Save second half as old data */
  155.         timeBuffPtr = timeBuff;     /*       [ch];      */
  156.     for (i = BLOCK_LEN_LONG/16 - 1; i >= 0; --i)  {
  157.       *timeBuffPtr++ = *transBuffPtr++; *timeBuffPtr++ = *transBuffPtr++;
  158.       *timeBuffPtr++ = *transBuffPtr++; *timeBuffPtr++ = *transBuffPtr++;
  159.       *timeBuffPtr++ = *transBuffPtr++; *timeBuffPtr++ = *transBuffPtr++;
  160.       *timeBuffPtr++ = *transBuffPtr++; *timeBuffPtr++ = *transBuffPtr++;
  161.       *timeBuffPtr++ = *transBuffPtr++; *timeBuffPtr++ = *transBuffPtr++;
  162.       *timeBuffPtr++ = *transBuffPtr++; *timeBuffPtr++ = *transBuffPtr++;
  163.       *timeBuffPtr++ = *transBuffPtr++; *timeBuffPtr++ = *transBuffPtr++;
  164.       *timeBuffPtr++ = *transBuffPtr++; *timeBuffPtr++ = *transBuffPtr++;
  165.         }
  166.     }
  167.     else if (blockType == SHORT_TYPE)
  168.     {
  169.         /* Do 8 SHORT transforms */
  170.         if (hDecoder->dolbyShortOffset_f2t)
  171.             destPtr = timeBuff + 4 * BLOCK_LEN_SHORT;       /* DBS */
  172.         else
  173.             destPtr = timeBuff + (BLOCK_LEN_LONG - BLOCK_LEN_SHORT) / 2;    /*  448 */
  174.         for (i = 0; i < 8; i++) {
  175.             unfold (freqInPtr, transBuff, BLOCK_LEN_SHORT );
  176.             /*was freqinPtr++, 8 .. mfd */
  177.             freqInPtr += BLOCK_LEN_SHORT;   /*  added mfd   */
  178.             ITransformBlock (hDecoder, transBuff, SHORT_BLOCK, wnd_shape, timeBuff);
  179.             /* Add first half of short window and old data */
  180.             transBuffPtr = transBuff;
  181.       for (j = BLOCK_LEN_SHORT/16-1; j >= 0; --j)  {
  182.         *destPtr++ += *transBuffPtr++; *destPtr++ += *transBuffPtr++;
  183.         *destPtr++ += *transBuffPtr++; *destPtr++ += *transBuffPtr++;
  184.         *destPtr++ += *transBuffPtr++; *destPtr++ += *transBuffPtr++;
  185.         *destPtr++ += *transBuffPtr++; *destPtr++ += *transBuffPtr++;
  186.         *destPtr++ += *transBuffPtr++; *destPtr++ += *transBuffPtr++;
  187.         *destPtr++ += *transBuffPtr++; *destPtr++ += *transBuffPtr++;
  188.         *destPtr++ += *transBuffPtr++; *destPtr++ += *transBuffPtr++;
  189.         *destPtr++ += *transBuffPtr++; *destPtr++ += *transBuffPtr++;
  190.             }
  191.             /* Save second half of short window */
  192.       for (j = BLOCK_LEN_SHORT/16-1; j >= 0; --j)  {
  193.         *destPtr++ = *transBuffPtr++;  *destPtr++ = *transBuffPtr++;
  194.         *destPtr++ = *transBuffPtr++;  *destPtr++ = *transBuffPtr++;
  195.         *destPtr++ = *transBuffPtr++;  *destPtr++ = *transBuffPtr++;
  196.         *destPtr++ = *transBuffPtr++;  *destPtr++ = *transBuffPtr++;
  197.         *destPtr++ = *transBuffPtr++;  *destPtr++ = *transBuffPtr++;
  198.         *destPtr++ = *transBuffPtr++;  *destPtr++ = *transBuffPtr++;
  199.         *destPtr++ = *transBuffPtr++;  *destPtr++ = *transBuffPtr++;
  200.         *destPtr++ = *transBuffPtr++;  *destPtr++ = *transBuffPtr++;
  201.             }
  202.             destPtr -= BLOCK_LEN_SHORT;
  203.         }
  204.         /* Copy data to output buffer */
  205.         destPtr = timeOutPtr;
  206.         timeBuffPtr = timeBuff;     /*       [ch];      */
  207.     for (i = BLOCK_LEN_LONG/16 - 1; i >= 0; --i)  {
  208.       *destPtr++ = *timeBuffPtr++; *destPtr++ = *timeBuffPtr++;
  209.       *destPtr++ = *timeBuffPtr++; *destPtr++ = *timeBuffPtr++;
  210.       *destPtr++ = *timeBuffPtr++; *destPtr++ = *timeBuffPtr++;
  211.       *destPtr++ = *timeBuffPtr++; *destPtr++ = *timeBuffPtr++;
  212.       *destPtr++ = *timeBuffPtr++; *destPtr++ = *timeBuffPtr++;
  213.       *destPtr++ = *timeBuffPtr++; *destPtr++ = *timeBuffPtr++;
  214.       *destPtr++ = *timeBuffPtr++; *destPtr++ = *timeBuffPtr++;
  215.       *destPtr++ = *timeBuffPtr++; *destPtr++ = *timeBuffPtr++;
  216.         }
  217.         /* Update timeBuff fifo */
  218.         destPtr = timeBuff;     /*       [ch];      */
  219.     for (i = BLOCK_LEN_LONG/16 - 1; i >= 0; --i)  {
  220.       *destPtr++ = *timeBuffPtr++; *destPtr++ = *timeBuffPtr++;
  221.       *destPtr++ = *timeBuffPtr++; *destPtr++ = *timeBuffPtr++;
  222.       *destPtr++ = *timeBuffPtr++; *destPtr++ = *timeBuffPtr++;
  223.       *destPtr++ = *timeBuffPtr++; *destPtr++ = *timeBuffPtr++;
  224.       *destPtr++ = *timeBuffPtr++; *destPtr++ = *timeBuffPtr++;
  225.       *destPtr++ = *timeBuffPtr++; *destPtr++ = *timeBuffPtr++;
  226.       *destPtr++ = *timeBuffPtr++; *destPtr++ = *timeBuffPtr++;
  227.       *destPtr++ = *timeBuffPtr++; *destPtr++ = *timeBuffPtr++;
  228.      }
  229.     }
  230.     else if (blockType == START_TYPE)  {
  231.         unfold(freqInPtr, transBuff, BLOCK_LEN_LONG);
  232.         ITransformBlock (hDecoder, transBuff, START_FLAT_BLOCK, wnd_shape, timeBuff);
  233.         /* Add first half and old data */
  234.         transBuffPtr = transBuff;
  235.         timeBuffPtr = timeBuff;
  236.         destPtr = timeOutPtr;
  237.     for (i = BLOCK_LEN_LONG/16 - 1; i >= 0; --i)  {
  238.             *destPtr++ = *transBuffPtr++ + *timeBuffPtr++;
  239.             *destPtr++ = *transBuffPtr++ + *timeBuffPtr++;
  240.             *destPtr++ = *transBuffPtr++ + *timeBuffPtr++;
  241.             *destPtr++ = *transBuffPtr++ + *timeBuffPtr++;
  242.             *destPtr++ = *transBuffPtr++ + *timeBuffPtr++;
  243.             *destPtr++ = *transBuffPtr++ + *timeBuffPtr++;
  244.             *destPtr++ = *transBuffPtr++ + *timeBuffPtr++;
  245.             *destPtr++ = *transBuffPtr++ + *timeBuffPtr++;
  246.             *destPtr++ = *transBuffPtr++ + *timeBuffPtr++;
  247.             *destPtr++ = *transBuffPtr++ + *timeBuffPtr++;
  248.             *destPtr++ = *transBuffPtr++ + *timeBuffPtr++;
  249.             *destPtr++ = *transBuffPtr++ + *timeBuffPtr++;
  250.             *destPtr++ = *transBuffPtr++ + *timeBuffPtr++;
  251.             *destPtr++ = *transBuffPtr++ + *timeBuffPtr++;
  252.             *destPtr++ = *transBuffPtr++ + *timeBuffPtr++;
  253.             *destPtr++ = *transBuffPtr++ + *timeBuffPtr++;
  254.         }
  255.         /* Save second half as old data */
  256.         timeBuffPtr = timeBuff;
  257.     for (i = BLOCK_LEN_LONG/16 - 1; i >= 0; --i)  {
  258.       *timeBuffPtr++ = *transBuffPtr++;  *timeBuffPtr++ = *transBuffPtr++;
  259.       *timeBuffPtr++ = *transBuffPtr++;  *timeBuffPtr++ = *transBuffPtr++;
  260.       *timeBuffPtr++ = *transBuffPtr++;  *timeBuffPtr++ = *transBuffPtr++;
  261.       *timeBuffPtr++ = *transBuffPtr++;  *timeBuffPtr++ = *transBuffPtr++;
  262.       *timeBuffPtr++ = *transBuffPtr++;  *timeBuffPtr++ = *transBuffPtr++;
  263.       *timeBuffPtr++ = *transBuffPtr++;  *timeBuffPtr++ = *transBuffPtr++;
  264.       *timeBuffPtr++ = *transBuffPtr++;  *timeBuffPtr++ = *transBuffPtr++;
  265.       *timeBuffPtr++ = *transBuffPtr++;  *timeBuffPtr++ = *transBuffPtr++;
  266.         }
  267.         hDecoder->dolbyShortOffset_f2t = 0;
  268.     }
  269.     else if (blockType == STOP_TYPE)  {
  270.         unfold (freqInPtr, transBuff, BLOCK_LEN_LONG);
  271.         /* Do 1 LONG transforms */
  272.         ITransformBlock (hDecoder, transBuff, STOP_FLAT_BLOCK, wnd_shape, timeBuff);
  273.         /* Add first half and old data */
  274.         transBuffPtr = transBuff;
  275.         timeBuffPtr = timeBuff;
  276.         destPtr = timeOutPtr;
  277.     for (i = (BLOCK_LEN_LONG - NFLAT)/16 - 1; i>=0;--i)
  278.     {
  279.             *destPtr++ = *transBuffPtr++ + *timeBuffPtr++;
  280.       *destPtr++ = *transBuffPtr++ + *timeBuffPtr++;
  281.       *destPtr++ = *transBuffPtr++ + *timeBuffPtr++;
  282.       *destPtr++ = *transBuffPtr++ + *timeBuffPtr++;
  283.             *destPtr++ = *transBuffPtr++ + *timeBuffPtr++;
  284.       *destPtr++ = *transBuffPtr++ + *timeBuffPtr++;
  285.       *destPtr++ = *transBuffPtr++ + *timeBuffPtr++;
  286.       *destPtr++ = *transBuffPtr++ + *timeBuffPtr++;
  287.             *destPtr++ = *transBuffPtr++ + *timeBuffPtr++;
  288.       *destPtr++ = *transBuffPtr++ + *timeBuffPtr++;
  289.       *destPtr++ = *transBuffPtr++ + *timeBuffPtr++;
  290.       *destPtr++ = *transBuffPtr++ + *timeBuffPtr++;
  291.             *destPtr++ = *transBuffPtr++ + *timeBuffPtr++;
  292.       *destPtr++ = *transBuffPtr++ + *timeBuffPtr++;
  293.       *destPtr++ = *transBuffPtr++ + *timeBuffPtr++;
  294.       *destPtr++ = *transBuffPtr++ + *timeBuffPtr++;
  295.     }
  296.     for ( i = NFLAT/16-1; i>=0;--i)  {
  297.       *destPtr++ = *transBuffPtr++; *destPtr++ = *transBuffPtr++;
  298.       *destPtr++ = *transBuffPtr++; *destPtr++ = *transBuffPtr++;
  299.       *destPtr++ = *transBuffPtr++; *destPtr++ = *transBuffPtr++;
  300.       *destPtr++ = *transBuffPtr++; *destPtr++ = *transBuffPtr++;
  301.       *destPtr++ = *transBuffPtr++; *destPtr++ = *transBuffPtr++;
  302.       *destPtr++ = *transBuffPtr++; *destPtr++ = *transBuffPtr++;
  303.       *destPtr++ = *transBuffPtr++; *destPtr++ = *transBuffPtr++;
  304.       *destPtr++ = *transBuffPtr++; *destPtr++ = *transBuffPtr++;
  305.         }
  306.         /* Save second half as old data */
  307.         timeBuffPtr = timeBuff;
  308.     for (i = BLOCK_LEN_LONG/16 - 1; i >= 0; --i )  {
  309.       *timeBuffPtr++ = *transBuffPtr++; *timeBuffPtr++ = *transBuffPtr++;
  310.       *timeBuffPtr++ = *transBuffPtr++; *timeBuffPtr++ = *transBuffPtr++;
  311.       *timeBuffPtr++ = *transBuffPtr++; *timeBuffPtr++ = *transBuffPtr++;
  312.       *timeBuffPtr++ = *transBuffPtr++; *timeBuffPtr++ = *transBuffPtr++;
  313.       *timeBuffPtr++ = *transBuffPtr++; *timeBuffPtr++ = *transBuffPtr++;
  314.       *timeBuffPtr++ = *transBuffPtr++; *timeBuffPtr++ = *transBuffPtr++;
  315.       *timeBuffPtr++ = *transBuffPtr++; *timeBuffPtr++ = *transBuffPtr++;
  316.       *timeBuffPtr++ = *transBuffPtr++; *timeBuffPtr++ = *transBuffPtr++;
  317.         }
  318.     }
  319.     i=0;
  320.     do
  321.     {
  322.       *(ftimeOutPtr++) = (timeOutPtr[i]); i++;
  323.       *(ftimeOutPtr++) = (timeOutPtr[i]); i++;
  324.       *(ftimeOutPtr++) = (timeOutPtr[i]); i++;
  325.       *(ftimeOutPtr++) = (timeOutPtr[i]); i++;
  326.       *(ftimeOutPtr++) = (timeOutPtr[i]); i++;
  327.       *(ftimeOutPtr++) = (timeOutPtr[i]); i++;
  328.       *(ftimeOutPtr++) = (timeOutPtr[i]); i++;
  329.       *(ftimeOutPtr++) = (timeOutPtr[i]); i++;
  330.     } while(i<BLOCK_LEN_LONG);
  331.     FreeMemory(timeOutPtr);
  332.     FreeMemory(transBuff);
  333. }
  334. /*****************************************************************************
  335. *
  336. *   time2freq_adapt
  337. *   transform to time domain data to freq. domain.
  338. *   Blocks composed of multiple segments (i.e. all but long) have
  339. *     input spectrums interleaved.
  340. *   Notice: currently verified only for certain blocktypes
  341. *   input: see below
  342. *   output: see below
  343. *   local static:
  344. *     none
  345. *   globals: none
  346. *
  347. *****************************************************************************/
  348. void time2freq_adapt(faacDecHandle hDecoder,
  349.     WINDOW_TYPE blockType,          /* input: blockType 0-3                     */
  350.     Wnd_Shape *wnd_shape,   /* input/output                             */
  351.     Float *timeInPtr,       /* input: time domain data              */
  352.     Float *ffreqOutPtr)     /* output: 1/2 block of new freq values     */
  353. {
  354.     Float *transBuff, *transBuffPtr;
  355.     int i, j;
  356.     Float *srcPtr;
  357.     Float *destPtr;
  358.     Float *freqOutPtr;
  359.     transBuff = AllocMemory(2*BLOCK_LEN_LONG*sizeof(Float));
  360.     freqOutPtr = AllocMemory(BLOCK_LEN_LONG*sizeof(Float));
  361.     if (blockType == NORM_TYPE)
  362.     {
  363.         srcPtr = timeInPtr;
  364.         destPtr = transBuff;
  365.     for (i = 2 * BLOCK_LEN_LONG / 16 - 1; i >= 0; --i)
  366.     {
  367.       *destPtr++ = *srcPtr++; *destPtr++ = *srcPtr++;
  368.       *destPtr++ = *srcPtr++; *destPtr++ = *srcPtr++;
  369.       *destPtr++ = *srcPtr++; *destPtr++ = *srcPtr++;
  370.       *destPtr++ = *srcPtr++; *destPtr++ = *srcPtr++;
  371.       *destPtr++ = *srcPtr++; *destPtr++ = *srcPtr++;
  372.       *destPtr++ = *srcPtr++; *destPtr++ = *srcPtr++;
  373.       *destPtr++ = *srcPtr++; *destPtr++ = *srcPtr++;
  374.       *destPtr++ = *srcPtr++; *destPtr++ = *srcPtr++;
  375.         }
  376.         /* Do 1 LONG transform */
  377.         TransformBlock (hDecoder, transBuff, LONG_BLOCK, wnd_shape);
  378.         srcPtr = transBuff;
  379.         destPtr = freqOutPtr;
  380.     for (i = BLOCK_LEN_LONG/16-1; i>=0; --i)
  381.     {
  382.       *destPtr++ = *srcPtr++; *destPtr++ = *srcPtr++;
  383.       *destPtr++ = *srcPtr++; *destPtr++ = *srcPtr++;
  384.       *destPtr++ = *srcPtr++; *destPtr++ = *srcPtr++;
  385.       *destPtr++ = *srcPtr++; *destPtr++ = *srcPtr++;
  386.       *destPtr++ = *srcPtr++; *destPtr++ = *srcPtr++;
  387.       *destPtr++ = *srcPtr++; *destPtr++ = *srcPtr++;
  388.       *destPtr++ = *srcPtr++; *destPtr++ = *srcPtr++;
  389.       *destPtr++ = *srcPtr++; *destPtr++ = *srcPtr++;
  390.         }
  391.     }
  392.     else if (blockType == SHORT_TYPE)  {
  393.     /* Do 8 SHORT transforms */
  394.         srcPtr = timeInPtr + (BLOCK_LEN_LONG - BLOCK_LEN_SHORT) / 2;
  395.     destPtr = freqOutPtr;
  396.     for (i = 0; i < 8; i++) {
  397.         transBuffPtr = transBuff;
  398.       for (i = 2 * BLOCK_LEN_SHORT/16-1; i>=0; --i)  {
  399.         *transBuffPtr++ = *srcPtr++; *transBuffPtr++ = *srcPtr++;
  400.         *transBuffPtr++ = *srcPtr++; *transBuffPtr++ = *srcPtr++;
  401.         *transBuffPtr++ = *srcPtr++; *transBuffPtr++ = *srcPtr++;
  402.         *transBuffPtr++ = *srcPtr++; *transBuffPtr++ = *srcPtr++;
  403.         *transBuffPtr++ = *srcPtr++; *transBuffPtr++ = *srcPtr++;
  404.         *transBuffPtr++ = *srcPtr++; *transBuffPtr++ = *srcPtr++;
  405.         *transBuffPtr++ = *srcPtr++; *transBuffPtr++ = *srcPtr++;
  406.         *transBuffPtr++ = *srcPtr++; *transBuffPtr++ = *srcPtr++;
  407.         }
  408.         srcPtr -= BLOCK_LEN_SHORT;
  409.         TransformBlock (hDecoder, transBuff, SHORT_BLOCK, wnd_shape);
  410.         /* Copy data to output buffer */
  411.         transBuffPtr = transBuff;
  412.       for (j = BLOCK_LEN_SHORT/16-1; j>=0;--j)  {
  413.     *destPtr++ = *transBuffPtr++; *destPtr++ = *transBuffPtr++;
  414.     *destPtr++ = *transBuffPtr++; *destPtr++ = *transBuffPtr++;
  415.     *destPtr++ = *transBuffPtr++; *destPtr++ = *transBuffPtr++;
  416.     *destPtr++ = *transBuffPtr++; *destPtr++ = *transBuffPtr++;
  417.     *destPtr++ = *transBuffPtr++; *destPtr++ = *transBuffPtr++;
  418.     *destPtr++ = *transBuffPtr++; *destPtr++ = *transBuffPtr++;
  419.     *destPtr++ = *transBuffPtr++; *destPtr++ = *transBuffPtr++;
  420.     *destPtr++ = *transBuffPtr++; *destPtr++ = *transBuffPtr++;
  421.         }
  422.     }
  423.     }
  424.     else if (blockType == START_TYPE)  {
  425.         srcPtr = timeInPtr;
  426.     destPtr = transBuff;
  427.   for (i = 2 * BLOCK_LEN_LONG/16-1; i>=0;--i)  {
  428.     *destPtr++ = *srcPtr++; *destPtr++ = *srcPtr++;
  429.     *destPtr++ = *srcPtr++; *destPtr++ = *srcPtr++;
  430.     *destPtr++ = *srcPtr++; *destPtr++ = *srcPtr++;
  431.     *destPtr++ = *srcPtr++; *destPtr++ = *srcPtr++;
  432.     *destPtr++ = *srcPtr++; *destPtr++ = *srcPtr++;
  433.     *destPtr++ = *srcPtr++; *destPtr++ = *srcPtr++;
  434.     *destPtr++ = *srcPtr++; *destPtr++ = *srcPtr++;
  435.     *destPtr++ = *srcPtr++; *destPtr++ = *srcPtr++;
  436.     }
  437.     TransformBlock (hDecoder, transBuff, START_FLAT_BLOCK, wnd_shape);
  438.     srcPtr = transBuff;
  439.     destPtr = freqOutPtr;
  440.   for (i = BLOCK_LEN_LONG/16-1; i>=0;--i)  {
  441.     *destPtr++ = *srcPtr++;     *destPtr++ = *srcPtr++;
  442.     *destPtr++ = *srcPtr++;     *destPtr++ = *srcPtr++;
  443.     *destPtr++ = *srcPtr++;     *destPtr++ = *srcPtr++;
  444.     *destPtr++ = *srcPtr++;     *destPtr++ = *srcPtr++;
  445.     *destPtr++ = *srcPtr++;     *destPtr++ = *srcPtr++;
  446.     *destPtr++ = *srcPtr++;     *destPtr++ = *srcPtr++;
  447.     *destPtr++ = *srcPtr++;     *destPtr++ = *srcPtr++;
  448.     *destPtr++ = *srcPtr++;     *destPtr++ = *srcPtr++;
  449.     }
  450.     hDecoder->dolbyShortOffset_t2f = 0;
  451.     }
  452.     else if (blockType == STOP_TYPE)  {
  453.         srcPtr = timeInPtr;
  454.     destPtr = transBuff;
  455.   for (i = 2 * BLOCK_LEN_LONG/16-1; i>=0;--i)  {
  456.     *destPtr++ = *srcPtr++; *destPtr++ = *srcPtr++;
  457.     *destPtr++ = *srcPtr++; *destPtr++ = *srcPtr++;
  458.     *destPtr++ = *srcPtr++; *destPtr++ = *srcPtr++;
  459.     *destPtr++ = *srcPtr++; *destPtr++ = *srcPtr++;
  460.     *destPtr++ = *srcPtr++; *destPtr++ = *srcPtr++;
  461.     *destPtr++ = *srcPtr++; *destPtr++ = *srcPtr++;
  462.     *destPtr++ = *srcPtr++; *destPtr++ = *srcPtr++;
  463.     *destPtr++ = *srcPtr++; *destPtr++ = *srcPtr++;
  464.     }
  465.     TransformBlock (hDecoder, transBuff, STOP_FLAT_BLOCK, wnd_shape);
  466.     srcPtr = transBuff;
  467.     destPtr = freqOutPtr;
  468.   for (i = BLOCK_LEN_LONG/16-1; i>=0;--i)  {
  469.     *destPtr++ = *srcPtr++;     *destPtr++ = *srcPtr++;
  470.     *destPtr++ = *srcPtr++;     *destPtr++ = *srcPtr++;
  471.     *destPtr++ = *srcPtr++;     *destPtr++ = *srcPtr++;
  472.     *destPtr++ = *srcPtr++;     *destPtr++ = *srcPtr++;
  473.     *destPtr++ = *srcPtr++;     *destPtr++ = *srcPtr++;
  474.     *destPtr++ = *srcPtr++;     *destPtr++ = *srcPtr++;
  475.     *destPtr++ = *srcPtr++;     *destPtr++ = *srcPtr++;
  476.     *destPtr++ = *srcPtr++;     *destPtr++ = *srcPtr++;
  477.     }
  478.     }
  479.     srcPtr = freqOutPtr;
  480.     destPtr = ffreqOutPtr;
  481.   for (i = BLOCK_LEN_LONG/16-1; i>=0;--i)  {
  482.     *destPtr++ = *srcPtr++;     *destPtr++ = *srcPtr++;
  483.     *destPtr++ = *srcPtr++;     *destPtr++ = *srcPtr++;
  484.     *destPtr++ = *srcPtr++;     *destPtr++ = *srcPtr++;
  485.     *destPtr++ = *srcPtr++;     *destPtr++ = *srcPtr++;
  486.     *destPtr++ = *srcPtr++;     *destPtr++ = *srcPtr++;
  487.     *destPtr++ = *srcPtr++;     *destPtr++ = *srcPtr++;
  488.     *destPtr++ = *srcPtr++;     *destPtr++ = *srcPtr++;
  489.     *destPtr++ = *srcPtr++;     *destPtr++ = *srcPtr++;
  490.     }
  491.     FreeMemory(freqOutPtr);
  492.     FreeMemory(transBuff);
  493. }