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;
}

x264_nal_decode:nal 代碼詳解 - 加菲 - 視頻會議 - 加菲
x264_nal_decode:nal 代碼詳解 - 加菲 - 視頻會議 - 加菲
關於*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;
}

x264_nal_decode:nal 代碼詳解 - 加菲 - 視頻會議 - 加菲
 
 
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;
}
x264_nal_decode:nal 代碼詳解 - 加菲 - 視頻會議 - 加菲
 




發佈了18 篇原創文章 · 獲贊 6 · 訪問量 8萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章