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

流媒体/Mpeg4/MP4

开发平台:

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