]> git.vomp.tv Git - vompclient.git/blob - draintarget.h
Preparations for dynamic mode switching
[vompclient.git] / draintarget.h
1 /*\r
2     Copyright 2004-2005 Chris Tallon\r
3 \r
4     This file is part of VOMP.\r
5 \r
6     VOMP is free software; you can redistribute it and/or modify\r
7     it under the terms of the GNU General Public License as published by\r
8     the Free Software Foundation; either version 2 of the License, or\r
9     (at your option) any later version.\r
10 \r
11     VOMP is distributed in the hope that it will be useful,\r
12     but WITHOUT ANY WARRANTY; without even the implied warranty of\r
13     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
14     GNU General Public License for more details.\r
15 \r
16     You should have received a copy of the GNU General Public License\r
17     along with VOMP; if not, write to the Free Software\r
18     Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\r
19 */\r
20 \r
21 #ifndef DRAINTARGET_H\r
22 #define DRAINTARGET_H\r
23 \r
24 #include "defines.h"\r
25 #include <list>\r
26 \r
27 #define MPTYPE_VIDEO_MPEG2 0x00\r
28 #define MPTYPE_MPEG_AUDIO 0x01\r
29 #define MPTYPE_AC3 0x02\r
30 #define MPTYPE_AC3_PRE13 0x03 //old vdr recording compatmode\r
31 #define MPTYPE_MPEG_AUDIO_LAYER3 0x04 //for media mp3 playback\r
32 #define MPTYPE_TELETEXT 0x05 //for EBU VBI teletext\r
33 #define MPTYPE_VIDEO_H264 0x06\r
34 #define MPTYPE_AAC_LATM 0x07\r
35 \r
36 \r
37 \r
38 struct MediaPacket\r
39 {\r
40   ULONG pos_buffer; //position in stream buffer\r
41   ULONG length; //length of the packet\r
42   // The fields below are not needed by the MVP\r
43   UCHAR type;\r
44   ULLONG pts;\r
45   ULLONG dts;\r
46   bool synched;\r
47   int index;\r
48 #ifndef VOMP_PLATTFORM_MVP\r
49   long long presentation_time;/* native time of plattform, in 100 ns units(Windows)*/\r
50   bool disconti;\r
51 #endif\r
52 };\r
53 \r
54 using namespace std;\r
55 typedef list<MediaPacket> MediaPacketList;\r
56 \r
57 \r
58 \r
59 class DrainTarget\r
60 {\r
61   public:\r
62     DrainTarget() {\r
63 \r
64     }\r
65     virtual ~DrainTarget(){\r
66 \r
67     }\r
68 \r
69     virtual long long SetStartOffset(long long curreftime, bool *rsync)=0;\r
70     virtual void ResetTimeOffsets()=0;\r
71 \r
72     virtual bool DrainTargetReady() {return false;}; //if the draintarget is blocking in paused state, this tells that it is ready to rumble\r
73 \r
74     virtual bool dtsTimefix(){return false;} //determines if the draintargets needs a mixure of pts and dts or not\r
75 \r
76 // The following two functions are used by the Stream\r
77 // to deliver media packets to the front end (DrainTarget).\r
78 //\r
79 // First, the Stream calls PrepareMediaSample, which gives the front end\r
80 // read-only access to the Stream's MediaPacketList. PrepareMediaSample should\r
81 // examine the list to determine how much it wishes to consume, and\r
82 // should copy any data it requires from the MediaPacket objects into\r
83 // local storage.\r
84 // This function call takes place under a mutex lock to ensure integrity\r
85 // of the list structure. It should be fast and must not contain any\r
86 // cancellation points, such as I/O calls for logging.\r
87 //\r
88 // Second, the Stream releases the mutex and calls DeliverMediaSample.\r
89 // This function delivers data from the Stream buffer to the presentation\r
90 // device and returns information to the Stream regarding how many MediaPackets\r
91 // were consumed. Any data copied from the MediaPackets objects during\r
92 // PrepareMediaSample is guaranteed by the Stream still to be valid\r
93 // during the following DeliverMediaSample call.\r
94 \r
95     // samplepos is equal to the number of bytes from the first MediaPacket\r
96     // in the list that have already been consumed in a previous call.\r
97     virtual void PrepareMediaSample(const MediaPacketList&, UINT samplepos)=0;\r
98 \r
99     // The Stream guarantees that the value of *samplepos passed to\r
100     // DeliverMediaSample will be equal to the value of samplepos passed to\r
101     // PrepareMediaSample in the previous call.\r
102     // This function should consume data from the buffer according to the\r
103     // decisions made in PrepareMediaSample. Its return value and *samplepos\r
104     // tell the Stream how much data it consumed.\r
105     // If DeliverMediaSample returns X, the Stream will remove packets 0 to X-1\r
106     // (inclusive) from the list before the next call.\r
107     // DeliverMediaSample must also set *samplepos equal to the number of bytes\r
108     // processed from packet X (usually zero).\r
109         // It is allowed, that the draintarget modifies the part of the buffer, which belongs \r
110         // to the mediapackets it is processing.\r
111     virtual UINT DeliverMediaSample(UCHAR* buffer, UINT *samplepos)=0;\r
112     // The drain target might advice the feeder about free buffers with threadSignal\r
113 \r
114 \r
115 };\r
116 \r
117 #endif\r