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

流媒体/Mpeg4/MP4

开发平台:

Visual C++

  1. /*
  2.  * FAAC - Freeware Advanced Audio Coder
  3.  * Copyright (C) 2001 Menno Bakker
  4.  *
  5.  * This library is free software; you can redistribute it and/or
  6.  * modify it under the terms of the GNU Lesser General Public
  7.  * License as published by the Free Software Foundation; either
  8.  * version 2.1 of the License, or (at your option) any later version.
  9.  *
  10.  * This library is distributed in the hope that it will be useful,
  11.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  12.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  13.  * Lesser General Public License for more details.
  14.  * You should have received a copy of the GNU Lesser General Public
  15.  * License along with this library; if not, write to the Free Software
  16.  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  17.  *
  18.  * $Id: joint.c,v 1.3 2001/06/04 23:02:24 wmay Exp $
  19.  */
  20. #include "channels.h"
  21. #include "util.h"
  22. void MSEncode(CoderInfo *coderInfo,
  23.   ChannelInfo *channelInfo,
  24.   double *spectrum[MAX_CHANNELS],
  25.   unsigned int numberOfChannels,
  26.   unsigned int msenable)
  27. {
  28. unsigned int chanNum;
  29. int sfbNum;
  30. int lineNum;
  31. double sum,diff;
  32. /* Look for channel_pair_elements */
  33. for (chanNum=0;chanNum<numberOfChannels;chanNum++) {
  34. if (channelInfo[chanNum].present) {
  35. if ((channelInfo[chanNum].cpe)&&(channelInfo[chanNum].ch_is_left)) {
  36. int leftChan=chanNum;
  37. int rightChan = channelInfo[chanNum].paired_ch;
  38. channelInfo[leftChan].msInfo.is_present = 0;
  39. channelInfo[rightChan].msInfo.is_present = 0;
  40. /* Perform MS if block_types are the same */
  41. if ((coderInfo[leftChan].block_type==coderInfo[rightChan].block_type)&&(msenable)) { 
  42. int numGroups;
  43. int maxSfb;
  44. int g,w,line_offset;
  45. int startWindow,stopWindow;
  46. MSInfo *msInfoL;
  47. MSInfo *msInfoR;
  48. channelInfo[leftChan].common_window = 1;  /* Use common window */
  49. channelInfo[leftChan].msInfo.is_present = 1;
  50. channelInfo[rightChan].msInfo.is_present = 1;
  51. numGroups = coderInfo[leftChan].num_window_groups;
  52. maxSfb = coderInfo[leftChan].max_sfb;
  53. w=0;
  54. /* Determine which bands should be enabled */
  55. msInfoL = &(channelInfo[leftChan].msInfo);
  56. msInfoR = &(channelInfo[rightChan].msInfo);
  57. /* Perform sum and differencing on bands in which ms_used flag */
  58. /* has been set. */
  59. if (coderInfo[leftChan].block_type == ONLY_SHORT_WINDOW) {
  60. line_offset=0;
  61. startWindow = 0;
  62. for (g=0;g<numGroups;g++) {
  63. int numWindows = coderInfo[leftChan].window_group_length[g];
  64. stopWindow = startWindow + numWindows;
  65. for (sfbNum=0;sfbNum<maxSfb;sfbNum++) {
  66. /* Enable MS mask */
  67. int use_ms = 1;
  68. for (w=startWindow;w<stopWindow;w++) {
  69. use_ms = min(use_ms, msInfoL->ms_usedS[w][sfbNum]);
  70. }
  71. msInfoL->ms_used[g*maxSfb+sfbNum] = use_ms; /* write this to bitstream */
  72. msInfoR->ms_used[g*maxSfb+sfbNum] = use_ms;
  73. for (w=startWindow;w<stopWindow;w++) {
  74. msInfoL->ms_usedS[w][sfbNum] = use_ms;
  75. msInfoR->ms_usedS[w][sfbNum] = use_ms;
  76. }
  77. for (w=startWindow;w<stopWindow;w++) {
  78. if (msInfoL->ms_usedS[w][sfbNum]) {
  79. for (lineNum = coderInfo[leftChan].sfb_offset[sfbNum];
  80.  lineNum < coderInfo[leftChan].sfb_offset[sfbNum+1];
  81.  lineNum++)
  82. {
  83. line_offset = w*BLOCK_LEN_SHORT;
  84. sum=spectrum[leftChan][line_offset+lineNum]+spectrum[rightChan][line_offset+lineNum];
  85. diff=spectrum[leftChan][line_offset+lineNum]-spectrum[rightChan][line_offset+lineNum];
  86. spectrum[leftChan][line_offset+lineNum] = 0.5 * sum;
  87. spectrum[rightChan][line_offset+lineNum] = 0.5 * diff;
  88. }
  89. }
  90. }
  91. }
  92. startWindow = stopWindow;
  93. }
  94. } else {
  95. for (sfbNum = 0;sfbNum < maxSfb; sfbNum++) {
  96. msInfoR->ms_used[sfbNum] = msInfoL->ms_used[sfbNum];
  97. /* Enable MS mask */
  98. if (msInfoL->ms_used[sfbNum]) {
  99. for (lineNum = coderInfo[leftChan].sfb_offset[sfbNum];
  100.  lineNum < coderInfo[leftChan].sfb_offset[sfbNum+1];
  101.  lineNum++)
  102. {
  103. sum=spectrum[leftChan][lineNum]+spectrum[rightChan][lineNum];
  104. diff=spectrum[leftChan][lineNum]-spectrum[rightChan][lineNum];
  105. spectrum[leftChan][lineNum] = 0.5 * sum;
  106. spectrum[rightChan][lineNum] = 0.5 * diff;
  107. }
  108. }
  109. }
  110. }
  111. }
  112. }
  113. }
  114. }
  115. }
  116. void MSReconstruct(CoderInfo *coderInfo,
  117.    ChannelInfo *channelInfo,
  118.    int numberOfChannels)
  119. {
  120. int chanNum;
  121. int sfbNum;
  122. int lineNum;
  123. double sum,diff;
  124. /* Look for channel_pair_elements */
  125. for (chanNum=0;chanNum<numberOfChannels;chanNum++) {
  126. if (channelInfo[chanNum].present) {
  127. if ((channelInfo[chanNum].cpe)&&(channelInfo[chanNum].ch_is_left)) {
  128. int leftChan=chanNum;
  129. int rightChan=channelInfo[chanNum].paired_ch;
  130. MSInfo *msInfoL;
  131. msInfoL = &(channelInfo[leftChan].msInfo);
  132. if (msInfoL->is_present) {
  133. int numGroups = coderInfo[leftChan].num_window_groups;
  134. int maxSfb = coderInfo[leftChan].max_sfb;
  135. int w,line_offset;
  136. int startWindow;
  137. w=0;
  138. line_offset=0;
  139. startWindow = 0;
  140. if (coderInfo[leftChan].block_type != ONLY_SHORT_WINDOW) {
  141. for (sfbNum = 0;sfbNum < maxSfb; sfbNum++) {
  142. if (msInfoL->ms_used[sfbNum]) {
  143. for (lineNum = coderInfo[leftChan].sfb_offset[sfbNum];
  144.  lineNum < coderInfo[leftChan].sfb_offset[sfbNum+1];
  145.  lineNum++)
  146. {
  147. sum=coderInfo[leftChan].requantFreq[lineNum];
  148. diff=coderInfo[rightChan].requantFreq[lineNum];
  149. coderInfo[leftChan].requantFreq[lineNum] = (sum+diff);
  150. coderInfo[rightChan].requantFreq[lineNum] = (sum-diff);
  151. }
  152. }
  153. }
  154. }
  155. }
  156. }
  157. }
  158. }
  159. }