1 /***************************************************************************
2                           ADM_pics.h  -  description
3                              -------------------
4     begin                : Mon Jun 3 2002
5     copyright            : (C) 2002/2009 by mean
6     email                : fixounet@free.fr
7  ***************************************************************************/
8 
9 /***************************************************************************
10  *                                                                         *
11  *   This program is free software; you can redistribute it and/or modify  *
12  *   it under the terms of the GNU General Public License as published by  *
13  *   the Free Software Foundation; either version 2 of the License, or     *
14  *   (at your option) any later version.                                   *
15  *                                                                         *
16  ***************************************************************************/
17 
18 #ifndef ADM_ASF_H
19 #define ADM_ASF_H
20 #include <vector>
21 using std::vector;
22 #include "ADM_Video.h"
23 //#include "ADM_queue.h"
24 
25 
26 #define ASF_MAX_AUDIO_TRACK 8
27 
28 #define WTV_CHUNK_SIZE (0x40*0x1000)
29 
30 class wtvHeader;
31 
32 typedef enum
33 {
34    ADM_CHUNK_WTV_TIMING_CHUNK,
35    ADM_CHUNK_WTV_DATA_CHUNK,
36    ADM_CHUNK_WTV_STREAM_CHUNK,
37    ADM_CHUNK_WTV_SUBTITLE_CHUNK,
38    ADM_CHUNK_WTV_LANGUAGE_CHUNK,
39 
40    ADM_CHUNK_WTV_UNKNOWN_CHUNK
41 }ADM_KNOWN_CHUNK;
42 
43 typedef struct
44 {
45   const char *name;
46   uint32_t len;
47   uint8_t val[16];
48   ADM_KNOWN_CHUNK id;
49 }chunky;
50 
51 typedef struct
52 {
53   uint32_t     streamIndex;
54   uint32_t     extraDataLen;
55   uint8_t      *extraData;
56   uint32_t     nbPackets;
57   uint32_t     length;
58   uint64_t     lastDts;
59   WAVHeader    wavHeader;
60 }wtvAudioTrak;
61 
62 /**
63     \class wtvAudioAccess
64     \brief Audio access class for asf/wmv
65 */
66 class wtvAudioAccess : public ADM_audioAccess
67 {
68   protected:
69     uint32_t                _myRank;
70     char                    *myName;
71     uint32_t                _streamId;
72     uint32_t                _dataStart;
73     FILE                    *_fd;
74     //ADM_queue               readQueue;
75     uint32_t                _packetSize;
76     class wtvHeader         *_father;
77     wtvAudioTrak            *_track;
78   public:
79                                 wtvAudioAccess(wtvHeader *father,uint32_t rank);
80     virtual                     ~wtvAudioAccess();
81 
canSeekTime(void)82     virtual bool      canSeekTime(void) {return true;};
canSeekOffset(void)83     virtual bool      canSeekOffset(void) {return true;};
canGetDuration(void)84     virtual bool      canGetDuration(void) {return true;};
85 
getLength(void)86     virtual uint32_t  getLength(void) {return _track->length;}
87     virtual bool      goToTime(uint64_t timeUs) ;
isCBR(void)88     virtual bool      isCBR(void) {return true;};
89 
90 
91     virtual uint64_t  getPos(void);
92     virtual bool      setPos(uint64_t pos);
93     virtual uint64_t  getDurationInUs(void) ;
94 
95     virtual bool   getPacket(uint8_t *buffer, uint32_t *size, uint32_t maxSize,uint64_t *dts);
96 
97 };
98 
99 /**
100     \class wtvHeader
101     \brief Asf Demuxer
102 */
103 
104 class wtvHeader         :public vidHeader
105 {
106   protected:
107     uint64_t                _duration;  // Duration 100 ns
108   protected:
109 
110     FILE                    *_fd;
111 
112     int32_t                 _videoIndex;
113     uint32_t                _videoStreamId;
114 
115     uint8_t                 close(void);
116 
117 
118   public: // Shared with audio track
119     char                    *myName;
120 
121     uint32_t                nbImage;
122     uint32_t                _nbAudioTrack;
123     wtvAudioAccess          *_audioAccess[ASF_MAX_AUDIO_TRACK];
124     wtvAudioTrak             _allAudioTracks[ASF_MAX_AUDIO_TRACK];
125     ADM_audioStream         *_audioStreams[ASF_MAX_AUDIO_TRACK];
126     // / Shared
127   public:
128                                         wtvHeader(void);
129    virtual                              ~wtvHeader();
130                 uint8_t                 open(const char *name);
131       //__________________________
132       //				 Audio
133       //__________________________
134 
135     virtual 	WAVHeader              *getAudioInfo(uint32_t i )  ;
136     virtual 	uint8_t                 getAudioStream(uint32_t i,ADM_audioStream  **audio);
137     virtual     uint8_t                 getNbAudioStreams(void);
138     // Frames
139       //__________________________
140       //				 video
141       //__________________________
142 
143     virtual 	uint8_t                 setFlag(uint32_t frame,uint32_t flags);
144     virtual 	uint32_t                getFlags(uint32_t frame,uint32_t *flags);
145     virtual 	uint8_t                 getFrameSize(uint32_t frame,uint32_t *size);
146     virtual 	uint8_t                 getFrame(uint32_t framenum,ADMCompressedImage *img);
147 
148     virtual   void                       Dump(void);
149     virtual   uint64_t                   getTime(uint32_t frameNum);
150     virtual   uint64_t                   getVideoDuration(void);
151 
152     // Return true if the container provides pts informations
providePts(void)153     virtual   bool                       providePts(void) {return false;};
154     //
155     virtual   bool                       getPtsDts(uint32_t frame,uint64_t *pts,uint64_t *dts);
156     virtual   bool                       setPtsDts(uint32_t frame,uint64_t pts,uint64_t dts);
157 
158 
159 };
160 #endif
161 
162 
163