| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849 | #ifndef NULLSOFT_IN_FLV_FLVREADER_H#define NULLSOFT_IN_FLV_FLVREADER_H#include <windows.h>#include <bfc/platform/types.h>#include "FLVStreamheader.h"#include "../nu/AutoLock.h"#include "BackgroundDownloader.h"#include "FLVProcessor.h"class FLVReader : private Downloader::DownloadCallback{public:	FLVReader(const wchar_t *_url);	~FLVReader();	bool GetFrame(size_t frameIndex, FrameData &frameData);	bool GetPosition(int time_in_ms, size_t *frameIndex, bool needVideoKeyFrame);	uint64_t Seek(uint64_t position);	size_t Read(void *data, size_t bytes);	void Kill();	void SignalKill();	bool IsEOF();	uint32_t GetMaxTimestamp();	uint64_t GetProcessedPosition();	bool IsStreaming();	FLVHeader *GetHeader();private:	void ProcessFile();	int OnConnect(api_httpreceiver *http);	int OnData(void *data, size_t datalen);	int Process();	DWORD CALLBACK ParserThread();	static DWORD CALLBACK ParserThreadStub(LPVOID param) { return ((FLVReader *)param)->ParserThread(); }private:	bool killswitch;	HANDLE flvThread;	bool end_of_stream;	wchar_t *url;	/* because we won't know until after opening the stream whether it's progressive download	or a real-time stream, we need have a pointer to a virtual base class to do the processing	we'll create a different one depending on what kind of stream */	FLVProcessor *processor;};#endif
 |