2 Copyright 2005-2008 Mark Calderbank
\r
3 Copyright 2007 Marten Richter (AC3 support)
\r
5 This file is part of VOMP.
\r
7 VOMP is free software; you can redistribute it and/or modify
\r
8 it under the terms of the GNU General Public License as published by
\r
9 the Free Software Foundation; either version 2 of the License, or
\r
10 (at your option) any later version.
\r
12 VOMP is distributed in the hope that it will be useful,
\r
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
\r
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
\r
15 GNU General Public License for more details.
\r
17 You should have received a copy of the GNU General Public License
\r
18 along with VOMP; if not, write to the Free Software Foundation, Inc.,
\r
19 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
\r
24 Thanks go to Jon Gettler of the MVPMC project and Stephen Rice for
\r
25 the demuxer in mvpmc. It was used in the creation of this demuxer;
\r
26 however, no code was copied verbatim.
\r
34 #include "defines.h"
\r
44 PESPacket(const PESPacket& packet);
\r
45 PESPacket& operator=(const PESPacket& packet);
\r
47 void init(UCHAR type, UCHAR sub=0);
\r
49 int write(const UCHAR* buf, int len);
\r
51 UCHAR operator[] (UINT index) const;
\r
52 // return data[index] if in bounds, else 0
\r
53 // so no proper error condition but never mind for now
\r
54 const UCHAR* getData() const { return data; }
\r
55 UINT getLength() const { return length; }
\r
56 UINT getSize() const { return size; }
\r
57 UCHAR getPacketType() const { return packetType; }
\r
58 void setSubstream(UCHAR s) { substream = s; }
\r
59 UCHAR getSubstream() const { return substream; }
\r
60 ULLONG getPTS() const;
\r
61 bool hasPTS() const { return (getPTS() != PTS_INVALID); }
\r
63 UINT findPictureHeader(bool h264) const;
\r
64 UINT findSeqHeader(bool h264) const;
\r
65 UINT countPictureHeaders(bool h264) const;
\r
66 static const ULLONG PTS_INVALID = (1LL << 33);
\r
71 void copyFrom(const PESPacket& packet);
\r
77 UINT mutable seq_header; // 0 = no, 1 = unknown, else = header offset
\r
85 static Demuxer* getInstance();
\r
86 int init(Callback* tcallback, DrainTarget* audio, DrainTarget* video,
\r
87 DrainTarget* teletext,
\r
88 ULONG demuxMemoryV, ULONG demuxMemoryA, ULONG demuxMemoryT, double fps=25.,
\r
89 DVBSubtitles* tsubtitles=NULL);
\r
90 virtual void reset();
\r
91 virtual void flush();
\r
94 void setVideoStream(int id);
\r
95 //TODO HANS next virtual necessary?
\r
96 //virtual void setAudioStream(int id);
\r
97 void setAudioStream(int id);
\r
98 void setTeletextStream(int id);
\r
99 void setDVBSubtitleStream(int id);
\r
100 bool writeAudio(bool * dataavail=NULL);
\r
101 bool writeVideo(bool * dataavail=NULL);
\r
102 bool writeTeletext(bool * dataavail=NULL);
\r
104 virtual int scan(UCHAR* buf, int len) = 0;
\r
105 virtual int findPTS(UCHAR* buf, int len, ULLONG* dest) = 0;
\r
106 virtual int put(UCHAR* buf, int len) = 0;
\r
107 virtual void setFrameNum(ULONG frame) {}
\r
108 virtual void setPacketNum(ULONG packet) {}
\r
109 virtual ULONG getFrameNumFromPTS(ULLONG pts) {return 0;}
\r
110 virtual ULONG getPacketNum() {return 0;}
\r
112 bool* getmpAudioChannels(); //Maybe virtual ?
\r
113 bool* getac3AudioChannels(); //Maybe virtual ?
\r
114 bool* getSubtitleChannels();
\r
115 int getselAudioChannel();
\r
116 int getselSubtitleChannel();
\r
117 bool ish264() {return h264;}
\r
118 void seth264(bool newh264){h264=newh264;}
\r
120 int getHorizontalSize() { return horizontal_size; }
\r
121 int getVerticalSize() { return vertical_size; }
\r
122 int getAspectRatio() { return aspect_ratio; }
\r
123 int getFrameRate() { return frame_rate; }
\r
124 int getBitRate() { return bit_rate; }
\r
125 ULLONG getVideoPTS() { return video_pts; }
\r
126 ULLONG getAudioPTS() { return audio_pts; }
\r
134 // Remove all data from a buffer apart from video PES packets.
\r
135 // Returns the length of the reduced data.
\r
136 // removed *static function*, due to DemuxerTS
\r
137 virtual UINT stripAudio(UCHAR* buf, UINT len);
\r
138 void changeTimes(UCHAR* buf, UINT len,UINT playtime);
\r
140 // Scan a buffer to see if video packets are present.
\r
141 // Returns true if video exists; false if not.
\r
142 // removed *static function* for h264 detection
\r
143 static bool scanForVideo(UCHAR* buf, UINT len, bool &ish264);
\r
147 PESTYPE_PRIVATE_1 = 0xBD,
\r
149 PESTYPE_AUD0 = 0xC0,
\r
150 PESTYPE_AUD1, PESTYPE_AUD2, PESTYPE_AUD3, PESTYPE_AUD4,
\r
151 PESTYPE_AUD5, PESTYPE_AUD6, PESTYPE_AUD7, PESTYPE_AUD8,
\r
152 PESTYPE_AUD9, PESTYPE_AUD10, PESTYPE_AUD11, PESTYPE_AUD12,
\r
153 PESTYPE_AUD13, PESTYPE_AUD14, PESTYPE_AUD15, PESTYPE_AUD16,
\r
154 PESTYPE_AUD17, PESTYPE_AUD18, PESTYPE_AUD19, PESTYPE_AUD20,
\r
155 PESTYPE_AUD21, PESTYPE_AUD22, PESTYPE_AUD23, PESTYPE_AUD24,
\r
156 PESTYPE_AUD25, PESTYPE_AUD26, PESTYPE_AUD27, PESTYPE_AUD28,
\r
157 PESTYPE_AUD29, PESTYPE_AUD30, PESTYPE_AUD31,
\r
158 PESTYPE_AUDMAX = PESTYPE_AUD31,
\r
160 PESTYPE_VID0 = 0xE0,
\r
161 PESTYPE_VID1, PESTYPE_VID2, PESTYPE_VID3, PESTYPE_VID4,
\r
162 PESTYPE_VID5, PESTYPE_VID6, PESTYPE_VID7, PESTYPE_VID8,
\r
163 PESTYPE_VID9, PESTYPE_VID10, PESTYPE_VID11, PESTYPE_VID12,
\r
164 PESTYPE_VID13, PESTYPE_VID14, PESTYPE_VID15,
\r
165 PESTYPE_VIDMAX = PESTYPE_VID15
\r
167 enum PESTYPE_SUBSTREAM
\r
169 PESTYPE_SUBSTREAM_TELETEXT0 = 0x10,
\r
170 PESTYPE_SUBSTREAM_TELETEXT1,PESTYPE_SUBSTREAM_TELETEXT2, PESTYPE_SUBSTREAM_TELETEXT3,
\r
171 PESTYPE_SUBSTREAM_TELETEXT4,PESTYPE_SUBSTREAM_TELETEXT5,PESTYPE_SUBSTREAM_TELETEXT6,
\r
172 PESTYPE_SUBSTREAM_TELETEXT7, PESTYPE_SUBSTREAM_TELETEXT8, PESTYPE_SUBSTREAM_TELETEXT9,
\r
173 PESTYPE_SUBSTREAM_TELETEXT10,PESTYPE_SUBSTREAM_TELETEXT11,PESTYPE_SUBSTREAM_TELETEXT12,
\r
174 PESTYPE_SUBSTREAM_TELETEXT13,PESTYPE_SUBSTREAM_TELETEXT14,PESTYPE_SUBSTREAM_TELETEXT15,
\r
175 PESTYPE_SUBSTREAM_TELETEXTMAX=PESTYPE_SUBSTREAM_TELETEXT15,
\r
176 PESTYPE_SUBSTREAM_DVBSUBTITLE0=0x20,
\r
177 PESTYPE_SUBSTREAM_DVBSUBTITLE1,PESTYPE_SUBSTREAM_DVBSUBTITLE2,PESTYPE_SUBSTREAM_DVBSUBTITLE3,
\r
178 PESTYPE_SUBSTREAM_DVBSUBTITLE4,PESTYPE_SUBSTREAM_DVBSUBTITLE5,PESTYPE_SUBSTREAM_DVBSUBTITLE6,
\r
179 PESTYPE_SUBSTREAM_DVBSUBTITLE7,
\r
180 PESTYPE_SUBSTREAM_DVBSUBTITLEMAX=PESTYPE_SUBSTREAM_DVBSUBTITLE7,
\r
181 PESTYPE_SUBSTREAM_AC30 = 0x80,
\r
182 PESTYPE_SUBSTREAM_AC31,PESTYPE_SUBSTREAM_AC32, PESTYPE_SUBSTREAM_AC33,
\r
183 PESTYPE_SUBSTREAM_AC34,PESTYPE_SUBSTREAM_AC35,PESTYPE_SUBSTREAM_AC36,
\r
184 PESTYPE_SUBSTREAM_AC37,
\r
185 PESTYPE_SUBSTREAM_AC3MAX = PESTYPE_SUBSTREAM_AC37
\r
189 // Operations on PES packets
\r
190 bool submitPacket(PESPacket&);
\r
191 void parsePacketDetails(PESPacket&);
\r
193 // General demuxer objects and status indicators
\r
194 static Demuxer* instance;
\r
195 Stream videostream;
\r
196 Stream audiostream;
\r
197 DVBSubtitles* subtitles;
\r
198 Stream teletextstream;
\r
204 int video_current, audio_current, teletext_current, subtitle_current;
\r
206 // Video stream information
\r
207 void setAspectRatio(enum AspectRatio);
\r
208 Callback* callback;
\r
210 int horizontal_size;
\r
213 enum AspectRatio aspect_ratio;
\r
218 ULLONG video_pts_seek;
\r
220 ULLONG teletext_pts;
\r
221 bool isteletextdecoded;
\r
224 unsigned int packetnum;
\r
227 static const int FrameRates[9];
\r
232 bool avail_mpaudchan[PESTYPE_AUDMAX-PESTYPE_AUD0+1];
\r
233 bool avail_ac3audchan[PESTYPE_SUBSTREAM_AC3MAX-PESTYPE_SUBSTREAM_AC30+1];
\r
234 bool avail_dvbsubtitlechan[PESTYPE_SUBSTREAM_DVBSUBTITLEMAX-PESTYPE_SUBSTREAM_DVBSUBTITLE0+1];
\r