📄 nal.c
字号:
/*
***********************************************************************
* COPYRIGHT AND WARRANTY INFORMATION
*
* Copyright 2001, International Telecommunications Union, Geneva
*
* DISCLAIMER OF WARRANTY
*
* These software programs are available to the user without any
* license fee or royalty on an "as is" basis. The ITU disclaims
* any and all warranties, whether express, implied, or
* statutory, including any implied warranties of merchantability
* or of fitness for a particular purpose. In no event shall the
* contributor or the ITU be liable for any incidental, punitive, or
* consequential damages of any kind whatsoever arising from the
* use of these programs.
*
* This disclaimer of warranty extends to the user of these programs
* and user's customers, employees, agents, transferees, successors,
* and assigns.
*
* The ITU does not represent or warrant that the programs furnished
* hereunder are free of infringement of any third-party patents.
* Commercial implementations of ITU-T Recommendations, including
* shareware, may be subject to royalty fees to patent holders.
* Information regarding the ITU-T patent policy is available from
* the ITU Web site at http://www.itu.int.
*
* THIS IS NOT A GRANT OF PATENT RIGHTS - SEE THE ITU-T PATENT POLICY.
************************************************************************
*/
/*!
**************************************************************************************
* \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 <string.h>
#include <math.h>
#include <time.h>
#include <sys/timeb.h>
#include <stdlib.h>
#include <assert.h>
#include <string.h>
#include "defines.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;
for(i = begin_bytepos; i < end_bytepos; i++)
NAL_Payload_buffer[i] = streamBuffer[i];
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++;
}
while (j < begin_bytepos+min_num_bytes) {
streamBuffer[j] = 0x00; // cabac stuffing word
streamBuffer[j+1] = 0x00;
streamBuffer[j+2] = 0x03;
j += 3;
stat->bit_use_stuffingBits[img->type]+=16;
}
return j;
}
/*!
************************************************************************
* \brief
* Initializes NAL module (allocates NAL_Payload_buffer)
************************************************************************
*/
void AllocNalPayloadBuffer()
{
const int buffer_size = (img->width * img->height * 4); // AH 190202: There can be data expansion with
// low QP values. So, we make sure that buffer
// does not everflow. 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;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -