Какие виды "маячков" бывают?
Может кто в анализе навести на мысль ?
SectionBuffer pmt_buf;
for (const auto& pkt2 : packets) {
if (pkt2.size() != 188) continue;
uint16_t pid2 = ((pkt2[1] & 0x1F) << 8) | pkt2[2];
if (pid2 != pmt_pid) continue;
std::cout << "DEBUG: PMT candidate PID found: " << pid2 << std::endl;
bool unit_start2 = pkt2[1] & 0x40;
int pointer_field2 = pkt2[4];
int payload_offset2 = 4 + (unit_start2 ? 1 + pointer_field2 : 0);
if (payload_offset2 >= 188) continue;
pmt_buf.push(&pkt2[payload_offset2], 188 - payload_offset2, unit_start2);
std::cout << "DEBUG: PMT buffer size: " << pmt_buf.data.size() << std::endl;
if (pmt_buf.complete) {
std::cout << "DEBUG: PMT section COLLECTED!" << std::endl;
int expected_len2
= pmt_buf.expected_len;
if (pmt_buf.data.size() < expected_len2) break;
uint8_t version = (pmt_buf.data[5] >> 1) & 0x1F;
std::cout << "INFO: PMT pnr:" << pnr << " version:" << int(version) << std::endl;
int section_len2 = ((pmt_buf.data[1] & 0x0F) << 8) | pmt_buf.data[2];
int pcr_pid = ((pmt_buf.data[8] & 0x1F) << 8) | pmt_buf.data[9];
std::cout << "INFO: PCR pid:" << pcr_pid << std::endl;
int prog_info_len = ((pmt_buf.data[10] & 0x0F) << 8) | pmt_buf.data[11];
int idx = 12 + prog_info_len;
int section_len = ((pmt_buf.data[1] & 0x0F) << 8) | pmt_buf.data[2];
while (idx < section_len - 1 - 4) {
uint8_t stream_type = pmt_buf.data[idx];
uint16_t elem_pid = ((pmt_buf.data[idx + 1] & 0x1F) << 8)
| pmt_buf.data[idx + 2];
// VIDEO
if (stream_type == 0x1B) {
std::cout << "INFO: VIDEO pid:" << elem_pid << " type:0x" << std::hex << int(stream_type) << std::dec << std::endl;
}
// AUDIO
else if (stream_type == 0x03 || stream_type == 0x04 || stream_type == 0x0F || stream_type == 0x81) {
std::cout << "INFO: AUDIO pid:" << elem_pid << " type:0x" << std::hex << int(stream_type) << std::dec << std::endl;
}
// TTX
else if (stream_type == 0x06) {
std::cout << "INFO: TTX pid:" << elem_pid << " type:0x" << std::hex << int(stream_type) << std::dec << std::endl;
}
// Другие PID
else {
std::cout << "INFO:
PID:" << elem_pid << " type:0x" << std::hex << int(stream_type) << std::dec << std::endl;
}
// Descriptors
int es_desc_len = ((pmt_buf.data[idx + 3] & 0x0F) << 8) | pmt_buf.data[idx + 4];
int d = idx + 5;
while (d + 2 < idx + 5 + es_desc_len && d + 1 < int(pmt_buf.data.size())) {
uint8_t tag = pmt_buf.data[d];
uint8_t len = pmt_buf.data[d + 1];
if (tag == 0x0A && len >= 3) {
std::string lang(reinterpret_cast<const char*>(&pmt_buf.data[d+2]), 3);
std::cout << "INFO: AUDIO lang:" << lang << std::endl;
}
d += 2 + len;
}
idx += 5 + es_desc_len;
}
break;
}
}
}
}