]> git.vomp.tv Git - vompclient.git/blob - demuxer.h
Translation updates
[vompclient.git] / demuxer.h
1 /*
2     Copyright 2005-2006 Mark Calderbank
3
4     This file is part of VOMP.
5
6     VOMP is free software; you can redistribute it and/or modify
7     it under the terms of the GNU General Public License as published by
8     the Free Software Foundation; either version 2 of the License, or
9     (at your option) any later version.
10
11     VOMP is distributed in the hope that it will be useful,
12     but WITHOUT ANY WARRANTY; without even the implied warranty of
13     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14     GNU General Public License for more details.
15
16     You should have received a copy of the GNU General Public License
17     along with VOMP; if not, write to the Free Software
18     Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
19 */
20
21 /*
22
23 Thanks goes 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.
26
27 */
28
29 #ifndef DEMUXER_H
30 #define DEMUXER_H
31
32 #include <stdio.h>
33 #include <memory.h>
34 #include "stream.h"
35 #include "log.h"
36 #include "defines.h"
37 #include "callback.h"
38 #include "draintarget.h"
39
40 #define PES_AUDIO_START 0xc0
41 #define PES_AUDIO_END 0xcf
42
43 class Demuxer
44 {
45 protected:
46   class PESPacket
47   {
48     public:
49       PESPacket();
50       void init(UCHAR type);
51       void truncate();
52       int  write(UCHAR* buf, int len);
53       int  submit();
54     protected:
55       UCHAR data[0x10000];
56       UINT length, size;
57       bool closed;
58       UCHAR packetType;
59       ULLONG pts;
60       bool seq_header;
61       UINT submitted;
62       virtual void parseDetails();
63       UINT findPictureHeader();
64
65       static const ULLONG PTS_INVALID;
66   };
67   friend class PESPacket;
68
69   public:
70     Demuxer();
71     virtual ~Demuxer();
72     static Demuxer* getInstance();
73     int init(Callback* callback, DrainTarget* audio, DrainTarget* video, ULONG demuxMemoryV, ULONG demuxMemoryA);
74     virtual void reset();
75     virtual void flush();
76     void flushAudio();
77     void seek();
78     void setVideoStream(int id);
79     void setAudioStream(int id);
80     bool writeAudio();
81     bool writeVideo();
82
83     virtual int scan(UCHAR* buf, int len) = 0;
84     virtual int findPTS(UCHAR* buf, int len, ULLONG* dest) = 0;
85     virtual int put(UCHAR* buf, int len) = 0;
86     virtual void setFrameNum(ULONG frame) {}
87     virtual void setPacketNum(ULONG packet) {}
88     virtual ULONG getFrameNumFromPTS(ULLONG pts) {return 0;}
89     virtual ULONG getPacketNum() {return 0;}
90
91     bool* getmpAudioChannels(); //Maybe virtual ?
92     int getselAudioChannel();
93     void setmpAudioChannel(int aud_channel);
94
95     int getHorizontalSize() { return horizontal_size; }
96     int getVerticalSize() { return vertical_size; }
97     int getAspectRatio() { return aspect_ratio; }
98     int getFrameRate() { return frame_rate; }
99     int getBitRate() { return bit_rate; }
100     ULLONG getVideoPTS() { return video_pts; }
101     ULLONG getAudioPTS() { return audio_pts; }
102
103     enum AspectRatio
104     {
105       ASPECT_4_3  = 2,
106       ASPECT_16_9 = 3
107     };
108
109     // Remove all data from a buffer apart from video PES packets.
110     // Returns the length of the reduced data.
111     // *static function*
112     static UINT stripAudio(UCHAR* buf, UINT len);
113
114     // Scan a buffer to see if video packets are present.
115     // Returns true if video exists; false if not.
116     // *static function*
117     static bool scanForVideo(UCHAR* buf, UINT len);
118
119   protected:
120     // General demuxer objects and status indicators
121     static Demuxer* instance;
122     Stream videostream;
123     Stream audiostream;
124     int shutdown();
125     bool initted;
126     bool vid_seeking;
127     bool aud_seeking;
128     int video_current, audio_current;
129
130     // Video stream information
131     void setAspectRatio(enum AspectRatio);
132     Callback* callback;
133
134     int horizontal_size;
135     int vertical_size;
136     enum AspectRatio aspect_ratio;
137     int arcnt;
138     int frame_rate;
139     int bit_rate;
140     ULLONG video_pts;
141     ULLONG video_pts_seek;
142     ULLONG audio_pts;
143
144     // Constants
145     static const int FrameRates[9];
146
147     enum PESTYPE
148     {
149       PESTYPE_PRIVATE_1 = 0xBD,
150
151       PESTYPE_AUD0 = 0xC0,
152       PESTYPE_AUD1,  PESTYPE_AUD2,  PESTYPE_AUD3,  PESTYPE_AUD4,
153       PESTYPE_AUD5,  PESTYPE_AUD6,  PESTYPE_AUD7,  PESTYPE_AUD8,
154       PESTYPE_AUD9,  PESTYPE_AUD10, PESTYPE_AUD11, PESTYPE_AUD12,
155       PESTYPE_AUD13, PESTYPE_AUD14, PESTYPE_AUD15, PESTYPE_AUD16,
156       PESTYPE_AUD17, PESTYPE_AUD18, PESTYPE_AUD19, PESTYPE_AUD20,
157       PESTYPE_AUD21, PESTYPE_AUD22, PESTYPE_AUD23, PESTYPE_AUD24,
158       PESTYPE_AUD25, PESTYPE_AUD26, PESTYPE_AUD27, PESTYPE_AUD28,
159       PESTYPE_AUD29, PESTYPE_AUD30, PESTYPE_AUD31,
160       PESTYPE_AUDMAX = PESTYPE_AUD31,
161
162       PESTYPE_VID0 = 0xE0,
163       PESTYPE_VID1,  PESTYPE_VID2,  PESTYPE_VID3,  PESTYPE_VID4,
164       PESTYPE_VID5,  PESTYPE_VID6,  PESTYPE_VID7,  PESTYPE_VID8,
165       PESTYPE_VID9,  PESTYPE_VID10, PESTYPE_VID11, PESTYPE_VID12,
166       PESTYPE_VID13, PESTYPE_VID14, PESTYPE_VID15,
167       PESTYPE_VIDMAX = PESTYPE_VID15
168     };
169
170     bool avail_mpaudchan[PESTYPE_AUDMAX-PESTYPE_AUD0+1];
171 };
172
173 #endif