您的位置:首页 > 其它

int x264_nal_encode( void *p_data, int *pi_data, int b_annexeb, x264_nal_t *nal )

2012-12-13 20:47 190 查看
/****************************************************************************
* x264_nal_encode:
* x264_nal_encode( mux_buffer, &i_size, 1, &nal[i] );
****************************************************************************/
int x264_nal_encode( void *p_data, int *pi_data, int b_annexeb, x264_nal_t *nal )
{
uint8_t *dst = p_data;/*nal首地址*/
uint8_t *src = nal->p_payload;/*裸数据的首地址*/
uint8_t *end = &nal->p_payload[nal->i_payload];/*下一个裸数据的首地址,-> 和 [] 属于同一优先级,从左到右结合*/
int i_count = 0;

/* FIXME this code doesn't check overflow */

if( b_annexeb )/*H.264附录B中的方案,此处b_annexeb一直取1,利用RTP打包时去掉下面4个字节的start_code,但在存储介质上时,由于NAL
是依次紧密排列的,解码器将无法在数据流中分辨出每个NAL的起始位置和终止位置,故而采用了start_code*/
{
/* long nal start code (we always use long ones)*/
*dst++ = 0x00;
*dst++ = 0x00;
*dst++ = 0x00;
*dst++ = 0x01;
}

/* nal header */
*dst++ = ( 0x00 << 7 ) | ( nal->i_ref_idc << 5 ) | nal->i_type;/*第一个字节*/

while( src < end )
{
if( i_count == 2 && *src <= 0x03 )
{
*dst++ = 0x03;
i_count = 0;
}
if( *src == 0 )/*如果遇到数据中有0x00的,则i_cout++,直到检测到2次0x00,则在其后面添加03以防止与起始码竞争*/
i_count++;
else
i_count = 0;
*dst++ = *src++;
}
*pi_data = dst - (uint8_t*)p_data;/*p_data为nal的首地址,最后pi_data记录的是整个nal的字节数*/

return *pi_data;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐