Source code of Windows XP (NT5)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

316 lines
9.1 KiB

#include "extra.h"
#include "fileshar.h"
#include "aviidx.h"
#include "buffer.h"
/* - - - - - - - - */
/*
** Copyright (C) Microsoft Corporation 1993. All rights reserved.
*/
/* - - - - - - - - */
#define CFactoryImpl CI // Can't handle long exported names
#define CAVIFileImpl CF // Can't handle long exported names
#define CAVIStreamImpl CS // Can't handle long exported names
/* Remove warning of using object during initialization. */
#pragma warning(disable:4355)
/* - - - - - - - - */
#define implement struct
#define implementations private
/*
** _StdClassImplementations
** Defines the standard implementations for a class object.
*/
#define _StdClassImplementations(Impl) \
STDMETHODIMP QueryInterface(REFIID riid, LPVOID FAR* ppv); \
STDMETHODIMP_(ULONG) AddRef(); \
STDMETHODIMP_(ULONG) Release()
/* - - - - - - - - */
class FAR CAVIFileCF {
public:
static HRESULT Create(const CLSID FAR& rclsid, REFIID riid, LPVOID FAR* ppv);
private:
CAVIFileCF(const CLSID FAR& rclsid, IUnknown FAR* FAR* ppUnknown);
implementations:
implement CUnknownImpl : IUnknown {
public:
_StdClassImplementations(CUnknownImpl);
CUnknownImpl(CAVIFileCF FAR* pAVIFileCF);
private:
CAVIFileCF FAR* m_pAVIFileCF;
ULONG m_refs;
};
implement CFactoryImpl : IClassFactory {
public:
_StdClassImplementations(CFactoryImpl);
CFactoryImpl(CAVIFileCF FAR* pAVIFileCF);
STDMETHODIMP CreateInstance(IUnknown FAR* pUnknownOuter, REFIID riid, LPVOID FAR* ppv);
STDMETHODIMP LockServer(BOOL fLock);
private:
CAVIFileCF FAR* m_pAVIFileCF;
};
public:
CUnknownImpl m_Unknown;
CFactoryImpl m_Factory;
public:
CLSID m_clsid;
};
/* - - - - - - - - */
class FAR CAVIFile;
class FAR CAVIStream {
public:
CAVIStream(IUnknown FAR* pUnknownOuter, IUnknown FAR* FAR* ppUnknown);
private:
implementations:
implement CUnknownImpl : IUnknown {
public:
_StdClassImplementations(CUnknownImpl);
CUnknownImpl(CAVIStream FAR* pAVIStream);
private:
CAVIStream FAR* m_pAVIStream;
ULONG m_refs;
};
implement CAVIStreamImpl : IAVIStream {
public:
_StdClassImplementations(CAVIStreamImpl);
CAVIStreamImpl(CAVIStream FAR* pAVIStream);
~CAVIStreamImpl();
STDMETHODIMP Create (THIS_ LPARAM lParam1, LPARAM lParam2);
STDMETHODIMP Info (THIS_ AVISTREAMINFO FAR * psi, LONG lSize);
STDMETHODIMP_(LONG) FindSample(THIS_ LONG lPos, LONG lFlags);
STDMETHODIMP ReadFormat (THIS_ LONG lPos,
LPVOID lpFormat, LONG FAR *cbFormat);
STDMETHODIMP SetFormat (THIS_ LONG lPos,
LPVOID lpFormat, LONG cbFormat);
STDMETHODIMP Read (THIS_ LONG lStart, LONG lSamples,
LPVOID lpBuffer, LONG cbBuffer,
LONG FAR * plBytes, LONG FAR * plSamples);
STDMETHODIMP Write (THIS_ LONG lStart, LONG lSamples,
LPVOID lpBuffer, LONG cbBuffer,
DWORD dwFlags,
LONG FAR *plSampWritten,
LONG FAR *plBytesWritten);
STDMETHODIMP Delete (THIS_ LONG lStart, LONG lSamples);
STDMETHODIMP ReadData (THIS_ DWORD fcc, LPVOID lp, LONG FAR *lpcb);
STDMETHODIMP WriteData (THIS_ DWORD fcc, LPVOID lp, LONG cb);
STDMETHODIMP Reserved1 (THIS);
STDMETHODIMP Reserved2 (THIS);
STDMETHODIMP Reserved3 (THIS);
STDMETHODIMP Reserved4 (THIS);
STDMETHODIMP Reserved5 (THIS);
private:
void ReadPalette(LONG lPos, LONG lPal, LPRGBQUAD prgb);
// private functions here?
CAVIStream FAR* m_pAVIStream;
};
implement CStreamingImpl : IAVIStreaming {
public:
_StdClassImplementations(CStreamingImpl);
CStreamingImpl(CAVIStream FAR* pAVIStream);
~CStreamingImpl();
STDMETHODIMP Begin (THIS_
LONG lStart,
LONG lEnd,
LONG lRate);
STDMETHODIMP End (THIS);
private:
// private functions here?
CAVIStream FAR* m_pAVIStream;
};
struct CMarshalImpl : IMarshal {
public:
CMarshalImpl(CAVIStream FAR* pAVIStream);
STDMETHODIMP QueryInterface(REFIID riid, LPVOID FAR* ppv);
STDMETHODIMP_(ULONG) AddRef();
STDMETHODIMP_(ULONG) Release();
// *** IMarshal methods ***
STDMETHODIMP GetUnmarshalClass (THIS_ REFIID riid, LPVOID pv,
DWORD dwDestContext, LPVOID pvDestContext,
DWORD mshlflags, LPCLSID pCid);
STDMETHODIMP GetMarshalSizeMax (THIS_ REFIID riid, LPVOID pv,
DWORD dwDestContext, LPVOID pvDestContext,
DWORD mshlflags, LPDWORD pSize);
STDMETHODIMP MarshalInterface (THIS_ LPSTREAM pStm, REFIID riid,
LPVOID pv, DWORD dwDestContext, LPVOID pvDestContext,
DWORD mshlflags);
STDMETHODIMP UnmarshalInterface (THIS_ LPSTREAM pStm, REFIID riid,
LPVOID FAR* ppv);
STDMETHODIMP ReleaseMarshalData (THIS_ LPSTREAM pStm);
STDMETHODIMP DisconnectObject (THIS_ DWORD dwReserved);
CAVIStream FAR* m_pAVIStream;
};
public:
CUnknownImpl m_Unknown;
CAVIStreamImpl m_AVIStream;
CMarshalImpl m_Marshal;
CStreamingImpl m_Streaming;
public:
IUnknown FAR* m_pUnknownOuter;
// AVIStream Instance data
AVISTREAMINFO avistream; // stream info
CAVIFile FAR * pfile;
int iStream;
PAVISTREAM paviBase;
//
// stream instance data
//
HSHFILE hshfile; // file I/O
LONG lPal; // last palette change
RGBQUAD argbq[256]; // current palette
LPVOID lpFormat; // stream format
LONG cbFormat;
LPVOID lpData; // stream handler data
LONG cbData;
EXTRA extra;
PBUFSYSTEM pb;
BOOL fInit;
PSTREAMINDEX psx;
};
/* - - - - - - - - */
#define MAXSTREAMS 64
class FAR CAVIFile {
public:
static HRESULT Create(IUnknown FAR* pUnknownOuter, REFIID riid, LPVOID FAR* ppv);
private:
CAVIFile(IUnknown FAR* pUnknownOuter, IUnknown FAR* FAR* ppUnknown);
implementations:
implement CUnknownImpl : IUnknown {
public:
_StdClassImplementations(CUnknownImpl);
CUnknownImpl(CAVIFile FAR* pAVIFile);
private:
CAVIFile FAR* m_pAVIFile;
ULONG m_refs;
};
implement CAVIFileImpl : IAVIFile {
public:
_StdClassImplementations(CAVIFileImpl);
CAVIFileImpl(CAVIFile FAR* pAVIFile);
~CAVIFileImpl();
STDMETHODIMP Open (THIS_
LPCSTR szFile,
UINT mode);
STDMETHODIMP Info (THIS_
AVIFILEINFO FAR * pfi,
LONG lSize);
STDMETHODIMP GetStream (THIS_
PAVISTREAM FAR * ppStream,
DWORD fccType,
LONG lParam);
STDMETHODIMP CreateStream (THIS_
PAVISTREAM FAR * ppStream,
AVISTREAMINFO FAR * psi);
STDMETHODIMP Save (THIS_
LPCSTR szFile,
AVICOMPRESSOPTIONS FAR *lpOptions,
AVISAVECALLBACK lpfnCallback);
STDMETHODIMP WriteData (THIS_
DWORD ckid,
LPVOID lpData,
LONG cbData);
STDMETHODIMP ReadData (THIS_
DWORD ckid,
LPVOID lpData,
LONG FAR *lpcbData);
STDMETHODIMP EndRecord (THIS);
STDMETHODIMP Reserved1 (THIS);
STDMETHODIMP Reserved2 (THIS);
STDMETHODIMP Reserved3 (THIS);
STDMETHODIMP Reserved4 (THIS);
STDMETHODIMP Reserved5 (THIS);
private:
// private functions here?
CAVIFile FAR* m_pAVIFile;
};
struct CMarshalImpl : IMarshal {
public:
CMarshalImpl(CAVIFile FAR* pAVIFile);
STDMETHODIMP QueryInterface(REFIID riid, LPVOID FAR* ppv);
STDMETHODIMP_(ULONG) AddRef();
STDMETHODIMP_(ULONG) Release();
// *** IMarshal methods ***
STDMETHODIMP GetUnmarshalClass (THIS_ REFIID riid, LPVOID pv,
DWORD dwDestContext, LPVOID pvDestContext,
DWORD mshlflags, LPCLSID pCid);
STDMETHODIMP GetMarshalSizeMax (THIS_ REFIID riid, LPVOID pv,
DWORD dwDestContext, LPVOID pvDestContext,
DWORD mshlflags, LPDWORD pSize);
STDMETHODIMP MarshalInterface (THIS_ LPSTREAM pStm, REFIID riid,
LPVOID pv, DWORD dwDestContext, LPVOID pvDestContext,
DWORD mshlflags);
STDMETHODIMP UnmarshalInterface (THIS_ LPSTREAM pStm, REFIID riid,
LPVOID FAR* ppv);
STDMETHODIMP ReleaseMarshalData (THIS_ LPSTREAM pStm);
STDMETHODIMP DisconnectObject (THIS_ DWORD dwReserved);
CAVIFile FAR* m_pAVIFile;
};
public:
CUnknownImpl m_Unknown;
CAVIFileImpl m_AVIFile;
CMarshalImpl m_Marshal;
public:
IUnknown FAR* m_pUnknownOuter;
//
// AVIFile instance data
//
MainAVIHeader FARSTRUCT avihdr; // file info
LONG lHeaderSize;
char achFile[260];
UINT mode;
HSHFILE hshfile; // file I/O
LONG lDataListStart;
BOOL fInRecord;
LONG lRecordIndex;
MMCKINFO ckRecord;
LONG lWriteLoc;
EXTRA extra;
BOOL fDirty;
CAVIStream FAR * ps[MAXSTREAMS];
PAVIINDEX px; // the index
PBUFSYSTEM pb;
};
/*
** The usage counter keeps track of the overall usage of objects based on
** implementations provided by the component. This allows one to determine
** when the implementation is no longer in use.
*/
extern UINT uUseCount;
extern BOOL fLocked;
/* - - - - - - - - */
DEFINE_AVIGUID(CLSID_AVIFile, 0x00020000, 0, 0);