欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費電子書(shū)等14項超值服

開(kāi)通VIP
數字電視中TS包解碼函數注解

數字電視中TS包解碼函數注解

/*****************************************************************************

* dvbpsi_PushPacket

*****************************************************************************

* Injection of a TS packet into a PSI decoder.

*****************************************************************************/

void dvbpsi_PushPacket(dvbpsi_handle h_dvbpsi, uint8_t* p_data)

{

uint8_t i_expected_counter; /* 存儲下一個(gè)數據包的連續計數器數字 */

dvbpsi_psi_section_t* p_section; /* 當前段指針 */

uint8_t* p_payload_pos; /* 當前位置指針 */

uint8_t* p_new_pos = NULL; /* Beginning of the new section,

updated to NULL when the new

section is handled */

int i_available; /* 包中可用字節數 */

/* TS start code */

if(p_data[0] != 0x47) //同步字節(sync byte:1B),應為0x47

{

DVBPSI_ERROR("PSI decoder", "not a TS packet");

return;

}

/* 連續檢查 */

i_expected_counter = (h_dvbpsi->i_continuity_counter + 1) & 0xf; /*連續計數器累加1*/

h_dvbpsi->i_continuity_counter = p_data[3] & 0xf; //TS頭部最后4比特為連續計數器

if(i_expected_counter != h_dvbpsi->i_continuity_counter) /*判斷是否是連續傳送的包*/

{

DVBPSI_ERROR_ARG("PSI decoder",

"TS discontinuity (received %d, expected %d)",

h_dvbpsi->i_continuity_counter, i_expected_counter);

h_dvbpsi->b_discontinuity = 1; //將不連續標志置1

if(h_dvbpsi->p_current_section) //刪除當前段

{

dvbpsi_DeletePSISections(h_dvbpsi->p_current_section); //釋放空間

h_dvbpsi->p_current_section = NULL;

}

}

/* 判斷是否有有效負載,沒(méi)有就返回*/

if(!(p_data[3] & 0x10)) //第28bit標識有無(wú)調整段

{

return;

}

/* 跳過(guò)自適應長(cháng)度區 */

if(p_data[3] & 0x20) //第27bit標識有無(wú)自適應區(adaption field)

p_payload_pos = p_data + 5 + p_data[4]; //5為包頭4字節及1字節的自適應長(cháng)度 p_data[4]自適應區長(cháng)度

else

p_payload_pos = p_data + 4;

/* Unit start -> skip the pointer_field and a new section begins */

if(p_data[1] & 0x40) //即"payload unit start indicator"bit位 有效荷載單元起始批示符位,值為1表示存在確定的起始信息

{

p_new_pos = p_payload_pos + *p_payload_pos + 1; //指向包數據起始位置

p_payload_pos += 1; //跳過(guò)長(cháng)度指示的1個(gè)字節

}

p_section = h_dvbpsi->p_current_section;

/* If the psi decoder needs a begginning of section and a new section

begins in the packet then initialize the dvbpsi_psi_section_t structure */

if(p_section == NULL)

{

if(p_new_pos)

{

/* 為結構分配內存空間 */

h_dvbpsi->p_current_section

= p_section

= dvbpsi_NewPSISection(h_dvbpsi->i_section_max_size);

/* 更新當前位置指針 */

p_payload_pos = p_new_pos;

/* 有指針指向新段 */

p_new_pos = NULL;

/* Just need the header to know how long is the section */

h_dvbpsi->i_need = 3; //在前3個(gè)字節中包含了表ID、section syntax indicator和長(cháng)度批示,能確定是那種表,有多長(cháng)

h_dvbpsi->b_complete_header = 0;

}

else

{

/* No new section => return */

return;

}

}

/* Remaining bytes in the payload */

i_available = 188 + p_data - p_payload_pos; //有效載荷長(cháng)度

while(i_available > 0)

{

if(i_available >= h_dvbpsi->i_need)

{

/* 有足夠的字節存儲頭部或整個(gè)段的信息 */

memcpy(p_section->p_payload_end, p_payload_pos, h_dvbpsi->i_need);

p_payload_pos += h_dvbpsi->i_need;

p_section->p_payload_end += h_dvbpsi->i_need;

i_available -= h_dvbpsi->i_need;

if(!h_dvbpsi->b_complete_header)

{

/* Header is complete */

h_dvbpsi->b_complete_header = 1;

/* Compute p_section->i_length and update h_dvbpsi->i_need */

//不懂?????????

h_dvbpsi->i_need = p_section->i_length

= ((uint16_t)(p_section->p_data[1] & 0xf)) << 8

| p_section->p_data[2]; //從第12個(gè)比特位到第24個(gè)比特位為長(cháng)度批示段

/* 檢查段是否超過(guò)最大長(cháng)度 */

if(h_dvbpsi->i_need > h_dvbpsi->i_section_max_size - 3) //包頭3個(gè)字節

{

DVBPSI_ERROR("PSI decoder", "PSI section too long");

dvbpsi_DeletePSISections(p_section);

h_dvbpsi->p_current_section = NULL;

/* 如果還有新段沒(méi)有分析,則繼續*/

if(p_new_pos)

{

h_dvbpsi->p_current_section

= p_section

= dvbpsi_NewPSISection(h_dvbpsi->i_section_max_size);

p_payload_pos = p_new_pos;

p_new_pos = NULL;

h_dvbpsi->i_need = 3;

h_dvbpsi->b_complete_header = 0;

i_available = 188 + p_data - p_payload_pos;

}

else

{

i_available = 0;

}

}

}

else

{

/* PSI section is complete */

p_section->b_syntax_indicator = p_section->p_data[1] & 0x80; //讀段語(yǔ)法標志 位

p_section->b_private_indicator = p_section->p_data[1] & 0x40; //固定的'0',這是為了防止和ISO13818Video流格式中的控制字沖突而設置的

/* 如果存在CRC校驗數據,則更新p_payload_end指針 */

if(p_section->b_syntax_indicator)

p_section->p_payload_end -= 4;

if(dvbpsi_ValidPSISection(p_section)) /*調用函數對數據進(jìn)行CRC校驗*/

{

/* 數據無(wú)誤 */

p_section->i_table_id = p_section->p_data[0]; //從第一個(gè)字節讀取表ID,0x00為PAT,0x02為PMT

if(p_section->b_syntax_indicator)

{

p_section->i_extension = (p_section->p_data[3] << 8)

| p_section->p_data[4]; //16bits的當前流ID,DVB內唯一.(事實(shí)上很多都是自定義的TS ID)

p_section->i_version = (p_section->p_data[5] & 0x3e) >> 1; //43到47的5bits為版本號碼,標注當前節目的版本.這是個(gè)非常有用的參數,當檢測到這個(gè)字段改變時(shí),說(shuō)明TS流中的節目已經(jīng)變化了,程序必須重新搜索節目

p_section->b_current_next = p_section->p_data[5] & 0x1; //第48比特位,當前還是未來(lái)使用標志符,一般情況下為'0'

p_section->i_number = p_section->p_data[6]; //當前段號碼

p_section->i_last_number = p_section->p_data[7]; //最后段號碼(section_number和last_section_number的功能是當PAT內容>184字節時(shí),PAT表會(huì )分成多個(gè)段(sections),解復用程序必須在全部接收完成后再進(jìn)行PAT的分析)從for()開(kāi)始,就是描述了當前流中的頻道數目(N),每一個(gè)頻道對應的PMT PID是什么.解復用程序需要和上圖類(lèi)似的循環(huán)來(lái)接收所有的頻道號碼和對應的PMT PID,并把這些信息在緩沖區中保存起來(lái).在后部的處理中需要使用到PMT PID.

p_section->p_payload_start = p_section->p_data + 8; //前面已分析了8個(gè)字節,指向新的開(kāi)始

}

else

{

p_section->p_payload_start = p_section->p_data + 3;

}

h_dvbpsi->pf_callback(h_dvbpsi, p_section);

h_dvbpsi->p_current_section = NULL;

}

else

{

/* PSI section isn't valid => trash it */

dvbpsi_DeletePSISections(p_section);

h_dvbpsi->p_current_section = NULL;

}

/* If there is a new section not being handled then go forward

in the packet */

if(p_new_pos)

{

h_dvbpsi->p_current_section

= p_section

= dvbpsi_NewPSISection(h_dvbpsi->i_section_max_size);

p_payload_pos = p_new_pos;

p_new_pos = NULL;

h_dvbpsi->i_need = 3;

h_dvbpsi->b_complete_header = 0;

i_available = 188 + p_data - p_payload_pos;

}

else

{

i_available = 0;

}

}

}

else

{

/* There aren't enough bytes in this packet to complete the

header/section */

memcpy(p_section->p_payload_end, p_payload_pos, i_available);

p_section->p_payload_end += i_available;

h_dvbpsi->i_need -= i_available;

i_available = 0;

}

}

}

本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請點(diǎn)擊舉報。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
常見(jiàn)視頻封裝格式(2)
DVB-SI理解入門(mén)指南(一)(二)(三)
數據廣播簡(jiǎn)介
一、TS流概述
TS各個(gè)表與SECTION的解析CAS原理
Spring4新特性
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導長(cháng)圖 關(guān)注 下載文章
綁定賬號成功
后續可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服

欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久