/****************************************************************************
* x264_nal_decode:nal单元解码
* 解码一个缓冲区 nal (p_data) 到 一个 x264_nal_t 结构体 (*nal)
* 思路:网络传输过来的是一个字节,并不是如结构体x264_nal_t定义的用int表示的一个个结构体字段
* 我们要把传来的第一个字节拆开用结构体中的int字段来表示,把前3比特放到x264_nal_t.i_ref_idc
* 后5比特放到x264_nal_t.i_type
****************************************************************************/
int x264_nal_decode( x264_nal_t *nal, void *p_data, int i_data )
{
uint8_t *src = p_data;
//缓冲区起始地址, unsigned char,就是一个8位的char,一个字节
uint8_t *end = &src[i_data];
//缓冲区结束地址,
uint8_t *dst = nal->p_payload;
//指向有效荷载的起始地址
/*
* 0 1 2 3 4 5 6 7 第一字节的8比特
* | | | + + + + + 前3比特是优先级;后5比特是nal单元类型
* --3-- ----5----
*/
nal->i_type = src[0]&0x1f;
//类型占本字节的5位 0x1f-> 0001 1111 本字节与0001 1111按位与,取出nal的类型值
nal->i_ref_idc = (src[0] >> 5)&0x03;//第1个字节右移5,得到优先级,占本字节的2位
src++;
//第2个字节及后面的字节
while( src < end )
//循环第2及以后字节
{
if( src < end - 3 && src[0] == 0x00 && src[1] == 0x00 && src[2] == 0x03 )
//开始地址 < 结束地址 并且 第1字节 == 0x00
//
并且 第2字节 == 0x00
//
并且 第3字节 == 0x03
{
*dst++ = 0x00;//dst后移1字节
*dst++ = 0x00;//同上
src += 3;
//src=src+3
/*
* src 最初的src地址是起始的第一字节
* src++ 移到了第2字节(while前的那句)
* src += 3 即 src = src + 3
* 比如起始地址为0, src = 0 + 3
* 0 1 2 3
* 可以看到,3实际是第4个字节了
* 这样,0x 00 00 03 01 虽然只是比较了前3字节,但是
* src += 3 ,实际上把后面的01也跳过了
*/
continue;
}
*dst++ = *src++;//左边是dst的值(*dst)++,右侧是(*src)++
//先结合* ,然后指针自增1
// 这样理解,++后置的情况下,先用它的值,最后才++
//是*src给*dst
/* 等价于如下的三行代码:
* *dst = *src
* dst++;
* src++;
* -----------------
* *j++的理解还应该是 *(j++)
* *(j++)就是*j
* 注意:不是先计算括号里面的++
*/
}//去掉添加的0x00 00 03 01 (4字节)
nal->i_payload = dst - (uint8_t*)p_data;//i_payload是有效载荷的长度,以字节为单位
/* 直观的理解,负载的长度为 nal->p_payload 的地址 减
* 1字节的Nal Header 减
* 0x00 00 03 01 (4字节)(如果有的话) 减
*
* NAL起始地址p_data
* -----------------------
* dst经过几次移动
* 第一次,uint8_t *dst = nal->p_payload;
//指向有效荷载的起始地址
* 第二次,*dst++ = 0x00;
* 第三次,*dst++ = 0x00;
* 第四次,*dst++ = *src++;
*/
return 0;
}
关于*dst++ = *src++,测试例子如下:
H.264 ing(450291883) 22:30:09
#include<iostream>
using namespace std;
int main()
{
char a[10]="abc123";
char b[10]="edf456";
char *src,*des;
src=b;
des=a;
while(*des++=*src++);
cout<<a<<endl;
return 0;
}
H.264 ing(450291883) 22:13:06
#include<iostream>
using namespace std;
int main()
{
int a[3]={1,2,3};
int *p1,*p2;
p1=a;
p2=a;
cout<<*p1++<<endl;
cout<<*(p2++)<<endl;
return 0;
}