]> git.vomp.tv Git - vompclient.git/blob - demuxer.h
Count frames properly in VDR 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 #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 class Demuxer
41 {
42 protected:
43   class PESPacket
44   {
45     public:
46       PESPacket();
47       void init(UCHAR type);
48       int  write(UCHAR* buf, int len);
49 #ifndef NEW_DEMUXER
50       int  submit();
51 #else
52       int  submit(ULLONG cur_pos);
53 #endif
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);
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     int writeAudio();
81     int writeVideo();
82
83     virtual int scan(UCHAR* buf, int len) = 0;
84     virtual int findVideoPTS(UCHAR* buf, int len, ULLONG* dest) = 0;
85 #ifndef NEW_DEMUXER
86     virtual int put(UCHAR* buf, int len) = 0;
87 #else
88     virtual int put(UCHAR* buf, int len,ULLONG cur_pos) = 0;
89 #endif
90     virtual void setFrameNum(ULONG frame) {}
91     virtual ULONG getFrameNumFromPTS(ULLONG pts) {return 0;}
92
93     int getHorizontalSize() { return horizontal_size; }
94     int getVerticalSize() { return vertical_size; }
95     int getAspectRatio() { return aspect_ratio; }
96     int getFrameRate() { return frame_rate; }
97     int getBitRate() { return bit_rate; }
98     ULLONG getVideoPTS() { return video_pts; }
99
100     enum AspectRatio
101     {
102       ASPECT_4_3  = 2,
103       ASPECT_16_9 = 3
104     };
105
106   protected:
107     // General demuxer objects and status indicators
108     static Demuxer* instance;
109     Stream videostream;
110     Stream audiostream;
111     int shutdown();
112     bool initted;
113     bool vid_seeking;
114     bool aud_seeking;
115     int video_current, audio_current;
116
117     // Video stream information
118     void setAspectRatio(enum AspectRatio);
119     Callback* callback;
120
121     int horizontal_size;
122     int vertical_size;
123     enum AspectRatio aspect_ratio;
124     int arcnt;
125     int frame_rate;
126     int bit_rate;
127     ULLONG video_pts;
128     ULLONG video_pts_seek;
129     ULLONG audio_pts;
130
131     // Constants
132     static const int demuxMemoryV = 2097152;
133     static const int demuxMemoryA = 524288;
134     static const int FrameRates[9];
135
136     enum PESTYPE
137     {
138       PESTYPE_PRIVATE_1 = 0xBD,
139
140       PESTYPE_AUD0 = 0xC0,
141       PESTYPE_AUD1,  PESTYPE_AUD2,  PESTYPE_AUD3,  PESTYPE_AUD4,
142       PESTYPE_AUD5,  PESTYPE_AUD6,  PESTYPE_AUD7,  PESTYPE_AUD8,
143       PESTYPE_AUD9,  PESTYPE_AUD10, PESTYPE_AUD11, PESTYPE_AUD12,
144       PESTYPE_AUD13, PESTYPE_AUD14, PESTYPE_AUD15, PESTYPE_AUD16,
145       PESTYPE_AUD17, PESTYPE_AUD18, PESTYPE_AUD19, PESTYPE_AUD20,
146       PESTYPE_AUD21, PESTYPE_AUD22, PESTYPE_AUD23, PESTYPE_AUD24,
147       PESTYPE_AUD25, PESTYPE_AUD26, PESTYPE_AUD27, PESTYPE_AUD28,
148       PESTYPE_AUD29, PESTYPE_AUD30, PESTYPE_AUD31,
149       PESTYPE_AUDMAX = PESTYPE_AUD31,
150
151       PESTYPE_VID0 = 0xE0,
152       PESTYPE_VID1,  PESTYPE_VID2,  PESTYPE_VID3,  PESTYPE_VID4,
153       PESTYPE_VID5,  PESTYPE_VID6,  PESTYPE_VID7,  PESTYPE_VID8,
154       PESTYPE_VID9,  PESTYPE_VID10, PESTYPE_VID11, PESTYPE_VID12,
155       PESTYPE_VID13, PESTYPE_VID14, PESTYPE_VID15,
156       PESTYPE_VIDMAX = PESTYPE_VID15
157     };
158
159 };
160
161 #endif