2 Copyright 2005-2007 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, write to the Free Software
19 Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
24 Thanks go to Jon Gettler of the MVPMC project and Stephen Rice for
25 the demuxer in mvpmc. It was used in the creation of this demuxer;
26 however, no code was copied verbatim.
43 void init(UCHAR type, UCHAR sub=0);
45 int write(UCHAR* buf, int len);
47 UCHAR operator[] (UINT index); // return data[index] if in bounds, else 0
48 // so no proper error condition but never mind for now
49 const UCHAR* getData() { return data; }
50 UINT getLength() { return length; }
51 UINT getSize() { return size; }
52 UCHAR getPacketType() { return packetType; }
53 void setSubstream(UCHAR s) { substream = s; }
54 UCHAR getSubstream() { return substream; }
56 bool hasPTS() { return (getPTS() != PTS_INVALID); }
58 UINT findPictureHeader();
60 static const ULLONG PTS_INVALID;
67 UINT seq_header; // 0 = no, 1 = unknown, else = header offset
75 static Demuxer* getInstance();
76 int init(Callback* callback, DrainTarget* audio, DrainTarget* video, ULONG demuxMemoryV, ULONG demuxMemoryA);
81 void setVideoStream(int id);
82 void setAudioStream(int id);
86 virtual int scan(UCHAR* buf, int len) = 0;
87 virtual int findPTS(UCHAR* buf, int len, ULLONG* dest) = 0;
88 virtual int put(UCHAR* buf, int len) = 0;
89 virtual void setFrameNum(ULONG frame) {}
90 virtual void setPacketNum(ULONG packet) {}
91 virtual ULONG getFrameNumFromPTS(ULLONG pts) {return 0;}
92 virtual ULONG getPacketNum() {return 0;}
94 bool* getmpAudioChannels(); //Maybe virtual ?
95 bool* getac3AudioChannels(); //Maybe virtual ?
96 int getselAudioChannel();
97 void setAudioChannel(int aud_channel);
99 int getHorizontalSize() { return horizontal_size; }
100 int getVerticalSize() { return vertical_size; }
101 int getAspectRatio() { return aspect_ratio; }
102 int getFrameRate() { return frame_rate; }
103 int getBitRate() { return bit_rate; }
104 ULLONG getVideoPTS() { return video_pts; }
105 ULLONG getAudioPTS() { return audio_pts; }
113 // Remove all data from a buffer apart from video PES packets.
114 // Returns the length of the reduced data.
116 static UINT stripAudio(UCHAR* buf, UINT len);
118 // Scan a buffer to see if video packets are present.
119 // Returns true if video exists; false if not.
121 static bool scanForVideo(UCHAR* buf, UINT len);
125 PESTYPE_PRIVATE_1 = 0xBD,
128 PESTYPE_AUD1, PESTYPE_AUD2, PESTYPE_AUD3, PESTYPE_AUD4,
129 PESTYPE_AUD5, PESTYPE_AUD6, PESTYPE_AUD7, PESTYPE_AUD8,
130 PESTYPE_AUD9, PESTYPE_AUD10, PESTYPE_AUD11, PESTYPE_AUD12,
131 PESTYPE_AUD13, PESTYPE_AUD14, PESTYPE_AUD15, PESTYPE_AUD16,
132 PESTYPE_AUD17, PESTYPE_AUD18, PESTYPE_AUD19, PESTYPE_AUD20,
133 PESTYPE_AUD21, PESTYPE_AUD22, PESTYPE_AUD23, PESTYPE_AUD24,
134 PESTYPE_AUD25, PESTYPE_AUD26, PESTYPE_AUD27, PESTYPE_AUD28,
135 PESTYPE_AUD29, PESTYPE_AUD30, PESTYPE_AUD31,
136 PESTYPE_AUDMAX = PESTYPE_AUD31,
139 PESTYPE_VID1, PESTYPE_VID2, PESTYPE_VID3, PESTYPE_VID4,
140 PESTYPE_VID5, PESTYPE_VID6, PESTYPE_VID7, PESTYPE_VID8,
141 PESTYPE_VID9, PESTYPE_VID10, PESTYPE_VID11, PESTYPE_VID12,
142 PESTYPE_VID13, PESTYPE_VID14, PESTYPE_VID15,
143 PESTYPE_VIDMAX = PESTYPE_VID15
145 enum PESTYPE_SUBSTREAM
147 PESTYPE_SUBSTREAM_AC30 = 0x80,
148 PESTYPE_SUBSTREAM_AC31,PESTYPE_SUBSTREAM_AC32, PESTYPE_SUBSTREAM_AC33,
149 PESTYPE_SUBSTREAM_AC34,PESTYPE_SUBSTREAM_AC35,PESTYPE_SUBSTREAM_AC36,
150 PESTYPE_SUBSTREAM_AC37,
151 PESTYPE_SUBSTREAM_AC3MAX = PESTYPE_SUBSTREAM_AC37
155 // Operations on PES packets
156 bool submitPacket(PESPacket&);
157 void parsePacketDetails(PESPacket&);
159 // General demuxer objects and status indicators
160 static Demuxer* instance;
167 int video_current, audio_current;
169 // Video stream information
170 void setAspectRatio(enum AspectRatio);
175 enum AspectRatio aspect_ratio;
180 ULLONG video_pts_seek;
184 static const int FrameRates[9];
187 bool avail_mpaudchan[PESTYPE_AUDMAX-PESTYPE_AUD0+1];
188 bool avail_ac3audchan[PESTYPE_SUBSTREAM_AC3MAX-PESTYPE_SUBSTREAM_AC30+1];