www.pudn.com > XvidQP.rar > DubSource.h


//	VirtualDub - Video processing and capture application 
//	Copyright (C) 1998-2001 Avery Lee 
// 
//	This program is free software; you can redistribute it and/or modify 
//	it under the terms of the GNU General Public License as published by 
//	the Free Software Foundation; either version 2 of the License, or 
//	(at your option) any later version. 
// 
//	This program is distributed in the hope that it will be useful, 
//	but WITHOUT ANY WARRANTY; without even the implied warranty of 
//	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the 
//	GNU General Public License for more details. 
// 
//	You should have received a copy of the GNU General Public License 
//	along with this program; if not, write to the Free Software 
//	Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 
 
#ifndef f_DUBSOURCE_H 
#define f_DUBSOURCE_H 
 
#include  
#include  
 
class InputFile; 
 
class DubSource { 
private: 
	void *	format; 
	int		format_len; 
 
protected: 
	void *allocFormat(int format_len); 
	virtual BOOL _isKey(LONG lSample); 
 
public: 
	LONG lSampleFirst, lSampleLast; 
	AVISTREAMINFO	streamInfo; 
 
	DubSource(); 
	virtual ~DubSource(); 
 
	virtual BOOL init(); 
	int read(LONG lStart, LONG lCount, LPVOID lpBuffer, LONG cbBuffer, LONG *lBytesRead, LONG *lSamplesRead); 
	virtual int _read(LONG lStart, LONG lCount, LPVOID lpBuffer, LONG cbBuffer, LONG *lBytesRead, LONG *lSamplesRead) = 0; 
 
	void *getFormat() const { return format; } 
	int getFormatLen() const { return format_len; } 
 
	virtual bool isStreaming(); 
 
	BOOL isKey(LONG lSample); 
	virtual LONG nearestKey(LONG lSample); 
	virtual LONG prevKey(LONG lSample); 
	virtual LONG nextKey(LONG lSample); 
 
	virtual void streamBegin( bool fRealTime); 
	virtual void streamEnd(); 
 
	LONG msToSamples(LONG lMs) const { 
		return (LONG)(((__int64)lMs * streamInfo.dwRate + (__int64)500 * streamInfo.dwScale) / ((__int64)1000 * streamInfo.dwScale)); 
	} 
	LONG samplesToMs(LONG lSamples) const { 
		return (LONG)( 
				(((__int64)lSamples * streamInfo.dwScale) * 1000 + streamInfo.dwRate/2) / streamInfo.dwRate 
			); 
	} 
 
	// This is more accurate than AVIStreamSampleToSample(), which does a conversion to 
	// milliseconds and back. 
 
	static LONG samplesToSamples(const AVISTREAMINFO *dest, const AVISTREAMINFO *source, LONG lSamples) { 
		__int64 divisor = (__int64)source->dwRate * dest->dwScale; 
 
		return (LONG)((((__int64)lSamples * source->dwScale) * dest->dwRate + divisor/2) 
				/ divisor); 
	} 
 
	LONG samplesToSamples(const DubSource *source, LONG lSamples) const { 
		return samplesToSamples(&streamInfo, &source->streamInfo, lSamples); 
	} 
}; 
 
#endif