gaConfig.cpp
上传用户:zhongxx05
上传日期:2007-06-06
资源大小:33641k
文件大小:10k
源码类别:

Symbian

开发平台:

C/C++

  1. /* ***** BEGIN LICENSE BLOCK ***** 
  2.  * Version: RCSL 1.0/RPSL 1.0 
  3.  *  
  4.  * Portions Copyright (c) 1995-2002 RealNetworks, Inc. All Rights Reserved. 
  5.  *      
  6.  * The contents of this file, and the files included with this file, are 
  7.  * subject to the current version of the RealNetworks Public Source License 
  8.  * Version 1.0 (the "RPSL") available at 
  9.  * http://www.helixcommunity.org/content/rpsl unless you have licensed 
  10.  * the file under the RealNetworks Community Source License Version 1.0 
  11.  * (the "RCSL") available at http://www.helixcommunity.org/content/rcsl, 
  12.  * in which case the RCSL will apply. You may also obtain the license terms 
  13.  * directly from RealNetworks.  You may not use this file except in 
  14.  * compliance with the RPSL or, if you have a valid RCSL with RealNetworks 
  15.  * applicable to this file, the RCSL.  Please see the applicable RPSL or 
  16.  * RCSL for the rights, obligations and limitations governing use of the 
  17.  * contents of the file.  
  18.  *  
  19.  * This file is part of the Helix DNA Technology. RealNetworks is the 
  20.  * developer of the Original Code and owns the copyrights in the portions 
  21.  * it created. 
  22.  *  
  23.  * This file, and the files included with this file, is distributed and made 
  24.  * available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER 
  25.  * EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS ALL SUCH WARRANTIES, 
  26.  * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, FITNESS 
  27.  * FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. 
  28.  * 
  29.  * Technology Compatibility Kit Test Suite(s) Location: 
  30.  *    http://www.helixcommunity.org/content/tck 
  31.  * 
  32.  * Contributor(s): 
  33.  *  
  34.  * ***** END LICENSE BLOCK ***** */ 
  35. /* parse an MPEG-4 general audio specific config structure from a bitstream */
  36. #include "gaConfig.h"
  37. #include "bitstream.h"
  38. CGASpecificConfig::CGASpecificConfig()
  39. : mFrameLengthFlag   (1)
  40. , mDependsOnCoreCoder(1)
  41. , mCoreCoderDelay    (14,0)
  42. , mExtensionFlag     (1)
  43. {
  44. }
  45. CGASpecificConfig::~CGASpecificConfig() {}
  46. HX_RESULT CGASpecificConfig::Read(struct BITSTREAM &bs,
  47. UINT32 samplingFrequency,
  48. UINT32 ChannelConfiguration,
  49. UINT32 AudioObjectType)
  50. {
  51. mFrameLengthFlag.Read(bs) ;
  52. mFrameLength = mFrameLengthFlag ? 960 : 1024 ;
  53. if (mDependsOnCoreCoder.Read(bs))
  54. mCoreCoderDelay.Read(bs) ;
  55. mExtensionFlag.Read(bs) ;
  56. if (ChannelConfiguration == 0)
  57. {
  58. mPCE.Read(bs) ;
  59. }
  60. else
  61. {
  62. HX_RESULT res = mPCE.SetChannelConfiguration(ChannelConfiguration) ;
  63. if (FAILED(res))
  64. return res ;
  65. }
  66. if (mExtensionFlag)
  67. {
  68. // to be defined in mpeg4 phase 2
  69. // should we return HXR_FAIL?
  70. }
  71. return HXR_OK ;
  72. }
  73. UINT32 CGASpecificConfig::GetFrameLength() const
  74. {
  75. return mFrameLength ;
  76. }
  77. CPCE::CPCE()
  78. : element_instance_tag         (4)
  79. , object_type                  (2)
  80. , sampling_frequency_index     (4)
  81. , num_front_channel_elements   (4)
  82. , num_side_channel_elements    (4)
  83. , num_back_channel_elements    (4)
  84. , num_lfe_channel_elements     (2)
  85. , num_assoc_data_elements      (3)
  86. , num_valid_cc_elements        (4)
  87. , mono_mixdown_present         (1)
  88. , mono_mixdown_element_number  (4,0)
  89. , stereo_mixdown_present       (1)
  90. , stereo_mixdown_element_number(4,0)
  91. , matrix_mixdown_idx_present   (1)
  92. , matrix_mixdown_idx           (2)
  93. , pseudo_surround_enable       (1)
  94. , comment_field_bytes          (8)
  95. , comment_field_data           (0)
  96. {
  97. }
  98. CPCE::~CPCE()
  99. {
  100. if (comment_field_data) delete[] comment_field_data ;
  101. }
  102. UINT32 CPCE::GetNChannels() const
  103. {
  104. return
  105. num_front_channels +
  106. num_side_channels +
  107. num_back_channels +
  108. num_lfe_channel_elements ;
  109. }
  110. const int CPCE::channelMapping[][4] =
  111. {
  112. {0,0,0,0},
  113. {1,0,0,0}, // center front speaker
  114. {2,0,0,0}, // left, right front speakers
  115. {3,0,0,0}, // center front speaker, left, right front speakers
  116. {3,0,1,0}, // center front speaker, left, right center front speakers, rear surround speakers
  117. {3,0,2,0}, // center front speaker, left, right front speakers, left surround, right surround rear speakers
  118. {3,0,2,1}, //  center front speaker, left, right front speakers, left surround, right surround rear speakers, front low frequency effects speaker
  119. {5,0,2,1}, // center front speaker left, right center front speakers, left, right outside front speakers, left surround, right surround rear speakers, front low frequency effects speaker
  120. } ;
  121. /* Utility function for implizit channel config signalling.
  122.    Initialize the channel pair information and return the number of channel elements. */
  123. static int initChannelPairs(int n, int isCpe[])
  124. {
  125. int nElem = (n+1)>>1 ;
  126. int i ;
  127. isCpe[0] = 0 ;
  128. for (i = (n & 1); i < nElem; i++)
  129. isCpe[i] = 1 ;
  130. return nElem ;
  131. }
  132. HX_RESULT CPCE::SetChannelConfiguration(UINT32 channelConfig)
  133. {
  134. if (channelConfig >= 8)
  135. return HXR_FAIL ;
  136. num_front_channels = channelMapping[channelConfig][0] ;
  137. num_side_channels  = channelMapping[channelConfig][1] ;
  138. num_back_channels  = channelMapping[channelConfig][2] ;
  139. num_lfe_channel_elements = channelMapping[channelConfig][3] ;
  140. num_front_channel_elements = initChannelPairs(num_front_channels, front_element_is_cpe) ;
  141. num_side_channel_elements  = initChannelPairs(num_side_channels, side_element_is_cpe) ;
  142. num_back_channel_elements  = initChannelPairs(num_back_channels, back_element_is_cpe) ;
  143. return HXR_OK ;
  144. }
  145. HX_RESULT CPCE::Read(struct BITSTREAM &bs)
  146. {
  147. UINT32 i ;
  148. num_front_channels = 0 ;
  149. num_side_channels  = 0 ;
  150. num_back_channels  = 0 ;
  151. /* should check here whether we have enough bits in the bitstream */
  152. element_instance_tag.Read(bs) ;
  153. object_type.Read(bs) ;
  154. sampling_frequency_index.Read(bs) ;
  155. num_front_channel_elements.Read(bs) ;
  156. num_side_channel_elements.Read(bs) ;
  157. num_back_channel_elements.Read(bs) ;
  158. num_lfe_channel_elements.Read(bs) ;
  159. num_assoc_data_elements.Read(bs) ;
  160. num_valid_cc_elements.Read(bs) ;
  161. if (mono_mixdown_present.Read(bs))
  162. mono_mixdown_element_number.Read(bs) ;
  163. if (stereo_mixdown_present.Read(bs))
  164. stereo_mixdown_element_number.Read(bs) ;
  165. if (matrix_mixdown_idx_present.Read(bs))
  166. {
  167. matrix_mixdown_idx.Read(bs) ;
  168. pseudo_surround_enable.Read(bs) ;
  169. }
  170. for ( i = 0; i < num_front_channel_elements; i++) {
  171. front_element_is_cpe[i] = readBits(&bs,1) ;
  172. num_front_channels += (1+front_element_is_cpe[i]) ;
  173. front_element_tag_select[i] = readBits(&bs,4) ;
  174. }
  175. for ( i = 0; i < num_side_channel_elements; i++) {
  176. side_element_is_cpe[i] = readBits(&bs,1) ;
  177. num_side_channels += (1+side_element_is_cpe[i]) ;
  178. side_element_tag_select[i] = readBits(&bs,4) ;
  179. }
  180. for ( i = 0; i < num_back_channel_elements; i++) {
  181. back_element_is_cpe[i] = readBits(&bs,1) ;
  182. num_back_channels += (1+back_element_is_cpe[i]) ;
  183. back_element_tag_select[i] = readBits(&bs,4) ;
  184. }
  185. for ( i = 0; i < num_lfe_channel_elements; i++)
  186. lfe_element_tag_select[i] = readBits(&bs,4) ;
  187. for ( i = 0; i < num_assoc_data_elements; i++)
  188. assoc_data_element_tag_select[i] = readBits(&bs,4) ;
  189. for ( i = 0; i < num_valid_cc_elements; i++) {
  190. cc_element_is_ind_sw[i] = readBits(&bs,1) ;
  191. valid_cc_element_tag_select[i] = readBits(&bs,4) ;
  192. }
  193. byteAlign(&bs) ;
  194. comment_field_bytes.Read(bs) ;
  195. if (comment_field_bytes)
  196. {
  197. // this is a slow way to read characters, but since we don't
  198. // parse many GAconfigs, I think that's OK
  199. CBitstreamInt t(8) ;
  200. comment_field_data = new char[(UINT32)comment_field_bytes] ;
  201. for (i = 0 ; i < comment_field_bytes ; i++)
  202. {
  203. comment_field_data[i] = (char)t.Read(bs) ;
  204. }
  205. }
  206. return HXR_OK ;
  207. }
  208. CAudioSpecificConfig::CAudioSpecificConfig()
  209. : AudioObjectType        (5)
  210. , samplingFrequencyIndex (4)
  211. , samplingFrequency     (24)
  212. , extensionSamplingFrequencyIndex (4)
  213. , extensionSamplingFrequency     (24)
  214. , channelConfiguration   (4)
  215. {
  216. }
  217. CAudioSpecificConfig::~CAudioSpecificConfig() {}
  218. const UINT32 CAudioSpecificConfig::aSampleRate[13] =
  219. {
  220. 96000, 88200, 64000, 48000, 44100, 32000, 24000, 22050, 16000, 12000,
  221. 11025, 8000, 7350
  222. } ;
  223. HX_RESULT CAudioSpecificConfig::Read(struct BITSTREAM &bs)
  224. {
  225. HX_RESULT res = HXR_OK;
  226. AudioObjectType.Read(bs) ;
  227. samplingFrequencyIndex.Read(bs) ;
  228. extensionSamplingFrequencyIndex = samplingFrequencyIndex ;
  229. switch (samplingFrequencyIndex)
  230. {
  231. case 0xf: // ESC, read sr from bitstream
  232. samplingFrequency.Read(bs) ;
  233. break ;
  234. case 0xd: case 0xe: // these are reserved.
  235. return HXR_FAIL ;
  236. break ;
  237. default: // the normal case
  238. samplingFrequency = aSampleRate[samplingFrequencyIndex] ;
  239. }
  240. extensionSamplingFrequency = samplingFrequency ;
  241. channelConfiguration.Read(bs) ;
  242. m_bSBR = (AudioObjectType == AACSBR) ;
  243. if (m_bSBR)
  244. {
  245. extensionSamplingFrequencyIndex.Read(bs) ;
  246. switch (extensionSamplingFrequencyIndex)
  247. {
  248. case 0xf: // ESC, read sr from bitstream
  249. extensionSamplingFrequency.Read(bs) ;
  250. break ;
  251. case 0xd: case 0xe: // these are reserved.
  252. return HXR_FAIL ;
  253. break ;
  254. default: // the normal case
  255. extensionSamplingFrequency = aSampleRate[extensionSamplingFrequencyIndex] ;
  256. }
  257. AudioObjectType.Read(bs) ;
  258. }
  259. switch (AudioObjectType)
  260. {
  261. case AACMAIN: case AACLC: case AACLTP:
  262. res = GASpecificConfig.Read(bs,
  263. samplingFrequency,channelConfiguration,AudioObjectType) ;
  264. break ;
  265. default:
  266. // no other audio types supported
  267. return HXR_FAIL ;
  268. }
  269. if (!m_bSBR && bitsLeftInBitstream(&bs) >= 16)
  270. // if SBR info has not been read before, but there are more bytes to follow...
  271. {
  272. if (readBits(&bs,11) == 0x2b7)
  273. {
  274. if (readBits(&bs,5) == 5)
  275. {
  276. m_bSBR = readBits(&bs,1) ;
  277. if (m_bSBR)
  278. {
  279. extensionSamplingFrequencyIndex.Read(bs) ;
  280. switch (extensionSamplingFrequencyIndex)
  281. {
  282. case 0xf: // ESC, read sr from bitstream
  283. extensionSamplingFrequency.Read(bs) ;
  284. break ;
  285. case 0xd: case 0xe: // these are reserved.
  286. return HXR_FAIL ;
  287. break ;
  288. default: // the normal case
  289. extensionSamplingFrequency = aSampleRate[extensionSamplingFrequencyIndex] ;
  290. }
  291. }
  292. }
  293. }
  294. }
  295. return HXR_OK ;
  296. }
  297. UINT32 CAudioSpecificConfig::GetSampleRate() const
  298. {
  299. return extensionSamplingFrequency ;
  300. }
  301. UINT32 CAudioSpecificConfig::GetCoreSampleRate() const
  302. {
  303. return samplingFrequency ;
  304. }
  305. UINT32 CAudioSpecificConfig::GetCoreSamplingFrequencyIndex() const
  306. {
  307.     return samplingFrequencyIndex;
  308. }
  309. UINT32 CAudioSpecificConfig::GetObjectType() const
  310. {
  311. return AudioObjectType ;
  312. }