23 #define dbgpatpmt(a...) if (DebugPatPmt) fprintf(stderr, a)
24 #define dbgframes(a...) if (DebugFrames) fprintf(stderr, a)
26 #define EMPTY_SCANNER (0xFFFFFFFF)
33 if ((Data[6] & 0xC0) == 0x80) {
37 PesPayloadOffset = 6 + 3 + Data[8];
38 if (Count < PesPayloadOffset)
41 if (ContinuationHeader)
42 *ContinuationHeader = ((Data[6] == 0x80) && !Data[7] && !Data[8]);
51 for (
int i = 0; i < 16; i++) {
52 if (Data[PesPayloadOffset] != 0xFF)
55 if (Count <= ++PesPayloadOffset)
60 if ((Data[PesPayloadOffset] & 0xC0) == 0x40) {
61 PesPayloadOffset += 2;
63 if (Count <= PesPayloadOffset)
67 if (ContinuationHeader)
68 *ContinuationHeader =
false;
70 if ((Data[PesPayloadOffset] & 0xF0) == 0x20) {
72 PesPayloadOffset += 5;
74 else if ((Data[PesPayloadOffset] & 0xF0) == 0x30) {
76 PesPayloadOffset += 10;
78 else if (Data[PesPayloadOffset] == 0x0F) {
82 if (ContinuationHeader)
83 *ContinuationHeader =
true;
88 if (Count < PesPayloadOffset)
94 #define VIDEO_STREAM_S 0xE0
102 for (
int i = PesPayloadOffset; i < Length - 7; i++) {
103 if (Data[i] == 0 && Data[i + 1] == 0 && Data[i + 2] == 1 && Data[i + 3] == 0xB8) {
104 if (!(Data[i + 7] & 0x40))
109 dsyslog(
"SetBrokenLink: no GOP header found in video packet");
112 dsyslog(
"SetBrokenLink: no video packet in frame");
124 memset(p + 6, 0xFF,
TS_SIZE - 6);
137 p[10] = (b << 7) | (p[10] & 0x7E) | ((e >> 8) & 0x01);
201 p[ 9] = ((Pts >> 29) & 0x0E) | (p[9] & 0xF1);
203 p[11] = ((Pts >> 14) & 0xFE) | 0x01;
205 p[13] = ((Pts << 1) & 0xFE) | 0x01;
210 p[14] = ((Dts >> 29) & 0x0E) | (p[14] & 0xF1);
212 p[16] = ((Dts >> 14) & 0xFE) | 0x01;
214 p[18] = ((Dts << 1) & 0xFE) | 0x01;
219 int64_t d = Pts2 - Pts1;
239 Setup(Data, Length, Pid);
298 if (Index >= 0 && Index <
length)
304 int OldIndex =
index;
307 Scanner = (Scanner << 8) |
GetByte();
343 if (Offset == 4 && Offset < NewPayload)
345 if (Offset == 5 && Offset < NewPayload)
346 Packet[Offset++] = 0;
347 while (Offset < NewPayload)
348 Packet[Offset++] = 0xff;
365 TsPacket[3] = (TsPacket[3] & 0xF0) | Counter;
366 if (++Counter > 0x0F)
372 if (++Version > 0x1F)
389 Target[i++] = 0xE0 | (Pid >> 8);
412 Target[i++] = *Language++;
413 Target[i++] = *Language++;
414 Target[i++] = *Language++;
415 Target[i++] = SubtitlingType;
416 Target[i++] = CompositionPageId >> 8;
417 Target[i++] = CompositionPageId & 0xFF;
418 Target[i++] = AncillaryPageId >> 8;
419 Target[i++] = AncillaryPageId & 0xFF;
430 for (
int n = 0; n < pageCount; n++) {
432 Target[i++] = *Language++;
433 Target[i++] = *Language++;
434 Target[i++] = *Language++;
435 Target[i++] = (pages[n].
ttxtType << 3) + pages[n].ttxtMagazine;
452 Target[Length] = 0x00;
453 for (
const char *End = Language + strlen(Language); Language < End; ) {
454 Target[i++] = *Language++;
455 Target[i++] = *Language++;
456 Target[i++] = *Language++;
458 Target[Length] += 0x04;
459 if (*Language ==
'+')
470 Target[i++] = crc >> 24;
471 Target[i++] = crc >> 16;
472 Target[i++] = crc >> 8;
477 #define P_TSID 0x8008 // pseudo TS ID
478 #define P_PMT_PID 0x0084 // pseudo PMT pid
479 #define MAXPID 0x2000 // the maximum possible number of pids
483 bool Used[
MAXPID] = {
false };
484 #define SETPID(p) { if ((p) >= 0 && (p) < MAXPID) Used[p] = true; }
485 #define SETPIDS(l) { const int *p = l; while (*p) { SETPID(*p); p++; } }
498 memset(
pat, 0xFF,
sizeof(
pat));
506 int PayloadStart = i;
509 int SectionLength = i;
518 p[i++] = 0xE0 | (
pmtPid >> 8);
520 pat[SectionLength] = i - SectionLength - 1 + 4;
529 memset(buf, 0xFF,
sizeof(buf));
532 int Vpid = Channel->
Vpid();
533 int Ppid = Channel->
Ppid();
534 int Tpid = Channel->
Tpid();
538 int SectionLength = i;
546 p[i++] = 0xE0 | (Ppid >> 8);
553 for (
int n = 0; Channel->
Apid(n); n++) {
555 const char *Alang = Channel->
Alang(n);
558 for (
int n = 0; Channel->
Dpid(n); n++) {
563 for (
int n = 0; Channel->
Spid(n); n++) {
572 int sl = i - SectionLength - 2 + 4;
573 buf[SectionLength] |= (sl >> 8) & 0x0F;
574 buf[SectionLength + 1] = sl;
651 Data += PayloadOffset;
652 Length -= PayloadOffset;
654 if ((Length -= Data[0] + 1) <= 0)
676 esyslog(
"ERROR: can't parse PAT");
684 Data += PayloadOffset;
685 Length -= PayloadOffset;
689 if ((Length -= Data[0] + 1) <= 0)
693 if (Length <=
int(
sizeof(
pmt))) {
694 memcpy(
pmt, Data, Length);
698 esyslog(
"ERROR: PMT packet length too big (%d byte)!", Length);
710 esyslog(
"ERROR: PMT section length too big (%d byte)!",
pmtSize + Length);
766 char *s =
alangs[NumApids];
816 char *s =
slangs[NumSpids];
872 dpids[NumDpids] = dpid;
922 esyslog(
"ERROR: can't parse PMT");
931 int Pid =
TsPid(Data);
984 esyslog(
"ERROR: out of memory");
993 #define MAXPESLENGTH 0xFFF0
1013 memmove(p,
data, 4);
1060 printf(
"--- %s\n", Name);
1061 for (
int i = 0; i < Length; i++) {
1062 if (i && (i % 16) == 0)
1064 printf(
" %02X", Data[i]);
1071 printf(
"%s: %04X", Name, Length);
1072 int n =
min(Length, 20);
1073 for (
int i = 0; i < n; i++)
1074 printf(
" %02X", Data[i]);
1077 n =
max(n, Length - 10);
1078 for (n =
max(n, Length - 10); n < Length; n++)
1079 printf(
" %02X", Data[n]);
1086 TsDump(Name, Data, Length);
1099 virtual int Parse(
const uchar *Data,
int Length,
int Pid) = 0;
1123 virtual int Parse(
const uchar *Data,
int Length,
int Pid);
1150 virtual int Parse(
const uchar *Data,
int Length,
int Pid);
1162 bool SeenPayloadStart =
false;
1163 cTsPayload tsPayload(const_cast<uchar *>(Data), Length, Pid);
1165 SeenPayloadStart =
true;
1171 uint32_t OldScanner =
scanner;
1173 if (!SeenPayloadStart && tsPayload.
AtTsStart())
1188 static const char FrameTypes[] =
"?IPBD???";
1199 return tsPayload.
Used();
1240 virtual int Parse(
const uchar *Data,
int Length,
int Pid);
1281 return (
byte & (1 <<
bit--)) ? 1 : 0;
1295 for (
int b = 0; !b; z++)
1297 return (1 << z) - 1 +
GetBits(z);
1304 if ((v & 0x01) != 0)
1307 return -int32_t(v / 2);
1325 if ((
scanner & 0xFFFFFF00) == 0x00000100) {
1327 switch (NalUnitType) {
1365 if (profile_idc == 100 || profile_idc == 110 || profile_idc == 122 || profile_idc == 244 || profile_idc == 44 || profile_idc == 83 || profile_idc == 86 || profile_idc ==118 || profile_idc == 128) {
1367 if (chroma_format_idc == 3)
1373 for (
int i = 0; i < ((chroma_format_idc != 3) ? 8 : 12); i++) {
1375 int SizeOfScalingList = (i < 6) ? 16 : 64;
1378 for (
int j = 0; j < SizeOfScalingList; j++) {
1380 NextScale = (LastScale +
GetGolombSe() + 256) % 256;
1382 LastScale = NextScale;
1390 if (pic_order_cnt_type == 0)
1392 else if (pic_order_cnt_type == 1) {
1418 static const char SliceTypes[] =
"PBIpi";
1419 dbgframes(
"%c", SliceTypes[slice_type % 5]);
1452 if (*(uint32_t *)p1 < *(uint32_t *)p2)
return -1;
1453 if (*(uint32_t *)p1 > *(uint32_t *)p2)
return 1;
1466 else if (
type == 0x1B)
1468 else if (
type == 0x04 ||
type == 0x06)
1471 esyslog(
"ERROR: unknown stream type %d (PID %d) in frame detector",
type,
pid);
1484 while (Skipped < Length && (Data[Skipped] !=
TS_SYNC_BYTE || Length - Skipped > TS_SIZE && Data[Skipped + TS_SIZE] !=
TS_SYNC_BYTE))
1486 esyslog(
"ERROR: skipped %d bytes to sync on start of TS packet", Skipped);
1487 return Processed + Skipped;
1492 int Pid =
TsPid(Data);
1552 if (abs(Delta - 3600) <= 1)
1554 else if (Delta % 3003 == 0)
1556 else if (abs(Delta - 1800) <= 1)
1558 else if (Delta == 1501)
1579 Processed += Handled;
1610 int LastKeepByte = -1;
1619 for (
int i=0; i<size; i++) {
1625 bool DropByte =
false;
1652 if (Payload[i] == 0xFF)
1656 else if (Payload[i] == 0x80)
1663 dsyslog(
"cNaluDumper: Unexpected NALU fill data: %02x", Payload[i]);
1665 if (LastKeepByte == -1)
1677 if (LastKeepByte == -1)
1705 dsyslog(
"cNaluDumper: TS continuity offset %i", Offset);
1749 if (DropThisPayload && HasAdaption)
1753 DropThisPayload =
false;
1756 if (DropThisPayload)
1789 esyslog(
"cNaluStreamProcessor::PutBuffer: New data before old data was processed!");
1812 if (tempLength < TS_SIZE && length > 0)
1834 esyslog(
"ERROR: skipped %d bytes to sync on start of TS packet", Skipped);
1838 OutLength = Skipped;
1870 uchar *OutEnd = Out;
1878 esyslog(
"ERROR: skipped %d bytes to sync on start of TS packet", Skipped);
1882 memcpy(OutEnd,
data, Skipped);
1923 OutLength = (OutEnd - Out);
1924 return OutLength > 0 ? Out : NULL;