x264_nal_decode:nal 代碼詳解
/****************************************************************************
* 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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.