formatBitstream.c
上传用户:njqiyou
上传日期:2007-01-08
资源大小:574k
文件大小:15k
源码类别:

mpeg/mp3

开发平台:

C/C++

  1. /*********************************************************************
  2.   Copyright (c) 1995 ISO/IEC JTC1 SC29 WG1, All Rights Reserved
  3.   formatBitstream.c
  4. **********************************************************************/
  5. /*
  6.   Revision History:
  7.   Date        Programmer                Comment
  8.   ==========  ========================= ===============================
  9.   1995/09/06  mc@fivebats.com           created
  10.   1995/09/18  mc@fivebats.com           bugfix: WriteMainDataBits
  11.   1995/09/20  mc@fivebats.com           bugfix: store_side_info
  12. */
  13. #include "formatBitstream.h"
  14. #include <stdlib.h>
  15. #include <stdio.h>
  16. #include <assert.h>
  17. #ifndef EXIT_FAILURE
  18. #define EXIT_FAILURE 1
  19. #endif
  20. /* globals */
  21. static int BitCount       = 0;
  22. static int ThisFrameSize  = 0;
  23. static int BitsRemaining  = 0;
  24. static BitsFcnPtr PutBits = NULL;
  25. /* forward declarations */
  26. static int store_side_info( BF_FrameData *frameInfo );
  27. static int main_data( BF_FrameData *frameInfo, BF_FrameResults *results );
  28. static int side_queue_elements( int *forwardFrameLength, int *forwardSILength );
  29. static void free_side_queues();
  30. static void WriteMainDataBits( unsigned val,
  31.                                unsigned nbits,
  32.        BF_FrameResults *results );
  33. /*
  34.   BitStreamFrame is the public interface to the bitstream
  35.   formatting package. It writes one frame of main data per call.
  36.   Assumptions:
  37.   - The back pointer is zero on the first call
  38.   - An integral number of bytes is written each frame
  39.   You should be able to change the frame length, side info
  40.   length, #channels, #granules on a frame-by-frame basis.
  41.   See formatBitstream.h for more information about the data
  42.   structures and the bitstream syntax.
  43. */
  44. void
  45. BF_BitstreamFrame( BF_FrameData *frameInfo, BF_FrameResults *results )
  46. {
  47.     int elements, forwardFrameLength, forwardSILength;
  48.     assert( frameInfo->nGranules <= MAX_GRANULES );
  49.     assert( frameInfo->nChannels <= MAX_CHANNELS );
  50.     /* get ptr to bit writing function */
  51.     PutBits = frameInfo->putbits;
  52.     assert( PutBits );
  53.     /* save SI and compute its length */
  54.     results->SILength = store_side_info( frameInfo );
  55.     /* write the main data, inserting SI to maintain framing */
  56.     results->mainDataLength = main_data( frameInfo, results );
  57.     /*
  58.       Caller must ensure that back SI and main data are
  59.       an integral number of bytes, since the back pointer
  60.       can only point to a byte boundary and this code
  61.       does not add stuffing bits
  62.     */
  63.     assert( (BitsRemaining % 8) == 0 );
  64.     /* calculate nextBackPointer */
  65.     elements = side_queue_elements( &forwardFrameLength, &forwardSILength );
  66.     results->nextBackPtr = (BitsRemaining / 8) + (forwardFrameLength / 8) - (forwardSILength / 8);
  67. }
  68. /*
  69.   FlushBitstream writes zeros into main data
  70.   until all queued headers are written. The
  71.   queue data buffers are also freed.
  72. */
  73. void
  74. BF_FlushBitstream( BF_FrameData *frameInfo, BF_FrameResults *results )
  75. {
  76.     int elements, forwardFrameLength, forwardSILength;
  77.     /* get ptr to bit writing function */
  78.     PutBits = frameInfo->putbits;
  79.     assert( PutBits );
  80.     elements = side_queue_elements( &forwardFrameLength, &forwardSILength );
  81.     if ( elements )
  82.     {
  83. int bitsRemaining = forwardFrameLength - forwardSILength;
  84. int wordsRemaining = bitsRemaining / 32;
  85. while ( wordsRemaining-- )
  86.     WriteMainDataBits( 0, 32, results );
  87. WriteMainDataBits( 0, (bitsRemaining % 32), results );
  88.     }
  89.     results->mainDataLength = forwardFrameLength - forwardSILength;
  90.     results->SILength       = forwardSILength;
  91.     results->nextBackPtr    = 0;
  92.     /* reclaim queue space */
  93.     free_side_queues();
  94.     /* reinitialize globals */
  95.     BitCount       = 0;
  96.     ThisFrameSize  = 0;
  97.     BitsRemaining  = 0;    
  98.     PutBits        = NULL;
  99.     return;
  100. }
  101. int
  102. BF_PartLength( BF_BitstreamPart *part )
  103. {
  104.     BF_BitstreamElement *ep = part->element;
  105.     int i, bits;
  106.     bits = 0;
  107.     for ( i = 0; i < part->nrEntries; i++, ep++ )
  108. bits += ep->length;
  109.     return bits;
  110. }
  111. /*
  112.   The following is all private to this file
  113. */
  114. typedef struct
  115. {
  116.     int frameLength;
  117.     int SILength;
  118.     int nGranules;
  119.     int nChannels;
  120.     BF_PartHolder *headerPH;
  121.     BF_PartHolder *frameSIPH;
  122.     BF_PartHolder *channelSIPH[MAX_CHANNELS];
  123.     BF_PartHolder *spectrumSIPH[MAX_GRANULES][MAX_CHANNELS];
  124. } MYSideInfo;
  125. static MYSideInfo *get_side_info();
  126. static int write_side_info();
  127. typedef int (*PartWriteFcnPtr)( BF_BitstreamPart *part, BF_FrameResults *results );
  128. static int
  129. writePartMainData( BF_BitstreamPart *part, BF_FrameResults *results )
  130. {
  131.     BF_BitstreamElement *ep;
  132.     int i, bits;
  133.     assert( results );
  134.     assert( part );
  135.     bits = 0;
  136.     ep = part->element;
  137.     for ( i = 0; i < part->nrEntries; i++, ep++ )
  138.     {
  139. WriteMainDataBits( ep->value, ep->length, results );
  140. bits += ep->length;
  141.     }
  142.     return bits;
  143. }
  144. static int
  145. writePartSideInfo( BF_BitstreamPart *part, BF_FrameResults *results )
  146. {
  147.     BF_BitstreamElement *ep;
  148.     int i, bits;
  149.     assert( part );
  150.     bits = 0;
  151.     ep = part->element;
  152.     for ( i = 0; i < part->nrEntries; i++, ep++ )
  153.     {
  154. (*PutBits)( ep->value, ep->length );
  155. bits += ep->length;
  156.     }
  157.     return bits;
  158. }
  159. static int
  160. main_data( BF_FrameData *fi, BF_FrameResults *results )
  161. {
  162.     int gr, ch, bits;
  163.     PartWriteFcnPtr wp = writePartMainData;
  164.     bits = 0;
  165.     results->mainDataLength = 0;
  166.     for ( gr = 0; gr < fi->nGranules; gr++ )
  167. for ( ch = 0; ch < fi->nChannels; ch++ )
  168. {
  169.     bits += (*wp)( fi->scaleFactors[gr][ch], results );
  170.     bits += (*wp)( fi->codedData[gr][ch],    results );
  171.     bits += (*wp)( fi->userSpectrum[gr][ch], results );
  172. }
  173.     bits += (*wp)( fi->userFrameData, results );
  174.     return bits;
  175. }
  176. /*
  177.   This is a wrapper around PutBits() that makes sure that the
  178.   framing header and side info are inserted at the proper
  179.   locations
  180. */
  181. static void
  182. WriteMainDataBits( unsigned val,
  183.    unsigned nbits,
  184.    BF_FrameResults *results )
  185. {
  186.     assert( nbits <= 32 );
  187.     if ( BitCount == ThisFrameSize )
  188.     {
  189. BitCount = write_side_info();
  190. BitsRemaining = ThisFrameSize - BitCount;
  191.     }
  192.     if ( nbits == 0 )
  193. return;
  194.     if ( nbits > BitsRemaining )
  195.     {
  196. unsigned extra = val >> (nbits - BitsRemaining);
  197. nbits -= BitsRemaining;
  198. (*PutBits)( extra, BitsRemaining );
  199. BitCount = write_side_info();
  200. BitsRemaining = ThisFrameSize - BitCount;
  201. (*PutBits)( val, nbits );
  202.     }
  203.     else
  204. (*PutBits)( val, nbits );
  205.     BitCount += nbits;
  206.     BitsRemaining -= nbits;
  207.     assert( BitCount <= ThisFrameSize );
  208.     assert( BitsRemaining >= 0 );
  209.     assert( (BitCount + BitsRemaining) == ThisFrameSize );
  210. }
  211. static int
  212. write_side_info()
  213. {
  214.     MYSideInfo *si;
  215.     int bits, ch, gr;
  216.     PartWriteFcnPtr wp = writePartSideInfo;
  217.     bits = 0;
  218.     si = get_side_info();
  219.     ThisFrameSize = si->frameLength;
  220.     bits += (*wp)( si->headerPH->part,  NULL );
  221.     bits += (*wp)( si->frameSIPH->part, NULL );
  222.     for ( ch = 0; ch < si->nChannels; ch++ )
  223. bits += (*wp)( si->channelSIPH[ch]->part, NULL );
  224.     for ( gr = 0; gr < si->nGranules; gr++ )
  225. for ( ch = 0; ch < si->nChannels; ch++ )
  226.     bits += (*wp)( si->spectrumSIPH[gr][ch]->part, NULL );
  227.     return bits;
  228. }
  229. typedef struct side_info_link
  230. {
  231.     struct side_info_link *next;
  232.     MYSideInfo           side_info;
  233. } side_info_link;
  234. static struct side_info_link *side_queue_head   = NULL;
  235. static struct side_info_link *side_queue_free   = NULL;
  236. static void free_side_info_link( side_info_link *l );
  237. static int
  238. side_queue_elements( int *frameLength, int *SILength )
  239. {
  240.     int elements = 0;
  241.     side_info_link *l = side_queue_head;
  242.     *frameLength = 0;
  243.     *SILength    = 0;
  244.     for ( l = side_queue_head; l; l = l->next )
  245.     {
  246. elements++;
  247. *frameLength += l->side_info.frameLength;
  248. *SILength    += l->side_info.SILength;
  249.     }
  250.     return elements;
  251. }
  252. static int
  253. store_side_info( BF_FrameData *info )
  254. {
  255.     int ch, gr;
  256.     side_info_link *l = NULL;
  257.     /* obtain a side_info_link to store info */
  258.     side_info_link *f = side_queue_free;
  259.     int bits = 0;
  260.     if ( f == NULL )
  261.     { /* must allocate another */
  262. #ifdef DEBUG
  263. static int n_si = 0;
  264. n_si += 1;
  265. fprintf( stderr, "allocating side_info_link number %dn", n_si );
  266. #endif
  267. l = (side_info_link *) calloc( 1, sizeof(side_info_link) );
  268. if ( l == NULL )
  269. {
  270.     fprintf( stderr, "cannot allocate side_info_link" );
  271.     exit( EXIT_FAILURE );
  272. }
  273. l->next = NULL;
  274. l->side_info.headerPH  = BF_newPartHolder( info->header->nrEntries );
  275. l->side_info.frameSIPH = BF_newPartHolder( info->frameSI->nrEntries );
  276. for ( ch = 0; ch < info->nChannels; ch++ )
  277.     l->side_info.channelSIPH[ch] = BF_newPartHolder( info->channelSI[ch]->nrEntries );
  278. for ( gr = 0; gr < info->nGranules; gr++ )
  279.     for ( ch = 0; ch < info->nChannels; ch++ )
  280. l->side_info.spectrumSIPH[gr][ch] = BF_newPartHolder( info->spectrumSI[gr][ch]->nrEntries );
  281.     }
  282.     else
  283.     { /* remove from the free list */
  284. side_queue_free = f->next;
  285. f->next = NULL;
  286. l = f;
  287.     }
  288.     /* copy data */
  289.     l->side_info.frameLength = info->frameLength;
  290.     l->side_info.nGranules   = info->nGranules;
  291.     l->side_info.nChannels   = info->nChannels;
  292.     l->side_info.headerPH    = BF_LoadHolderFromBitstreamPart( l->side_info.headerPH,  info->header );
  293.     l->side_info.frameSIPH   = BF_LoadHolderFromBitstreamPart( l->side_info.frameSIPH, info->frameSI );
  294.     bits += BF_PartLength( info->header );
  295.     bits += BF_PartLength( info->frameSI );
  296.     for ( ch = 0; ch < info->nChannels; ch++ )
  297.     {
  298. l->side_info.channelSIPH[ch] = BF_LoadHolderFromBitstreamPart( l->side_info.channelSIPH[ch],
  299.        info->channelSI[ch] );
  300. bits += BF_PartLength( info->channelSI[ch] );
  301.     }
  302.     for ( gr = 0; gr < info->nGranules; gr++ )
  303. for ( ch = 0; ch < info->nChannels; ch++ )
  304. {
  305.     l->side_info.spectrumSIPH[gr][ch] = BF_LoadHolderFromBitstreamPart( l->side_info.spectrumSIPH[gr][ch],
  306. info->spectrumSI[gr][ch] );
  307.     bits += BF_PartLength( info->spectrumSI[gr][ch] );
  308. }
  309.     l->side_info.SILength = bits;
  310.     /* place at end of queue */
  311.     f = side_queue_head;
  312.     if ( f == NULL )
  313.     {  /* empty queue */
  314. side_queue_head = l;
  315.     }
  316.     else
  317.     { /* find last element */
  318. while ( f->next )
  319.     f = f->next;
  320. f->next = l;
  321.     }
  322.     return bits;
  323. }
  324. static MYSideInfo*
  325. get_side_info()
  326. {
  327.     side_info_link *f = side_queue_free;
  328.     side_info_link *l = side_queue_head;
  329.     
  330.     /*
  331.       If we stop here it means you didn't provide enough
  332.       headers to support the amount of main data that was
  333.       written.
  334.     */
  335.     assert( l );
  336.     
  337.     /* update queue head */
  338.     side_queue_head = l->next;
  339.     /*
  340.       Append l to the free list. You can continue
  341.       to use it until store_side_info is called
  342.       again, which will not happen again for this
  343.       frame.
  344.     */
  345.     side_queue_free = l;
  346.     l->next = f;
  347.     return &l->side_info;
  348. }
  349. static void
  350. free_side_queues()
  351. {
  352.     side_info_link *l, *next;
  353.     
  354.     for ( l = side_queue_head; l; l = next )
  355.     {
  356. next = l->next;
  357. free_side_info_link( l );
  358.     }
  359.     side_queue_head = NULL;
  360.     for ( l = side_queue_free; l; l = next )
  361.     {
  362. next = l->next;
  363. free_side_info_link( l );
  364.     }
  365.     side_queue_free = NULL;
  366. }
  367. static void
  368. free_side_info_link( side_info_link *l )
  369. {
  370.     int gr, ch;
  371.     l->side_info.headerPH  = BF_freePartHolder( l->side_info.headerPH );
  372.     l->side_info.frameSIPH = BF_freePartHolder( l->side_info.frameSIPH );
  373.     for ( ch = 0; ch < l->side_info.nChannels; ch++ )
  374. l->side_info.channelSIPH[ch] = BF_freePartHolder( l->side_info.channelSIPH[ch] );
  375.     for ( gr = 0; gr < l->side_info.nGranules; gr++ )
  376. for ( ch = 0; ch < l->side_info.nChannels; ch++ )
  377.     l->side_info.spectrumSIPH[gr][ch] = BF_freePartHolder( l->side_info.spectrumSIPH[gr][ch] );
  378.     free( l );
  379. }
  380. /*
  381.   Allocate a new holder of a given size
  382. */
  383. BF_PartHolder *BF_newPartHolder( int max_elements )
  384. {
  385.     BF_PartHolder *newPH    = calloc( 1, sizeof(BF_PartHolder) );
  386.     assert( newPH );
  387.     newPH->max_elements  = max_elements;
  388.     newPH->part          = calloc( 1, sizeof(BF_BitstreamPart) );
  389.     assert( newPH->part );
  390.     newPH->part->element = calloc( max_elements, sizeof(BF_BitstreamElement) );
  391.     assert( newPH->part->element );
  392.     newPH->part->nrEntries = 0;
  393.     return newPH;
  394. }
  395. BF_PartHolder *BF_NewHolderFromBitstreamPart( BF_BitstreamPart *thePart )
  396. {
  397.     BF_PartHolder *newHolder = BF_newPartHolder( thePart->nrEntries );
  398.     return BF_LoadHolderFromBitstreamPart( newHolder, thePart );
  399. }
  400. BF_PartHolder *BF_LoadHolderFromBitstreamPart( BF_PartHolder *theHolder, BF_BitstreamPart *thePart )
  401. {
  402.     BF_BitstreamElement *pElem;
  403.     int i;
  404.     theHolder->part->nrEntries = 0;
  405.     for ( i = 0; i < thePart->nrEntries; i++ )
  406.     {
  407. pElem = &(thePart->element[i]);
  408. theHolder = BF_addElement( theHolder, pElem );
  409.     }
  410.     return theHolder;
  411. }
  412. /*
  413.   Grow or shrink a part holder. Always creates a new
  414.   one of the right length and frees the old one after
  415.   copying the data.
  416. */
  417. BF_PartHolder *BF_resizePartHolder( BF_PartHolder *oldPH, int max_elements )
  418. {
  419.     int elems, i;
  420.     BF_PartHolder *newPH;
  421. #ifdef DEBUG
  422.     fprintf( stderr, "Resizing part holder from %d to %dn",
  423.      oldPH->max_elements, max_elements );
  424. #endif
  425.     /* create new holder of the right length */
  426.     newPH = BF_newPartHolder( max_elements );
  427.     /* copy values from old to new */
  428.     elems = (oldPH->max_elements > max_elements) ? max_elements : oldPH->max_elements;
  429.     newPH->part->nrEntries = elems;
  430.     for ( i = 0; i < elems; i++ )
  431. newPH->part->element[i] = oldPH->part->element[i];
  432.     /* free old holder */
  433.     BF_freePartHolder( oldPH );
  434.     
  435.     return newPH;
  436. }
  437. BF_PartHolder *BF_freePartHolder( BF_PartHolder *thePH )
  438. {
  439.     free( thePH->part->element );
  440.     free( thePH->part );
  441.     free( thePH );
  442.     return NULL;
  443. }
  444. /*
  445.   Add theElement to thePH, growing the holder if
  446.   necessary. Returns ptr to the holder, which may
  447.   not be the one you called it with!
  448. */
  449. BF_PartHolder *BF_addElement( BF_PartHolder *thePH, BF_BitstreamElement *theElement )
  450. {
  451.     BF_PartHolder *retPH = thePH;
  452.     int needed_entries = thePH->part->nrEntries + 1;
  453.     int extraPad = 8;  /* add this many more if we need to resize */
  454.     /* grow if necessary */
  455.     if ( needed_entries > thePH->max_elements )
  456. retPH = BF_resizePartHolder( thePH, needed_entries + extraPad );
  457.     /* copy the data */
  458.     retPH->part->element[retPH->part->nrEntries++] = *theElement;
  459.     return retPH;
  460. }
  461. /*
  462.   Add a bit value and length to the element list in thePH
  463. */
  464. BF_PartHolder *BF_addEntry( BF_PartHolder *thePH, uint32 value, uint16 length )
  465. {
  466.     BF_BitstreamElement myElement;
  467.     myElement.value  = value;
  468.     myElement.length = length;
  469.     if ( length )
  470. return BF_addElement( thePH, &myElement );
  471.     else
  472. return thePH;
  473. }