




已阅读5页,还剩2页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
x264中的NAL流程 目前,主要是在分析NAL,做抓包实验,所以对NAL的格式要求比较高,这个过程中读了新一代视频编码,以前也读过,这是没有遇到实际的问题,读的时候也是似懂非懂的,囫囵吞枣,现在要分析,要用了才知道这些相关文档是要好好读的,ES流也是要好好分析的。在上一篇中关于函数指针和指针函数的理论知识中,我主要是来看看x264中的NAL是怎么在封装的。在x264中使用的函数指针,关于NAL部分的下面的一些:static int (*p_write_nalu)( hnd_t handle, uint8_t *p_nal, int i_size );,在这里可以看到p_write_nalu)是一个指针函数,p_write_nalu = write_nalu_bsf;即对于p_write_nalu其所指向的函数write_nalu_bsf,类似的还有:p_write_nalu = write_nalu_mp4;p_write_nalu = write_nalu_mkv;/每一个NALU都是由header+payload组成的,在header的结构是可以参考264的相关文档enum nal_unit_type_eNAL_UNKNOWN = 0,NAL_SLICE = 1,NAL_SLICE_DPA = 2,NAL_SLICE_DPB = 3,NAL_SLICE_DPC = 4,NAL_SLICE_IDR = 5, /* ref_idc != 0 */NAL_SEI = 6, /* ref_idc = 0 */NAL_SPS = 7,NAL_PPS = 8,NAL_AUD = 9,/* ref_idc = 0 for 6,9,10,11,12 */;enum nal_priority_eNAL_PRIORITY_DISPOSABLE = 0,NAL_PRIORITY_LOW = 1,NAL_PRIORITY_HIGH = 2,NAL_PRIORITY_HIGHEST = 3,;/NAL结构typedef structint i_ref_idc; /* nal_priority_e */int i_type; /* nal_unit_type_e */* Size of payload in bytes. */int i_payload; /负载的大小/* If param-b_annexb is set, Annex-B bytestream with 4-byte startcode.* Otherwise, startcode is replaced with a 4-byte size.* This size is the size used in mp4/similar muxing; it is equal to i_payload-4 */uint8_t *p_payload;/如果是字节流格式的NAL时所用到的前缀4bytes x264_nal_t;下面主要是跟踪x264,得到NAL的封装流程,如下:1. /NALstatic void x264_nal_start( x264_t *h, int i_type, int i_ref_idc )x264_nal_t *nal = &h-out.nalh-out.i_nal;nal-i_ref_idc = i_ref_idc;nal-i_type = i_type;nal-i_payload= 0;nal-p_payload= &h-out.p_bitstreambs_pos( &h-out.bs ) / 8;/下面是对bs_pos函数的注解static inline int bs_pos( bs_t *s )return( 8 * (s-p - s-p_start) + (WORD_SIZE*8) - s-i_left ); / /获取当前的NALU的地址?- s-i_left/bs_s的结构typedef struct bs_suint8_t *p_start;uint8_t *p;uint8_t *p_end;intptr_t cur_bits;int i_left; /* i_count number of available bits */int i_bits_encoded; /* RD only */ bs_t;2.static int x264_encoder_encapsulate_nals( x264_t *h ) /NAL封装int nal_size = 0, i;uint8_t *nal_buffer;for( i = 0; i out.i_nal; i+ )nal_size += h-out.nali.i_payload;/* Worst-case NAL unit escaping: reallocate the buffer if its too small. */if( h-nal_buffer_size out.i_nal * 4 )uint8_t *buf = x264_malloc( nal_size * 2 + h-out.i_nal * 4 );if( !buf )return -1;x264_free( h-nal_buffer );h-nal_buffer = buf;nal_buffer = h-nal_buffer;for( i = 0; i out.i_nal; i+ )int size = x264_nal_encode( nal_buffer, h-param.b_annexb, &h-out.nali );h-out.nali.i_payload = size;h-out.nali.p_payload = nal_buffer;nal_buffer += size;return nal_buffer - h-nal_buffer;3.在2.中有:int x264_nal_encode( uint8_t *dst, int b_annexb, x264_nal_t *nal )uint8_t *src = nal-p_payload; /为了同意结构还是将字节流格式的前缀作为指针的初始值uint8_t *end = nal-p_payload + nal-i_payload;uint8_t *orig_dst = dst;int i_count = 0, size;/* long nal start code (we always use long ones) */if( b_annexb ) /这里是进行字节流格式的码流编码,有开始前缀码,对于RTP封装则不需要前缀码*dst+ = 0x00;*dst+ = 0x00;*dst+ = 0x00;*dst+ = 0x01;else /* save room for size later */dst += 4;/* nal header */*dst+ = ( 0x00 i_ref_idc i_type;/第一个bit的设置是由编码器自己控制的while( src end )if( i_count = 2 & *src 24;orig_dst1 = size16;orig_dst2 = size 8;orig_dst3 = size 0;return size+4; /+44.static int x264_nal_end( x264_t *h )x264_nal_t *nal = &h-out.nalh-out.i_nal;nal-i_payload = &h-out.p_bitstreambs_pos( &h-out.bs )/ 8 - nal -p_payload;h-out.i_nal+;/* if number of allocated nals is not enough, re-allocate a larger one. */if( h-out.i_nal = h-out.i_nals_allocated )x264_nal_t *new_out = x264_malloc( sizeof(x264_nal_t) * (h-out.i_nals_allocated*2) );if( !new_out )return -1;memcpy( new_out, h-out.nal, sizeof(x264_nal_t) * (h-out.i_nals_allocated) );x264_free( h-out.nal );h-out.nal = new_out;h-out.i_nals_allocated *= 2;return 0;5.p_write_naluint write_nalu_bsf( hnd_t handle, uint8_t *p_nalu, int i_size )if( fwrite( p_nalu, i_size, 1, (FILE*)handle ) 0 ) /就是把p_nalu里面的1*i_size的字节输出到handle里面return i_size;return -1;实验跟踪:在编码第一个I帧的时候,要编码的NALU的个数为4个,这里主要是指编码的类型为:SEI,SPS,PPS,I帧的NAL的编码,对于一个I帧,也就是对这个GOP中的图像序列参数,图像参数进行编码,即有如下:/* Write SPS and PPS */if( i_nal_type = NAL_SLICE_IDR & h-param.b_repeat_headers )if( h-fenc-i_frame = 0 )/* identify ourself */x264_nal_start( h, NAL_SEI, NAL_PRIORITY_DISPOSABLE );if( x264_sei_version_write( h, &h-out.bs ) )return -1;if( x264_nal_end( h ) )return -1;overhead += h-out.nalh-out.i_nal-1.i_payload + NALU_OVERHEAD;/* generate sequence parameters */x264_nal_start( h, NAL_SPS, NAL_PRIORITY_HIGHEST );x264_sps_write( &h-out.bs, h-sps );if( x264_nal_end( h ) )return -1;overhead += h-out.nalh-out.i_nal-1.i_payload + NALU_OVERHEAD;/* generate picture parameters */x264_nal_start( h, NAL_PPS, NAL_PRIORITY_HIGHEST );x264_pps_write( &h-out.bs, h-pps );if( x264_nal_end( h ) )return -1;overhead += h-out.nalh-out.i_nal-1.i_payload + NALU_OVERHEAD;int x264_encoder_headers( x264_t *h, x264_nal_t *pp_nal, int *pi_nal )int frame_size = 0;/* init bitstream context */h-out.i_nal = 0;bs_init( &h-out.bs, h-out.p_bitstream, h-out.i_bitstream );/* Write SEI, SPS and PPS. */x264_nal_start( h, NAL_SEI, NAL_PRIORITY_DISPOSABLE );if( x264_sei_version_write( h, &h-out.bs ) )return -1;if( x264_nal_end( h ) )return -1;/* generate sequence parameters */x264_nal_start( h, NAL_SPS, NAL_PRIORITY_HIGHEST );x264_sps_write( &h-out.bs, h-sps );if( x264_nal_end( h ) )return -1;/* generate picture parameters */x264_nal_start( h, NAL_PPS, NAL_PRIORITY_HIGHEST );x264_pps_write( &h-out.bs, h-pps );if( x264_nal_end( h ) )return -1;bs_flush( &h-out.bs );frame_size = x264_encoder_encapsulate_nals( h );/* now set output*/*pi_nal =
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 高考单招模拟试题及答案
- 租房合同中介范本5篇
- 邢台疫情考试试题及答案
- 复代理委托合同7篇
- 2025年专项选调考试试题及答案
- 2025年安全业务考试试题及答案
- 2025年专科民法考试试题及答案
- 2025年泌尿系统常见疾病诊断与治疗模拟试卷答案及解析
- 2025年食品安全管理员培训考试试题及答案
- 2025年精神科精神障碍患者心理评估模拟测试答案及解析
- 2025年合肥公交集团有限公司驾驶员招聘180人笔试参考题库附带答案详解
- 2024年上海市大数据中心招聘真题
- 2025年网络安全监测预警体系建设实施方案评估报告
- 2025年会计继续教育网络答题真题及答案
- 2025年工勤行政事务高级技师技术等级考试试题及答案
- 中国银行招聘笔试真题及答案(可下载)
- 高血压指南培训课件
- 设计文件更改管理办法
- 飞利浦录音笔VTR8000说明书
- 数字赋能教学课件
- 机器点钞技术课件
评论
0/150
提交评论