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; }
相关文章推荐
- int x264_nal_encode( void *p_data, int *pi_data, int b_annexeb, x264_nal_t *nal ) .
- X264中的x264_encoder_encode和x264_nal_encode函数
- signal函数理解或者void (*signal(int signum,void(*handler)(int)))(int)理解
- x86_64 xercexc: error: cast from 'const void*' to 'long int' loses precision [-fpermissive]
- about urllib.encode & urlopen(url,data,timeout) function
- vs2005 warning C4267: 'initializing' : conversion from 'size_t' to 'int', possible loss of data
- const int *pi、int const *pi 与 int *const pi的区别
- 通过 DataFormatString="{0:yyyy/MM/dd}" HtmlEncode="false" 格式化显示时间
- error LNK2019: 无法解析的外部符号 "void __cdecl QTest::qSleep(int)",该符号在函数 "void __cdecl QTest::qWait(int)"中被
- vs2005 warning C4267: 'initializing' : conversion from 'size_t' to 'int', possible loss of data
- 参数 void aa(int a,int b) 与 void aa(int* a,int* b) 与 void aa(int& a,int& b)区别
- x264重要结构体详细说明(2): x264_image_t、x264_picture_t、x264_nal_t
- 关于c语言的typedef高级用法 typedef void (*post_sync_t)(CO_Data*);
- main/int main/void main
- public final void writeInt(int v)
- 无法解析的外部符号 "public: virtual int __thiscall CAddPage::OnSetActive(void)" (?OnSetActive@CAddPage@@UAEH
- how to get Class of primitive datatypes array . Class.forName(int[]) throws exception
- 理解#define write(b,addr) (void)((*(volatile unsigned int *) (addr)) = (b))
- x264代码剖析(七):encode()函数之x264_encoder_encode()函数
- main函数的返回值是int类型,不能是void