summaryrefslogtreecommitdiff
path: root/genindex/pes.h
diff options
context:
space:
mode:
authorRichard <richard@ha-server.local>2016-09-04 11:18:57 +0100
committerRichard <richard@ha-server.local>2016-09-04 11:18:57 +0100
commit83632745c43d406856a3b9948cb5ea4a5ec22666 (patch)
tree76b4e1210c2fdd8f732f17b119e315a2ec72d5e3 /genindex/pes.h
downloadvdr-convert-83632745c43d406856a3b9948cb5ea4a5ec22666.tar.gz
vdr-convert-83632745c43d406856a3b9948cb5ea4a5ec22666.tar.bz2
Initial import
Diffstat (limited to 'genindex/pes.h')
-rw-r--r--genindex/pes.h166
1 files changed, 166 insertions, 0 deletions
diff --git a/genindex/pes.h b/genindex/pes.h
new file mode 100644
index 0000000..8fe7481
--- /dev/null
+++ b/genindex/pes.h
@@ -0,0 +1,166 @@
+/*
+ * pes.h:
+ *
+ * See the main source file 'genindex.c' for copyright information and
+ * how to reach the author.
+ *
+ *-------------------------------------------------------------------------------
+ * Revision History
+ * $Log: pes.h,v $
+ * Revision 1.2 2016/09/01 15:37:42 richard
+ * Extensively updated to V0.2 for EN 300 743 compliant subtitles
+ * added -b and -n flags
+ *
+ *-------------------------------------------------------------------------------
+ *
+ */
+
+#ifndef __PES_H
+#define __PES_H
+
+#include "thread.h"
+#include "tools.h"
+#include "fifo.h"
+
+#define PES_MIN_SIZE 4 // min. number of bytes to identify a packet
+#define PES_HDR_SIZE 6 // length of PES header
+#define PES_EXT_SIZE 3 // length of PES extension
+
+#define NUM_RULESETS 4 // number of rule sets
+#define NUM_RULES 256 // how many rules in every set
+
+class cFrame;
+class cRingBufferFrame;
+//RF
+class cDvbSubtitleAssembler; // for legacy PES recordings
+
+class cPES : public cMutex {
+protected:
+ enum eRule { prPass, prSkip, prAct1, prAct2, prAct3, prAct4, prAct5, prAct6, prAct7, prAct8 };
+private:
+ eRule rules[NUM_RULESETS][NUM_RULES], *currRules, currRule, defaultRule;
+ int currNum;
+ // Statistics
+ unsigned int seen[256];
+ int skipped, zeros;
+ int64_t totalBytes, totalSkipped, totalZeros;
+ //
+ enum eMode { pmNewSync, pmFastSync, pmSync, pmGetHeader, pmHeaderOk, pmPayload,
+ pmRingGet, pmRingDrop, pmDataPut, pmDataReady, pmOutput };
+ eMode mode, nextMode;
+ uchar hbuff[PES_HDR_SIZE+PES_EXT_SIZE+256];
+ uchar type;
+ int have, need, old;
+ bool unsavedHeader, outputHeader, redirect;
+ //
+ cFrame *frame;
+ const uchar *outData;
+ int outCount;
+ int saveddata;
+ //
+ bool ValidRuleset(const int num);
+ void Skip(uchar *data, int count=1);
+ int Return(int used, int len);
+ int HeaderSize(uchar *head, int len);
+ int PacketSize(uchar *head, int len);
+//RF
+ cDvbSubtitleAssembler *dvbSubtitleAssembler;
+ int dvbsub_probe(uchar *p, int size, int64_t pts);
+ uchar pktbuf[KILOBYTE(64)];
+ fifo_t fifo;
+ int64_t ptsnow[256];
+ int64_t ptsfirst[256];
+ int64_t ptslast[256];
+ int64_t totsubsize;
+ int subspkts;
+ int errpkts;
+
+protected:
+ bool SOP; // true if we process the start of packet
+ int headerSize; // size of the header including additional header data
+ uchar *header; // the actual header
+ int mpegType; // gives type of packet 1=mpeg1 2=mpeg2
+ int payloadSize; // number of data bytes in the packet
+ //
+ cRingBufferFrame *rb;
+ //
+ // Rule Management
+ void UseRuleset(int num);
+ int CurrentRuleset(void);
+ void SetDefaultRule(eRule ru, const int num=0);
+ void SetRule(uchar type, eRule ru, const int num=0);
+ void SetRuleR(uchar ltype, uchar htype, eRule ru, const int num=0);
+ void Reset(void);
+ // Misc
+ unsigned int Seen(uchar type) const;
+ void ClearSeen(void);
+ void Statistics(bool);
+ void ModifyPaketSize(int mod);
+ // Data Processing
+ int Process(const uchar *data, int len);
+ void Redirect(eRule ru);
+ void Clear(void);
+ virtual int Output(const uchar *data, int len) { return len; }
+ virtual int Action1(uchar type, uchar *data, int len) { return len; }
+ virtual int Action2(uchar type, uchar *data, int len) { return len; }
+ virtual int Action3(uchar type, uchar *data, int len) { return len; }
+ virtual int Action4(uchar type, uchar *data, int len) { return len; }
+ virtual int Action5(uchar type, uchar *data, int len) { return len; }
+ virtual int Action6(uchar type, uchar *data, int len) { return len; }
+ virtual int Action7(uchar type, uchar *data, int len) { return len; }
+ virtual int Action8(uchar type, uchar *data, int len) { return len; }
+ virtual void Skipped(uchar *data, int len) {}
+public:
+
+ cPES(eRule ru=prPass);
+ virtual ~cPES();
+ };
+
+inline bool PesHasPts(const uchar *p)
+{
+ return (p[7] & 0x80) && p[8] >= 5;
+}
+
+inline bool PesHasDts(const uchar *p)
+{
+ return (p[7] & 0x40) && p[8] >= 10;
+}
+
+inline void PesSetDtsbit(uchar *p)
+{
+ p[7] |= 0x40;
+}
+
+inline void PesSetPtsbit(uchar *p)
+{
+ p[7] |= 0x80;
+}
+
+inline int64_t PesGetPts(const uchar *p)
+{
+ return ((((int64_t)p[ 9]) & 0x0E) << 29) |
+ (( (int64_t)p[10]) << 22) |
+ ((((int64_t)p[11]) & 0xFE) << 14) |
+ (( (int64_t)p[12]) << 7) |
+ ((((int64_t)p[13]) & 0xFE) >> 1);
+}
+
+inline int64_t PesGetDts(const uchar *p)
+{
+ return ((((int64_t)p[14]) & 0x0E) << 29) |
+ (( (int64_t)p[15]) << 22) |
+ ((((int64_t)p[16]) & 0xFE) << 14) |
+ (( (int64_t)p[17]) << 7) |
+ ((((int64_t)p[18]) & 0xFE) >> 1);
+}
+
+
+#define MAX33BIT 0x00000001FFFFFFFFLL // max. possible value with 33 bit
+#define ROUNDUP(N, S) ((N + (S>>1)) / S)
+
+//ffmpeg
+#define FFMIN(a,b) ((a) > (b) ? (b) : (a))
+
+#endif
+
+// --------- $Id: pes.h,v 1.2 2016/09/01 15:37:42 richard Exp $ ---------- END \ No newline at end of file