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

Audio

开发平台:

Visual C++

  1. /*!
  2.  **************************************************************************************
  3.  * file
  4.  *    nal.c
  5.  * brief
  6.  *    Handles the operations on converting String of Data Bits (SODB)
  7.  *    to Raw Byte Sequence Payload (RBSP), and then
  8.  *    onto Encapsulate Byte Sequence Payload (EBSP).
  9.  *  date 14 June 2002
  10.  * author
  11.  *    Main contributors (see contributors.h for copyright, address and affiliation details)
  12.  *      - Shankar Regunathan                  <shanre@microsoft.de>
  13.  *      - Stephan Wenger                      <stewe@cs.tu-berlin.de>
  14.  ***************************************************************************************
  15.  */
  16. #include "contributors.h"
  17. #include "global.h"
  18. #include "enc_statistics.h"
  19. #include "cabac.h"
  20.  /*!
  21.  ************************************************************************
  22.  * brief
  23.  *    Converts String Of Data Bits (SODB) to Raw Byte Sequence
  24.  *    Packet (RBSP)
  25.  * param currStream
  26.  *        Bitstream which contains data bits.
  27.  * return None
  28.  * note currStream is byte-aligned at the end of this function
  29.  *
  30.  ************************************************************************
  31. */
  32. void SODBtoRBSP(Bitstream *currStream)
  33. {
  34.   currStream->byte_buf <<= 1;
  35.   currStream->byte_buf |= 1;
  36.   currStream->bits_to_go--;
  37.   currStream->byte_buf <<= currStream->bits_to_go;
  38.   currStream->streamBuffer[currStream->byte_pos++] = currStream->byte_buf;
  39.   currStream->bits_to_go = 8;
  40.   currStream->byte_buf = 0;
  41. }
  42. /*!
  43. ************************************************************************
  44. *  brief
  45. *     This function add emulation_prevention_three_byte for all occurrences
  46. *     of the following byte sequences in the stream
  47. *       0x000000  -> 0x00000300
  48. *       0x000001  -> 0x00000301
  49. *       0x000002  -> 0x00000302
  50. *       0x000003  -> 0x00000303
  51. *
  52. *  param NaluBuffer
  53. *            pointer to target buffer
  54. *  param rbsp
  55. *            pointer to source buffer
  56. *  param rbsp_size
  57. *           Size of source
  58. *  return
  59. *           Size target buffer after emulation prevention.
  60. *
  61. ************************************************************************
  62. */
  63. int RBSPtoEBSP(byte *NaluBuffer, unsigned char *rbsp, int rbsp_size)
  64. {
  65.   int j     = 0;
  66.   int count = 0;
  67.   int i;
  68.   for(i = 0; i < rbsp_size; i++)
  69.   {
  70.     if(count == ZEROBYTES_SHORTSTARTCODE && !(rbsp[i] & 0xFC))
  71.     {
  72.       NaluBuffer[j] = 0x03;
  73.       j++;
  74.       count = 0;
  75.     }
  76.     NaluBuffer[j] = rbsp[i];
  77.     if(rbsp[i] == 0x00)
  78.       count++;
  79.     else
  80.       count = 0;
  81.     j++;
  82.   }
  83.   return j;
  84. }
  85. /*!
  86. ************************************************************************
  87. *  brief
  88. *     This function adds cabac_zero_word syntax elements at the end of the
  89. *     NAL unit to
  90. *
  91. *  param nalu
  92. *            target NAL unit
  93. *  return
  94. *           number of added bytes
  95. *
  96. ************************************************************************
  97. */
  98. int addCabacZeroWords(NALU_t *nalu, StatParameters *cur_stats)
  99. {
  100.   const static int MbWidthC  [4]= { 0, 8, 8,  16};
  101.   const static int MbHeightC [4]= { 0, 8, 16, 16};
  102.   int stuffing_bytes = 0;
  103.   int i = 0;
  104.   byte *buf = &nalu->buf[nalu->len];
  105.   int RawMbBits = 256 * img->bitdepth_luma + 2 * MbWidthC[active_sps->chroma_format_idc] * MbHeightC[active_sps->chroma_format_idc] * img->bitdepth_chroma;
  106.   int min_num_bytes = ((96 * get_pic_bin_count()) - (RawMbBits * (int)img->PicSizeInMbs *3) + 1023) / 1024;
  107.   if (min_num_bytes > img->bytes_in_picture)
  108.   {
  109.     stuffing_bytes = min_num_bytes - img->bytes_in_picture;
  110.     printf ("Inserting %d/%d cabac_zero_word syntax elements/bytes (Clause 7.4.2.10)n", ((stuffing_bytes + 2)/3), stuffing_bytes);  
  111.     for (i = 0; i < stuffing_bytes; i+=3 )
  112.     {
  113.       *buf++ = 0x00; // CABAC zero word
  114.       *buf++ = 0x00;
  115.       *buf++ = 0x03;
  116.     }
  117.     cur_stats->bit_use_stuffingBits[img->type] += (i<<3);
  118.     nalu->len += i;
  119.   }  
  120.   return i;
  121. }