blob: 8897c5dd99b51953bfe04d6a8d1cf5688689782c [file] [log] [blame]
/*!
**************************************************************************************
* \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;
}
}