unsigned int GetSectionStart(unsigned char *ucPacketBuffer, struct ts_packet_head *pstPacketHead)
{
unsigned int uiSectionStart = 0;
switch(pstPacketHead->adaptation_field_control)
{
case 0: break;
case 1: uiSectionStart = 4;
break;
case 2: break;
case 3: uiSectionStart = 5 + ucPacketBuffer[4];
break;
}
if(pstPacketHead->payload_uint_start_indicator)
{
uiSectionStart = uiSectionStart + ucPacketBuffer[uiSectionStart] + 1;
}
return uiSectionStart;
}
在写这段程序的时候查了好久才想通,结果后面回过来看的时候又忘记了,还是稍微总结下吧。
adaption_field_control为“调整字段控制”,表示TS分组首部后面是否跟随有调整字段和有效负载。01仅含有效负载,10仅含调整字段,11含有调整字段和有效负载。为00解码器不进行处理。空分组没有调整字段。如果有调整字段就是包数据的第一位(除去包头)指定调整字段长度。
因为00和10都没有有效负载所以不进行处理,为1表示只有有效负载,数据从第5个字节(数组下标为4)开始;如果为11则从调整字段后一位(第6个字节,数组下标5)加上调整字段长度为包有效数据开始位置。