|
|
#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);
|