vdr 2.6.1
include/vdr/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
227private:
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)
234 uchar SetEof(void);
235protected:
236 void Reset(void);
237public:
238 cTsPayload(void);
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;
268 uchar GetByte(void);
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
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
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
354private:
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
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
433private:
437 uint16_t YMDtoMJD(int Y, int M, int D);
438 uchar *AddParentalRatingDescriptor(uchar *p, uchar ParentalRating = 0);
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:
453 int size;
459public:
460 cTsToPes(void);
461 ~cTsToPes();
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
508private:
509 enum { MaxPtsValues = 150 };
510 int pid;
511 int type;
512 bool synced;
515 uint32_t ptsValues[MaxPtsValues]; // 32 bit is enough - we only need the delta
521 int framesPerPayloadUnit; // Some broadcasters send one frame per payload unit (== 1),
522 // while others put an entire GOP into one payload unit (> 1).
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)
Definition: remux.c:947
uchar * Data(void)
uchar * AddParentalRatingDescriptor(uchar *p, uchar ParentalRating=0)
Definition: remux.c:961
uint16_t YMDtoMJD(int Y, int M, int D)
Definition: remux.c:955
uchar * Generate(int Sid)
Definition: remux.c:972
cFrameParser * parser
bool Synced(void)
Returns true if the frame detector has synced on the data stream.
bool IndependentFrame(void)
Returns true if a new frame was detected and this is an independent frame (i.e.
double FramesPerSecond(void)
Returns the number of frames per second, or 0 if this information is not available.
cFrameDetector(int Pid=0, int Type=0)
Sets up a frame detector for the given Pid and stream Type.
Definition: remux.c:1615
uint32_t ptsValues[MaxPtsValues]
int Analyze(const uchar *Data, int Length)
Analyzes the TS packets pointed to by Data.
Definition: remux.c:1654
void SetPid(int Pid, int Type)
Sets the Pid and stream Type to detect frames for.
Definition: remux.c:1635
bool NewFrame(void)
Returns true if the data given to the last call to Analyze() started a new frame.
int MakeCRC(uchar *Target, const uchar *Data, int Length)
Definition: remux.c:451
uchar * GetPmt(int &Index)
Returns a pointer to the Index'th TS packet of the PMT section.
Definition: remux.c:600
void SetChannel(const cChannel *Channel)
Sets the Channel for which the PAT/PMT shall be generated.
Definition: remux.c:585
void IncEsInfoLength(int Length)
Definition: remux.c:384
void IncCounter(int &Counter, uchar *TsPacket)
Definition: remux.c:371
cPatPmtGenerator(const cChannel *Channel=NULL)
Definition: remux.c:361
void SetVersions(int PatVersion, int PmtVersion)
Sets the version numbers for the generated PAT and PMT, in case this generator is used to,...
Definition: remux.c:579
int MakeAC3Descriptor(uchar *Target, uchar Type)
Definition: remux.c:405
void GeneratePat(void)
Generates a PAT section for later use with GetPat().
Definition: remux.c:481
uchar pat[TS_SIZE]
uchar * GetPat(void)
Returns a pointer to the PAT section, which consists of exactly one TS packet.
Definition: remux.c:594
uchar pmt[MAX_PMT_TS][TS_SIZE]
int MakeLanguageDescriptor(uchar *Target, const char *Language)
Definition: remux.c:432
void GeneratePmt(const cChannel *Channel)
Generates a PMT section for the given Channel, for later use with GetPmt().
Definition: remux.c:510
void GeneratePmtPid(const cChannel *Channel)
Generates a PMT pid that doesn't collide with any of the actual pids of the Channel.
Definition: remux.c:466
int MakeStream(uchar *Target, uchar Type, int Pid)
Definition: remux.c:393
int MakeSubtitlingDescriptor(uchar *Target, const char *Language, uchar SubtitlingType, uint16_t CompositionPageId, uint16_t AncillaryPageId)
Definition: remux.c:415
void IncVersion(int &Version)
Definition: remux.c:378
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...
Definition: remux.c:938
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...
char alangs[MAXAPIDS][MAXLANGCODE2]
char slangs[MAXSPIDS][MAXLANGCODE2]
cPatPmtParser(bool UpdatePrimaryDevice=false)
Definition: remux.c:611
void Reset(void)
Resets the parser.
Definition: remux.c:617
int dpids[MAXDPIDS+1]
int Dtype(int i) const
void ParsePat(const uchar *Data, int Length)
Parses the PAT data from the single TS packet in Data.
Definition: remux.c:627
bool ParsePatPmt(const uchar *Data, int Length)
Parses the given Data (which may consist of several TS packets, typically an entire frame) and extrac...
Definition: remux.c:919
uint16_t ancillaryPageIds[MAXSPIDS]
const int * Spids(void) const
int Dpid(int i) const
const int * Dpids(void) const
char dlangs[MAXDPIDS][MAXLANGCODE2]
int SectionLength(const uchar *Data, int Length)
uint16_t CompositionPageId(int i) const
int dtypes[MAXDPIDS+1]
const int * Apids(void) const
int Apid(int i) const
void ParsePmt(const uchar *Data, int Length)
Parses the PMT data from the single TS packet in Data.
Definition: remux.c:659
uchar pmt[MAX_SECTION_SIZE]
bool Completed(void)
Returns true if the PMT has been completely parsed.
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.
uchar SubtitlingType(int i) const
uint16_t AncillaryPageId(int i) const
int Spid(int i) const
int atypes[MAXAPIDS+1]
uint16_t compositionPageIds[MAXSPIDS]
uchar subtitlingTypes[MAXSPIDS]
int Atype(int i) const
const char * Dlang(int i) const
const char * Slang(int i) const
const char * Alang(int i) const
int Ppid(void) const
Returns the PCR pid as defined by the current PMT, or 0 if no PCR pid has been detected,...
int Vpid(void) const
Returns the video pid as defined by the current PMT, or 0 if no video pid has been detected,...
int spids[MAXSPIDS+1]
int pmtPids[MAX_PMT_PIDS+1]
static void SetBrokenLink(uchar *Data, int Length)
Definition: remux.c:102
cTsPayload(void)
Definition: remux.c:246
bool AtPayloadStart(void)
Returns true if this payload handler is currently pointing to the first byte of a TS packet that star...
int Used(void)
Returns the number of raw bytes that have already been used (e.g.
bool Eof(void) const
Returns true if all available bytes of the TS payload have been processed.
void SetByte(uchar Byte, int Index)
Sets the TS data byte at the given Index to the value Byte.
Definition: remux.c:328
uchar GetByte(void)
Gets the next byte of the TS payload, skipping any intermediate TS header data.
Definition: remux.c:280
bool AtTsStart(void)
Returns true if this payload handler is currently pointing to first byte of a TS packet.
int Available(void)
Returns the number of raw bytes (including any TS headers) still available in the TS payload handler.
int GetLastIndex(void)
Returns the index into the TS data of the payload byte that has most recently been read.
Definition: remux.c:323
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...
Definition: remux.c:272
bool SkipPesHeader(void)
Skips all bytes belonging to the PES header of the payload.
Definition: remux.c:318
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...
Definition: remux.c:351
uchar SetEof(void)
Definition: remux.c:259
bool Find(uint32_t Code)
Searches for the four byte sequence given in Code and returns true if it was found within the payload...
Definition: remux.c:334
void Reset(void)
Definition: remux.c:265
bool SkipBytes(int Bytes)
Skips the given number of bytes in the payload and returns true if there is still data left to read.
Definition: remux.c:311
void PutTs(const uchar *Data, int Length)
Puts the payload data of the single TS packet at Data into the converter.
Definition: remux.c:1046
void SetRepeatLast(void)
Makes the next call to GetPes() return exactly the same data as the last one (provided there was no c...
Definition: remux.c:1123
const uchar * GetPes(int &Length)
Gets a pointer to the complete PES packet, or NULL if the packet is not complete yet.
Definition: remux.c:1075
uchar * lastData
cTsToPes(void)
Definition: remux.c:1034
~cTsToPes()
Definition: remux.c:1041
void Reset(void)
Resets the converter.
Definition: remux.c:1128
void TsSetPcr(uchar *p, int64_t Pcr)
Definition: remux.c:131
#define TS_ERROR
bool TsError(const uchar *p)
#define TS_ADAPT_PCR
int TsPid(const uchar *p)
void PesDump(const char *Name, const u_char *Data, int Length)
Definition: remux.c:1164
#define TS_SCRAMBLING_CONTROL
bool TsHasPayload(const uchar *p)
int64_t PtsDiff(int64_t Pts1, int64_t Pts2)
Returns the difference between two PTS values.
Definition: remux.c:234
#define MAX33BIT
#define MAX_PMT_PIDS
int PesPayloadOffset(const uchar *p)
bool TsIsScrambled(const uchar *p)
void TsHidePayload(uchar *p)
Definition: remux.c:121
void TsSetContinuityCounter(uchar *p, uchar Counter)
uchar TsContinuityCounter(const uchar *p)
#define MAX_PMT_TS
int TsGetPayload(const uchar **p)
#define TS_PAYLOAD_EXISTS
bool PesHasPts(const uchar *p)
bool PesLongEnough(int Length)
#define TS_SIZE
void TsSetPid(uchar *p, int Pid)
#define MAX_SECTION_SIZE
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)
#define TS_ADAPT_FIELD_EXISTS
int64_t PesGetPts(const uchar *p)
bool TsPayloadStart(const uchar *p)
int TsPayloadOffset(const uchar *p)
void PesSetDts(uchar *p, int64_t Dts)
Definition: remux.c:225
int64_t TsGetPcr(const uchar *p)
bool PesHasDts(const uchar *p)
#define PCRFACTOR
bool PesHasLength(const uchar *p)
bool TsHasAdaptationField(const uchar *p)
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)
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
ePesHeader
@ phMPEG2
@ phNeedMoreData
@ phInvalid
@ phMPEG1
#define TS_CONT_CNT_MASK
#define TS_PAYLOAD_START
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.
#define TS_PID_MASK_HI
unsigned char uchar
unsigned char u_char