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