main.c
上传用户:zhongxx05
上传日期:2007-06-06
资源大小:33641k
文件大小:6k
源码类别:

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. /**************************************************************************************
  36.  * Fixed-point MP3 decoder
  37.  * Jon Recker (jrecker@real.com), Ken Cooke (kenc@real.com)
  38.  * June 2003
  39.  *
  40.  * main.c - command-line test app that uses C interface to MP3 decoder
  41.  **************************************************************************************/
  42. #include <stdlib.h>
  43. #include <string.h>
  44. #include <stdio.h>
  45. #include "mp3dec.h"
  46. #include "debug.h"
  47. #include "timing.h"
  48. #define READBUF_SIZE (1024*16) /* feel free to change this, but keep big enough for >= one frame at high bitrates */
  49. #define MAX_ARM_FRAMES 100
  50. #define ARMULATE_MUL_FACT 1
  51. static int FillReadBuffer(unsigned char *readBuf, unsigned char *readPtr, int bufSize, int bytesLeft, FILE *infile)
  52. {
  53. int nRead;
  54. /* move last, small chunk from end of buffer to start, then fill with new data */
  55. memmove(readBuf, readPtr, bytesLeft);
  56. nRead = fread(readBuf + bytesLeft, 1, bufSize - bytesLeft, infile);
  57. /* zero-pad to avoid finding false sync word after last frame (from old data in readBuf) */
  58. if (nRead < bufSize - bytesLeft)
  59. memset(readBuf + bytesLeft + nRead, 0, bufSize - bytesLeft - nRead);
  60. return nRead;
  61. }
  62. int main(int argc, char **argv)
  63. {
  64. int bytesLeft, nRead, err, offset, outOfData, eofReached;
  65. unsigned char readBuf[READBUF_SIZE], *readPtr;
  66. short outBuf[MAX_NCHAN * MAX_NGRAN * MAX_NSAMP];
  67. FILE *infile, *outfile;
  68. MP3FrameInfo mp3FrameInfo;
  69. HMP3Decoder hMP3Decoder;
  70. int startTime, endTime, diffTime, totalDecTime, nFrames;
  71. #ifdef ARM_ADS
  72. float audioSecs;
  73. #endif
  74. if (argc != 3) {
  75. printf("usage: mp3dec infile.mp3 outfile.pcmn");
  76. return -1;
  77. }
  78. infile = fopen(argv[1], "rb");
  79. if (!infile) {
  80. printf("file open errorn");
  81. return -1;
  82. }
  83. if (strcmp(argv[2], "nul")) {
  84. outfile = fopen(argv[2], "wb");
  85. if (!outfile) {
  86. printf("file open errorn");
  87. return -1;
  88. }
  89. } else {
  90. outfile = 0; /* nul output */
  91. }
  92. DebugMemCheckInit();
  93. InitTimer();
  94. DebugMemCheckStartPoint();
  95. if ( (hMP3Decoder = MP3InitDecoder()) == 0 )
  96. return -2;
  97. DebugMemCheckEndPoint();
  98. bytesLeft = 0;
  99. outOfData = 0;
  100. eofReached = 0;
  101. readPtr = readBuf;
  102. nRead = 0;
  103. totalDecTime = 0;
  104. nFrames = 0;
  105. do {
  106. /* somewhat arbitrary trigger to refill buffer - should always be enough for a full frame */
  107. if (bytesLeft < 2*MAINBUF_SIZE && !eofReached) {
  108. nRead = FillReadBuffer(readBuf, readPtr, READBUF_SIZE, bytesLeft, infile);
  109. bytesLeft += nRead;
  110. readPtr = readBuf;
  111. if (nRead == 0)
  112. eofReached = 1;
  113. }
  114. /* find start of next MP3 frame - assume EOF if no sync found */
  115. offset = MP3FindSyncWord(readPtr, bytesLeft);
  116. if (offset < 0) {
  117. outOfData = 1;
  118. break;
  119. }
  120. readPtr += offset;
  121. bytesLeft -= offset;
  122. /* decode one MP3 frame - if offset < 0 then bytesLeft was less than a full frame */
  123. startTime = ReadTimer();
  124.   err = MP3Decode(hMP3Decoder, &readPtr, &bytesLeft, outBuf, 0);
  125.   nFrames++;
  126.  
  127.   endTime = ReadTimer();
  128.   diffTime = CalcTimeDifference(startTime, endTime);
  129. totalDecTime += diffTime;
  130. #if defined ARM_ADS && defined MAX_ARM_FRAMES
  131. printf("frame %5d  start = %10d, end = %10d elapsed = %10d ticksr", 
  132. nFrames, startTime, endTime, diffTime);
  133. fflush(stdout);
  134. #endif
  135. if (err) {
  136. /* error occurred */
  137. switch (err) {
  138. case ERR_MP3_INDATA_UNDERFLOW:
  139. outOfData = 1;
  140. break;
  141. case ERR_MP3_MAINDATA_UNDERFLOW:
  142. /* do nothing - next call to decode will provide more mainData */
  143. break;
  144. case ERR_MP3_FREE_BITRATE_SYNC:
  145. default:
  146. outOfData = 1;
  147. break;
  148. }
  149. } else {
  150. /* no error */
  151. MP3GetLastFrameInfo(hMP3Decoder, &mp3FrameInfo);
  152. if (outfile)
  153. fwrite(outBuf, mp3FrameInfo.bitsPerSample / 8, mp3FrameInfo.outputSamps, outfile);
  154. }
  155. #if defined ARM_ADS && defined MAX_ARM_FRAMES
  156. if (nFrames >= MAX_ARM_FRAMES)
  157. break;
  158. #endif
  159. } while (!outOfData);
  160. #ifdef ARM_ADS
  161. MP3GetLastFrameInfo(hMP3Decoder, &mp3FrameInfo);
  162. audioSecs = ((float)nFrames * mp3FrameInfo.outputSamps) / ( (float)mp3FrameInfo.samprate * mp3FrameInfo.nChans);
  163. printf("nTotal clock ticks = %d, MHz usage = %.2fn", totalDecTime, ARMULATE_MUL_FACT * (1.0f / audioSecs) * totalDecTime * GetClockDivFactor() / 1e6f);
  164. printf("nFrames = %d, output samps = %d, sampRate = %d, nChans = %dn", nFrames, mp3FrameInfo.outputSamps, mp3FrameInfo.samprate, mp3FrameInfo.nChans);
  165. #endif
  166. MP3FreeDecoder(hMP3Decoder);
  167. fclose(infile);
  168. if (outfile)
  169. fclose(outfile);
  170. FreeTimer();
  171. DebugMemCheckFree();
  172. return 0;
  173. }