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

流媒体/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: frame.c,v 1.4 2002/02/25 22:26:43 dmackie Exp $
  19.  */
  20. /*
  21.  * CHANGES:
  22.  *  2001/01/17: menno: Added frequency cut off filter.
  23.  *  2001/02/28: menno: Added Temporal Noise Shaping.
  24.  *  2001/03/05: menno: Added Long Term Prediction.
  25.  *  2001/05/01: menno: Added backward prediction.
  26.  *
  27.  */
  28. #include <stdio.h>
  29. #include <stdlib.h>
  30. #include "frame.h"
  31. #include "coder.h"
  32. #include "joint.h"
  33. #include "channels.h"
  34. #include "bitstream.h"
  35. #include "filtbank.h"
  36. #include "aacquant.h"
  37. #include "util.h"
  38. #include "huffman.h"
  39. #include "psych.h"
  40. #include "tns.h"
  41. #include "ltp.h"
  42. #include "backpred.h"
  43. faacEncConfigurationPtr FAACAPI faacEncGetCurrentConfiguration(faacEncHandle hEncoder)
  44. {
  45. faacEncConfigurationPtr config = &(hEncoder->config);
  46. return config;
  47. }
  48. int FAACAPI faacEncSetConfiguration(faacEncHandle hEncoder,
  49. faacEncConfigurationPtr config)
  50. {
  51. hEncoder->config.allowMidside = config->allowMidside;
  52. hEncoder->config.useLfe = config->useLfe;
  53. hEncoder->config.useTns = config->useTns;
  54. hEncoder->config.aacObjectType = config->aacObjectType;
  55. hEncoder->config.mpegVersion = config->mpegVersion;
  56. /* No SSR supported for now */
  57. if (hEncoder->config.aacObjectType == SSR)
  58. return 0;
  59. /* LTP only with MPEG4 */
  60. if ((hEncoder->config.aacObjectType == LTP) && (hEncoder->config.mpegVersion != MPEG4))
  61. return 0;
  62. /* Re-init TNS for new profile */
  63. TnsInit(hEncoder);
  64. /* Check for correct bitrate */
  65. if (config->bitRate > MaxBitrate(hEncoder->sampleRate))
  66. return 0;
  67. if (config->bitRate < MinBitrate())
  68. return 0;
  69. /* Bitrate check passed */
  70. hEncoder->config.bitRate = config->bitRate;
  71. /* OK */
  72. return 1;
  73. }
  74. faacEncHandle FAACAPI faacEncOpen(unsigned long sampleRate,
  75.   unsigned int numChannels,
  76.   unsigned long *inputSamples,
  77.   unsigned long *maxOutputBytes)
  78. {
  79. unsigned int channel;
  80. faacEncHandle hEncoder;
  81. *inputSamples = 1024*numChannels;
  82. *maxOutputBytes = (6144/8)*numChannels;
  83. hEncoder = (faacEncStruct*)AllocMemory(sizeof(faacEncStruct));
  84. SetMemory(hEncoder, 0, sizeof(faacEncStruct));
  85. hEncoder->numChannels = numChannels;
  86. hEncoder->sampleRate = sampleRate;
  87. hEncoder->sampleRateIdx = GetSRIndex(sampleRate);
  88. /* Initialize variables to default values */
  89. hEncoder->frameNum = 0;
  90. hEncoder->flushFrame = 0;
  91. /* Default configuration */
  92. hEncoder->config.mpegVersion = MPEG4;
  93. hEncoder->config.aacObjectType = LTP;
  94. hEncoder->config.allowMidside = 1;
  95. hEncoder->config.useLfe = 0;
  96. hEncoder->config.useTns = 0;
  97. hEncoder->config.bitRate = 64000; /* default bitrate / channel */
  98. hEncoder->config.bandWidth = 18000; /* default bandwidth */
  99. #ifdef MPEG4IP
  100. hEncoder->config.useAdts = 1;
  101. #endif
  102. /* find correct sampling rate depending parameters */
  103. hEncoder->srInfo = &srInfo[hEncoder->sampleRateIdx];
  104. for (channel = 0; channel < numChannels; channel++) {
  105. hEncoder->coderInfo[channel].prev_window_shape = SINE_WINDOW;
  106. hEncoder->coderInfo[channel].window_shape = SINE_WINDOW;
  107. hEncoder->coderInfo[channel].block_type = ONLY_LONG_WINDOW;
  108. hEncoder->coderInfo[channel].num_window_groups = 1;
  109. hEncoder->coderInfo[channel].window_group_length[0] = 1;
  110. /* FIXME: Use sr_idx here */
  111. hEncoder->coderInfo[channel].max_pred_sfb = GetMaxPredSfb(hEncoder->sampleRateIdx);
  112. hEncoder->sampleBuff[channel] = NULL;
  113. hEncoder->nextSampleBuff[channel] = NULL;
  114. hEncoder->next2SampleBuff[channel] = NULL;
  115. hEncoder->ltpTimeBuff[channel] = (double*)AllocMemory(2*BLOCK_LEN_LONG*sizeof(double));
  116. SetMemory(hEncoder->ltpTimeBuff[channel], 0, 2*BLOCK_LEN_LONG*sizeof(double));
  117. }
  118. /* Initialize coder functions */
  119. PsyInit(&hEncoder->gpsyInfo, hEncoder->psyInfo, hEncoder->numChannels,
  120. hEncoder->sampleRate, hEncoder->sampleRateIdx);
  121. FilterBankInit(hEncoder);
  122.     TnsInit(hEncoder);
  123. LtpInit(hEncoder);
  124. PredInit(hEncoder);
  125. AACQuantizeInit(hEncoder->coderInfo, hEncoder->numChannels);
  126. HuffmanInit(hEncoder->coderInfo, hEncoder->numChannels);
  127. /* Return handle */
  128. return hEncoder;
  129. }
  130. int FAACAPI faacEncClose(faacEncHandle hEncoder)
  131. {
  132. unsigned int channel;
  133. /* Deinitialize coder functions */
  134. PsyEnd(&hEncoder->gpsyInfo, hEncoder->psyInfo, hEncoder->numChannels);
  135. FilterBankEnd(hEncoder);
  136. LtpEnd(hEncoder);
  137. AACQuantizeEnd(hEncoder->coderInfo, hEncoder->numChannels);
  138. HuffmanEnd(hEncoder->coderInfo, hEncoder->numChannels);
  139. /* Free remaining buffer memory */
  140. for (channel = 0; channel < hEncoder->numChannels; channel++) {
  141. if (hEncoder->ltpTimeBuff[channel]) FreeMemory(hEncoder->ltpTimeBuff[channel]);
  142. if (hEncoder->sampleBuff[channel]) FreeMemory(hEncoder->sampleBuff[channel]);
  143. if (hEncoder->nextSampleBuff[channel]) FreeMemory(hEncoder->nextSampleBuff[channel]);
  144. }
  145. /* Free handle */
  146. if (hEncoder) FreeMemory(hEncoder);
  147. return 0;
  148. }
  149. int FAACAPI faacEncEncode(faacEncHandle hEncoder,
  150.   short *inputBuffer,
  151.   unsigned int samplesInput,
  152.   unsigned char *outputBuffer,
  153.   unsigned int bufferSize
  154.   )
  155. {
  156. unsigned int channel, i;
  157. int sb, frameBytes;
  158. unsigned int bitsToUse, offset;
  159. BitStream *bitStream; /* bitstream used for writing the frame to */
  160. TnsInfo *tnsInfo_for_LTP;
  161. TnsInfo *tnsDecInfo;
  162. /* local copy's of parameters */
  163. ChannelInfo *channelInfo = hEncoder->channelInfo;
  164. CoderInfo *coderInfo = hEncoder->coderInfo;
  165. unsigned int numChannels = hEncoder->numChannels;
  166. unsigned int sampleRate = hEncoder->sampleRate;
  167. unsigned int aacObjectType = hEncoder->config.aacObjectType;
  168. unsigned int mpegVersion = hEncoder->config.mpegVersion;
  169. unsigned int useLfe = hEncoder->config.useLfe;
  170. unsigned int useTns = hEncoder->config.useTns;
  171. unsigned int allowMidside = hEncoder->config.allowMidside;
  172. unsigned int bitRate = hEncoder->config.bitRate;
  173. unsigned int bandWidth = hEncoder->config.bandWidth;
  174. /* Increase frame number */
  175. hEncoder->frameNum++;
  176. if (samplesInput == 0)
  177. hEncoder->flushFrame++;
  178. /* After 2 flush frames all samples have been encoded,
  179.    return 0 bytes written */
  180. if (hEncoder->flushFrame == 2)
  181. return 0;
  182. /* Determine the channel configuration */
  183. GetChannelInfo(channelInfo, numChannels, useLfe);
  184. /* Update current sample buffers */
  185. for (channel = 0; channel < numChannels; channel++) {
  186. if (hEncoder->sampleBuff[channel]) {
  187. for(i = 0; i < FRAME_LEN; i++) {
  188. hEncoder->ltpTimeBuff[channel][i] = hEncoder->sampleBuff[channel][i];
  189. }
  190. }
  191. if (hEncoder->nextSampleBuff[channel]) {
  192. for(i = 0; i < FRAME_LEN; i++) {
  193. hEncoder->ltpTimeBuff[channel][FRAME_LEN + i] =
  194. hEncoder->nextSampleBuff[channel][i];
  195. }
  196. }
  197. if (hEncoder->sampleBuff[channel])
  198. FreeMemory(hEncoder->sampleBuff[channel]);
  199. hEncoder->sampleBuff[channel] = hEncoder->nextSampleBuff[channel];
  200. hEncoder->nextSampleBuff[channel] = (double*)AllocMemory(FRAME_LEN*sizeof(double));
  201. if (samplesInput == 0) { /* start flushing*/
  202. for (i = 0; i < FRAME_LEN; i++)
  203. hEncoder->nextSampleBuff[channel][i] = 0.0;
  204. } else {
  205. for (i = 0; i < (int)(samplesInput/numChannels); i++)
  206. hEncoder->nextSampleBuff[channel][i] = 
  207. (double)inputBuffer[(i*numChannels)+channel];
  208. for (i = (int)(samplesInput/numChannels); i < FRAME_LEN; i++)
  209. hEncoder->nextSampleBuff[channel][i] = 0.0;
  210. }
  211. /* Psychoacoustics */
  212. /* Update buffers and run FFT on new samples */
  213. PsyBufferUpdate(&hEncoder->gpsyInfo, &hEncoder->psyInfo[channel],
  214. hEncoder->nextSampleBuff[channel]);
  215. }
  216. if (hEncoder->frameNum <= 1) /* Still filling up the buffers */
  217. return 0;
  218. /* Psychoacoustics */
  219. PsyCalculate(channelInfo, &hEncoder->gpsyInfo, hEncoder->psyInfo,
  220. hEncoder->srInfo->cb_width_long, hEncoder->srInfo->num_cb_long,
  221. hEncoder->srInfo->cb_width_short,
  222. hEncoder->srInfo->num_cb_short, numChannels);
  223. BlockSwitch(coderInfo, hEncoder->psyInfo, numChannels);
  224. /* AAC Filterbank, MDCT with overlap and add */
  225. for (channel = 0; channel < numChannels; channel++) {
  226. int k;
  227. FilterBank(hEncoder,
  228. &coderInfo[channel],
  229. hEncoder->sampleBuff[channel],
  230. hEncoder->freqBuff[channel],
  231. hEncoder->overlapBuff[channel],
  232. MOVERLAPPED);
  233. if (coderInfo[channel].block_type == ONLY_SHORT_WINDOW) {
  234. for (k = 0; k < 8; k++) {
  235. specFilter(hEncoder->freqBuff[channel]+k*BLOCK_LEN_SHORT,
  236. sampleRate, bandWidth, BLOCK_LEN_SHORT);
  237. }
  238. } else {
  239. specFilter(hEncoder->freqBuff[channel], sampleRate,
  240. bandWidth, BLOCK_LEN_LONG);
  241. }
  242. }
  243. /* TMP: Build sfb offset table and other stuff */
  244. for (channel = 0; channel < numChannels; channel++) {
  245. channelInfo[channel].msInfo.is_present = 0;
  246. if (coderInfo[channel].block_type == ONLY_SHORT_WINDOW) {
  247. coderInfo[channel].max_sfb = hEncoder->srInfo->num_cb_short;
  248. coderInfo[channel].nr_of_sfb = hEncoder->srInfo->num_cb_short;
  249. coderInfo[channel].num_window_groups = 1;
  250. coderInfo[channel].window_group_length[0] = 8;
  251. coderInfo[channel].window_group_length[1] = 0;
  252. coderInfo[channel].window_group_length[2] = 0;
  253. coderInfo[channel].window_group_length[3] = 0;
  254. coderInfo[channel].window_group_length[4] = 0;
  255. coderInfo[channel].window_group_length[5] = 0;
  256. coderInfo[channel].window_group_length[6] = 0;
  257. coderInfo[channel].window_group_length[7] = 0;
  258. offset = 0;
  259. for (sb = 0; sb < coderInfo[channel].nr_of_sfb; sb++) {
  260. coderInfo[channel].sfb_offset[sb] = offset;
  261. offset += hEncoder->srInfo->cb_width_short[sb];
  262. }
  263. coderInfo[channel].sfb_offset[coderInfo[channel].nr_of_sfb] = offset;
  264. } else {
  265. coderInfo[channel].max_sfb = hEncoder->srInfo->num_cb_long;
  266. coderInfo[channel].nr_of_sfb = hEncoder->srInfo->num_cb_long;
  267. coderInfo[channel].num_window_groups = 1;
  268. coderInfo[channel].window_group_length[0] = 1;
  269. offset = 0;
  270. for (sb = 0; sb < coderInfo[channel].nr_of_sfb; sb++) {
  271. coderInfo[channel].sfb_offset[sb] = offset;
  272. offset += hEncoder->srInfo->cb_width_long[sb];
  273. }
  274. coderInfo[channel].sfb_offset[coderInfo[channel].nr_of_sfb] = offset;
  275. }
  276. }
  277. /* Perform TNS analysis and filtering */
  278. for (channel = 0; channel < numChannels; channel++) {
  279. if ((!channelInfo[channel].lfe) && (useTns)) {
  280. TnsEncode(&(coderInfo[channel].tnsInfo),
  281. coderInfo[channel].max_sfb,
  282. coderInfo[channel].max_sfb,
  283. coderInfo[channel].block_type,
  284. coderInfo[channel].sfb_offset,
  285. hEncoder->freqBuff[channel]);
  286. } else {
  287. coderInfo[channel].tnsInfo.tnsDataPresent = 0;      /* TNS not used for LFE */
  288. }
  289. }
  290. for(channel = 0; channel < numChannels; channel++)
  291. {
  292. if((coderInfo[channel].tnsInfo.tnsDataPresent != 0) && (useTns))
  293. tnsInfo_for_LTP = &(coderInfo[channel].tnsInfo);
  294. else
  295. tnsInfo_for_LTP = NULL;
  296. if(channelInfo[channel].present && (!channelInfo[channel].lfe) &&
  297. (coderInfo[channel].block_type != ONLY_SHORT_WINDOW) &&
  298. (mpegVersion == MPEG4) && (aacObjectType == LTP)) 
  299. {
  300. LtpEncode(hEncoder,
  301. &coderInfo[channel],
  302. &(coderInfo[channel].ltpInfo),
  303. tnsInfo_for_LTP,
  304. hEncoder->freqBuff[channel],
  305. hEncoder->ltpTimeBuff[channel]);
  306. } else {
  307. coderInfo[channel].ltpInfo.global_pred_flag = 0;
  308. }
  309. }
  310. for(channel = 0; channel < numChannels; channel++)
  311. {
  312. if ((aacObjectType == MAIN) && (!channelInfo[channel].lfe)) {
  313. int numPredBands = min(coderInfo[channel].max_pred_sfb, coderInfo[channel].nr_of_sfb);
  314. PredCalcPrediction(hEncoder->freqBuff[channel], 
  315. coderInfo[channel].requantFreq,
  316. coderInfo[channel].block_type,
  317. numPredBands,
  318. (coderInfo[channel].block_type==ONLY_SHORT_WINDOW)?
  319. hEncoder->srInfo->cb_width_short:hEncoder->srInfo->cb_width_long,
  320. coderInfo,
  321. channelInfo,
  322. channel); 
  323. } else {
  324. coderInfo[channel].pred_global_flag = 0;
  325. }
  326. }
  327. MSEncode(coderInfo, channelInfo, hEncoder->freqBuff, numChannels, allowMidside);
  328. /* Quantize and code the signal */
  329. bitsToUse = (int)(bitRate*FRAME_LEN/sampleRate+0.5);
  330. for (channel = 0; channel < numChannels; channel++) {
  331. if (coderInfo[channel].block_type == ONLY_SHORT_WINDOW) {
  332. AACQuantize(&coderInfo[channel], &hEncoder->psyInfo[channel],
  333. &channelInfo[channel], hEncoder->srInfo->cb_width_short,
  334. hEncoder->srInfo->num_cb_short, hEncoder->freqBuff[channel], bitsToUse);
  335. } else {
  336. AACQuantize(&coderInfo[channel], &hEncoder->psyInfo[channel],
  337. &channelInfo[channel], hEncoder->srInfo->cb_width_long,
  338. hEncoder->srInfo->num_cb_long, hEncoder->freqBuff[channel], bitsToUse);
  339. }
  340. }
  341. MSReconstruct(coderInfo, channelInfo, numChannels);
  342. for (channel = 0; channel < numChannels; channel++) 
  343. {
  344. /* If short window, reconstruction not needed for prediction */
  345. if ((coderInfo[channel].block_type == ONLY_SHORT_WINDOW)) {
  346. int sind;
  347. for (sind = 0; sind < 1024; sind++) {
  348. coderInfo[channel].requantFreq[sind] = 0.0;
  349. }
  350. } else {
  351. if((coderInfo[channel].tnsInfo.tnsDataPresent != 0) && (useTns))
  352. tnsDecInfo = &(coderInfo[channel].tnsInfo);
  353. else
  354. tnsDecInfo = NULL;
  355. if ((!channelInfo[channel].lfe) && (aacObjectType == LTP)) {  /* no reconstruction needed for LFE channel*/
  356. LtpReconstruct(&coderInfo[channel], &(coderInfo[channel].ltpInfo),
  357. coderInfo[channel].requantFreq);
  358. if(tnsDecInfo != NULL)
  359. TnsDecodeFilterOnly(&(coderInfo[channel].tnsInfo), coderInfo[channel].nr_of_sfb,
  360. coderInfo[channel].max_sfb, coderInfo[channel].block_type,
  361. coderInfo[channel].sfb_offset, coderInfo[channel].requantFreq);
  362. IFilterBank(hEncoder, &coderInfo[channel],
  363. coderInfo[channel].requantFreq,
  364. coderInfo[channel].ltpInfo.time_buffer,
  365. coderInfo[channel].ltpInfo.ltp_overlap_buffer,
  366. MOVERLAPPED);
  367. LtpUpdate(&(coderInfo[channel].ltpInfo),
  368. coderInfo[channel].ltpInfo.time_buffer,
  369. coderInfo[channel].ltpInfo.ltp_overlap_buffer,
  370. BLOCK_LEN_LONG);
  371. }
  372. }
  373. }
  374. /* Write the AAC bitstream */
  375. bitStream = OpenBitStream(bufferSize, outputBuffer);
  376. WriteBitstream(hEncoder, coderInfo, channelInfo, bitStream, numChannels);
  377. /* Close the bitstream and return the number of bytes written */
  378. frameBytes = CloseBitStream(bitStream);
  379. #ifdef _DEBUG
  380. printf("%4d %4dn", hEncoder->frameNum-1, frameBytes);
  381. #endif
  382. return frameBytes;
  383. }
  384. /* Scalefactorband data table */
  385. static SR_INFO srInfo[12+1] =
  386. {
  387. { 96000, 41, 12,
  388. {
  389. 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 
  390. 8, 8, 8, 8, 8, 12, 12, 12, 12, 12, 16, 16, 24, 28, 
  391. 36, 44, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64
  392. },{
  393. 4, 4, 4, 4, 4, 4, 8, 8, 8, 16, 28, 36
  394. }
  395. }, { 88200, 41, 12,
  396. {
  397. 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 
  398. 8, 8, 8, 8, 8, 12, 12, 12, 12, 12, 16, 16, 24, 28, 
  399. 36, 44, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64
  400. },{
  401. 4, 4, 4, 4, 4, 4, 8, 8, 8, 16, 28, 36
  402. }
  403. }, { 64000, 47, 12,
  404. {
  405. 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
  406. 8, 8, 8, 8, 12, 12, 12, 16, 16, 16, 20, 24, 24, 28,
  407. 36, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40,
  408. 40, 40, 40, 40, 40
  409. },{
  410. 4, 4, 4, 4, 4, 4, 8, 8, 8, 16, 28, 32
  411. }
  412. }, { 48000, 49, 14,
  413. {
  414. 4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  8,  8,  8,  8,  8,  8,  8, 
  415. 12, 12, 12, 12, 16, 16, 20, 20, 24, 24, 28, 28, 32, 32, 32, 32, 32, 32,
  416. 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 96
  417. }, {
  418. 4,  4,  4,  4,  4,  8,  8,  8, 12, 12, 12, 16, 16, 16 
  419. }
  420. }, { 44100, 49, 14,
  421. {
  422. 4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  8,  8,  8,  8,  8,  8,  8, 
  423. 12, 12, 12, 12, 16, 16, 20, 20, 24, 24, 28, 28, 32, 32, 32, 32, 32, 32,
  424. 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 96
  425. }, {
  426. 4,  4,  4,  4,  4,  8,  8,  8, 12, 12, 12, 16, 16, 16 
  427. }
  428. }, { 32000, 51, 14,
  429. {
  430. 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 8, 8, 8, 8,
  431. 8, 8, 8, 12, 12, 12, 12, 16, 16, 20, 20, 24, 24, 28,
  432. 28, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
  433. 32, 32, 32, 32, 32, 32, 32, 32, 32
  434. },{
  435. 4, 4, 4, 4, 4, 8, 8, 8, 12, 12, 12, 16, 16, 16
  436. }
  437. }, { 24000, 47, 15,
  438. {
  439. 4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  8,  8,  8,  8,  8,  8,  8,
  440. 8,  8,  8,  12, 12, 12, 12, 16, 16, 16, 20, 20, 24, 24, 28, 28, 32,
  441. 36, 36, 40, 44, 48, 52, 52, 64, 64, 64, 64, 64
  442. }, {
  443. 4,  4,  4,  4,  4,  4,  4,  8,  8,  8, 12, 12, 16, 16, 20
  444. }
  445. }, { 22050, 47, 15,
  446. {
  447. 4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  8,  8,  8,  8,  8,  8,  8,
  448. 8,  8,  8,  12, 12, 12, 12, 16, 16, 16, 20, 20, 24, 24, 28, 28, 32,
  449. 36, 36, 40, 44, 48, 52, 52, 64, 64, 64, 64, 64
  450. }, {
  451. 4,  4,  4,  4,  4,  4,  4,  8,  8,  8, 12, 12, 16, 16, 20
  452. }
  453. }, { 16000, 43, 15,
  454. {
  455. 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 12, 12, 12, 
  456. 12, 12, 12, 12, 12, 12, 16, 16, 16, 16, 20, 20, 20, 24, 
  457. 24, 28, 28, 32, 36, 40, 40, 44, 48, 52, 56, 60, 64, 64, 64
  458. }, {
  459. 4, 4, 4, 4, 4, 4, 4, 4, 8, 8, 12, 12, 16, 20, 20
  460. }
  461. }, { 12000, 43, 15,
  462. {
  463. 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 12, 12, 12, 
  464. 12, 12, 12, 12, 12, 12, 16, 16, 16, 16, 20, 20, 20, 24, 
  465. 24, 28, 28, 32, 36, 40, 40, 44, 48, 52, 56, 60, 64, 64, 64
  466. }, {
  467. 4, 4, 4, 4, 4, 4, 4, 4, 8, 8, 12, 12, 16, 20, 20
  468. }
  469. }, { 11025, 43, 15,
  470. {
  471. 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 12, 12, 12, 
  472. 12, 12, 12, 12, 12, 12, 16, 16, 16, 16, 20, 20, 20, 24,
  473. 24, 28, 28, 32, 36, 40, 40, 44, 48, 52, 56, 60, 64, 64, 64
  474. }, {
  475. 4, 4, 4, 4, 4, 4, 4, 4, 8, 8, 12, 12, 16, 20, 20
  476. }
  477. }, { 8000, 40, 15,
  478. {
  479. 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 16, 
  480. 16, 16, 16, 16, 16, 16, 20, 20, 20, 20, 24, 24, 24, 28, 
  481. 28, 32, 36, 36, 40, 44, 48, 52, 56, 60, 64, 80
  482. }, {
  483. 4, 4, 4, 4, 4, 4, 4, 8, 8, 8, 8, 12, 16, 20, 20
  484. }
  485. },
  486. { -1 }
  487. };