JM8.6中的一个重要结构体NALU_t的定义、分配和释放

       在JM8.6中,NALU_t是一个非常重要的结构体,回寝室之前,欣赏一下结构体NALU_t的定义:

typedef struct 
{
  int startcodeprefix_len;      //! 4 for parameter sets and first slice in picture, 3 for everything else (suggested)
  unsigned len;                 //! Length of the NAL unit (Excluding the start code, which does not belong to the NALU)
  unsigned max_size;            //! Nal Unit Buffer size
  int nal_unit_type;            //! NALU_TYPE_xxxx
  int nal_reference_idc;        //! NALU_PRIORITY_xxxx
  int forbidden_bit;            //! should be always FALSE
  byte *buf;        //! conjtains the first byte followed by the EBSP
} NALU_t;


     接着欣赏一下AllocNALU函数

NALU_t *AllocNALU(int buffersize)
{
  NALU_t *n;

  if ((n = (NALU_t*)calloc (1, sizeof (NALU_t))) == NULL) no_mem_exit ("AllocNALU: n");  // 分配一个结构体的空间

  n->max_size=buffersize;

  if ((n->buf = (byte*)calloc (buffersize, sizeof (byte))) == NULL) no_mem_exit ("AllocNALU: n->buf"); // 也要分配这个空间
  
  return n;
}

      

      接着欣赏FreeNALU函数.

void FreeNALU(NALU_t *n)
{
  if (n)
  {
    if (n->buf)
    {
      free(n->buf);  // 先释放
      n->buf=NULL;   
    }
    free (n);  // 再释放
  }
}


     欣赏完最后一个近似模拟程序就回去啦,如下:

#include<iostream>
using namespace std;

typedef struct nalu
{
	int bufferSize;
	int *buf;
}NALU_t;

NALU_t* allocNALU(int size)
{
	NALU_t *n = new NALU_t;
	n->bufferSize = size;
	n->buf = new int[n->bufferSize];
	
	return n;
}

void freeNALU(NALU_t *n)
{
	if(NULL != n)
	{
		if(NULL != n->buf)
		{
			free(n->buf);
			n->buf = NULL;
		}
		free(n);
		n->buf = NULL;
	}
	n->bufferSize = 0;
}

int main()
{
	int size = 280;
	NALU_t *n = allocNALU(size);

	int i;
	for(i = 0; i < size; i++)
	{
		n->buf[i] = i;
	}

	for(i = 0; i < size; i++)
	{
		cout << n->buf[i] << endl;
	}

	freeNALU(n);

	return 0;
}


      Ok, 回去.

 

      第二天了. 发现还有几个函数不错呢,可以看看:

static byte *NAL_Payload_buffer;  // 文件全局变量
void FreeNalPayloadBuffer()
{
  if(NAL_Payload_buffer)
  {
    free(NAL_Payload_buffer);
    NAL_Payload_buffer=NULL;
  }
}
void AllocNalPayloadBuffer() // 分配一帧的堆
{
  const int buffer_size = (input->img_width * input->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);
}


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值