24 #ifndef GNASH_FLVPARSER_H
25 #define GNASH_FLVPARSER_H
33 #include <boost/thread/mutex.hpp>
64 boost::scoped_array<boost::uint8_t>
data;
96 boost::scoped_array<boost::uint8_t>
data;
113 static const size_t paddingBytes = 8;
129 virtual bool seek(boost::uint32_t&);
132 virtual bool parseNextChunk();
135 boost::uint64_t getBytesLoaded()
const;
138 bool indexingCompleted()
const
140 return _indexingCompleted;
155 virtual void fetchMetaTags(OrderedMetaTags& tags, boost::uint64_t
ts);
161 FLV_AUDIO_TAG = 0x08,
162 FLV_VIDEO_TAG = 0x09,
166 struct FLVTag :
public boost::noncopyable
168 FLVTag(boost::uint8_t* stream)
171 body_size(getUInt24(stream+1)),
172 timestamp(getUInt24(stream+4) | (stream[7] << 24) )
177 boost::uint32_t body_size;
178 boost::uint32_t timestamp;
181 struct FLVAudioTag :
public boost::noncopyable
183 FLVAudioTag(
const boost::uint8_t& byte)
185 codec( (byte & 0xf0) >> 4 ),
186 samplerate( flv_audio_rates[(byte & 0x0C) >> 2] ),
187 samplesize( 1 + ((byte & 0x02) >> 1)),
188 stereo( (byte & 0x01) )
193 boost::uint8_t codec;
195 boost::uint16_t samplerate;
198 boost::uint8_t samplesize;
204 static const boost::uint16_t flv_audio_rates[];
210 FLV_VIDEO_KEYFRAME = 1,
211 FLV_VIDEO_INTERLACED = 2,
212 FLV_VIDEO_DISPOSABLE = 3
215 struct FLVVideoTag :
public boost::noncopyable
217 FLVVideoTag(
const boost::uint8_t& byte)
219 frametype( (byte & 0xf0) >> 4 ),
224 boost::uint8_t frametype;
226 boost::uint8_t codec;
234 bool parseNextTag(
bool index_only);
236 std::auto_ptr<EncodedAudioFrame> parseAudioTag(
const FLVTag& flvtag,
237 const FLVAudioTag& audiotag, boost::uint32_t thisTagPos);
239 std::auto_ptr<EncodedVideoFrame> parseVideoTag(
const FLVTag& flvtag,
240 const FLVVideoTag& videotag, boost::uint32_t thisTagPos);
242 void indexAudioTag(
const FLVTag& tag, boost::uint32_t thisTagPos);
244 void indexVideoTag(
const FLVTag& tag,
const FLVVideoTag& videotag,
245 boost::uint32_t thisTagPos);
253 static boost::uint32_t getUInt24(boost::uint8_t* in);
257 boost::uint64_t _lastParsedPosition;
260 boost::uint64_t _nextPosToIndex;
267 size_t _nextAudioFrame;
274 size_t _nextVideoFrame;
282 std::auto_ptr<EncodedAudioFrame>
283 readAudioFrame(boost::uint32_t dataSize, boost::uint32_t timestamp);
285 std::auto_ptr<EncodedVideoFrame>
286 readVideoFrame(boost::uint32_t dataSize, boost::uint32_t timestamp);
291 typedef std::map<boost::uint64_t, long> CuePointsMap;
292 CuePointsMap _cuePoints;
294 bool _indexingCompleted;
298 boost::mutex _metaTagsMutex;