]> git.vomp.tv Git - vompclient.git/blob - demuxer.h
A little convergence to NEW_DEMUXER
[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
30 #ifndef DEMUXER_H
31 #define DEMUXER_H
32
33 #include <stdio.h>
34 #include <memory.h>
35 #include "stream.h"
36 #include "log.h"
37 #include "defines.h"
38 #include "callback.h"
39 #include "draintarget.h"
40
41 class Demuxer
42 {
43 public: //MS Visual C++ need this, private does not work for DemuxerVDR, Marten
44   class PESPacket
45   {
46     public:
47       PESPacket();
48       void init(UCHAR type);
49       int  write(UCHAR* buf, int len);
50 #ifndef NEW_DEMUXER
51       int  submit();
52 #else
53     int  submit(ULLONG cur_pos);
54 #endif
55     private:
56       UCHAR data[0x10000];
57       UINT length, size;
58       bool closed;
59       UCHAR packetType;
60       UINT submitted;
61       void parseDetails();
62   };
63   friend class PESPacket;
64
65   public:
66     Demuxer();
67     virtual ~Demuxer();
68     static Demuxer* getInstance();
69     int init(Callback* callback, DrainTarget* audio, DrainTarget* video);
70     void reset();
71     virtual void flush();
72     void flushAudio();
73     void seek();
74     void setVideoStream(int id);
75     void setAudioStream(int id);
76     int writeAudio();
77     int writeVideo();
78
79     virtual int scan(UCHAR* buf, int len) = 0;
80     virtual int findVideoPTS(UCHAR* buf, int len, ULLONG* dest) = 0;
81 #ifndef NEW_DEMUXER
82     virtual int put(UCHAR* buf, int len) = 0;
83 #else
84   virtual int put(UCHAR* buf, int len,ULLONG cur_pos) = 0;
85 #endif
86
87     int getHorizontalSize() { return horizontal_size; }
88     int getVerticalSize() { return vertical_size; }
89     int getAspectRatio() { return aspect_ratio; }
90     int getFrameRate() { return frame_rate; }
91     int getBitRate() { return bit_rate; }
92     ULLONG getVideoPTS() { return video_pts; }
93
94     enum AspectRatio
95     {
96       ASPECT_4_3  = 2,
97       ASPECT_16_9 = 3
98     };
99
100   protected:
101     // General demuxer objects and status indicators
102     static Demuxer* instance;
103     Stream videostream;
104     Stream audiostream;
105     int shutdown();
106     bool initted;
107     bool vid_seeking;
108     bool aud_seeking;
109     int video_current, audio_current;
110
111     // Video stream information
112     void setAspectRatio(enum AspectRatio);
113     Callback* callback;
114
115     int horizontal_size;
116     int vertical_size;
117     enum AspectRatio aspect_ratio;
118     int arcnt;
119     int frame_rate;
120     int bit_rate;
121     ULLONG video_pts;
122     ULLONG video_pts_seek;
123     ULLONG audio_pts;
124
125     // Constants
126     static const int demuxMemoryV = 2097152;
127     static const int demuxMemoryA = 524288;
128     static const int FrameRates[9];
129
130     enum PESTYPE
131     {
132       PESTYPE_PRIVATE_1 = 0xBD,
133
134       PESTYPE_AUD0 = 0xC0,
135       PESTYPE_AUD1,  PESTYPE_AUD2,  PESTYPE_AUD3,  PESTYPE_AUD4,
136       PESTYPE_AUD5,  PESTYPE_AUD6,  PESTYPE_AUD7,  PESTYPE_AUD8,
137       PESTYPE_AUD9,  PESTYPE_AUD10, PESTYPE_AUD11, PESTYPE_AUD12,
138       PESTYPE_AUD13, PESTYPE_AUD14, PESTYPE_AUD15, PESTYPE_AUD16,
139       PESTYPE_AUD17, PESTYPE_AUD18, PESTYPE_AUD19, PESTYPE_AUD20,
140       PESTYPE_AUD21, PESTYPE_AUD22, PESTYPE_AUD23, PESTYPE_AUD24,
141       PESTYPE_AUD25, PESTYPE_AUD26, PESTYPE_AUD27, PESTYPE_AUD28,
142       PESTYPE_AUD29, PESTYPE_AUD30, PESTYPE_AUD31,
143       PESTYPE_AUDMAX = PESTYPE_AUD31,
144
145       PESTYPE_VID0 = 0xE0,
146       PESTYPE_VID1,  PESTYPE_VID2,  PESTYPE_VID3,  PESTYPE_VID4,
147       PESTYPE_VID5,  PESTYPE_VID6,  PESTYPE_VID7,  PESTYPE_VID8,
148       PESTYPE_VID9,  PESTYPE_VID10, PESTYPE_VID11, PESTYPE_VID12,
149       PESTYPE_VID13, PESTYPE_VID14, PESTYPE_VID15,
150       PESTYPE_VIDMAX = PESTYPE_VID15
151     };
152
153 };
154
155 #endif