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