2 Copyright 2005-2008 Mark Calderbank
3 Copyright 2007 Marten Richter (AC3 support)
5 This file is part of VOMP.
7 VOMP is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2 of the License, or
10 (at your option) any later version.
12 VOMP is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with VOMP. If not, see <https://www.gnu.org/licenses/>.
23 Thanks go to Jon Gettler of the MVPMC project and Stephen Rice for
24 the demuxer in mvpmc. It was used in the creation of this demuxer;
25 however, no code was copied verbatim.
43 int log2_max_frame_num;
44 int frame_mbs_only_flag;
45 int separate_color_plane_flag;
52 PESPacket(const PESPacket& packet);
53 PESPacket& operator=(const PESPacket& packet);
55 void init(UCHAR type, UCHAR sub = 0);
57 int write(const UCHAR* buf, int len);
59 UCHAR operator[] (UINT index) const;
60 // return data[index] if in bounds, else 0
61 // so no proper error condition but never mind for now
62 const UCHAR* getData() const { return data; }
63 UINT getLength() const { return length; }
64 UINT getSize() const { return size; }
65 UCHAR getPacketType() const { return packetType; }
66 void setSubstream(UCHAR s) { substream = s; }
67 UCHAR getSubstream() const { return substream; }
68 ULLONG getPTS() const;
69 bool hasPTS() const { return (getPTS() != PTS_INVALID); }
71 UINT findPictureHeader(bool h264) const;
72 UINT findSeqHeader(bool h264) const;
73 UINT findSeqExtHeader(bool h264) const;
74 UINT countPictureHeaders(bool h264, struct PictCountInfo& pinfo) const;
75 static const ULLONG PTS_INVALID = (1LL << 33);
80 void copyFrom(const PESPacket& packet);
86 UINT mutable seq_header; // 0 = no, 1 = unknown, else = header offset
94 static Demuxer* getInstance();
95 int init(Callback* tcallback, DrainTarget* audio, DrainTarget* video,
96 DrainTarget* teletext,
97 ULONG demuxMemoryV, ULONG demuxMemoryA, ULONG demuxMemoryT, double fps=25.,
98 DVBSubtitles* tsubtitles=NULL);
100 virtual void flush();
103 void setVideoStream(int id);
104 //TODO HANS next virtual necessary?
105 //virtual void setAudioStream(int id);
106 void setAudioStream(int id);
107 void setTeletextStream(int id);
108 void setDVBSubtitleStream(int id);
109 bool writeAudio(bool * dataavail=NULL);
110 bool writeVideo(bool * dataavail=NULL);
111 bool writeTeletext(bool * dataavail=NULL);
113 virtual int scan(UCHAR* buf, int len) = 0;
114 virtual int findPTS(UCHAR* buf, int len, ULLONG* dest) = 0;
115 virtual int put(UCHAR* buf, int len) = 0;
116 virtual void setFrameNum(ULONG /* frame */) {}
117 virtual void setPacketNum(ULONG /* packet */) {}
118 virtual ULONG getFrameNumFromPTS(ULLONG /* pts */) { return 0; }
119 virtual ULONG getPacketNum() {return 0;}
121 bool* getmpAudioChannels(); //Maybe virtual ?
122 bool* getac3AudioChannels(); //Maybe virtual ?
123 bool* getSubtitleChannels();
124 int getselAudioChannel();
125 int getselSubtitleChannel();
126 bool ish264() {return h264;}
127 void seth264(bool newh264){h264=newh264;}
129 int getHorizontalSize() { return horizontal_size; }
130 int getVerticalSize() { return vertical_size; }
131 UCHAR getAspectRatio(int *tparx,int *tpary) {
132 *tparx=parx; *tpary=pary;return aspect_ratio; }
133 int getFrameRate() { return frame_rate; }
134 int getBitRate() { return bit_rate; }
135 bool getInterlaced() { return interlaced;}
136 ULLONG getVideoPTS() { return video_pts; }
137 ULLONG getAudioPTS() { return audio_pts; }
139 enum AspectRatio : UCHAR
147 // Remove all data from a buffer apart from video PES packets.
148 // Returns the length of the reduced data.
149 // removed *static function*, due to DemuxerTS
150 virtual UINT stripAudio(UCHAR* buf, UINT len);
151 void changeTimes(UCHAR* buf, UINT len,UINT playtime);
153 // Scan a buffer to see if video packets are present.
154 // Returns true if video exists; false if not.
155 // removed *static function* for h264 detection
156 static bool scanForVideo(UCHAR* buf, UINT len, bool &ish264);
160 PESTYPE_PRIVATE_1 = 0xBD,
163 PESTYPE_AUD1, PESTYPE_AUD2, PESTYPE_AUD3, PESTYPE_AUD4,
164 PESTYPE_AUD5, PESTYPE_AUD6, PESTYPE_AUD7, PESTYPE_AUD8,
165 PESTYPE_AUD9, PESTYPE_AUD10, PESTYPE_AUD11, PESTYPE_AUD12,
166 PESTYPE_AUD13, PESTYPE_AUD14, PESTYPE_AUD15, PESTYPE_AUD16,
167 PESTYPE_AUD17, PESTYPE_AUD18, PESTYPE_AUD19, PESTYPE_AUD20,
168 PESTYPE_AUD21, PESTYPE_AUD22, PESTYPE_AUD23, PESTYPE_AUD24,
169 PESTYPE_AUD25, PESTYPE_AUD26, PESTYPE_AUD27, PESTYPE_AUD28,
170 PESTYPE_AUD29, PESTYPE_AUD30, PESTYPE_AUD31,
171 PESTYPE_AUDMAX = PESTYPE_AUD31,
174 PESTYPE_VID1, PESTYPE_VID2, PESTYPE_VID3, PESTYPE_VID4,
175 PESTYPE_VID5, PESTYPE_VID6, PESTYPE_VID7, PESTYPE_VID8,
176 PESTYPE_VID9, PESTYPE_VID10, PESTYPE_VID11, PESTYPE_VID12,
177 PESTYPE_VID13, PESTYPE_VID14, PESTYPE_VID15,
178 PESTYPE_VIDMAX = PESTYPE_VID15
180 enum PESTYPE_SUBSTREAM
182 PESTYPE_SUBSTREAM_TELETEXT0 = 0x10,
183 PESTYPE_SUBSTREAM_TELETEXT1,PESTYPE_SUBSTREAM_TELETEXT2, PESTYPE_SUBSTREAM_TELETEXT3,
184 PESTYPE_SUBSTREAM_TELETEXT4,PESTYPE_SUBSTREAM_TELETEXT5,PESTYPE_SUBSTREAM_TELETEXT6,
185 PESTYPE_SUBSTREAM_TELETEXT7, PESTYPE_SUBSTREAM_TELETEXT8, PESTYPE_SUBSTREAM_TELETEXT9,
186 PESTYPE_SUBSTREAM_TELETEXT10,PESTYPE_SUBSTREAM_TELETEXT11,PESTYPE_SUBSTREAM_TELETEXT12,
187 PESTYPE_SUBSTREAM_TELETEXT13,PESTYPE_SUBSTREAM_TELETEXT14,PESTYPE_SUBSTREAM_TELETEXT15,
188 PESTYPE_SUBSTREAM_TELETEXTMAX=PESTYPE_SUBSTREAM_TELETEXT15,
189 PESTYPE_SUBSTREAM_DVBSUBTITLE0=0x20,
190 PESTYPE_SUBSTREAM_DVBSUBTITLE1,PESTYPE_SUBSTREAM_DVBSUBTITLE2,PESTYPE_SUBSTREAM_DVBSUBTITLE3,
191 PESTYPE_SUBSTREAM_DVBSUBTITLE4,PESTYPE_SUBSTREAM_DVBSUBTITLE5,PESTYPE_SUBSTREAM_DVBSUBTITLE6,
192 PESTYPE_SUBSTREAM_DVBSUBTITLE7,
193 PESTYPE_SUBSTREAM_DVBSUBTITLEMAX=PESTYPE_SUBSTREAM_DVBSUBTITLE7,
194 PESTYPE_SUBSTREAM_AC30 = 0x80,
195 PESTYPE_SUBSTREAM_AC31,PESTYPE_SUBSTREAM_AC32, PESTYPE_SUBSTREAM_AC33,
196 PESTYPE_SUBSTREAM_AC34,PESTYPE_SUBSTREAM_AC35,PESTYPE_SUBSTREAM_AC36,
197 PESTYPE_SUBSTREAM_AC37,
198 PESTYPE_SUBSTREAM_AC3MAX = PESTYPE_SUBSTREAM_AC37
202 // Operations on PES packets
203 bool submitPacket(PESPacket&);
204 void parsePacketDetails(PESPacket&);
206 // General demuxer objects and status indicators
207 static Demuxer* instance;
210 DVBSubtitles* subtitles;
211 Stream teletextstream;
217 int video_current, audio_current, teletext_current, subtitle_current;
221 // Video stream information
222 void setAspectRatio(enum AspectRatio, int taspectx, int taspecty);
231 enum AspectRatio aspect_ratio;
236 ULLONG video_pts_seek;
239 bool isteletextdecoded;
242 unsigned int packetnum;
245 static const int FrameRates[9];
250 bool avail_mpaudchan[PESTYPE_AUDMAX-PESTYPE_AUD0+1];
251 bool avail_ac3audchan[PESTYPE_SUBSTREAM_AC3MAX-PESTYPE_SUBSTREAM_AC30+1];
252 bool avail_dvbsubtitlechan[PESTYPE_SUBSTREAM_DVBSUBTITLEMAX-PESTYPE_SUBSTREAM_DVBSUBTITLE0+1];