summaryrefslogtreecommitdiff
path: root/remux.h
diff options
context:
space:
mode:
Diffstat (limited to 'remux.h')
-rw-r--r--remux.h85
1 files changed, 85 insertions, 0 deletions
diff --git a/remux.h b/remux.h
new file mode 100644
index 0000000..833cb2f
--- /dev/null
+++ b/remux.h
@@ -0,0 +1,85 @@
+/*
+ * remux.h: A streaming MPEG2 remultiplexer
+ *
+ * See the main source file 'vdr.c' for copyright information and
+ * how to reach the author.
+ *
+ * $Id: remux.h 1.17 2007/09/02 10:19:06 kls Exp $
+ */
+
+#ifndef __REMUX_PIP_H
+#define __REMUX_PIP_H
+
+#include <vdr/ringbuffer.h>
+#include <vdr/tools.h>
+#include <vdr/remux.h>
+
+//ePesHeader AnalyzePesHeader(const uchar *Data, int Count, int &PesPayloadOffset, bool *ContinuationHeader = NULL);
+
+// Picture types:
+#define NO_PICTURE 0
+#define I_FRAME 1
+#define P_FRAME 2
+#define B_FRAME 3
+
+#define MAXTRACKS 64
+
+class cTS2PES;
+
+class cRemuxPIP {
+private:
+ bool exitOnFailure;
+ bool noVideo;
+ int numUPTerrors;
+ bool synced;
+#ifdef USE_SYNCEARLY
+ bool syncEarly;
+#endif /* SYNCEARLY */
+ int skipped;
+ cTS2PES *ts2pes[MAXTRACKS];
+ int numTracks;
+ cRingBufferLinear *resultBuffer;
+ int resultSkipped;
+ int GetPid(const uchar *Data);
+public:
+#ifdef USE_SYNCEARLY
+ cRemuxPIP(int VPid, const int *APids, const int *DPids, const int *SPids, bool ExitOnFailure = false, bool SyncEarly = false);
+#else
+ cRemuxPIP(int VPid, const int *APids, const int *DPids, const int *SPids, bool ExitOnFailure = false);
+#endif /* SYNCEARLY */
+ ///< Creates a new remuxer for the given PIDs. VPid is the video PID, while
+ ///< APids, DPids and SPids are pointers to zero terminated lists of audio,
+ ///< dolby and subtitle PIDs (the pointers may be NULL if there is no such
+ ///< PID). If ExitOnFailure is true, the remuxer will initiate an "emergency
+ ///< exit" in case of problems with the data stream.
+ ///< If USE_SYNCEARLY is activated: SyncEarly causes cRemuxPIP to sync as soon
+ ///< as a video or audio frame is seen.
+ ~cRemuxPIP();
+ void SetTimeouts(int PutTimeout, int GetTimeout) { resultBuffer->SetTimeouts(PutTimeout, GetTimeout); }
+ ///< By default cRemuxPIP assumes that Put() and Get() are called from different
+ ///< threads, and uses a timeout in the Get() function in case there is no
+ ///< data available. SetTimeouts() can be used to modify these timeouts.
+ ///< Especially if Put() and Get() are called from the same thread, setting
+ ///< both timeouts to 0 is recommended.
+ int Put(const uchar *Data, int Count);
+ ///< Puts at most Count bytes of Data into the remuxer.
+ ///< \return Returns the number of bytes actually consumed from Data.
+ uchar *Get(int &Count, uchar *PictureType = NULL);
+ ///< Gets all currently available data from the remuxer.
+ ///< \return Count contains the number of bytes the result points to, and
+ ///< PictureType (if not NULL) will contain one of NO_PICTURE, I_FRAME, P_FRAME
+ ///< or B_FRAME.
+ void Del(int Count);
+ ///< Deletes Count bytes from the remuxer. Count must be the number returned
+ ///< from a previous call to Get(). Several calls to Del() with fractions of
+ ///< a previously returned Count may be made, but the total sum of all Count
+ ///< values must be exactly what the previous Get() has returned.
+ void Clear(void);
+ ///< Clears the remuxer of all data it might still contain, keeping the PID
+ ///< settings as they are.
+ static void SetBrokenLink(uchar *Data, int Length);
+ static int GetPacketLength(const uchar *Data, int Count, int Offset);
+ static int ScanVideoPacket(const uchar *Data, int Count, int Offset, uchar &PictureType);
+ };
+
+#endif // __REMUX_PIP_H