winmain.cpp
上传用户:dangjiwu
上传日期:2013-07-19
资源大小:42019k
文件大小:6k
源码类别:

Symbian

开发平台:

Visual 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.  * winmain.cpp - 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 "mpadecobjfixpt.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 25
  50. static int FillReadBuffer(unsigned char *readBuf, unsigned char *readPtr, int bufSize, int bytesLeft, FILE *infile)
  51. {
  52. int nRead;
  53. /* move last, small chunk from end of buffer to start, then fill with new data */
  54. memmove(readBuf, readPtr, bytesLeft);
  55. nRead = fread(readBuf + bytesLeft, 1, bufSize - bytesLeft, infile);
  56. /* zero-pad to avoid finding false sync word after last frame (from old data in readBuf) */
  57. if (nRead < bufSize - bytesLeft)
  58. memset(readBuf + bytesLeft + nRead, 0, bufSize - bytesLeft - nRead);
  59. return nRead;
  60. }
  61. #if defined (_WIN32) && defined (_WIN32_WCE)
  62. #include <windows.h>
  63. #define main TestMain
  64. static int main(int argc, char **argv);
  65. int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR lpCmdLine, int nShowCmd)
  66. {
  67. /* not designed to do anything right now - just lets us build application to force linker
  68.  *   to run and check for link errors 
  69.  */
  70. char *testArgs[3] = {
  71. "testwrap.exe", 
  72. "\My Documents\test128.mp3",
  73. "nul"
  74. };
  75. TestMain(3, testArgs);
  76. return 0;
  77. }
  78. #endif
  79. int main(int argc, char **argv)
  80. {
  81. int bytesLeft, bytesIn, err, nRead, offset, outOfData, eofReached;
  82. unsigned char readBuf[READBUF_SIZE], *readPtr;
  83. short outBuf[MAX_NCHAN * MAX_NGRAN * MAX_NSAMP];
  84. FILE *infile, *outfile;
  85. int initFlag, chans, bits;
  86. unsigned long sampRate, outBytes;
  87. CMpaDecObj *decobj;
  88. if (argc != 3) {
  89. printf("usage: mp3dec infile.mp3 outfile.pcmn");
  90. return -1;
  91. }
  92. infile = fopen(argv[1], "rb");
  93. if (!infile) {
  94. printf("file open errorn");
  95. return -1;
  96. }
  97. if (strcmp(argv[2], "nul")) {
  98. outfile = fopen(argv[2], "wb");
  99. if (!outfile) {
  100. printf("file open errorn");
  101. return -1;
  102. }
  103. } else {
  104. outfile = 0; /* nul output */
  105. }
  106. DebugMemCheckInit();
  107. decobj = new CMpaDecObj;
  108. if (!decobj)
  109. return -1;
  110. bytesLeft = 0;
  111. outOfData = 0;
  112. eofReached = 0;
  113. readPtr = readBuf;
  114. nRead = 0;
  115. err = 0;
  116. initFlag = 0;
  117. do {
  118. /* somewhat arbitrary trigger to refill buffer - should always be enough for a full frame */
  119. if (bytesLeft < 2*MAINBUF_SIZE && !eofReached) {
  120. nRead = FillReadBuffer(readBuf, readPtr, READBUF_SIZE, bytesLeft, infile);
  121. bytesLeft += nRead;
  122. readPtr = readBuf;
  123. if (nRead == 0)
  124. eofReached = 1;
  125. }
  126. /* find start of next MP3 frame - assume EOF if no sync found */
  127. offset = MP3FindSyncWord(readPtr, bytesLeft);
  128. if (offset < 0) {
  129. outOfData = 1;
  130. break;
  131. }
  132. readPtr += offset;
  133. bytesLeft -= offset;
  134. /* lazy initialization for backwards compatibility with mpadecobj API */
  135. if (!initFlag) {
  136. DebugMemCheckStartPoint();
  137. if (!decobj->Init_n(readPtr, bytesLeft))
  138. return -1; /* init error */
  139. DebugMemCheckEndPoint();
  140. decobj->GetPCMInfo_v(sampRate, chans, bits);
  141. decobj->GetSamplesPerFrame_n();
  142. initFlag = 1;
  143. }
  144. /* decode one MP3 frame - if offset < 0 then bytesLeft was less than a full frame */
  145. outBytes = sizeof(outBuf);
  146. bytesIn = bytesLeft;
  147. decobj->DecodeFrame_v(readPtr, (unsigned long *)(&bytesIn), (unsigned char *)outBuf, &outBytes, &err);
  148. readPtr += bytesIn;
  149. bytesLeft -= bytesIn;
  150. if (err) {
  151. /* error occurred */
  152. switch (err) {
  153. case ERR_MP3_INDATA_UNDERFLOW:
  154. outOfData = 1;
  155. break;
  156. case ERR_MP3_MAINDATA_UNDERFLOW:
  157. /* do nothing - next call to decode will provide more mainData */
  158. break;
  159. case ERR_MP3_FREE_BITRATE_SYNC:
  160. default:
  161. outOfData = 1;
  162. break;
  163. }
  164. } else {
  165. /* no error */
  166. if (outfile)
  167. fwrite(outBuf, 1, (unsigned int)outBytes, outfile);
  168. }
  169. } while (!outOfData);
  170. fclose(infile);
  171. if (outfile)
  172. fclose(outfile);
  173. delete decobj;
  174. DebugMemCheckFree();
  175. return 0;
  176. }