www.pudn.com > wm2.5.zip > nal.c


 
/*! 
 ************************************************************************************** 
 * \file 
 *    nal.c 
 * WJP FOR NAL 
*************************************************************************************** 
 */ 
 
 
 
#include  
#include  
#include  
#include "define.h" 
#include "global.h" 
#include "nalu.h" 
 
extern void no_mem_exit(char *where); 
 /*!  
 ************************************************************************************* 
 * \brief 
 *    Allocates memory for a NALU 
 * 
 * \param buffersize 
 *     size of NALU buffer  
 * 
 * \return 
 *    pointer to a NALU 
 ************************************************************************************* 
 */ 
NALU_t *AllocNALU(int buffersize) 
{ 
  NALU_t *n; 
 
  if ((n = (NALU_t*)calloc (1, sizeof (NALU_t))) == NULL) no_mem_exit ("AllocNALU: n"); 
 
  if ((n->buf = (Byte*)calloc (buffersize, sizeof (Byte))) == NULL) no_mem_exit ("AllocNALU: n->buf"); 
   
  return n; 
} 
 
 
/*!  
 ************************************************************************************* 
 * \brief 
 *    Frees a NALU 
 * 
 * \param n  
 *    NALU to be freed 
 * 
 ************************************************************************************* 
 */ 
 
void FreeNALU(NALU_t *n) 
{ 
  if (n) 
  { 
    if (n->buf) 
    { 
      free(n->buf); 
      n->buf=NULL; 
    } 
    free (n); 
  } 
} 
 
/*! 
************************************************************************ 
*	name: Form_NALU 
*  \brief 
*     This function forms a NALU 
*      
*  \param NAL_type 
*       the type of the NALU 
*  \param NAL_ref_idc 
*       the ref_idc of the NALU 
*  \param streamBuffer 
*       pointer to data bits 
*  \param len_data_seq 
*           Size of streamBuffer in bytes. 
*  \return  
*           Size of NALU in byte. 
*	author: Wang Jianpeng 
* 
************************************************************************ 
*/ 
int Form_NALU(NALU_t *nalu, int NAL_type, int NAL_ref_idc, Byte *streamBuffer, int len_data_seq) 
{ 
	nalu->len = len_data_seq + 1; 
	nalu->forbidden_bit = 0; 
	nalu->nal_reference_idc = NAL_ref_idc; 
	nalu->nal_unit_type = NAL_type; 
 
	nalu->buf[0] = 
		nalu->forbidden_bit << 7      | 
		nalu->nal_reference_idc << 5  | 
		nalu->nal_unit_type;	 
	memcpy (&nalu->buf[1], streamBuffer, len_data_seq); 
	 
	return len_data_seq + 1; 
} 
 
/*! 
************************************************************************ 
*	\name: Write_NALU2File 
*  \brief 
*     This function writes the NALU to the output file 
*	author: Wang Jianpeng 
* 
************************************************************************ 
*/ 
 
int Write_NALU2File(NALU_t *nalu, FILE *f) 
{ 
	assert (nalu != NULL); 
	assert (nalu->forbidden_bit == 0); 
	assert (f != NULL); 
 
	putc (0, f); 
	putc (0, f); 
	putc (1, f); 
 
	if (nalu->len != fwrite (nalu->buf, 1, nalu->len, f)) 
	{ 
		printf ("Fatal: cannot write %d bytes to bitstream file, exit (-1)\n", nalu->len); 
		exit (-1); 
	} 
	fflush (f);	 
	return nalu->len + 3; 
}