39 #include <netinet/in.h>
63 if (!vpid || !apid || !ac3pid || !buf || !len)
return 0;
70 if (buf[c] == buf[c+
TS_SIZE])
break;
74 while(found<2 && c < len){
83 if (!*vpid && (buf[c+off+3] & 0xF0) == 0xE0){
85 if (vpos) *vpos = c+off+3;
88 if (!*ac3pid && buf[c+off+3] == 0xBD){
110 if (ac3pos) *ac3pos = c+off+3;
114 if (!*apid && ((buf[c+off+3] & 0xF0) == 0xC0 ||
115 (buf[c+off+3] & 0xF0) == 0xD0)){
117 if (apos) *apos = c+off+3;
130 return find_pids_pos(vpid, apid, ac3pid, buf, len,
nullptr,
nullptr,
nullptr);
135 static const std::array <const uint32_t,256>
crc_table {
136 0x00000000, 0x04c11db7, 0x09823b6e, 0x0d4326d9, 0x130476dc, 0x17c56b6b,
137 0x1a864db2, 0x1e475005, 0x2608edb8, 0x22c9f00f, 0x2f8ad6d6, 0x2b4bcb61,
138 0x350c9b64, 0x31cd86d3, 0x3c8ea00a, 0x384fbdbd, 0x4c11db70, 0x48d0c6c7,
139 0x4593e01e, 0x4152fda9, 0x5f15adac, 0x5bd4b01b, 0x569796c2, 0x52568b75,
140 0x6a1936c8, 0x6ed82b7f, 0x639b0da6, 0x675a1011, 0x791d4014, 0x7ddc5da3,
141 0x709f7b7a, 0x745e66cd, 0x9823b6e0, 0x9ce2ab57, 0x91a18d8e, 0x95609039,
142 0x8b27c03c, 0x8fe6dd8b, 0x82a5fb52, 0x8664e6e5, 0xbe2b5b58, 0xbaea46ef,
143 0xb7a96036, 0xb3687d81, 0xad2f2d84, 0xa9ee3033, 0xa4ad16ea, 0xa06c0b5d,
144 0xd4326d90, 0xd0f37027, 0xddb056fe, 0xd9714b49, 0xc7361b4c, 0xc3f706fb,
145 0xceb42022, 0xca753d95, 0xf23a8028, 0xf6fb9d9f, 0xfbb8bb46, 0xff79a6f1,
146 0xe13ef6f4, 0xe5ffeb43, 0xe8bccd9a, 0xec7dd02d, 0x34867077, 0x30476dc0,
147 0x3d044b19, 0x39c556ae, 0x278206ab, 0x23431b1c, 0x2e003dc5, 0x2ac12072,
148 0x128e9dcf, 0x164f8078, 0x1b0ca6a1, 0x1fcdbb16, 0x018aeb13, 0x054bf6a4,
149 0x0808d07d, 0x0cc9cdca, 0x7897ab07, 0x7c56b6b0, 0x71159069, 0x75d48dde,
150 0x6b93dddb, 0x6f52c06c, 0x6211e6b5, 0x66d0fb02, 0x5e9f46bf, 0x5a5e5b08,
151 0x571d7dd1, 0x53dc6066, 0x4d9b3063, 0x495a2dd4, 0x44190b0d, 0x40d816ba,
152 0xaca5c697, 0xa864db20, 0xa527fdf9, 0xa1e6e04e, 0xbfa1b04b, 0xbb60adfc,
153 0xb6238b25, 0xb2e29692, 0x8aad2b2f, 0x8e6c3698, 0x832f1041, 0x87ee0df6,
154 0x99a95df3, 0x9d684044, 0x902b669d, 0x94ea7b2a, 0xe0b41de7, 0xe4750050,
155 0xe9362689, 0xedf73b3e, 0xf3b06b3b, 0xf771768c, 0xfa325055, 0xfef34de2,
156 0xc6bcf05f, 0xc27dede8, 0xcf3ecb31, 0xcbffd686, 0xd5b88683, 0xd1799b34,
157 0xdc3abded, 0xd8fba05a, 0x690ce0ee, 0x6dcdfd59, 0x608edb80, 0x644fc637,
158 0x7a089632, 0x7ec98b85, 0x738aad5c, 0x774bb0eb, 0x4f040d56, 0x4bc510e1,
159 0x46863638, 0x42472b8f, 0x5c007b8a, 0x58c1663d, 0x558240e4, 0x51435d53,
160 0x251d3b9e, 0x21dc2629, 0x2c9f00f0, 0x285e1d47, 0x36194d42, 0x32d850f5,
161 0x3f9b762c, 0x3b5a6b9b, 0x0315d626, 0x07d4cb91, 0x0a97ed48, 0x0e56f0ff,
162 0x1011a0fa, 0x14d0bd4d, 0x19939b94, 0x1d528623, 0xf12f560e, 0xf5ee4bb9,
163 0xf8ad6d60, 0xfc6c70d7, 0xe22b20d2, 0xe6ea3d65, 0xeba91bbc, 0xef68060b,
164 0xd727bbb6, 0xd3e6a601, 0xdea580d8, 0xda649d6f, 0xc423cd6a, 0xc0e2d0dd,
165 0xcda1f604, 0xc960ebb3, 0xbd3e8d7e, 0xb9ff90c9, 0xb4bcb610, 0xb07daba7,
166 0xae3afba2, 0xaafbe615, 0xa7b8c0cc, 0xa379dd7b, 0x9b3660c6, 0x9ff77d71,
167 0x92b45ba8, 0x9675461f, 0x8832161a, 0x8cf30bad, 0x81b02d74, 0x857130c3,
168 0x5d8a9099, 0x594b8d2e, 0x5408abf7, 0x50c9b640, 0x4e8ee645, 0x4a4ffbf2,
169 0x470cdd2b, 0x43cdc09c, 0x7b827d21, 0x7f436096, 0x7200464f, 0x76c15bf8,
170 0x68860bfd, 0x6c47164a, 0x61043093, 0x65c52d24, 0x119b4be9, 0x155a565e,
171 0x18197087, 0x1cd86d30, 0x029f3d35, 0x065e2082, 0x0b1d065b, 0x0fdc1bec,
172 0x3793a651, 0x3352bbe6, 0x3e119d3f, 0x3ad08088, 0x2497d08d, 0x2056cd3a,
173 0x2d15ebe3, 0x29d4f654, 0xc5a92679, 0xc1683bce, 0xcc2b1d17, 0xc8ea00a0,
174 0xd6ad50a5, 0xd26c4d12, 0xdf2f6bcb, 0xdbee767c, 0xe3a1cbc1, 0xe760d676,
175 0xea23f0af, 0xeee2ed18, 0xf0a5bd1d, 0xf464a0aa, 0xf9278673, 0xfde69bc4,
176 0x89b8fd09, 0x8d79e0be, 0x803ac667, 0x84fbdbd0, 0x9abc8bd5, 0x9e7d9662,
177 0x933eb0bb, 0x97ffad0c, 0xafb010b1, 0xab710d06, 0xa6322bdf, 0xa2f33668,
178 0xbcb4666d, 0xb8757bda, 0xb5365d03, 0xb1f740b4};
180 static unsigned int crc32_04c11db7 (
const unsigned char *
d,
int len,
unsigned int crc)
182 const unsigned char *u =
d;
184 for (
int i=0; i<len; i++)
185 crc = (crc << 8) ^
crc_table[((crc >> 24) ^ *u++)];
191 int64_t SCR, uint8_t *obuf,
int stuff)
196 obuf[c++] = (payload_start ? 0x40 : 0x00) | ((pid >> 8) & 0x1f);
197 obuf[c++] = pid & 0xff;
198 obuf[c++] = ((SCR >= 0 || stuff) ? 0x30 : 0x10) | count;
199 if (SCR >= 0|| stuff) {
203 unsigned char flags = 0;
205 size = std::max(size, 7);
214 auto lscr = (uint32_t) ((SCR/300ULL) & 0xFFFFFFFFULL);
215 uint8_t bit = (lscr & 0x01) << 7;
216 lscr = htonl(lscr >> 1);
217 auto *scr = (uint8_t *) 𝓁
218 auto scr_ext = (
uint16_t) ((SCR%300ULL) & 0x1FFULL);
223 obuf[c++] = bit | 0x7e | (scr_ext >> 8);
224 obuf[c++] = scr_ext & 0xff;
234 int *vlength, uint8_t ptsdts,
ringbuffer *vrbuffer)
237 static int s_count = 0;
240 int length = *vlength;
242 if (! length)
return 0;
261 LOG(VB_GENERAL, LOG_INFO, QString(
"SCR: %1 PTS: %2 DTS: %3")
262 .arg(SCR / 27000000.0, 0,
'f')
263 .arg(vpts / 27000000.0, 0,
'f')
264 .arg(vdts / 27000000.0, 0,
'f'));
273 s_count = (s_count+1) & 0x0f;
275 if (length-pos > *vlength){
276 LOG(VB_GENERAL, LOG_ERR, QString(
"WHAT THE HELL %1 > %2\n")
277 .arg(length-pos).arg(*vlength));
280 int add =
ring_read( vrbuffer, buf+pos, length-pos);
282 if (add < 0)
return -1;
291 static std::array<int,32> s_count {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
292 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
295 int length = *alength;
297 if (!length)
return 0;
313 0, buf+pos, 0, ptsdts);
317 s_count[n] = (s_count[n]+1) & 0x0f;
318 int add =
ring_read( arbuffer, buf+pos, length-pos);
320 if (add < 0)
return -1;
324 LOG(VB_GENERAL, LOG_ERR, QString(
"apos: %1").arg(pos));
332 uint8_t ptsdts,
int nframes,
ringbuffer *ac3rbuffer)
334 static std::array<int,32> s_count {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
335 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
338 int length = *alength;
340 if (!length)
return 0;
357 pts, 0, buf+pos, 0, ptsdts);
359 buf[pos+1] = nframes;
366 s_count[n] = (s_count[n]+1) & 0x0f;
368 int add =
ring_read( ac3rbuffer, buf+pos, length-pos);
370 if (add < 0)
return -1;
374 LOG(VB_GENERAL, LOG_ERR, QString(
"apos: %1").arg(pos));
383 static constexpr uint8_t PMTPID { 0x20 };
384 static int s_count = 0;
388 std::array<uint8_t,17> pat
389 {0x00, 0x00, 0xb0, 0x0d, 0xfe, 0xef, 0xc1, 0x00, 0x00,
390 0x00, 0x00, 0xe0, PMTPID, 0x00, 0x00, 0x00, 0x00};
391 std::array<uint8_t,184> pmt
392 {0x00, 0x02, 0xb0, 0x00, 0x00, 0x00, 0xc1, 0x00, 0x00,
393 0x00, 0x00, 0xf0, 0x00};
398 *(uint32_t *)(pat.data()+13)= htonl(
crc32_04c11db7(pat.data()+1, 12, 0xffffffff));
399 memcpy(buf+pos, pat.data(), 17);
401 memset(buf+pos, 0xff,
TS_SIZE - pos);
405 for(
int i = 0; i <= extcnt; i++) {
407 uint32_t pid = 0x1FFF;
415 }
else if(ext[i-1].
type ==
AC3) {
422 pmt[pmtpos++] =
type;
423 pmt[pmtpos++] = 0xe0 | (0xff & (pid >> 8));
424 pmt[pmtpos++] = 0xff & pid;
425 pmt[pmtpos++] = 0xf0;
426 if(strlen(ext[i-1].language) == 3) {
427 pmt[pmtpos++] = 0x06;
428 pmt[pmtpos++] = 0x0a;
429 pmt[pmtpos++] = 0x04;
430 pmt[pmtpos++] = ext[i-1].
language[0];
431 pmt[pmtpos++] = ext[i-1].
language[1];
432 pmt[pmtpos++] = ext[i-1].
language[2];
433 pmt[pmtpos++] = 0x00;
435 pmt[pmtpos++] = 0x00;
438 pmt[3] = pmtpos + 4 - 3 - 1;
440 pmt[9] = 0xf0 | (0xff & (
TS_VIDPID >> 8));
442 *(uint32_t *)&pmt[pmtpos] = htonl(
crc32_04c11db7(&pmt[1], pmtpos -1,
445 memcpy(buf+pos, pmt.data(), pmtpos);
447 memset(buf+pos, 0xff, (2*
TS_SIZE) - pos);
449 s_count = (s_count+1) & 0x0f;