nal.c
上传用户:hjq518
上传日期:2021-12-09
资源大小:5084k
文件大小:3k
源码类别:

Audio

开发平台:

Visual C++

  1. /*!
  2.  ************************************************************************
  3.  * file  nal.c
  4.  *
  5.  * brief
  6.  *    Converts Encapsulated Byte Sequence Packets (EBSP) to Raw Byte
  7.  *    Sequence Packets (RBSP), and then onto String Of Data Bits (SODB)
  8.  *
  9.  * author
  10.  *    Main contributors (see contributors.h for copyright, address and affiliation details)
  11.  *    - Shankar L. Regunathan <shanre@microsoft.com>
  12.  ************************************************************************
  13.  */
  14. #include "contributors.h"
  15. #include "global.h"
  16.  /*!
  17.  ************************************************************************
  18.  * brief
  19.  *    Converts RBSP to string of data bits
  20.  * param streamBuffer
  21.  *          pointer to buffer containing data
  22.  *  param last_byte_pos
  23.  *          position of the last byte containing data.
  24.  * return last_byte_pos
  25.  *          position of the last byte pos. If the last-byte was entirely a stuffing byte,
  26.  *          it is removed, and the last_byte_pos is updated.
  27.  *
  28. ************************************************************************/
  29. int RBSPtoSODB(byte *streamBuffer, int last_byte_pos)
  30. {
  31.   int ctr_bit, bitoffset;
  32.   bitoffset = 0;
  33.   //find trailing 1
  34.   ctr_bit = (streamBuffer[last_byte_pos-1] & (0x01<<bitoffset));   // set up control bit
  35.   while (ctr_bit==0)
  36.   {                 // find trailing 1 bit
  37.     bitoffset++;
  38.     if(bitoffset == 8)
  39.     {
  40.       if(last_byte_pos == 0)
  41.         printf(" Panic: All zero data sequence in RBSP n");
  42.       assert(last_byte_pos != 0);
  43.       last_byte_pos -= 1;
  44.       bitoffset = 0;
  45.     }
  46.     ctr_bit= streamBuffer[last_byte_pos-1] & (0x01<<(bitoffset));
  47.   }
  48.   // We keep the stop bit for now
  49. /*  if (remove_stop)
  50.   {
  51.     streamBuffer[last_byte_pos-1] -= (0x01<<(bitoffset));
  52.     if(bitoffset == 7)
  53.       return(last_byte_pos-1);
  54.     else
  55.       return(last_byte_pos);
  56.   }
  57. */
  58.   return(last_byte_pos);
  59. }
  60. /*!
  61. ************************************************************************
  62. * brief
  63. *    Converts Encapsulated Byte Sequence Packets to RBSP
  64. * param streamBuffer
  65. *    pointer to data stream
  66. * param end_bytepos
  67. *    size of data stream
  68. * param begin_bytepos
  69. *    Position after beginning
  70. ************************************************************************/
  71. int EBSPtoRBSP(byte *streamBuffer, int end_bytepos, int begin_bytepos)
  72. {
  73.   int i, j, count;
  74.   count = 0;
  75.   if(end_bytepos < begin_bytepos)
  76.     return end_bytepos;
  77.   j = begin_bytepos;
  78.   for(i = begin_bytepos; i < end_bytepos; i++)
  79.   { //starting from begin_bytepos to avoid header information
  80.     //in NAL unit, 0x000000, 0x000001 or 0x000002 shall not occur at any byte-aligned position
  81.     if(count == ZEROBYTES_SHORTSTARTCODE && streamBuffer[i] < 0x03) 
  82.       return -1;
  83.     if(count == ZEROBYTES_SHORTSTARTCODE && streamBuffer[i] == 0x03)
  84.     {
  85.       //check the 4th byte after 0x000003, except when cabac_zero_word is used, in which case the last three bytes of this NAL unit must be 0x000003
  86.       if((i < end_bytepos-1) && (streamBuffer[i+1] > 0x03))
  87.         return -1;
  88.       //if cabac_zero_word is used, the final byte of this NAL unit(0x03) is discarded, and the last two bytes of RBSP must be 0x0000
  89.       if(i == end_bytepos-1)
  90.         return j;
  91.       i++;
  92.       count = 0;
  93.     }
  94.     streamBuffer[j] = streamBuffer[i];
  95.     if(streamBuffer[i] == 0x00)
  96.       count++;
  97.     else
  98.       count = 0;
  99.     j++;
  100.   }
  101.   return j;
  102. }