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

本文详细介绍了x264中NAL单元的编码过程,包括如何添加起始码、头部信息及如何处理裸数据中的特殊字节,确保了NAL单元在存储介质上的正确性和独立性。

原文地址:http://blog.youkuaiyun.com/diffenyu/article/details/8292541

/**************************************************************************** 

  1.  * x264_nal_encode: 
  2.  * x264_nal_encode( mux_buffer, &i_size, 1, &nal[i] ); 
  3.  ****************************************************************************/  
  4. int x264_nal_encode( void *p_data, int *pi_data, int b_annexeb, x264_nal_t *nal )  
  5. {  
  6.     uint8_t *dst = p_data;/*nal首地址*/  
  7.     uint8_t *src = nal->p_payload;/*裸数据的首地址*/  
  8.     uint8_t *end = &nal->p_payload[nal->i_payload];/*下一个裸数据的首地址,-> 和 [] 属于同一优先级,从左到右结合*/  
  9.     int i_count = 0;  
  10.   
  11.     /* FIXME this code doesn't check overflow */  
  12.   
  13.     if( b_annexeb )/*H.264附录B中的方案,此处b_annexeb一直取1,利用RTP打包时去掉下面4个字节的start_code,但在存储介质上时,由于NAL 
  14.                    是依次紧密排列的,解码器将无法在数据流中分辨出每个NAL的起始位置和终止位置,故而采用了start_code*/  
  15.     {  
  16.         /* long nal start code (we always use long ones)*/  
  17.         *dst++ = 0x00;  
  18.         *dst++ = 0x00;  
  19.         *dst++ = 0x00;  
  20.         *dst++ = 0x01;  
  21.     }  
  22.   
  23.     /* nal header */  
  24.     *dst++ = ( 0x00 << 7 ) | ( nal->i_ref_idc << 5 ) | nal->i_type;/*第一个字节*/  
  25.   
  26.     while( src < end )  
  27.     {  
  28.         if( i_count == 2 && *src <= 0x03 )  
  29.         {  
  30.             *dst++ = 0x03;  
  31.             i_count = 0;  
  32.         }  
  33.         if( *src == 0 )/*如果遇到数据中有0x00的,则i_cout++,直到检测到2次0x00,则在其后面添加03以防止与起始码竞争*/  
  34.             i_count++;  
  35.         else  
  36.             i_count = 0;  
  37.         *dst++ = *src++;  
  38.     }  
  39.     *pi_data = dst - (uint8_t*)p_data;/*p_data为nal的首地址,最后pi_data记录的是整个nal的字节数*/  
  40.   
  41.     return *pi_data;  
  42. }  

 

`x264_nal_t`结构体是x264库中用于存储编码后的NAL数据信息的结构体,其中不包含PTS、DTS、Duration和Index等信息,需要使用外部变量或函数进行传递或计算。具体实现时,可以按照以下步骤获取PTS、DTS、Duration和Index等信息: 1. 在调用x264_encoder_encode函数进行编码时,可以将PTS和DTS作为x264_picture_t结构体变量的i_pts和i_dts字段进行设置,例如: ``` x264_picture_t pic_in, pic_out; // 设置图像数据 pic_in.i_pts = pts; pic_in.i_dts = dts; // 编码一帧图像 int ret = x264_encoder_encode(encoder, &nal, &nnal, &pic_in, &pic_out); ``` 2. 在编码完成后,可以根据视频帧率和编码时长计算出Duration信息,例如: ``` int frame_rate = 25; // 视频帧率 int duration = 1000 / frame_rate; // 每帧编码时长(毫秒) ``` 3. 在传递x264_nal_t结构体变量时,可以使用外部变量或函数传递Index信息,例如: ``` int nal_index = 0; // NAL序号 for (int i = 0; i < nnal; i++) { x264_nal_t *nal_ptr = &nal[i]; // 设置NAL信息 nal_ptr->i_ref_idc = 0; nal_ptr->i_type = NAL_SLICE; nal_ptr->i_payload = nal_size[i]; nal_ptr->p_payload = nal_data[i]; nal_ptr->i_nal_units = nnal; nal_ptr->i_nal_unit = i; nal_ptr->i_temporal_reference = nal_index++; } ``` 通过以上步骤,就可以获取到PTS、DTS、Duration和Index等信息,并将编码后的NAL数据存储到x264_nal_t结构体中。需要注意的是,具体实现时还需要根据具体情况进行调整和优化。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值