text: 
  /*!
   **************************************************************************************
   * \file
   *    nal.c
   * \brief
   *    Handles the operations on converting String of Data Bits (SODB)
   *    to Raw Byte Sequence Payload (RBSP), and then 
   *    onto Encapsulate Byte Sequence Payload (EBSP).
   *  \date 14 June 2002
   * \author
   *    Main contributors (see contributors.h for copyright, address and affiliation details) 
   *      - Shankar Regunathan                  <shanre@microsoft.de>
   *      - Stephan Wenger                      <stewe@cs.tu-berlin.de>
   ***************************************************************************************
   */
  
  
  #include "contributors.h"
  
  #include <stdlib.h>
  #include <assert.h>
  #include <memory.h>
  
  #include "global.h"
  
   /*!
   ************************************************************************
   * \brief
   *    Converts String Of Data Bits (SODB) to Raw Byte Sequence 
   *    Packet (RBSP)
   * \param currStream
   *        Bitstream which contains data bits.
   * \return None
   * \note currStream is byte-aligned at the end of this function
   *    
   ************************************************************************
  */
  
  static byte *NAL_Payload_buffer;
  
  void SODBtoRBSP(Bitstream *currStream)
  {
    currStream->byte_buf <<= 1;
    currStream->byte_buf |= 1;
    currStream->bits_to_go--;
    currStream->byte_buf <<= currStream->bits_to_go;
    currStream->streamBuffer[currStream->byte_pos++] = currStream->byte_buf;
    currStream->bits_to_go = 8;
    currStream->byte_buf = 0;
  }
  
  
  /*!
  ************************************************************************
  *  \brief
  *     This function converts a RBSP payload to an EBSP payload
  *     
  *  \param streamBuffer
  *       pointer to data bits
  *  \param begin_bytepos
  *            The byte position after start-code, after which stuffing to
  *            prevent start-code emulation begins.
  *  \param end_bytepos
  *           Size of streamBuffer in bytes.
  *  \param min_num_bytes
  *           Minimum number of bytes in payload. Should be 0 for VLC entropy
  *           coding mode. Determines number of stuffed words for CABAC mode.
  *  \return 
  *           Size of streamBuffer after stuffing.
  *  \note
  *      NAL_Payload_buffer is used as temporary buffer to store data.
  *
  *
  ************************************************************************
  */
  
  int RBSPtoEBSP(byte *streamBuffer, int begin_bytepos, int end_bytepos, int min_num_bytes)
  {
    
    int i, j, count;
  
    memcpy(&NAL_Payload_buffer[begin_bytepos],&streamBuffer[begin_bytepos], (end_bytepos - begin_bytepos) * sizeof(unsigned char));
  
    count = 0;
    j = begin_bytepos;
    for(i = begin_bytepos; i < end_bytepos; i++) 
    {
      if(count == ZEROBYTES_SHORTSTARTCODE && !(NAL_Payload_buffer[i] & 0xFC)) 
      {
        streamBuffer[j] = 0x03;
        j++;
        count = 0;   
      }
      streamBuffer[j] = NAL_Payload_buffer[i];
      if(NAL_Payload_buffer[i] == 0x00)      
        count++;
      else 
        count = 0;
      j++;
    }
  
    for (i = 0; i< (min_num_bytes - end_bytepos); i+=3 ) 
    {
      streamBuffer[j]   = 0x00; // CABAC zero word
      streamBuffer[j+1] = 0x00;
      streamBuffer[j+2] = 0x03;
      j += 3;
      stats->bit_use_stuffingBits[img->type]+=16;
    }
    return j;
  }
  
   /*!
   ************************************************************************
   * \brief
   *    Initializes NAL module (allocates NAL_Payload_buffer)
   ************************************************************************
  */
  
  void AllocNalPayloadBuffer()
  {
    const int buffer_size = ((input->img_width+img->auto_crop_right) * (input->img_height+img->auto_crop_bottom) * 5); // AH 190202: There can be data expansion with 
                                                            // low QP values. So, we make sure that buffer 
                                                            // does not overflow. 4 is probably safe multiplier.
    FreeNalPayloadBuffer();
  
    NAL_Payload_buffer = (byte *) calloc(buffer_size, sizeof(byte));
    assert (NAL_Payload_buffer != NULL);
  }
  
  
   /*!
   ************************************************************************
   * \brief
   *   Finits NAL module (frees NAL_Payload_buffer)
   ************************************************************************
  */
  
  void FreeNalPayloadBuffer()
  {
    if(NAL_Payload_buffer)
    {
      free(NAL_Payload_buffer);
      NAL_Payload_buffer=NULL;
    }
  }
  