1 //
2 //
3 // C++ Interface: ADM_openDML
4 //
5 // Description:
6 //
7 //
8 // Author: mean <fixounet@free.fr>, (C) 2003
9 //
10 // Copyright: See COPYING file that comes with this distribution
11 //
12 //
13 
14 
15 #ifndef __ODMLHEADER__
16 #define __ODMLHEADER__
17 #include "ADM_Video.h"
18 #include "ADM_riff.h"
19 #include "ADM_audioStream.h"
20 class AVDMGenericAudioStream;
21 
22 typedef struct odmlIndex
23 {
24 	uint64_t offset;
25 	uint64_t size;
26 	uint32_t intra;
27     uint64_t pts;
28     uint64_t dts;
29 }odmlIndex;
30 
31 typedef struct odmlTrack
32 {
33 	odmlIndex strf;
34 	odmlIndex strh;
35 	odmlIndex indx;
36 }odmlTrack;
37 /**
38     \class odmlAudioTrack
39 */
40 class ADM_aviAudioAccess;
41 class odmlAudioTrack
42 {
43 public:
44                  odmlAudioTrack(void);
45                  ~odmlAudioTrack();
46 //********************************
47                  odmlIndex               *index;
48 
49                  WAVHeader               *wavHeader;
50                  uint32_t                nbChunks;
51                  uint32_t                extraDataLen;
52                  uint8_t                 *extraData;
53                  uint32_t                trackNum;
54                  uint32_t                totalLen;
55                  AVIStreamHeader          *avistream;
56 };
57 
58 /**
59     \class OpenDMLHeader
60 */
61 class OpenDMLHeader         :public vidHeader
62 {
63 protected:
64 
65 	  uint64_t			_fileSize;
66 	  FILE 				*_fd;
67 	  odmlIndex 		*_idx;
68 	  odmlAudioTrack                *_audioTracks;
69           ADM_aviAudioAccess           **_audioAccess;
70           ADM_audioStream              **_audioStreams;
71           uint32_t                       _nbAudioTracks;
72           uint32_t                       _currentAudioTrack;
73 
74           odmlIndex                     *_audioIdx;
75 
76 	  void 				walk(riffParser *p) ;
77 	  uint32_t			_nbTrack;
78 	  uint8_t			_recHack;
79       //
80           bool              ptsAvailable;
81 	  //_________________________________________
82 	  // This is temporary stuff to read the avi
83 	  //_________________________________________
84 	  odmlTrack			_Tracks[10];
85 	  odmlIndex			_regularIndex;
86 	  odmlIndex			_movi;
87 	  //_________________________________________
88 	  // Extra data for audio & video track
89 	  //_________________________________________
90 
91 	  uint8_t			_reordered;	/// set to DTS ?
92 
93 
94           char                         *myName;
95 	  uint32_t 			countAudioTrack( void );
96 	  uint32_t  			searchAudioTrack(uint32_t which);
97 	  // _____________________________________________
98 	  //		indexer, vanilla, odml and others
99 	  // _____________________________________________
100 	  uint8_t			indexODML(uint32_t vidTrack);
101 	  uint8_t 			indexRegular(uint32_t vidTrack);
102 
103 	  uint8_t 			indexReindex(uint32_t vidTrack,uint32_t audTrack,
104                                         uint32_t audioTrackNumber);
105 					// scan one track for openDML
106 	  uint8_t			scanIndex(uint32_t track,odmlIndex **index,uint32_t *nbElem);
read32(void)107 	  uint32_t			read32( void )
108                                         {
109                                                 uint8_t i[4]={0,0,0,0};
110                                                 ADM_assert(_fd);
111                                                 if(1!=fread(i,4,1,_fd))
112                                                 {
113                                                         printf("Problem using odml read32\n");
114                                                         return 0;
115                                                 }
116                                                 return (i[3]<<24)+(i[2]<<16)+(i[1]<<8)+i[0];
117                                         };
118 
119 	  uint8_t                       computePtsDts(void);
120           uint8_t                       mpegReorder(void);
121 	  uint8_t			unpackPacked( void );
122           bool                          removeEmptyFrames (void);
123 public:
124 
125 virtual   void 				Dump(void) ;
126 
127 					OpenDMLHeader( void ) ;
128        		    			~OpenDMLHeader(  ) ;
129 // AVI io
130 virtual 	uint8_t			open(const char *name);
131 virtual 	uint8_t			close(void) ;
132   //__________________________
133   //				 Info
134   //__________________________
135 
136   //__________________________
137   //				 Audio
138   //__________________________
139 
140 virtual 	WAVHeader              *getAudioInfo(uint32_t i )  ;
141 virtual 	uint8_t                 getAudioStream(uint32_t i,ADM_audioStream  **audio);
142 virtual         uint8_t                 getNbAudioStreams(void);
143 // Frames
144   //__________________________
145   //				 video
146   //__________________________
147 
148 virtual 	uint8_t  setFlag(uint32_t frame,uint32_t flags);
149 virtual 	uint32_t getFlags(uint32_t frame,uint32_t *flags);
150 virtual 	uint8_t  getFrame(uint32_t framenum,ADMCompressedImage *img);
151 virtual 	uint8_t  getFrameSize(uint32_t frame,uint32_t *size) ;
152 
153 virtual	    uint8_t	getExtraHeaderData(uint32_t *len, uint8_t **data);
154 virtual     uint64_t    getTime(uint32_t frameNum);
155 virtual     uint64_t    getVideoDuration(void);
providePts(void)156 virtual     bool        providePts(void) {return ptsAvailable;};
157 bool                    getPtsDts(uint32_t frame,uint64_t *pts,uint64_t *dts);
158 bool                    setPtsDts(uint32_t frame,uint64_t pts,uint64_t dts);
159 
160 };
161 
162 #endif
163 
164 
165