14 #define VIDEO_PID(bp) ((bp)+1)
15 #define AUDIO_PID(bp) ((bp)+4)
16 #define SYNC_BYTE 0x0047
30 using Clock = std::chrono::steady_clock;
31 using TimePoint = std::chrono::time_point<Clock, std::chrono::microseconds>;
44 SetContinuityCounter(
cc);
53 m_tsData[0]=header[0];
54 m_tsData[1]=header[1];
55 m_tsData[2]=header[2];
56 m_tsData[3]=header[3];
74 inline unsigned int PID(
void)
const {
75 return ((m_tsData[1] << 8) + m_tsData[2]) & 0x1fff;
85 return (m_tsData[3] >> 4) & 0x3;
96 {
return (HasAdaptationField() ?
static_cast<size_t>(m_tsData[4]) : 0); }
100 {
return AdaptationFieldSize() > 0 &&
bool(data()[5] & 0x80); }
102 bool HasPCR(
void)
const {
return AdaptationFieldSize() > 0 &&
103 bool(data()[5] & 0x10); }
113 {
return ((
static_cast<int64_t
>(data()[6]) << 25) |
114 (
static_cast<int64_t
>(data()[7]) << 17) |
115 (
static_cast<int64_t
>(data()[8]) << 9) |
116 (
static_cast<int64_t
>(data()[9]) << 1) |
117 (data()[10] >> 7)); }
121 {
return (((
static_cast<int32_t
>(data()[10]) & 0
x1) << 8) |
122 static_cast<int32_t
>(data()[11])); }
126 {
return ((GetPCRbase() * 300) + GetPCRext()); }
130 {
return TimePoint(std::chrono::microseconds(GetPCRraw() / 27)); }
133 if (err) m_tsData[1] |= 0x80;
else m_tsData[1] &= (0xff-(0x80));
136 if (start) m_tsData[1] |= 0x40;
else m_tsData[1] &= (0xff-0x40);
139 if (priority) m_tsData[1] |= 0x20;
else m_tsData[1] &= (0xff-0x20);
142 m_tsData[1] = ((pid >> 8) & 0x1F) | (m_tsData[1] & 0xE0);
143 m_tsData[2] = (pid & 0xFF);
146 m_tsData[3] = (m_tsData[3] & (0xff-(0x3<<6))) | (scr<<6);
149 m_tsData[3] = (m_tsData[3] & 0xcf) | (afc&0
x3)<<4;
152 m_tsData[3] = (m_tsData[3] & 0xf0) | (
cc & 0xf);
155 const unsigned char*
data(
void)
const {
return m_tsData.data(); }
156 unsigned char*
data(
void) {
return m_tsData.data(); }
158 static constexpr
unsigned int kHeaderSize {4};
180 pkt->InitHeader(kPayloadOnlyHeader.data());
181 pkt->m_tsPayload.fill(0xFF);
182 pkt->SetStartOfFieldPointer(0);
188 memcpy(pkt,
this, kSize);
195 std::copy(payload, payload+kPayloadSize, m_tsPayload.data());
201 std::copy(payload, payload+size, m_tsPayload.data());
217 {
return m_tsPayload[AFCOffset()-4]; }
219 { m_tsPayload[AFCOffset()-4] = sof; }
223 static constexpr
unsigned int kSize {188};
224 static constexpr
unsigned int kPayloadSize {188-4};
225 static constexpr
unsigned int kDVBEmissionSize {204};
226 static constexpr
unsigned int kISDBEmissionSize {204};
227 static constexpr
unsigned int k8VSBEmissionSize {208};
230 std::array<uint8_t,184> m_tsPayload {};
240 unsigned char m_tsFec[16];
249 unsigned char m_tsFec[16];
258 unsigned char m_tsFec[20];
262 #endif // TS_PACKET_H