資源簡介
1、H264的RTP組包和拆包,主要是對于單幀包和FU-A包的處理;
2、H265的RTP組包和拆包,主要是對于單幀包和FU-A包的處理;
3、H264和H265的SPS數(shù)據(jù)解析;
2、H265的RTP組包和拆包,主要是對于單幀包和FU-A包的處理;
3、H264和H265的SPS數(shù)據(jù)解析;
代碼片段和文件信息
#include?“H2645ParseSPS.h“
#include?
#include?
#include?
#include?
typedef?unsigned?char?BYTE;
typedef?int?INT;
typedef?unsigned?int?UINT;
typedef?struct
{
const?BYTE?*data;???//sps數(shù)據(jù)
UINT?size;??????????//sps數(shù)據(jù)大小
UINT?index;?????????//當前計算位所在的位置標記
}?sps_bit_stream;
static?BYTE?*ff_avc_find_startcode_internal(BYTE?*p?BYTE?*end)
{
BYTE?*a?=?p?+?4?-?((long?long)p?&?3);
for?(end?-=?3;?p? {
if?(p[0]?==?0?&&?p[1]?==?0?&&?p[2]?==?1)
return?p;
}
for?(end?-=?3;?p? {
UINT?x?=?*(const?UINT*)p;
//??????if?((x?-?0x01000100)?&?(~x)?&?0x80008000)?//?little?endian
//??????if?((x?-?0x00010001)?&?(~x)?&?0x00800080)?//?big?endian
if?((x?-?0x01010101)?&?(~x)?&?0x80808080)
{?//?generic
if?(p[1]?==?0)
{
if?(p[0]?==?0?&&?p[2]?==?1)
return?p;
if?(p[2]?==?0?&&?p[3]?==?1)
return?p?+?1;
}
if?(p[3]?==?0)
{
if?(p[2]?==?0?&&?p[4]?==?1)
return?p?+?2;
if?(p[4]?==?0?&&?p[5]?==?1)
return?p?+?3;
}
}
}
for?(end?+=?3;?p? {
if?(p[0]?==?0?&&?p[1]?==?0?&&?p[2]?==?1)
return?p;
}
return?end?+?3;
}
static?BYTE?*ff_avc_find_startcode(BYTE?*p?BYTE?*end)
{
BYTE?*out?=?ff_avc_find_startcode_internal(p?end);
if?(p? out--;
return?out;
}
/**
移除H264的NAL防競爭碼(0x03)
@param?data?sps數(shù)據(jù)
@param?dataSize?sps數(shù)據(jù)大小
*/
static?void?del_emulation_prevention(BYTE?*data?UINT?*dataSize)
{
UINT?dataSizeTemp?=?*dataSize;
for?(UINT?i?=?0?j?=?0;?i<(dataSizeTemp?-?2);?i++)?
{
int?val?=?(data[i]?^?0x0)?+?(data[i?+?1]?^?0x0)?+?(data[i?+?2]?^?0x3);????//檢測是否是競爭碼
if?(val?==?0)?
{
for?(j?=?i?+?2;?j {????//移除競爭碼
data[j]?=?data[j?+?1];
}
(*dataSize)--;??????//data?size?減1
}
}
}
static?void?sps_bs_init(sps_bit_stream?*bs?const?BYTE?*data?UINT?size)
{
if?(bs)
{
bs->data?=?data;
bs->size?=?size;
bs->index?=?0;
}
}
/**
是否已經(jīng)到數(shù)據(jù)流最后
@param?bs?sps_bit_stream數(shù)據(jù)
@return?1:yes,0:no
*/
static?INT?eof(sps_bit_stream?*bs)
{
return?(bs->index?>=?bs->size?*?8);????//位偏移已經(jīng)超出數(shù)據(jù)
}
/**
讀取從起始位開始的BitCount個位所表示的值
@param?bs?sps_bit_stream數(shù)據(jù)
@param?bitCount?bit位個數(shù)(從低到高)
@return?value
*/
static?UINT?u(sps_bit_stream?*bs?BYTE?bitCount)
{
UINT?val?=?0;
for?(BYTE?i?=?0;?i {
val?<<=?1;
if?(eof(bs))
{
val?=?0;
break;
}
else?if?(bs->data[bs->index?/?8]?&?(0x80?>>?(bs->index?%?8)))?
{?????//計算index所在的位是否為1
val?|=?1;
}
bs->index++;??//遞增當前起始位(表示該位已經(jīng)被計算,在后面的計算過程中不需要再次去計算所在的起始位索引,缺點:后面每個bit位都需要去位移)
}
return?val;
}
/**
讀取無符號哥倫布編碼值(UE)
#2^LeadingZeroBits?-?1?+?(xxx)
@param?bs?sps_bit_stream數(shù)據(jù)
@return?value
*/
static?UINT?ue(sps_bit_stream?*bs)
{
UINT?zeroNum?=?0;
while?(u(bs?1)?==?0?&&?!eof(bs)?&&?zeroNum?32)?
{
zeroNum++;
}
return?(UINT)((1?<}
/**
讀取有符號哥倫布編碼值(SE)
#(-1)^(k+1)?*?Ceil(k/2)
@param?bs?sps_bit_stream數(shù)據(jù)
@re
?屬性????????????大小?????日期????時間???名稱
-----------?---------??----------?-----??----
?????目錄???????????0??2019-06-19?16:22??rtp解包組包\
?????文件???????19974??2019-03-15?15:04??rtp解包組包\H2645ParseSPS.cpp
?????文件?????????730??2019-03-14?14:40??rtp解包組包\H2645ParseSPS.h
?????文件???????10938??2019-04-02?18:53??rtp解包組包\ParseSPS.cpp
?????文件?????????435??2019-04-02?18:56??rtp解包組包\ParseSPS.h
?????文件????????1984??2019-03-19?14:18??rtp解包組包\RTPProcessor.cpp
?????文件????????1880??2019-04-02?11:36??rtp解包組包\RTPProcessor.h
?????文件???????11221??2019-03-21?20:39??rtp解包組包\RTPRecvProcessor.cpp
?????文件????????1023??2019-03-15?11:27??rtp解包組包\RTPRecvProcessor.h
?????文件????????7668??2019-03-26?11:47??rtp解包組包\RTPSendProcessor.cpp
?????文件????????1007??2019-03-14?10:29??rtp解包組包\RTPSendProcessor.h
- 上一篇:BI財務分析主題
- 下一篇:statcom的控制原理
評論
共有 條評論