vdr 2.6.1
remux.h
Go to the documentation of this file.
1/*
2 * remux.h: Tools for detecting frames and handling PAT/PMT
3 *
4 * See the main source file 'vdr.c' for copyright information and
5 * how to reach the author.
6 *
7 * $Id: remux.h 5.2 2021/12/25 14:11:39 kls Exp $
8 */
9
10#ifndef __REMUX_H
11#define __REMUX_H
12
13#include "channels.h"
14#include "tools.h"
15
20 phMPEG2 = 2
21 };
22
23ePesHeader AnalyzePesHeader(const uchar *Data, int Count, int &PesPayloadOffset, bool *ContinuationHeader = NULL);
24
25class cRemux {
26public:
27 static void SetBrokenLink(uchar *Data, int Length);
28 };
29
30// Some TS handling tools.
31// The following functions all take a pointer to one complete TS packet.
32
33#define TS_SYNC_BYTE 0x47
34#define TS_SIZE 188
35#define TS_ERROR 0x80
36#define TS_PAYLOAD_START 0x40
37#define TS_TRANSPORT_PRIORITY 0x20
38#define TS_PID_MASK_HI 0x1F
39#define TS_SCRAMBLING_CONTROL 0xC0
40#define TS_ADAPT_FIELD_EXISTS 0x20
41#define TS_PAYLOAD_EXISTS 0x10
42#define TS_CONT_CNT_MASK 0x0F
43#define TS_ADAPT_DISCONT 0x80
44#define TS_ADAPT_RANDOM_ACC 0x40 // would be perfect for detecting independent frames, but unfortunately not used by all broadcasters
45#define TS_ADAPT_ELEM_PRIO 0x20
46#define TS_ADAPT_PCR 0x10
47#define TS_ADAPT_OPCR 0x08
48#define TS_ADAPT_SPLICING 0x04
49#define TS_ADAPT_TP_PRIVATE 0x02
50#define TS_ADAPT_EXTENSION 0x01
51
52#define PATPID 0x0000 // PAT PID (constant 0)
53#define CATPID 0x0001 // CAT PID (constant 1)
54#define EITPID 0x0012 // EIT PID (constant 18)
55#define MAXPID 0x2000 // for arrays that use a PID as the index
56
57#define PTSTICKS 90000 // number of PTS ticks per second
58#define PCRFACTOR 300 // conversion from 27MHz PCR extension to 90kHz PCR base
59#define MAX33BIT 0x00000001FFFFFFFFLL // max. possible value with 33 bit
60#define MAX27MHZ ((MAX33BIT + 1) * PCRFACTOR - 1) // max. possible PCR value
61
62inline bool TsHasPayload(const uchar *p)
63{
64 return p[3] & TS_PAYLOAD_EXISTS;
65}
66
67inline bool TsHasAdaptationField(const uchar *p)
68{
69 return p[3] & TS_ADAPT_FIELD_EXISTS;
70}
71
72inline bool TsPayloadStart(const uchar *p)
73{
74 return p[1] & TS_PAYLOAD_START;
75}
76
77inline bool TsError(const uchar *p)
78{
79 return p[1] & TS_ERROR;
80}
81
82inline int TsPid(const uchar *p)
83{
84 return (p[1] & TS_PID_MASK_HI) * 256 + p[2];
85}
86
87inline void TsSetPid(uchar *p, int Pid)
88{
89 p[1] = (p[1] & ~TS_PID_MASK_HI) | ((Pid >> 8) & TS_PID_MASK_HI);
90 p[2] = Pid & 0x00FF;
91}
92
93inline bool TsIsScrambled(const uchar *p)
94{
95 return p[3] & TS_SCRAMBLING_CONTROL;
96}
97
99{
100 return p[3] & TS_CONT_CNT_MASK;
101}
102
103inline void TsSetContinuityCounter(uchar *p, uchar Counter)
104{
105 p[3] = (p[3] & ~TS_CONT_CNT_MASK) | (Counter & TS_CONT_CNT_MASK);
106}
107
108inline int TsPayloadOffset(const uchar *p)
109{
110 int o = TsHasAdaptationField(p) ? p[4] + 5 : 4;
111 return o <= TS_SIZE ? o : TS_SIZE;
112}
113
114inline int TsGetPayload(const uchar **p)
115{
116 if (TsHasPayload(*p)) {
117 int o = TsPayloadOffset(*p);
118 *p += o;
119 return TS_SIZE - o;
120 }
121 return 0;
122}
123
124inline int64_t TsGetPcr(const uchar *p)
125{
126 if (TsHasAdaptationField(p)) {
127 if (p[4] >= 7 && (p[5] & TS_ADAPT_PCR)) {
128 return ((((int64_t)p[ 6]) << 25) |
129 (((int64_t)p[ 7]) << 17) |
130 (((int64_t)p[ 8]) << 9) |
131 (((int64_t)p[ 9]) << 1) |
132 (((int64_t)p[10]) >> 7)) * PCRFACTOR +
133 (((((int)p[10]) & 0x01) << 8) |
134 ( ((int)p[11])));
135 }
136 }
137 return -1;
138}
139
140void TsHidePayload(uchar *p);
141void TsSetPcr(uchar *p, int64_t Pcr);
142
143// Helper macro and function to quickly check whether Data points to the beginning
144// of a TS packet. The return value is the number of bytes that need to be skipped
145// to synchronize on the next TS packet (zero if already sync'd). TsSync() can be
146// called directly, the macro just performs the initial check inline and adds some
147// debug information for logging.
148
149#define TS_SYNC(Data, Length) (*Data == TS_SYNC_BYTE ? 0 : TsSync(Data, Length, __FILE__, __FUNCTION__, __LINE__))
150int TsSync(const uchar *Data, int Length, const char *File = NULL, const char *Function = NULL, int Line = 0);
151
152// The following functions all take a pointer to a sequence of complete TS packets.
153
154int64_t TsGetPts(const uchar *p, int l);
155int64_t TsGetDts(const uchar *p, int l);
156void TsSetPts(uchar *p, int l, int64_t Pts);
157void TsSetDts(uchar *p, int l, int64_t Dts);
158
159// Some PES handling tools:
160// The following functions that take a pointer to PES data all assume that
161// there is enough data so that PesLongEnough() returns true.
162
163inline bool PesLongEnough(int Length)
164{
165 return Length >= 6;
166}
167
168inline bool PesHasLength(const uchar *p)
169{
170 return p[4] | p[5];
171}
172
173inline int PesLength(const uchar *p)
174{
175 return 6 + p[4] * 256 + p[5];
176}
177
178inline int PesPayloadOffset(const uchar *p)
179{
180 return 9 + p[8];
181}
182
183inline bool PesHasPts(const uchar *p)
184{
185 return (p[7] & 0x80) && p[8] >= 5;
186}
187
188inline bool PesHasDts(const uchar *p)
189{
190 return (p[7] & 0x40) && p[8] >= 10;
191}
192
193inline int64_t PesGetPts(const uchar *p)
194{
195 return ((((int64_t)p[ 9]) & 0x0E) << 29) |
196 (( (int64_t)p[10]) << 22) |
197 ((((int64_t)p[11]) & 0xFE) << 14) |
198 (( (int64_t)p[12]) << 7) |
199 ((((int64_t)p[13]) & 0xFE) >> 1);
200}
201
202inline int64_t PesGetDts(const uchar *p)
203{
204 return ((((int64_t)p[14]) & 0x0E) << 29) |
205 (( (int64_t)p[15]) << 22) |
206 ((((int64_t)p[16]) & 0xFE) << 14) |
207 (( (int64_t)p[17]) << 7) |
208 ((((int64_t)p[18]) & 0xFE) >> 1);
209}
210
211void PesSetPts(uchar *p, int64_t Pts);
212void PesSetDts(uchar *p, int64_t Dts);
213
214// PTS handling:
215
216inline int64_t PtsAdd(int64_t Pts1, int64_t Pts2) { return (Pts1 + Pts2) & MAX33BIT; }
218int64_t PtsDiff(int64_t Pts1, int64_t Pts2);
223
224// A transparent TS payload handler:
225
226class cTsPayload {
227private:
228 uchar *data;
229 int length;
230 int pid;
231 int index; // points to the next byte to process
232 int numPacketsPid; // the number of TS packets with the given PID (for statistical purposes)
233 int numPacketsOther; // the number of TS packets with other PIDs (for statistical purposes)
235protected:
236 void Reset(void);
237public:
239 cTsPayload(uchar *Data, int Length, int Pid = -1);
241 void Setup(uchar *Data, int Length, int Pid = -1);
249 bool AtTsStart(void) { return index < length && (index % TS_SIZE) == 0; }
252 bool AtPayloadStart(void) { return AtTsStart() && TsPayloadStart(data + index) && TsPid(data + index) == pid; }
255 int Available(void) { return length - index; }
258 int Used(void) { return (index + TS_SIZE - 1) / TS_SIZE * TS_SIZE; }
262 bool Eof(void) const { return index >= length; }
264 void Statistics(void) const;
270 bool SkipBytes(int Bytes);
273 bool SkipPesHeader(void);
275 int GetLastIndex(void);
278 void SetByte(uchar Byte, int Index);
283 bool Find(uint32_t Code);
291 };
292
293// PAT/PMT Generator:
294
295#define MAX_SECTION_SIZE 4096 // maximum size of an SI section
296#define MAX_PMT_TS (MAX_SECTION_SIZE / TS_SIZE + 1)
297
298class cPatPmtGenerator {
299private:
300 uchar pat[TS_SIZE]; // the PAT always fits into a single TS packet
301 uchar pmt[MAX_PMT_TS][TS_SIZE]; // the PMT may well extend over several TS packets
302 int numPmtPackets;
303 int patCounter;
304 int pmtCounter;
305 int patVersion;
306 int pmtVersion;
307 int pmtPid;
309 void IncCounter(int &Counter, uchar *TsPacket);
310 void IncVersion(int &Version);
311 void IncEsInfoLength(int Length);
312protected:
313 int MakeStream(uchar *Target, uchar Type, int Pid);
314 int MakeAC3Descriptor(uchar *Target, uchar Type);
315 int MakeSubtitlingDescriptor(uchar *Target, const char *Language, uchar SubtitlingType, uint16_t CompositionPageId, uint16_t AncillaryPageId);
316 int MakeLanguageDescriptor(uchar *Target, const char *Language);
317 int MakeCRC(uchar *Target, const uchar *Data, int Length);
318 void GeneratePmtPid(const cChannel *Channel);
321 void GeneratePat(void);
323 void GeneratePmt(const cChannel *Channel);
326public:
327 cPatPmtGenerator(const cChannel *Channel = NULL);
328 void SetVersions(int PatVersion, int PmtVersion);
337 void SetChannel(const cChannel *Channel);
339 uchar *GetPat(void);
342 uchar *GetPmt(int &Index);
347 };
348
349// PAT/PMT Parser:
350
351#define MAX_PMT_PIDS 32
352
353class cPatPmtParser {
354private:
356 int pmtSize;
357 int patVersion;
358 int pmtVersion;
359 int pmtPids[MAX_PMT_PIDS + 1]; // list is zero-terminated
360 int vpid;
361 int ppid;
362 int vtype;
363 int apids[MAXAPIDS + 1]; // list is zero-terminated
364 int atypes[MAXAPIDS + 1]; // list is zero-terminated
366 int dpids[MAXDPIDS + 1]; // list is zero-terminated
367 int dtypes[MAXDPIDS + 1]; // list is zero-terminated
369 int spids[MAXSPIDS + 1]; // list is zero-terminated
373 uint16_t ancillaryPageIds[MAXSPIDS];
375 bool completed;
376protected:
377 int SectionLength(const uchar *Data, int Length) { return (Length >= 3) ? ((int(Data[1]) & 0x0F) << 8)| Data[2] : 0; }
378public:
379 cPatPmtParser(bool UpdatePrimaryDevice = false);
380 void Reset(void);
383 void ParsePat(const uchar *Data, int Length);
386 void ParsePmt(const uchar *Data, int Length);
393 bool ParsePatPmt(const uchar *Data, int Length);
397 bool GetVersions(int &PatVersion, int &PmtVersion) const;
400 bool IsPmtPid(int Pid) const { for (int i = 0; pmtPids[i]; i++) if (pmtPids[i] == Pid) return true; return false; }
403 int Vpid(void) const { return vpid; }
406 int Ppid(void) const { return ppid; }
409 int Vtype(void) const { return vtype; }
412 bool Completed(void) { return completed; }
414 const int *Apids(void) const { return apids; }
415 const int *Dpids(void) const { return dpids; }
416 const int *Spids(void) const { return spids; }
417 int Apid(int i) const { return (0 <= i && i < MAXAPIDS) ? apids[i] : 0; }
418 int Dpid(int i) const { return (0 <= i && i < MAXDPIDS) ? dpids[i] : 0; }
419 int Spid(int i) const { return (0 <= i && i < MAXSPIDS) ? spids[i] : 0; }
420 int Atype(int i) const { return (0 <= i && i < MAXAPIDS) ? atypes[i] : 0; }
421 int Dtype(int i) const { return (0 <= i && i < MAXDPIDS) ? dtypes[i] : 0; }
422 const char *Alang(int i) const { return (0 <= i && i < MAXAPIDS) ? alangs[i] : ""; }
423 const char *Dlang(int i) const { return (0 <= i && i < MAXDPIDS) ? dlangs[i] : ""; }
424 const char *Slang(int i) const { return (0 <= i && i < MAXSPIDS) ? slangs[i] : ""; }
425 uchar SubtitlingType(int i) const { return (0 <= i && i < MAXSPIDS) ? subtitlingTypes[i] : uchar(0); }
426 uint16_t CompositionPageId(int i) const { return (0 <= i && i < MAXSPIDS) ? compositionPageIds[i] : uint16_t(0); }
427 uint16_t AncillaryPageId(int i) const { return (0 <= i && i < MAXSPIDS) ? ancillaryPageIds[i] : uint16_t(0); }
428 };
429
430// EIT Generator:
431
432class cEitGenerator {
433private:
435 int counter;
436 int version;
437 uint16_t YMDtoMJD(int Y, int M, int D);
439public:
440 cEitGenerator(int Sid = 0);
441 uchar *Generate(int Sid);
442 uchar *Data(void) { return eit; }
443 int Length(void) { return sizeof(eit); }
444 };
445
446// TS to PES converter:
447// Puts together the payload of several TS packets that form one PES
448// packet.
449
450class cTsToPes {
451private:
452 uchar *data;
453 int size;
454 int length;
455 int offset;
457 int lastLength;
458 bool repeatLast;
459public:
460 cTsToPes(void);
462 void PutTs(const uchar *Data, int Length);
472 const uchar *GetPes(int &Length);
486 void SetRepeatLast(void);
489 void Reset(void);
493 };
494
495// Some helper functions for debugging:
496
497void BlockDump(const char *Name, const u_char *Data, int Length);
498void TsDump(const char *Name, const u_char *Data, int Length);
499void PesDump(const char *Name, const u_char *Data, int Length);
500
501// Frame detector:
502
503#define MIN_TS_PACKETS_FOR_FRAME_DETECTOR 100
504
505class cFrameParser;
506
507class cFrameDetector {
508private:
509 enum { MaxPtsValues = 150 };
510 int pid;
511 int type;
512 bool synced;
513 bool newFrame;
514 bool independentFrame;
515 uint32_t ptsValues[MaxPtsValues]; // 32 bit is enough - we only need the delta
516 int numPtsValues;
517 int numIFrames;
518 bool isVideo;
519 double framesPerSecond;
521 int framesPerPayloadUnit; // Some broadcasters send one frame per payload unit (== 1),
522 // while others put an entire GOP into one payload unit (> 1).
523 bool scanning;
525public:
526 cFrameDetector(int Pid = 0, int Type = 0);
530 void SetPid(int Pid, int Type);
532 int Analyze(const uchar *Data, int Length);
538 bool Synced(void) { return synced; }
540 bool NewFrame(void) { return newFrame; }
543 bool IndependentFrame(void) { return independentFrame; }
547 double FramesPerSecond(void) { return framesPerSecond; }
550 };
551
552#endif // __REMUX_H
#define MAXLANGCODE2
Definition: channels.h:37
#define MAXDPIDS
Definition: channels.h:32
#define MAXAPIDS
Definition: channels.h:31
#define MAXSPIDS
Definition: channels.h:33
uchar eit[TS_SIZE]
cEitGenerator(int Sid=0)
uchar * Data(void)
Definition: remux.h:442
int Length(void)
Definition: remux.h:443
uchar * AddParentalRatingDescriptor(uchar *p, uchar ParentalRating=0)
uint16_t YMDtoMJD(int Y, int M, int D)
uchar * Generate(int Sid)
cFrameParser * parser
bool Synced(void)
Returns true if the frame detector has synced on the data stream.
Definition: remux.h:538
bool IndependentFrame(void)
Returns true if a new frame was detected and this is an independent frame (i.e.
Definition: remux.h:543
double FramesPerSecond(void)
Returns the number of frames per second, or 0 if this information is not available.
Definition: remux.h:547
cFrameDetector(int Pid=0, int Type=0)
Sets up a frame detector for the given Pid and stream Type.
uint32_t ptsValues[MaxPtsValues]
int Analyze(const uchar *Data, int Length)
Analyzes the TS packets pointed to by Data.
void SetPid(int Pid, int Type)
Sets the Pid and stream Type to detect frames for.
bool NewFrame(void)
Returns true if the data given to the last call to Analyze() started a new frame.
Definition: remux.h:540
int MakeCRC(uchar *Target, const uchar *Data, int Length)
uchar * GetPmt(int &Index)
Returns a pointer to the Index'th TS packet of the PMT section.
void SetChannel(const cChannel *Channel)
Sets the Channel for which the PAT/PMT shall be generated.
void IncEsInfoLength(int Length)
void IncCounter(int &Counter, uchar *TsPacket)
cPatPmtGenerator(const cChannel *Channel=NULL)
void SetVersions(int PatVersion, int PmtVersion)
Sets the version numbers for the generated PAT and PMT, in case this generator is used to,...
int MakeAC3Descriptor(uchar *Target, uchar Type)
void GeneratePat(void)
Generates a PAT section for later use with GetPat().
uchar pat[TS_SIZE]
uchar * GetPat(void)
Returns a pointer to the PAT section, which consists of exactly one TS packet.
uchar pmt[MAX_PMT_TS][TS_SIZE]
int MakeLanguageDescriptor(uchar *Target, const char *Language)
void GeneratePmt(const cChannel *Channel)
Generates a PMT section for the given Channel, for later use with GetPmt().
void GeneratePmtPid(const cChannel *Channel)
Generates a PMT pid that doesn't collide with any of the actual pids of the Channel.
int MakeStream(uchar *Target, uchar Type, int Pid)
int MakeSubtitlingDescriptor(uchar *Target, const char *Language, uchar SubtitlingType, uint16_t CompositionPageId, uint16_t AncillaryPageId)
void IncVersion(int &Version)
bool GetVersions(int &PatVersion, int &PmtVersion) const
Returns true if a valid PAT/PMT has been parsed and stores the current version numbers in the given v...
int Vtype(void) const
Returns the video stream type as defined by the current PMT, or 0 if no video stream type has been de...
Definition: remux.h:409
char alangs[MAXAPIDS][MAXLANGCODE2]
char slangs[MAXSPIDS][MAXLANGCODE2]
cPatPmtParser(bool UpdatePrimaryDevice=false)
void Reset(void)
Resets the parser.
int dpids[MAXDPIDS+1]
int Dtype(int i) const
Definition: remux.h:421
void ParsePat(const uchar *Data, int Length)
Parses the PAT data from the single TS packet in Data.
bool ParsePatPmt(const uchar *Data, int Length)
Parses the given Data (which may consist of several TS packets, typically an entire frame) and extrac...
uint16_t ancillaryPageIds[MAXSPIDS]
const int * Spids(void) const
Definition: remux.h:416
int Dpid(int i) const
Definition: remux.h:418
const int * Dpids(void) const
Definition: remux.h:415
char dlangs[MAXDPIDS][MAXLANGCODE2]
int SectionLength(const uchar *Data, int Length)
Definition: remux.h:377
uint16_t CompositionPageId(int i) const
Definition: remux.h:426
int dtypes[MAXDPIDS+1]
const int * Apids(void) const
Definition: remux.h:414
int Apid(int i) const
Definition: remux.h:417
void ParsePmt(const uchar *Data, int Length)
Parses the PMT data from the single TS packet in Data.
uchar pmt[MAX_SECTION_SIZE]
bool Completed(void)
Returns true if the PMT has been completely parsed.
Definition: remux.h:412
int apids[MAXAPIDS+1]
bool IsPmtPid(int Pid) const
Returns true if Pid the one of the PMT pids as defined by the current PAT.
Definition: remux.h:400
uchar SubtitlingType(int i) const
Definition: remux.h:425
uint16_t AncillaryPageId(int i) const
Definition: remux.h:427
int Spid(int i) const
Definition: remux.h:419
int atypes[MAXAPIDS+1]
uint16_t compositionPageIds[MAXSPIDS]
uchar subtitlingTypes[MAXSPIDS]
int Atype(int i) const
Definition: remux.h:420
const char * Dlang(int i) const
Definition: remux.h:423
const char * Slang(int i) const
Definition: remux.h:424
const char * Alang(int i) const
Definition: remux.h:422
int Ppid(void) const
Returns the PCR pid as defined by the current PMT, or 0 if no PCR pid has been detected,...
Definition: remux.h:406
int Vpid(void) const
Returns the video pid as defined by the current PMT, or 0 if no video pid has been detected,...
Definition: remux.h:403
int spids[MAXSPIDS+1]
int pmtPids[MAX_PMT_PIDS+1]
static void SetBrokenLink(uchar *Data, int Length)
cTsPayload(void)
bool AtPayloadStart(void)
Returns true if this payload handler is currently pointing to the first byte of a TS packet that star...
Definition: remux.h:252
int Used(void)
Returns the number of raw bytes that have already been used (e.g.
Definition: remux.h:258
bool Eof(void) const
Returns true if all available bytes of the TS payload have been processed.
Definition: remux.h:262
void SetByte(uchar Byte, int Index)
Sets the TS data byte at the given Index to the value Byte.
uchar GetByte(void)
Gets the next byte of the TS payload, skipping any intermediate TS header data.
bool AtTsStart(void)
Returns true if this payload handler is currently pointing to first byte of a TS packet.
Definition: remux.h:249
int Available(void)
Returns the number of raw bytes (including any TS headers) still available in the TS payload handler.
Definition: remux.h:255
int GetLastIndex(void)
Returns the index into the TS data of the payload byte that has most recently been read.
cTsPayload(uchar *Data, int Length, int Pid=-1)
Creates a new TS payload handler and calls Setup() with the given Data.
void Setup(uchar *Data, int Length, int Pid=-1)
Sets up this TS payload handler with the given Data, which points to a sequence of Length bytes of co...
bool SkipPesHeader(void)
Skips all bytes belonging to the PES header of the payload.
void Statistics(void) const
May be called after a new frame has been detected, and will log a warning if the number of TS packets...
uchar SetEof(void)
bool Find(uint32_t Code)
Searches for the four byte sequence given in Code and returns true if it was found within the payload...
void Reset(void)
bool SkipBytes(int Bytes)
Skips the given number of bytes in the payload and returns true if there is still data left to read.
void PutTs(const uchar *Data, int Length)
Puts the payload data of the single TS packet at Data into the converter.
void SetRepeatLast(void)
Makes the next call to GetPes() return exactly the same data as the last one (provided there was no c...
const uchar * GetPes(int &Length)
Gets a pointer to the complete PES packet, or NULL if the packet is not complete yet.
uchar * lastData
cTsToPes(void)
void Reset(void)
Resets the converter.
ePesHeader
unsigned char uchar
unsigned char u_char
void TsSetPcr(uchar *p, int64_t Pcr)
Definition: remux.c:131
#define TS_ERROR
Definition: remux.h:35
bool TsError(const uchar *p)
Definition: remux.h:77
#define TS_ADAPT_PCR
Definition: remux.h:46
int TsPid(const uchar *p)
Definition: remux.h:82
void PesDump(const char *Name, const u_char *Data, int Length)
Definition: remux.c:1164
#define TS_SCRAMBLING_CONTROL
Definition: remux.h:39
bool TsHasPayload(const uchar *p)
Definition: remux.h:62
int64_t PtsDiff(int64_t Pts1, int64_t Pts2)
Returns the difference between two PTS values.
Definition: remux.c:234
#define MAX33BIT
Definition: remux.h:59
#define MAX_PMT_PIDS
Definition: remux.h:351
int PesPayloadOffset(const uchar *p)
Definition: remux.h:178
bool TsIsScrambled(const uchar *p)
Definition: remux.h:93
void TsHidePayload(uchar *p)
Definition: remux.c:121
void TsSetContinuityCounter(uchar *p, uchar Counter)
Definition: remux.h:103
uchar TsContinuityCounter(const uchar *p)
Definition: remux.h:98
#define MAX_PMT_TS
Definition: remux.h:296
int TsGetPayload(const uchar **p)
Definition: remux.h:114
#define TS_PAYLOAD_EXISTS
Definition: remux.h:41
bool PesHasPts(const uchar *p)
Definition: remux.h:183
bool PesLongEnough(int Length)
Definition: remux.h:163
#define TS_SIZE
Definition: remux.h:34
void TsSetPid(uchar *p, int Pid)
Definition: remux.h:87
#define MAX_SECTION_SIZE
Definition: remux.h:295
int TsSync(const uchar *Data, int Length, const char *File=NULL, const char *Function=NULL, int Line=0)
Definition: remux.c:147
int64_t PesGetDts(const uchar *p)
Definition: remux.h:202
#define TS_ADAPT_FIELD_EXISTS
Definition: remux.h:40
int64_t PesGetPts(const uchar *p)
Definition: remux.h:193
bool TsPayloadStart(const uchar *p)
Definition: remux.h:72
int TsPayloadOffset(const uchar *p)
Definition: remux.h:108
void PesSetDts(uchar *p, int64_t Dts)
Definition: remux.c:225
int64_t TsGetPcr(const uchar *p)
Definition: remux.h:124
bool PesHasDts(const uchar *p)
Definition: remux.h:188
#define PCRFACTOR
Definition: remux.h:58
bool PesHasLength(const uchar *p)
Definition: remux.h:168
bool TsHasAdaptationField(const uchar *p)
Definition: remux.h:67
int64_t TsGetDts(const uchar *p, int l)
Definition: remux.c:173
void TsSetDts(uchar *p, int l, int64_t Dts)
Definition: remux.c:200
void TsSetPts(uchar *p, int l, int64_t Pts)
Definition: remux.c:186
ePesHeader AnalyzePesHeader(const uchar *Data, int Count, int &PesPayloadOffset, bool *ContinuationHeader=NULL)
Definition: remux.c:32
int PesLength(const uchar *p)
Definition: remux.h:173
void PesSetPts(uchar *p, int64_t Pts)
Definition: remux.c:216
int64_t TsGetPts(const uchar *p, int l)
Definition: remux.c:160
void BlockDump(const char *Name, const u_char *Data, int Length)
Definition: remux.c:1138
@ phMPEG2
Definition: remux.h:20
@ phNeedMoreData
Definition: remux.h:17
@ phInvalid
Definition: remux.h:18
@ phMPEG1
Definition: remux.h:19
#define TS_CONT_CNT_MASK
Definition: remux.h:42
#define TS_PAYLOAD_START
Definition: remux.h:36
void TsDump(const char *Name, const u_char *Data, int Length)
Definition: remux.c:1149
int64_t PtsAdd(int64_t Pts1, int64_t Pts2)
Adds the given PTS values, taking into account the 33bit wrap around.
Definition: remux.h:216
#define TS_PID_MASK_HI
Definition: remux.h:38