formatbitstream2.c
上传用户:bjsgzm
上传日期:2007-01-08
资源大小:256k
文件大小:8k
源码类别:

mpeg/mp3

开发平台:

Visual C++

  1. /*
  2. (c) Copyright 1998, 1999 - Tord Jansson
  3. =======================================
  4. This file is part of the BladeEnc MP3 Encoder, based on
  5. ISO's reference code for MPEG Layer 3 compression.
  6. This file doesn't contain any of the ISO reference code and
  7. is copyright Tord Jansson (tord.jansson@swipnet.se).
  8. BladeEnc is free software; you can redistribute this file
  9. and/or modify it under the terms of the GNU Lesser General Public
  10. License as published by the Free Software Foundation; either
  11. version 2.1 of the License, or (at your option) any later version.
  12. */
  13. #include <stdio.h>
  14. #include <stdlib.h>
  15. #if !defined(__OpenBSD__) && !defined(__FreeBSD__) && !defined(__NetBSD__) && !defined(TARGET_OS_MAC)
  16. #include <malloc.h>
  17. #endif
  18. #include "formatbitstream2.h"
  19. #include "common.h"
  20. extern char * pEncodedOutput;
  21. extern int outputBit;
  22. /*____ Structure Definitions _________________________________________________*/
  23. typedef struct HeaderDef Header;
  24. struct HeaderDef
  25. {
  26. int size;
  27. int frameSize;
  28. char data[128];
  29. Header * pNext;
  30. };
  31. /*____ Function Prototypes ___________________________________________________*/
  32. static int writeMainDataBits( BF_FrameData * psFrame, BitHolder *psBH );
  33. static void putbits(unsigned int val, int n);
  34. static int generateHeader( BF_FrameData * psFrame );
  35. /*____ Static Data ___________________________________________________________*/
  36. static int BitsRemaining = 0;
  37. static Header * pHeaderChain;
  38. static Header * pFreeHeaderChain;
  39. /*____ initFormatBitstream() ________________________________________________*/
  40. void initFormatBitstream( void )
  41. {
  42. BitsRemaining = 0;
  43. pHeaderChain = NULL;
  44. pFreeHeaderChain = NULL;
  45. }
  46. /*____ exitFormatBitstream() _________________________________________________*/
  47. void  exitFormatBitstream( void )
  48. {
  49. Header * psHeader;
  50. Header * psFree;
  51. /* Fill out the last frame with 0xFF */
  52. while( BitsRemaining > 32 )
  53. {
  54. putbits( 0xFFFFFFFF, 32 );
  55. BitsRemaining -= 32;
  56. }
  57. if( BitsRemaining > 0 )
  58. putbits( 0xFFFFFFFF, BitsRemaining );
  59. /* Dealocate Headers */
  60. psHeader = pHeaderChain;
  61. while( psHeader != NULL )
  62. {
  63. psFree = psHeader;
  64. psHeader = psHeader->pNext;
  65. free( psFree );
  66. }
  67. psHeader = pFreeHeaderChain;
  68. while( psHeader != NULL )
  69. {
  70. psFree = psHeader;
  71. psHeader = psHeader->pNext;
  72. free( psFree );
  73. }
  74. }
  75. /*____ initBitHolder() ______________________________________________________*/
  76. BitHolder * initBitHolder( BitHolder * wp, int elements )
  77. {
  78. wp->element = (BitHolderElement *) malloc( sizeof( BitHolderElement ) * elements );
  79. wp->max_elements = elements;
  80. wp->nrEntries = 0;
  81. return wp;
  82. }
  83. /*____ exitBitHolder() ______________________________________________________*/
  84. void exitBitHolder( BitHolder * wp )
  85. {
  86. if( wp->element != NULL )
  87. free( wp->element );
  88. wp->element = NULL;
  89. }
  90. /*____ addBits() ____________________________________________________________*/
  91. void addBits( BitHolder * wp, unsigned int value, int length )
  92. {
  93. if( length != 0 )
  94. {
  95. if( wp->nrEntries == wp->max_elements )
  96. {
  97. printf( "ERROR: BitHolder overflow!n" );
  98. exit( -1 );
  99. }
  100. value = value & ((0xFFFFFFFF)>>(32-length));
  101. wp->element[wp->nrEntries].value = value;
  102. wp->element[wp->nrEntries].length = length;
  103. wp->nrEntries++;
  104. }
  105. }
  106. /*____ writeFrame() _________________________________________________________*/
  107. void writeFrame( BF_FrameData *psFrame, BF_FrameResults *results )
  108. {
  109. int bits;
  110. int ch, gr;
  111. int sizeRemainHeaders, sizeRemainFrames;
  112. Header * psHeader;
  113. /* Generate and save header, return size of SideInfo.*/
  114. results->SILength = generateHeader( psFrame );
  115. /* Put the bits and compute size of mainData */
  116. bits = 0;
  117. for ( gr = 0; gr < psFrame->nGranules; gr++ )
  118. for ( ch = 0; ch < psFrame->nChannels; ch++ )
  119. {
  120. bits += writeMainDataBits( psFrame, &psFrame->scaleFactors[gr][ch] );
  121. bits += writeMainDataBits( psFrame, &psFrame->codedData[gr][ch] );
  122. bits += writeMainDataBits( psFrame, &psFrame->userSpectrum[gr][ch] );
  123. }
  124. bits += writeMainDataBits( psFrame, &psFrame->userFrameData );
  125. results->mainDataLength = bits;
  126. /* calculate nextBackPointer */
  127. sizeRemainHeaders = 0;
  128. sizeRemainFrames = 0;
  129. for( psHeader = pHeaderChain ; psHeader != NULL ; psHeader = psHeader->pNext )
  130. {
  131. sizeRemainHeaders += psHeader->size;
  132. sizeRemainFrames += psHeader->frameSize;
  133. }
  134. results->nextBackPtr = (BitsRemaining / 8) + sizeRemainFrames - sizeRemainHeaders; /* BitsRemaining must be dividable by 8 */
  135. }
  136. /*=============================================================================
  137. >>> Static Functions <<<
  138. =============================================================================*/
  139. /*____ writeBitHolder() _____________________________________________________*/
  140. static void writeBitHolder( BitHolder * part )
  141. {
  142. BitHolderElement * ep;
  143. int i;
  144. ep = part->element;
  145. for ( i = 0; i < part->nrEntries; i++, ep++ )
  146. putbits( ep->value, ep->length );
  147. }
  148. /*____ calcCRC() ____________________________________________________________*/
  149. static int calcCRC( char * pData, int size )
  150. {
  151. int i;
  152. int crc = 0xffff;
  153. int masking;
  154. int carry;
  155. int data;
  156. for( i = 2 ; i < size ; i++ )
  157. {
  158. if( i != 4 && i != 5 )
  159. {
  160. masking = 1 << 8;
  161. data = pData[i];
  162. while( masking >>= 1 )
  163. {
  164. carry = crc & 0x8000;
  165. crc <<= 1;
  166. if (!carry ^ !(data & masking))
  167. crc ^= 0x8005;
  168. }
  169. }
  170. }
  171. crc &= 0xffff;
  172. return crc;
  173. }
  174. /*____ generateHeader() ____________________________________________________*/
  175. static int generateHeader( BF_FrameData * psFrame )
  176. {
  177. int ch, gr;
  178. int crc;
  179. Header * psHeader;
  180. Header **wpLink;
  181. char  * pOldEncodedOutput;
  182. /* Get a Free Header structure */
  183. if( pFreeHeaderChain == NULL )
  184. psHeader = (Header *) malloc( sizeof( Header ) );
  185. else
  186. {
  187. psHeader = pFreeHeaderChain;
  188. pFreeHeaderChain = psHeader->pNext;
  189. }
  190. psHeader->pNext = NULL;
  191. for( wpLink = &pHeaderChain ; * wpLink != NULL ; wpLink = &((*wpLink)->pNext) );
  192. *wpLink = psHeader;
  193. /* Generate the Header */
  194. pOldEncodedOutput = pEncodedOutput;
  195. pEncodedOutput = psHeader->data;
  196. writeBitHolder( &psFrame->header );
  197. writeBitHolder( &psFrame->frameSI );
  198. for ( ch = 0; ch < psFrame->nChannels; ch++ )
  199. writeBitHolder( &psFrame->channelSI[ch] );
  200. for ( gr = 0; gr < psFrame->nGranules; gr++ )
  201. for ( ch = 0; ch < psFrame->nChannels; ch++ )
  202. writeBitHolder( &psFrame->spectrumSI[gr][ch] );
  203. /* Checksum generation (if CRC enabled).*/
  204. if( !(psHeader->data[1] & 0x1) )
  205. {
  206. crc = calcCRC( psHeader->data, pEncodedOutput - psHeader->data );
  207. psHeader->data[4] = (char) (crc >> 8);
  208. psHeader->data[5] = (char) crc;
  209. }
  210. psHeader->size = pEncodedOutput - psHeader->data;
  211. psHeader->frameSize = psFrame->frameLength/8;
  212. pEncodedOutput = pOldEncodedOutput;
  213. return psHeader->size*8;
  214. }
  215. /*____ writeHeader() _______________________________________________________*/
  216. static int writeHeader( void )
  217. {
  218. Header * psHeader;
  219. psHeader = pHeaderChain;
  220. memcpy( pEncodedOutput, psHeader->data, psHeader->size );
  221. pEncodedOutput += psHeader->size;
  222. * pEncodedOutput = 0;
  223. pHeaderChain = psHeader->pNext;
  224. psHeader->pNext = pFreeHeaderChain;
  225. pFreeHeaderChain = psHeader;
  226. return (psHeader->frameSize - psHeader->size)*8;
  227. }
  228. /*____ writeMainDataBits() __________________________________________________*/
  229. static int writeMainDataBits( BF_FrameData * psFrame, BitHolder *psBH )
  230. {
  231. BitHolderElement * psElem = psBH->element;
  232. int i, bits = 0;
  233. unsigned int val;
  234. int nBits;
  235. for ( i = 0; i < psBH->nrEntries; i++, psElem++ )
  236. {
  237. val = psElem->value;
  238. nBits = psElem->length;
  239. if ( BitsRemaining == 0 )
  240. BitsRemaining = writeHeader();
  241. if ( nBits > BitsRemaining )
  242. {
  243. nBits -= BitsRemaining;
  244. putbits( val >> nBits, BitsRemaining );
  245. BitsRemaining = writeHeader();
  246. putbits( val, nBits );
  247. }
  248. else
  249. putbits( val, nBits );
  250. BitsRemaining -= nBits;
  251. bits += psElem->length;
  252. }
  253. return bits;
  254. }
  255. /*____ putbits() _____________________________________________________________*/
  256. /*write n bits into the bit stream */
  257. static void putbits(unsigned int val, int n)
  258. {
  259. int  x;
  260. while (n > 0)
  261. {
  262. x = MIN(n, outputBit);
  263. n -= x;
  264. outputBit -= x;
  265. * pEncodedOutput |= (val >> n) << outputBit;
  266. if (!outputBit)
  267. {
  268. outputBit = 8;
  269. pEncodedOutput++;
  270. * pEncodedOutput = 0;
  271. }
  272. }
  273. }