24 #ifndef GNASH_FLVPARSER_H
25 #define GNASH_FLVPARSER_H
35 #include <boost/thread/mutex.hpp>
66 boost::scoped_array<boost::uint8_t>
data;
98 boost::scoped_array<boost::uint8_t>
data;
115 static const size_t paddingBytes = 8;
131 virtual bool seek(boost::uint32_t&);
134 virtual bool parseNextChunk();
137 boost::uint64_t getBytesLoaded()
const;
142 return _indexingCompleted;
157 virtual void fetchMetaTags(OrderedMetaTags& tags, boost::uint64_t
ts);
163 FLV_AUDIO_TAG = 0x08,
164 FLV_VIDEO_TAG = 0x09,
168 struct FLVTag :
public boost::noncopyable
170 FLVTag(boost::uint8_t* stream)
173 body_size(getUInt24(stream+1)),
174 timestamp(getUInt24(stream+4) | (stream[7] << 24) )
179 boost::uint32_t body_size;
180 boost::uint32_t timestamp;
183 struct FLVAudioTag :
public boost::noncopyable
185 FLVAudioTag(
const boost::uint8_t& byte)
187 codec( (byte & 0xf0) >> 4 ),
188 samplerate( flv_audio_rates[(byte & 0x0C) >> 2] ),
189 samplesize( 1 + ((byte & 0x02) >> 1)),
190 stereo( (byte & 0x01) )
195 boost::uint8_t codec;
197 boost::uint16_t samplerate;
200 boost::uint8_t samplesize;
206 static const boost::uint16_t flv_audio_rates[];
212 FLV_VIDEO_KEYFRAME = 1,
213 FLV_VIDEO_INTERLACED = 2,
214 FLV_VIDEO_DISPOSABLE = 3
217 struct FLVVideoTag :
public boost::noncopyable
219 FLVVideoTag(
const boost::uint8_t& byte)
221 frametype( (byte & 0xf0) >> 4 ),
226 boost::uint8_t frametype;
228 boost::uint8_t codec;
236 bool parseNextTag(
bool index_only);
238 std::auto_ptr<EncodedAudioFrame> parseAudioTag(
const FLVTag& flvtag,
239 const FLVAudioTag& audiotag, boost::uint32_t thisTagPos);
241 std::auto_ptr<EncodedVideoFrame> parseVideoTag(
const FLVTag& flvtag,
242 const FLVVideoTag& videotag, boost::uint32_t thisTagPos);
244 void indexAudioTag(
const FLVTag& tag, boost::uint32_t thisTagPos);
246 void indexVideoTag(
const FLVTag& tag,
const FLVVideoTag& videotag,
247 boost::uint32_t thisTagPos);
255 static boost::uint32_t getUInt24(boost::uint8_t* in);
259 boost::uint64_t _lastParsedPosition;
262 boost::uint64_t _nextPosToIndex;
269 size_t _nextAudioFrame;
276 size_t _nextVideoFrame;
284 std::auto_ptr<EncodedAudioFrame>
285 readAudioFrame(boost::uint32_t dataSize, boost::uint32_t timestamp);
287 std::auto_ptr<EncodedVideoFrame>
288 readVideoFrame(boost::uint32_t dataSize, boost::uint32_t timestamp);
293 typedef std::map<boost::uint64_t, long> CuePointsMap;
294 CuePointsMap _cuePoints;
296 bool _indexingCompleted;
300 boost::mutex _metaTagsMutex;