解析PAT
从TS包中读取PAT
// 从TS包中读取PAT
friend PAT& operator<<(PAT& pat, Packet& packet)
{
const char* payload;
// 获取TS的载荷
packet.getPayload(payload);
// 强制转换
pat = *reinterpret_cast<const PAT*> (payload);
// 如果table的id是0x00,那就是PAT
if (pat.table_id == TABLE_ID_PAT)
{
pat.good = true;
}
return pat;
}
从PAT中得到program
program的定义
// 节目
class Program
{
public:
inline uint16_t getPid()
{
return (pid1 << 8) | pid2;
}
inline uint16_t getProgramNumber()
{
return htons(program_number);
}
private:
uint16_t program_number; // 节目号码
uint8_t pid1 :5; // PID,用于指明该节目在哪个TS包
uint8_t unused :3;
uint8_t pid2;
};
获取program
// 返回PAT中的节目
std::vector<PAT::Program> getPrograms() const
{
std::vector<PAT::Program> programs;
// 在PAT的头部和crc之间存放了program的信息
for (const uint8_t* off = data; off < data + getSectionLength()
- sizeof(CRC32) - (data - §ion_length2); off
+= sizeof(Program))
{
// 强制转换
Program program = *reinterpret_cast<const Program*> (off);
programs.push_back(program);
}
return programs;
}