MP3Internals.cpp
上传用户:sun1608
上传日期:2007-02-02
资源大小:6116k
文件大小:31k
源码类别:

流媒体/Mpeg4/MP4

开发平台:

Visual C++

  1. /**********
  2. This library is free software; you can redistribute it and/or modify it under
  3. the terms of the GNU Lesser General Public License as published by the
  4. Free Software Foundation; either version 2.1 of the License, or (at your
  5. option) any later version. (See <http://www.gnu.org/copyleft/lesser.html>.)
  6. This library is distributed in the hope that it will be useful, but WITHOUT
  7. ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
  8. FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License for
  9. more details.
  10. You should have received a copy of the GNU Lesser General Public License
  11. along with this library; if not, write to the Free Software Foundation, Inc.,
  12. 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  13. **********/
  14. // "liveMedia"
  15. // Copyright (c) 1996-2001 Live Networks, Inc.  All rights reserved.
  16. // MP3 internal implementation details
  17. // Implementation
  18. #include <stdlib.h>
  19. #include <math.h>
  20. #include <stdio.h>
  21. #include <string.h>
  22. #include "MP3Internals.hh"
  23. // This is crufty old code that needs to be cleaned up #####
  24. unsigned tabsel_123[2][3][16] = {
  25.    { {32,32,64,96,128,160,192,224,256,288,320,352,384,416,448,448},
  26.      {32,32,48,56, 64, 80, 96,112,128,160,192,224,256,320,384,384},
  27.      {32,32,40,48, 56, 64, 80, 96,112,128,160,192,224,256,320,320} },
  28.    { {32,32,48,56,64,80,96,112,128,144,160,176,192,224,256,256},
  29.      {8,8,16,24,32,40,48,56,64,80,96,112,128,144,160,160},
  30.      {8,8,16,24,32,40,48,56,64,80,96,112,128,144,160,160} }
  31. };
  32. /* Note: tabsel_123[*][*][0 or 15] shouldn't occur; use dummy values there */
  33. long freqs[7] = { 44100, 48000, 32000, 22050, 24000, 16000 , 11025 };
  34. static float ispow[8207];
  35. static float aa_ca[8], aa_cs[8];
  36. static float COS1[12][6];
  37. static float win[4][36];
  38. static float win1[4][36];
  39. static float COS9[9];
  40. static float COS6_1,COS6_2;
  41. static float tfcos36[9];
  42. static float tfcos12[3];
  43. int longLimit[7][23];
  44. int shortLimit[7][14];
  45. struct bandInfoStruct {
  46.   int longIdx[23];
  47.   int longDiff[22];
  48.   int shortIdx[14];
  49.   int shortDiff[13];
  50. };
  51. struct bandInfoStruct bandInfo[7] = { 
  52. /* MPEG 1.0 */
  53.  { {0,4,8,12,16,20,24,30,36,44,52,62,74, 90,110,134,162,196,238,288,342,418,576},
  54.    {4,4,4,4,4,4,6,6,8, 8,10,12,16,20,24,28,34,42,50,54, 76,158},
  55.    {0,4*3,8*3,12*3,16*3,22*3,30*3,40*3,52*3,66*3, 84*3,106*3,136*3,192*3},
  56.    {4,4,4,4,6,8,10,12,14,18,22,30,56} } ,
  57.  { {0,4,8,12,16,20,24,30,36,42,50,60,72, 88,106,128,156,190,230,276,330,384,576},
  58.    {4,4,4,4,4,4,6,6,6, 8,10,12,16,18,22,28,34,40,46,54, 54,192},
  59.    {0,4*3,8*3,12*3,16*3,22*3,28*3,38*3,50*3,64*3, 80*3,100*3,126*3,192*3},
  60.    {4,4,4,4,6,6,10,12,14,16,20,26,66} } ,
  61.  { {0,4,8,12,16,20,24,30,36,44,54,66,82,102,126,156,194,240,296,364,448,550,576} ,
  62.    {4,4,4,4,4,4,6,6,8,10,12,16,20,24,30,38,46,56,68,84,102, 26} ,
  63.    {0,4*3,8*3,12*3,16*3,22*3,30*3,42*3,58*3,78*3,104*3,138*3,180*3,192*3} ,
  64.    {4,4,4,4,6,8,12,16,20,26,34,42,12} }  ,
  65. /* MPEG 2.0 */
  66.  { {0,6,12,18,24,30,36,44,54,66,80,96,116,140,168,200,238,284,336,396,464,522,576},
  67.    {6,6,6,6,6,6,8,10,12,14,16,20,24,28,32,38,46,52,60,68,58,54 } ,
  68.    {0,4*3,8*3,12*3,18*3,24*3,32*3,42*3,56*3,74*3,100*3,132*3,174*3,192*3} ,
  69.    {4,4,4,6,6,8,10,14,18,26,32,42,18 } } ,
  70.  { {0,6,12,18,24,30,36,44,54,66,80,96,114,136,162,194,232,278,330,394,464,540,576},
  71.    {6,6,6,6,6,6,8,10,12,14,16,18,22,26,32,38,46,52,64,70,76,36 } ,
  72.    {0,4*3,8*3,12*3,18*3,26*3,36*3,48*3,62*3,80*3,104*3,136*3,180*3,192*3} ,
  73.    {4,4,4,6,8,10,12,14,18,24,32,44,12 } } ,
  74.  { {0,6,12,18,24,30,36,44,54,66,80,96,116,140,168,200,238,284,336,396,464,522,576},
  75.    {6,6,6,6,6,6,8,10,12,14,16,20,24,28,32,38,46,52,60,68,58,54 },
  76.    {0,4*3,8*3,12*3,18*3,26*3,36*3,48*3,62*3,80*3,104*3,134*3,174*3,192*3},
  77.    {4,4,4,6,8,10,12,14,18,24,30,40,18 } } ,
  78. /* MPEG 2.5, wrong! table (it's just a copy of MPEG 2.0/44.1kHz) */
  79.  { {0,6,12,18,24,30,36,44,54,66,80,96,116,140,168,200,238,284,336,396,464,522,576},
  80.    {6,6,6,6,6,6,8,10,12,14,16,20,24,28,32,38,46,52,60,68,58,54 } ,
  81.    {0,4*3,8*3,12*3,18*3,24*3,32*3,42*3,56*3,74*3,100*3,132*3,174*3,192*3} ,
  82.    {4,4,4,6,6,8,10,14,18,26,32,42,18 } } ,
  83. };
  84. static int mapbuf0[7][152];
  85. static int mapbuf1[7][156];
  86. static int mapbuf2[7][44];
  87. static int *map[7][3];
  88. static int *mapend[7][3];
  89. unsigned int n_slen2[512]; /* MPEG 2.0 slen for 'normal' mode */
  90. unsigned int i_slen2[256]; /* MPEG 2.0 slen for intensity stereo */
  91. static float tan1_1[16],tan2_1[16],tan1_2[16],tan2_2[16];
  92. static float pow1_1[2][16],pow2_1[2][16],pow1_2[2][16],pow2_2[2][16];
  93. // Init tables for layer-3 
  94. static float gainpow2[256+118+4];
  95. #define MPG_MD_MONO 3 
  96. #ifndef M_PI
  97. #define  M_PI            3.14159265358979323846  /* pi */
  98. #endif
  99. #ifndef M_SQRT2
  100. #define  M_SQRT2         1.41421356237309504880  /* sqrt(2) */
  101. #endif
  102. ////////// MP3FrameParams //////////
  103. MP3FrameParams::MP3FrameParams()
  104.   : bv(frameBytes, 0, sizeof frameBytes) /* by default */ {
  105.   oldHdr = firstHdr = 0;
  106.   static Boolean doneInit = False;
  107.   if (doneInit) return;
  108.   doneInit = True;
  109.   int i,j,k,l;
  110.   for (i=-256;i<118+4;i++) {
  111.     gainpow2[i+256] = pow((double)2.0,-0.25 * (double) (i+210) );
  112.   }
  113.   for (i=0;i<8207;i++) {
  114.     ispow[i] = pow((double)i,(double)4.0/3.0);
  115.   }
  116.   for (i=0;i<8;i++) {
  117.     static double Ci[8]={-0.6,-0.535,-0.33,-0.185,-0.095,-0.041,-0.0142,-0.0037};
  118.     double sq=sqrt(1.0+Ci[i]*Ci[i]);
  119.     aa_cs[i] = 1.0/sq;
  120.     aa_ca[i] = Ci[i]/sq;
  121.   }
  122.   for (i=0;i<18;i++) {
  123.     win[0][i]    = win[1][i]    = 0.5 * sin( M_PI / 72.0 * (double) (2*(i+0) +1) ) / cos ( M_PI * (double) (2*(i+0) +19) / 72.0 );
  124.     win[0][i+18] = win[3][i+18] = 0.5 * sin( M_PI / 72.0 * (double) (2*(i+18)+1) ) / cos ( M_PI * (double) (2*(i+18)+19) / 72.0 );
  125.   }
  126.   for (i=0;i<6;i++) {
  127.     win[1][i+18] = 0.5 / cos ( M_PI * (double) (2*(i+18)+19) / 72.0 );
  128.     win[3][i+12] = 0.5 / cos ( M_PI * (double) (2*(i+12)+19) / 72.0 );
  129.     win[1][i+24] = 0.5 * sin( M_PI / 24.0 * (double) (2*i+13) ) / cos ( M_PI * (double) (2*(i+24)+19) / 72.0 );
  130.     win[1][i+30] = win[3][i] = 0.0;
  131.     win[3][i+6 ] = 0.5 * sin( M_PI / 24.0 * (double) (2*i+1) )  / cos ( M_PI * (double) (2*(i+6 )+19) / 72.0 );
  132.   }
  133.   for (i=0;i<9;i++) {
  134.     COS9[i] = cos( M_PI / 18.0 * (double) i);
  135.   }
  136.   for (i=0;i<9;i++) {
  137.     tfcos36[i] = 0.5 / cos ( M_PI * (double) (i*2+1) / 36.0 );
  138.   }
  139.   for(i=0;i<3;i++) {
  140.     tfcos12[i] = 0.5 / cos ( M_PI * (double) (i*2+1) / 12.0 );
  141.   }
  142.   COS6_1 = cos( M_PI / 6.0 * (double) 1);
  143.   COS6_2 = cos( M_PI / 6.0 * (double) 2);
  144.   for (i=0;i<12;i++) {
  145.     win[2][i]  = 0.5 * sin( M_PI / 24.0 * (double) (2*i+1) ) / cos ( M_PI * (double) (2*i+7) / 24.0 );
  146.     for (j=0;j<6;j++) {
  147.       COS1[i][j] = cos( M_PI / 24.0 * (double) ((2*i+7)*(2*j+1)) );
  148.     }
  149.   }
  150.   for (j=0;j<4;j++) {
  151.     static int len[4] = { 36,36,12,36 };
  152.     for (i=0;i<len[j];i+=2) {
  153.       win1[j][i] = + win[j][i];
  154.     }
  155.     for (i=1;i<len[j];i+=2) {
  156.       win1[j][i] = - win[j][i];
  157.     }
  158.   }
  159.   for (i=0;i<16;i++) {
  160.     double t = tan( (double) i * M_PI / 12.0 );
  161.     tan1_1[i] = t / (1.0+t);
  162.     tan2_1[i] = 1.0 / (1.0 + t);
  163.     tan1_2[i] = M_SQRT2 * t / (1.0+t);
  164.     tan2_2[i] = M_SQRT2 / (1.0 + t);
  165.     for (j=0;j<2;j++) {
  166.       double base = pow(2.0,-0.25*(j+1.0));
  167.       double p1=1.0,p2=1.0;
  168.       if (i > 0) {
  169.         if (i & 1) {
  170.           p1 = pow(base,(i+1.0)*0.5);
  171. } else {
  172.           p2 = pow(base,i*0.5);
  173. }
  174.       }
  175.       pow1_1[j][i] = p1;
  176.       pow2_1[j][i] = p2;
  177.       pow1_2[j][i] = M_SQRT2 * p1;
  178.       pow2_2[j][i] = M_SQRT2 * p2;
  179.     }
  180.   }
  181.   for (j=0;j<7;j++) {
  182.     struct bandInfoStruct *bi = &bandInfo[j];
  183.     int *mp;
  184.     int cb,lwin;
  185.     int *bdf;
  186.     
  187.     mp = map[j][0] = mapbuf0[j];
  188.     bdf = bi->longDiff;
  189.     for (i=0,cb = 0; cb < 8 ; cb++,i+=*bdf++) {
  190.       *mp++ = (*bdf) >> 1;
  191.       *mp++ = i;
  192.       *mp++ = 3;
  193.       *mp++ = cb;
  194.     }
  195.     bdf = bi->shortDiff+3;
  196.     for (cb=3;cb<13;cb++) {
  197.       int l = (*bdf++) >> 1;
  198.       for(lwin=0;lwin<3;lwin++) {
  199. *mp++ = l;
  200. *mp++ = i + lwin;
  201. *mp++ = lwin;
  202. *mp++ = cb;
  203.       }
  204.       i += 6*l;
  205.     }
  206.     mapend[j][0] = mp;
  207.     
  208.     mp = map[j][1] = mapbuf1[j];
  209.     bdf = bi->shortDiff+0;
  210.     for (i=0,cb=0;cb<13;cb++) {
  211.       int l = (*bdf++) >> 1;
  212.       for (lwin=0;lwin<3;lwin++) {
  213. *mp++ = l;
  214. *mp++ = i + lwin;
  215. *mp++ = lwin;
  216. *mp++ = cb;
  217.       }
  218.       i += 6*l;
  219.     }
  220.     mapend[j][1] = mp;
  221.     
  222.     mp = map[j][2] = mapbuf2[j];
  223.     bdf = bi->longDiff;
  224.     for (cb = 0; cb < 22 ; cb++) {
  225.       *mp++ = (*bdf++) >> 1;
  226.       *mp++ = cb;
  227.     }
  228.     mapend[j][2] = mp;
  229.   }
  230.   for (j=0;j<7;j++) {
  231.     for (i=0;i<23;i++) {
  232.       longLimit[j][i] = (bandInfo[j].longIdx[i] - 1 + 8) / 18 + 1;
  233.       if (longLimit[j][i] > SBLIMIT) {
  234.         longLimit[j][i] = SBLIMIT;
  235.       }
  236.     }
  237.     for (i=0;i<14;i++) {
  238.       shortLimit[j][i] = (bandInfo[j].shortIdx[i] - 1) / 18 + 1;
  239.       if (shortLimit[j][i] > SBLIMIT) {
  240.         shortLimit[j][i] = SBLIMIT;
  241.       }
  242.     }
  243.   }
  244.   for (i=0;i<5;i++) {
  245.     for (j=0;j<6;j++) {
  246.       for (k=0;k<6;k++) {
  247.         int n = k + j * 6 + i * 36;
  248.         i_slen2[n] = i|(j<<3)|(k<<6)|(3<<12);
  249.       }
  250.     }
  251.   }
  252.   for (i=0;i<4;i++) {
  253.     for (j=0;j<4;j++) {
  254.       for (k=0;k<4;k++) {
  255.         int n = k + j * 4 + i * 16;
  256.         i_slen2[n+180] = i|(j<<3)|(k<<6)|(4<<12);
  257.       }
  258.     }
  259.   }
  260.   for (i=0;i<4;i++) {
  261.     for (j=0;j<3;j++) {
  262.       int n = j + i * 3;
  263.       i_slen2[n+244] = i|(j<<3) | (5<<12);
  264.       n_slen2[n+500] = i|(j<<3) | (2<<12) | (1<<15);
  265.     }
  266.   }
  267.   for (i=0;i<5;i++) {
  268.     for (j=0;j<5;j++) {
  269.       for (k=0;k<4;k++) {
  270.         for (l=0;l<4;l++) {
  271.           int n = l + k * 4 + j * 16 + i * 80;
  272.           n_slen2[n] = i|(j<<3)|(k<<6)|(l<<9)|(0<<12);
  273.         }
  274.       }
  275.     }
  276.   }
  277.   for (i=0;i<5;i++) {
  278.     for (j=0;j<5;j++) {
  279.       for (k=0;k<4;k++) {
  280.         int n = k + j * 4 + i * 20;
  281.         n_slen2[n+400] = i|(j<<3)|(k<<6)|(1<<12);
  282.       }
  283.     }
  284.   }
  285. }
  286. MP3FrameParams::~MP3FrameParams() {
  287. }
  288. void MP3FrameParams::setParamsFromHeader() {
  289.   if (hdr & (1<<20)) {
  290.     isMPEG2 = (hdr & (1<<19)) ? 0x0 : 0x1;
  291.     isMPEG2_5 = 0;
  292.   }
  293.   else {
  294.     isMPEG2 = 1;
  295.     isMPEG2_5 = 1;
  296.   }
  297.   
  298.   layer = 4-((hdr>>17)&3);
  299.   if (layer == 4) layer = 3; // layer==4 is not allowed
  300.   bitrateIndex = ((hdr>>12)&0xf);
  301.   
  302.   if (isMPEG2_5) {
  303.     samplingFreqIndex = 6;
  304.   } else {
  305.     samplingFreqIndex = ((hdr>>10)&0x3) + (isMPEG2*3);
  306.   }
  307.   
  308.   hasCRC = ((hdr>>16)&0x1)^0x1;
  309.   
  310.   padding   = ((hdr>>9)&0x1);
  311.   extension = ((hdr>>8)&0x1);
  312.   mode      = ((hdr>>6)&0x3);
  313.   mode_ext  = ((hdr>>4)&0x3);
  314.   copyright = ((hdr>>3)&0x1);
  315.   original  = ((hdr>>2)&0x1);
  316.   emphasis  = hdr & 0x3;
  317.   
  318.   stereo    = (mode == MPG_MD_MONO) ? 1 : 2;
  319.   
  320.   if (((hdr>>10)&0x3) == 0x3) {
  321. #ifdef DEBUG_ERRORS
  322.     fprintf(stderr,"Stream error - hdr: 0x%08xn", hdr);
  323. #endif
  324.   }
  325.   bitrate = tabsel_123[isMPEG2][layer-1][bitrateIndex];
  326.   samplingFreq = freqs[samplingFreqIndex];
  327.   isStereo = (stereo > 1);
  328.   isFreeFormat = (bitrateIndex == 0);
  329.   frameSize
  330.     = ComputeFrameSize(bitrate, samplingFreq, padding, isMPEG2, layer);
  331.   sideInfoSize = computeSideInfoSize();
  332.  }
  333. unsigned MP3FrameParams::computeSideInfoSize() {
  334.   unsigned size;
  335.   
  336.   if (isMPEG2) {
  337.     size = isStereo ? 17 : 9;
  338.   } else {
  339.     size = isStereo ? 32 : 17;
  340.   }
  341.   if (hasCRC) {
  342.     size += 2;
  343.   }
  344.   return size;
  345. }
  346. unsigned ComputeFrameSize(unsigned bitrate, unsigned samplingFreq,
  347.   Boolean usePadding, Boolean isMPEG2,
  348.   unsigned char layer) {
  349.   unsigned const bitrateMultiplier = (layer == 1) ? 12000*4 : 144000;
  350.   unsigned framesize;
  351.   framesize = bitrate*bitrateMultiplier;
  352.   framesize /= samplingFreq<<isMPEG2;
  353.   framesize = framesize + usePadding - 4;
  354.   return framesize;
  355. }
  356. #if 0
  357. #define TRUNC_FAIRLY
  358. static unsigned updateSideInfoSizes(MP3SideInfo& sideInfo, Boolean isMPEG2,
  359.     unsigned char const* mainDataPtr,
  360.     unsigned allowedNumBits,
  361.     unsigned& part23Length0a,
  362.     unsigned& part23Length0aTruncation,
  363.     unsigned& part23Length0b,
  364.     unsigned& part23Length0bTruncation,
  365.     unsigned& part23Length1a,
  366.     unsigned& part23Length1aTruncation,
  367.     unsigned& part23Length1b,
  368.     unsigned& part23Length1bTruncation) {
  369.   unsigned p23L0, p23L1 = 0, p23L0Trunc = 0, p23L1Trunc = 0;
  370.   p23L0 = sideInfo.ch[0].gr[0].part2_3_length;
  371.   p23L1 = isMPEG2 ? 0 : sideInfo.ch[0].gr[1].part2_3_length;
  372. #ifdef TRUNC_ONLY0
  373.   if (p23L0 < allowedNumBits)
  374.     allowedNumBits = p23L0;
  375. #endif
  376. #ifdef TRUNC_ONLY1
  377.   if (p23L1 < allowedNumBits)
  378.     allowedNumBits = p23L1;
  379. #endif
  380.   if (p23L0 + p23L1 > allowedNumBits) {
  381.     /* We need to shorten one or both fields */
  382.     unsigned truncation = p23L0 + p23L1 - allowedNumBits;
  383. #ifdef TRUNC_FAIRLY
  384.     p23L0Trunc = (truncation*p23L0)/(p23L0 + p23L1);
  385.     p23L1Trunc = truncation - p23L0Trunc;
  386. #endif
  387. #if defined(TRUNC_FAVOR0) || defined(TRUNC_ONLY0)
  388.     p23L1Trunc = (truncation>p23L1) ? p23L1 : truncation;
  389.     p23L0Trunc = truncation - p23L1Trunc;
  390. #endif
  391. #if defined(TRUNC_FAVOR1) || defined(TRUNC_ONLY1)
  392.     p23L0Trunc = (truncation>p23L0) ? p23L0 : truncation;
  393.     p23L1Trunc = truncation - p23L0Trunc;
  394. #endif
  395.   }
  396.   /* ASSERT: (p23L0Trunc <= p23L0) && (p23l1Trunc <= p23L1) */
  397.   p23L0 -= p23L0Trunc; p23L1 -= p23L1Trunc;
  398. #ifdef DEBUG
  399.   fprintf(stderr, "updateSideInfoSizes (allowed: %d): %d->%d, %d->%dn", allowedNumBits, p23L0+p23L0Trunc, p23L0, p23L1+p23L1Trunc, p23L1);
  400. #endif
  401.   // The truncations computed above are still estimates.  We need to 
  402.   // adjust them so that the new fields will continue to end on
  403.   // Huffman-encoded sample boundaries:
  404.   updateSideInfoForHuffman(sideInfo, isMPEG2, mainDataPtr,
  405.    p23L0, p23L1,
  406.    part23Length0a, part23Length0aTruncation,
  407.    part23Length0b, part23Length0bTruncation,
  408.    part23Length1a, part23Length1aTruncation,
  409.    part23Length1b, part23Length1bTruncation);
  410.   p23L0 = part23Length0a + part23Length0b;
  411.   p23L1 = part23Length1a + part23Length1b;
  412.   sideInfo.ch[0].gr[0].part2_3_length = p23L0;
  413.   sideInfo.ch[0].gr[1].part2_3_length = p23L1;
  414.   part23Length0bTruncation
  415.     += sideInfo.ch[1].gr[0].part2_3_length; /* allow for stereo */
  416.   sideInfo.ch[1].gr[0].part2_3_length = 0; /* output mono */
  417.   sideInfo.ch[1].gr[1].part2_3_length = 0; /* output mono */
  418.   return p23L0 + p23L1;
  419. }
  420. #endif
  421. Boolean GetADUInfoFromMP3Frame(unsigned char const* framePtr,
  422.        unsigned totFrameSize,
  423.        unsigned& hdr, unsigned& frameSize,
  424.        MP3SideInfo& sideInfo, unsigned& sideInfoSize,
  425.        unsigned& backpointer, unsigned& aduSize) {
  426.   if (totFrameSize < 4) return False; // there's not enough data
  427.   MP3FrameParams fr;
  428.   fr.hdr =   ((unsigned)framePtr[0] << 24) | ((unsigned)framePtr[1] << 16)
  429.            | ((unsigned)framePtr[2] << 8) | (unsigned)framePtr[3];
  430.   fr.setParamsFromHeader();
  431.   fr.setBytePointer(framePtr + 4, totFrameSize - 4); // skip hdr
  432.   frameSize = 4 + fr.frameSize;
  433.   sideInfoSize = fr.sideInfoSize;
  434.   if (totFrameSize < 4 + sideInfoSize) return False; // not enough data
  435.   fr.getSideInfo(sideInfo);
  436.   hdr = fr.hdr;
  437.   backpointer = sideInfo.main_data_begin;
  438.   unsigned numBits = sideInfo.ch[0].gr[0].part2_3_length;
  439.   numBits += sideInfo.ch[0].gr[1].part2_3_length;
  440.   numBits += sideInfo.ch[1].gr[0].part2_3_length;
  441.   numBits += sideInfo.ch[1].gr[1].part2_3_length;
  442.   aduSize = (numBits+7)/8;
  443. #ifdef DEBUG
  444.   fprintf(stderr, "mp3GetADUInfoFromFrame: hdr: %08x, frameSize: %d, part2_3_lengths: %d,%d,%d,%d, aduSize: %d, backpointer: %dn", hdr, frameSize, sideInfo.ch[0].gr[0].part2_3_length, sideInfo.ch[0].gr[1].part2_3_length, sideInfo.ch[1].gr[0].part2_3_length, sideInfo.ch[1].gr[1].part2_3_length, aduSize, backpointer);
  445. #endif
  446.   return True;
  447. }
  448. static void getSideInfo1(MP3FrameParams& fr, MP3SideInfo& si,
  449.  int stereo, int ms_stereo, long sfreq, int single) {
  450.    int ch, gr;
  451.    int powdiff = (single == 3) ? 4 : 0;
  452.    /* initialize all four "part2_3_length" fields to zero: */
  453.    si.ch[0].gr[0].part2_3_length = 0; si.ch[1].gr[0].part2_3_length = 0;
  454.    si.ch[0].gr[1].part2_3_length = 0; si.ch[1].gr[1].part2_3_length = 0;
  455.    si.main_data_begin = fr.getBits(9);
  456.    if (stereo == 1)
  457.      si.private_bits = fr.getBits(5);
  458.    else 
  459.      si.private_bits = fr.getBits(3);
  460.    for (ch=0; ch<stereo; ch++) {
  461.        si.ch[ch].gr[0].scfsi = -1;
  462.        si.ch[ch].gr[1].scfsi = fr.getBits(4);
  463.    }
  464.    for (gr=0; gr<2; gr++) {
  465.      for (ch=0; ch<stereo; ch++) {
  466.        MP3SideInfo::gr_info_s_t& gr_info = si.ch[ch].gr[gr];
  467.        gr_info.part2_3_length = fr.getBits(12);
  468.        gr_info.big_values = fr.getBits(9);
  469.        gr_info.global_gain = fr.getBits(8);
  470.        gr_info.pow2gain = gainpow2+256 - gr_info.global_gain + powdiff;
  471.        if (ms_stereo) gr_info.pow2gain += 2;
  472.        gr_info.scalefac_compress = fr.getBits(4);
  473. /* window-switching flag == 1 for block_Type != 0 .. and block-type == 0 -> win-sw-flag = 0 */
  474.        gr_info.window_switching_flag = fr.get1Bit();
  475.        if (gr_info.window_switching_flag) {
  476.          int i;
  477.          gr_info.block_type = fr.getBits(2);
  478.          gr_info.mixed_block_flag = fr.get1Bit();
  479.          gr_info.table_select[0] = fr.getBits(5);
  480.          gr_info.table_select[1] = fr.getBits(5);
  481.          /*
  482.           * table_select[2] not needed, because there is no region2,
  483.           * but to satisfy some verifications tools we set it either.
  484.           */
  485.          gr_info.table_select[2] = 0;
  486.          for (i=0;i<3;i++) {
  487.    gr_info.subblock_gain[i] = fr.getBits(3);
  488.            gr_info.full_gain[i]
  489.      = gr_info.pow2gain + ((gr_info.subblock_gain[i])<<3);
  490.  }
  491. #ifdef DEBUG_ERRORS
  492.          if (gr_info.block_type == 0) {
  493.            fprintf(stderr,"Blocktype == 0 and window-switching == 1 not allowed.n");
  494.          }
  495. #endif
  496.          /* region_count/start parameters are implicit in this case. */       
  497.          gr_info.region1start = 36>>1;
  498.          gr_info.region2start = 576>>1;
  499.        }
  500.        else 
  501.        {
  502.          int i,r0c,r1c;
  503.          for (i=0; i<3; i++) {
  504.    gr_info.table_select[i] = fr.getBits(5);
  505.  }
  506.          r0c = gr_info.region0_count = fr.getBits(4);
  507.          r1c = gr_info.region1_count = fr.getBits(3);
  508.          gr_info.region1start = bandInfo[sfreq].longIdx[r0c+1] >> 1 ;
  509.          gr_info.region2start = bandInfo[sfreq].longIdx[r0c+1+r1c+1] >> 1;
  510.          gr_info.block_type = 0;
  511.          gr_info.mixed_block_flag = 0;
  512.        }
  513.        gr_info.preflag = fr.get1Bit();
  514.        gr_info.scalefac_scale = fr.get1Bit();
  515.        gr_info.count1table_select = fr.get1Bit();
  516.      }
  517.    }
  518. }
  519. static void getSideInfo2(MP3FrameParams& fr, MP3SideInfo& si,
  520.  int stereo, int ms_stereo, long sfreq, int single) {
  521.    int ch;
  522.    int powdiff = (single == 3) ? 4 : 0;
  523.    /* initialize all four "part2_3_length" fields to zero: */
  524.    si.ch[0].gr[0].part2_3_length = 0; si.ch[1].gr[0].part2_3_length = 0;
  525.    si.ch[0].gr[1].part2_3_length = 0; si.ch[1].gr[1].part2_3_length = 0;
  526.    si.main_data_begin = fr.getBits(8);
  527.    if (stereo == 1)
  528.      si.private_bits = fr.get1Bit();
  529.    else 
  530.      si.private_bits = fr.getBits(2);
  531.    for (ch=0; ch<stereo; ch++) {
  532.        MP3SideInfo::gr_info_s_t& gr_info = si.ch[ch].gr[0];
  533.        gr_info.part2_3_length = fr.getBits(12);
  534.        si.ch[ch].gr[1].part2_3_length = 0; /* to ensure granule 1 unused */
  535.        gr_info.big_values = fr.getBits(9);
  536.        gr_info.global_gain = fr.getBits(8);
  537.        gr_info.pow2gain = gainpow2+256 - gr_info.global_gain + powdiff;
  538.        if (ms_stereo) gr_info.pow2gain += 2;
  539.        gr_info.scalefac_compress = fr.getBits(9);
  540. /* window-switching flag == 1 for block_Type != 0 .. and block-type == 0 -> win-sw-flag = 0 */
  541.        gr_info.window_switching_flag = fr.get1Bit();
  542.        if (gr_info.window_switching_flag) {
  543.          int i;
  544.          gr_info.block_type = fr.getBits(2);
  545.          gr_info.mixed_block_flag = fr.get1Bit();
  546.          gr_info.table_select[0] = fr.getBits(5);
  547.          gr_info.table_select[1] = fr.getBits(5);
  548.          /*
  549.           * table_select[2] not needed, because there is no region2,
  550.           * but to satisfy some verifications tools we set it either.
  551.           */
  552.          gr_info.table_select[2] = 0;
  553.          for (i=0;i<3;i++) {
  554.    gr_info.subblock_gain[i] = fr.getBits(3);
  555.            gr_info.full_gain[i]
  556.      = gr_info.pow2gain + ((gr_info.subblock_gain[i])<<3);
  557.  }
  558. #ifdef DEBUG_ERRORS
  559.          if (gr_info.block_type == 0) {
  560.            fprintf(stderr,"Blocktype == 0 and window-switching == 1 not allowed.n");
  561.          }
  562. #endif
  563.          /* region_count/start parameters are implicit in this case. */       
  564. /* check this again! */
  565.          if (gr_info.block_type == 2)
  566.            gr_info.region1start = 36>>1;
  567.          else {
  568.            gr_info.region1start = 54>>1;
  569.          }
  570.          gr_info.region2start = 576>>1;
  571.        }
  572.        else 
  573.        {
  574.          int i,r0c,r1c;
  575.          for (i=0; i<3; i++) {
  576.            gr_info.table_select[i] = fr.getBits(5);
  577.  }
  578.          r0c = gr_info.region0_count = fr.getBits(4);
  579.          r1c = gr_info.region1_count = fr.getBits(3);
  580.          gr_info.region1start = bandInfo[sfreq].longIdx[r0c+1] >> 1 ;
  581.          gr_info.region2start = bandInfo[sfreq].longIdx[r0c+1+r1c+1] >> 1;
  582.          gr_info.block_type = 0;
  583.          gr_info.mixed_block_flag = 0;
  584.        }
  585.        gr_info.scalefac_scale = fr.get1Bit();
  586.        gr_info.count1table_select = fr.get1Bit();
  587.    }
  588. }
  589. #define         MPG_MD_JOINT_STEREO     1
  590. void MP3FrameParams::getSideInfo(MP3SideInfo& si) {
  591.   // First skip over the CRC if present:
  592.   if (hasCRC) getBits(16);
  593.   int single = -1;
  594.   int ms_stereo, i_stereo;
  595.   int sfreq = samplingFreqIndex;
  596.   if (stereo == 1) {
  597.     single = 0;
  598.   }
  599.   ms_stereo = (mode == MPG_MD_JOINT_STEREO) && (mode_ext & 0x2);
  600.   i_stereo = (mode == MPG_MD_JOINT_STEREO) && (mode_ext & 0x1);
  601.   if (isMPEG2) {
  602.     getSideInfo2(*this, si, stereo, ms_stereo, sfreq, single);
  603.   } else {
  604.     getSideInfo1(*this, si, stereo, ms_stereo, sfreq, single);
  605.   }
  606. }
  607. static void putSideInfo1(BitVector& bv,
  608.  MP3SideInfo const& si, Boolean isStereo) {
  609.   int ch, gr, i;
  610.   int stereo = isStereo ? 2 : 1;
  611.   
  612.   bv.putBits(si.main_data_begin,9);
  613.   if (stereo == 1)
  614.     bv.putBits(si.private_bits, 5);
  615.   else
  616.     bv.putBits(si.private_bits, 3);
  617.   
  618.   for (ch=0; ch<stereo; ch++) {
  619.     bv.putBits(si.ch[ch].gr[1].scfsi, 4);
  620.   }
  621.   
  622.   for (gr=0; gr<2; gr++) {
  623.     for (ch=0; ch<stereo; ch++) {
  624.       MP3SideInfo::gr_info_s_t const& gr_info = si.ch[ch].gr[gr];
  625.       bv.putBits(gr_info.part2_3_length, 12);
  626.       bv.putBits(gr_info.big_values, 9);
  627.       bv.putBits(gr_info.global_gain, 8);
  628.       bv.putBits(gr_info.scalefac_compress, 4);
  629.       bv.put1Bit(gr_info.window_switching_flag);
  630.       if (gr_info.window_switching_flag) {
  631. bv.putBits(gr_info.block_type, 2);
  632. bv.put1Bit(gr_info.mixed_block_flag);
  633. for (i=0; i<2; i++)
  634.   bv.putBits(gr_info.table_select[i], 5);
  635. for (i=0; i<3; i++)
  636.   bv.putBits(gr_info.subblock_gain[i], 3);
  637.       }
  638.       else {
  639. for (i=0; i<3; i++)
  640.   bv.putBits(gr_info.table_select[i], 5);
  641. bv.putBits(gr_info.region0_count, 4);
  642. bv.putBits(gr_info.region1_count, 3);
  643.       }      
  644.       
  645.       bv.put1Bit(gr_info.preflag);
  646.       bv.put1Bit(gr_info.scalefac_scale);
  647.       bv.put1Bit(gr_info.count1table_select);
  648.     }
  649.   }
  650. }
  651. static void putSideInfo2(BitVector& bv,
  652.  MP3SideInfo const& si, Boolean isStereo) {
  653.   int ch, i;
  654.   int stereo = isStereo ? 2 : 1;
  655.   
  656.   bv.putBits(si.main_data_begin,8);
  657.   if (stereo == 1)
  658.     bv.put1Bit(si.private_bits);
  659.   else
  660.     bv.putBits(si.private_bits, 2);
  661.   
  662.   for (ch=0; ch<stereo; ch++) {
  663.     MP3SideInfo::gr_info_s_t const& gr_info = si.ch[ch].gr[0];
  664.     
  665.     bv.putBits(gr_info.part2_3_length, 12);
  666.     bv.putBits(gr_info.big_values, 9);
  667.     bv.putBits(gr_info.global_gain, 8);
  668.     bv.putBits(gr_info.scalefac_compress, 9);
  669.     bv.put1Bit(gr_info.window_switching_flag);
  670.     if (gr_info.window_switching_flag) {
  671.       bv.putBits(gr_info.block_type, 2);
  672.       bv.put1Bit(gr_info.mixed_block_flag);
  673.       for (i=0; i<2; i++)
  674. bv.putBits(gr_info.table_select[i], 5);
  675.       for (i=0; i<3; i++)
  676. bv.putBits(gr_info.subblock_gain[i], 3);
  677.     }
  678.     else {
  679.       for (i=0; i<3; i++)
  680. bv.putBits(gr_info.table_select[i], 5);
  681.       bv.putBits(gr_info.region0_count, 4);
  682.       bv.putBits(gr_info.region1_count, 3);
  683.     }      
  684.     
  685.     bv.put1Bit(gr_info.scalefac_scale);
  686.     bv.put1Bit(gr_info.count1table_select);
  687.   }
  688. }
  689. static void PutMP3SideInfoIntoFrame(MP3SideInfo const& si,
  690.     MP3FrameParams const& fr,
  691.     unsigned char* framePtr) {
  692.   if (fr.hasCRC) framePtr += 2; // skip CRC
  693.   BitVector bv(framePtr, 0, 8*fr.sideInfoSize);
  694.   if (fr.isMPEG2) {
  695.     putSideInfo2(bv, si, fr.isStereo);
  696.   } else {
  697.     putSideInfo1(bv, si, fr.isStereo);
  698.   }
  699. }
  700. Boolean ZeroOutMP3SideInfo(unsigned char* framePtr, unsigned totFrameSize,
  701.                            unsigned newBackpointer) {
  702.   if (totFrameSize < 4) return False; // there's not enough data
  703.   MP3FrameParams fr;
  704.   fr.hdr =   ((unsigned)framePtr[0] << 24) | ((unsigned)framePtr[1] << 16)
  705.            | ((unsigned)framePtr[2] << 8) | (unsigned)framePtr[3];
  706.   fr.setParamsFromHeader();
  707.   fr.setBytePointer(framePtr + 4, totFrameSize - 4); // skip hdr
  708.   if (totFrameSize < 4 + fr.sideInfoSize) return False; // not enough data
  709.   MP3SideInfo si;
  710.   fr.getSideInfo(si);
  711.   si.main_data_begin = newBackpointer; /* backpointer */
  712.   /* set all four "part2_3_length" and "big_values" fields to zero: */
  713.   si.ch[0].gr[0].part2_3_length = si.ch[0].gr[0].big_values = 0;
  714.   si.ch[1].gr[0].part2_3_length = si.ch[1].gr[0].big_values = 0;
  715.   si.ch[0].gr[1].part2_3_length = si.ch[0].gr[1].big_values = 0;
  716.   si.ch[1].gr[1].part2_3_length = si.ch[1].gr[1].big_values = 0;
  717.   PutMP3SideInfoIntoFrame(si, fr, framePtr + 4);
  718.   return True;
  719. }
  720. #if 0
  721. static unsigned MP3BitrateToBitrateIndex(unsigned bitrate /* in kbps */,
  722.  Boolean isMPEG2) {
  723.   for (unsigned i = 1; i < 15; ++i) {
  724.     if (tabsel_123[isMPEG2][2][i] >= bitrate)
  725.       return i;
  726.   }
  727.   // "bitrate" was larger than any possible, so return the largest possible:
  728.   return 14;
  729. }           
  730. static void outputHeader(unsigned char* toPtr, unsigned hdr) {
  731.   toPtr[0] = (unsigned char)(hdr>>24);
  732.   toPtr[1] = (unsigned char)(hdr>>16);
  733.   toPtr[2] = (unsigned char)(hdr>>8);
  734.   toPtr[3] = (unsigned char)(hdr);
  735. }
  736. static void assignADUBackpointer(MP3FrameParams const& fr,
  737.  unsigned aduSize,
  738.  MP3SideInfo& sideInfo,
  739.  unsigned& availableBytesForBackpointer) {
  740.   // Give the ADU as large a backpointer as possible:
  741.   unsigned maxBackpointerSize = fr.isMPEG2 ? 255 : 511;
  742.   unsigned backpointerSize = availableBytesForBackpointer;
  743.   if (backpointerSize > maxBackpointerSize) {
  744.     backpointerSize = maxBackpointerSize; 
  745.   }
  746.   // Store the new backpointer now:
  747.   sideInfo.main_data_begin = backpointerSize;
  748.   // Figure out how many bytes are available for the *next* ADU's backpointer:
  749.   availableBytesForBackpointer
  750.     = backpointerSize + fr.frameSize - fr.sideInfoSize ;
  751.   if (availableBytesForBackpointer < aduSize) {
  752.     availableBytesForBackpointer = 0;
  753.   } else {
  754.     availableBytesForBackpointer -= aduSize;
  755.   }
  756. }
  757. unsigned TranscodeMP3ADU(unsigned char const* fromPtr, unsigned fromSize,
  758.                       unsigned toBitrate,
  759.       unsigned char* toPtr, unsigned toMaxSize,
  760.       unsigned& availableBytesForBackpointer) {
  761.   // Begin by parsing the input ADU's parameters:
  762.   unsigned hdr, inFrameSize, inSideInfoSize, backpointer, inAduSize;
  763.   MP3SideInfo sideInfo;
  764.   if (!GetADUInfoFromMP3Frame(fromPtr, fromSize,
  765.                               hdr, inFrameSize, sideInfo, inSideInfoSize,
  766.       backpointer, inAduSize)) {
  767.     return 0;
  768.   }
  769.   fromPtr += (4+inSideInfoSize); // skip to 'main data'
  770.   // Alter the 4-byte MPEG header to reflect the output ADU:
  771.   // (different bitrate; mono; no CRC)
  772.   Boolean isMPEG2 = ((hdr&0x00080000) == 0);
  773.   unsigned toBitrateIndex = MP3BitrateToBitrateIndex(toBitrate, isMPEG2);
  774.   hdr &=~ 0xF000; hdr |= (toBitrateIndex<<12); // set bitrate index
  775.   hdr |= 0x10200; // turn on !error-prot and padding bits
  776.   hdr &=~ 0xC0; hdr |= 0xC0; // set mode to 3 (mono)
  777.   // Set up the rest of the parameters of the new ADU:
  778.   MP3FrameParams outFr;
  779.   outFr.hdr = hdr;
  780.   outFr.setParamsFromHeader();
  781.   // Figure out how big to make the output ADU:
  782.   unsigned inAveAduSize = inFrameSize - inSideInfoSize;
  783.   unsigned outAveAduSize = outFr.frameSize - outFr.sideInfoSize;
  784.   unsigned desiredOutAduSize /*=inAduSize*outAveAduSize/inAveAduSize*/
  785.     = (2*inAduSize*outAveAduSize + inAveAduSize)/(2*inAveAduSize);
  786.       // this rounds to the nearest integer
  787.   if (toMaxSize < (4 + outFr.sideInfoSize)) return 0;
  788.   unsigned maxOutAduSize = toMaxSize - (4 + outFr.sideInfoSize);
  789.   if (desiredOutAduSize > maxOutAduSize) {
  790.     desiredOutAduSize = maxOutAduSize;
  791.   }
  792.   // Figure out the new sizes of the various 'part23 lengths',
  793.   // and how much they are truncated:
  794.   unsigned part23Length0a, part23Length0aTruncation;
  795.   unsigned part23Length0b, part23Length0bTruncation;
  796.   unsigned part23Length1a, part23Length1aTruncation;
  797.   unsigned part23Length1b, part23Length1bTruncation;
  798.   unsigned numAduBits
  799.     = updateSideInfoSizes(sideInfo, outFr.isMPEG2,
  800.   fromPtr, 8*desiredOutAduSize,
  801.   part23Length0a, part23Length0aTruncation,
  802.   part23Length0b, part23Length0bTruncation,
  803.   part23Length1a, part23Length1aTruncation,
  804.   part23Length1b, part23Length1bTruncation);
  805. #ifdef DEBUG
  806. fprintf(stderr, "shrinkage %d->%d [(%d,%d),(%d,%d)] (trunc: [(%d,%d),(%d,%d)]) {%d}n", inAduSize, (numAduBits+7)/8,
  807.       part23Length0a, part23Length0b, part23Length1a, part23Length1b,
  808.       part23Length0aTruncation, part23Length0bTruncation,
  809.       part23Length1aTruncation, part23Length1bTruncation,
  810.       maxOutAduSize);
  811. #endif
  812.  unsigned actualOutAduSize = (numAduBits+7)/8;
  813.  // Give the new ADU an appropriate 'backpointer':
  814.  assignADUBackpointer(outFr, actualOutAduSize, sideInfo, availableBytesForBackpointer);
  815.  ///// Now output the new ADU:
  816.  // 4-byte header
  817.  outputHeader(toPtr, hdr); toPtr += 4;
  818.  // side info
  819.  PutMP3SideInfoIntoFrame(sideInfo, outFr, toPtr); toPtr += outFr.sideInfoSize;
  820.  // 'main data', using the new lengths
  821.  unsigned toBitOffset = 0;
  822.  unsigned fromBitOffset = 0;
  823.  
  824.  /* rebuild portion 0a: */
  825.  memmove(toPtr, fromPtr, (part23Length0a+7)/8);
  826.  toBitOffset += part23Length0a;
  827.  fromBitOffset += part23Length0a + part23Length0aTruncation;
  828.  
  829.  /* rebuild portion 0b: */
  830.  shiftBits(toPtr, toBitOffset, fromPtr, fromBitOffset, part23Length0b);
  831.  toBitOffset += part23Length0b;
  832.  fromBitOffset += part23Length0b + part23Length0bTruncation;
  833.  
  834.  /* rebuild portion 1a: */
  835.  shiftBits(toPtr, toBitOffset, fromPtr, fromBitOffset, part23Length1a);
  836.  toBitOffset += part23Length1a;
  837.  fromBitOffset += part23Length1a + part23Length1aTruncation;
  838.  
  839.  /* rebuild portion 1b: */
  840.  shiftBits(toPtr, toBitOffset, fromPtr, fromBitOffset, part23Length1b);
  841.  toBitOffset += part23Length1b;
  842.  /* zero out any remaining bits (probably unnecessary, but...) */
  843.  unsigned char const zero = '';
  844.  shiftBits(toPtr, toBitOffset, &zero, 0,
  845.    actualOutAduSize*8 - numAduBits);
  846.  return 4 + outFr.sideInfoSize + actualOutAduSize;
  847. }
  848. #endif