windows-nt/Source/XPSP1/NT/multimedia/media/avi/avifile.16/device.cpp
2020-09-26 16:20:57 +08:00

317 lines
5.7 KiB
C++
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/* - - - - - - - - */
/*
** Copyright (C) Microsoft Corporation 1993. All rights reserved.
*/
/* - - - - - - - - */
#include <win32.h>
#include <compobj.h>
#include <avifmt.h>
#include "avifile.h"
#include "avifilei.h"
#include "debug.h"
/* - - - - - - - - */
UINT uUseCount;
BOOL fLocked;
/* - - - - - - - - */
STDAPI DllCanUnloadNow(
void)
{
return ResultFromScode((fLocked || uUseCount) ? S_FALSE : S_OK);
}
/* - - - - - - - - */
HRESULT CAVIFile::Create(
IUnknown FAR* pUnknownOuter,
const IID FAR& riid,
void FAR* FAR* ppv)
{
IUnknown FAR* pUnknown;
CAVIFile FAR* pAVIFile;
HRESULT hresult;
pAVIFile = new FAR CAVIFile(pUnknownOuter, &pUnknown);
if (!pAVIFile)
return ResultFromScode(E_OUTOFMEMORY);
hresult = pUnknown->QueryInterface(riid, ppv);
if (FAILED(GetScode(hresult)))
delete pAVIFile;
return hresult;
}
/* - - - - - - - - */
CAVIFile::CAVIFile(
IUnknown FAR* pUnknownOuter,
IUnknown FAR* FAR* ppUnknown) :
m_Unknown(this),
m_AVIFile(this),
m_Marshal(this)
{
hshfile = 0;
achFile[0] = '\0';
fInRecord = FALSE;
lWriteLoc = 0;
fDirty = 0;
extra.lp = 0;
extra.cb = 0;
_fmemset(&avihdr, 0, sizeof(avihdr));
avihdr.dwStreams = 0;
lHeaderSize = 0;
px = NULL;
pb = NULL;
if (pUnknownOuter) {
DPF("(F) Being aggregated!\n");
m_pUnknownOuter = pUnknownOuter;
} else
m_pUnknownOuter = &m_Unknown;
*ppUnknown = &m_Unknown;
}
/* - - - - - - - - */
CAVIFile::CUnknownImpl::CUnknownImpl(
CAVIFile FAR* pAVIFile)
{
m_pAVIFile = pAVIFile;
m_refs = 0;
}
/* - - - - - - - - */
STDMETHODIMP CAVIFile::CUnknownImpl::QueryInterface(
const IID FAR& iid,
void FAR* FAR* ppv)
{
if (iid == IID_IUnknown || iid == CLSID_AVISimpleUnMarshal)
*ppv = &m_pAVIFile->m_Unknown;
else if (iid == IID_IAVIFile)
*ppv = &m_pAVIFile->m_AVIFile;
#if 0
else if (iid == IID_IMarshal) {
DPF("(F) QueryInterface (IMarshal)\n");
*ppv = &m_pAVIFile->m_Marshal;
}
#endif
else
return ResultFromScode(E_NOINTERFACE);
AddRef();
return AVIERR_OK;
}
/* - - - - - - - - */
STDMETHODIMP_(ULONG) CAVIFile::CUnknownImpl::AddRef()
{
DPF2("File %lx: Usage++=%lx\n", (DWORD) (LPVOID) this, m_refs + 1);
if (m_pAVIFile->hshfile)
shfileAddRef(m_pAVIFile->hshfile);
uUseCount++;
return ++m_refs;
}
/* - - - - - - - - */
CAVIFile::CAVIFileImpl::CAVIFileImpl(
CAVIFile FAR* pAVIFile)
{
m_pAVIFile = pAVIFile;
}
/* - - - - - - - - */
CAVIFile::CAVIFileImpl::~CAVIFileImpl()
{
}
/* - - - - - - - - */
STDMETHODIMP CAVIFile::CAVIFileImpl::QueryInterface(
const IID FAR& iid,
void FAR* FAR* ppv)
{
return m_pAVIFile->m_pUnknownOuter->QueryInterface(iid, ppv);
}
/* - - - - - - - - */
STDMETHODIMP_(ULONG) CAVIFile::CAVIFileImpl::AddRef()
{
return m_pAVIFile->m_pUnknownOuter->AddRef();
}
/* - - - - - - - - */
STDMETHODIMP_(ULONG) CAVIFile::CAVIFileImpl::Release()
{
return m_pAVIFile->m_pUnknownOuter->Release();
}
/* - - - - - - - - */
/* - - - - - - - - */
CAVIStream::CAVIStream(
IUnknown FAR* pUnknownOuter,
IUnknown FAR* FAR* ppUnknown) :
m_Unknown(this),
m_AVIStream(this),
m_Marshal(this),
m_Streaming(this)
{
paviBase = NULL;
hshfile = 0;
lpFormat = NULL;
cbFormat = 0;
lpData = NULL;
cbData = 0;
extra.lp = NULL;
extra.cb = 0;
psx = NULL;
lPal = 0;
pb = NULL;
fInit = FALSE;
if (pUnknownOuter) {
DPF("(S) Being aggregated!\n");
m_pUnknownOuter = pUnknownOuter;
}
else
m_pUnknownOuter = &m_Unknown;
*ppUnknown = &m_Unknown;
}
/* - - - - - - - - */
CAVIStream::CUnknownImpl::CUnknownImpl(
CAVIStream FAR* pAVIStream)
{
m_pAVIStream = pAVIStream;
m_refs = 0;
}
/* - - - - - - - - */
STDMETHODIMP CAVIStream::CUnknownImpl::QueryInterface(
const IID FAR& iid,
void FAR* FAR* ppv)
{
if (iid == IID_IUnknown || iid == CLSID_AVISimpleUnMarshal)
*ppv = &m_pAVIStream->m_Unknown;
else if (iid == IID_IAVIStream)
*ppv = &m_pAVIStream->m_AVIStream;
else if (iid == IID_IAVIStreaming)
*ppv = &m_pAVIStream->m_Streaming;
#if 0
else if (iid == IID_IMarshal) {
DPF("(S) QueryInterface (IMarshal)\n");
*ppv = &m_pAVIStream->m_Marshal;
}
#endif
else
return ResultFromScode(E_NOINTERFACE);
AddRef();
return NULL;
}
/* - - - - - - - - */
STDMETHODIMP_(ULONG) CAVIStream::CUnknownImpl::AddRef()
{
uUseCount++;
if (m_pAVIStream->hshfile)
shfileAddRef(m_pAVIStream->hshfile);
if (m_refs < 20) {
DPF2("Stream %lx: Usage++=%lx\n", (DWORD) (LPVOID) this, m_refs + 1);
}
return ++m_refs;
}
/* - - - - - - - - */
CAVIStream::CAVIStreamImpl::CAVIStreamImpl(
CAVIStream FAR* pAVIStream)
{
m_pAVIStream = pAVIStream;
}
/* - - - - - - - - */
CAVIStream::CAVIStreamImpl::~CAVIStreamImpl()
{
}
/* - - - - - - - - */
STDMETHODIMP CAVIStream::CAVIStreamImpl::QueryInterface(
const IID FAR& iid,
void FAR* FAR* ppv)
{
return m_pAVIStream->m_pUnknownOuter->QueryInterface(iid, ppv);
}
/* - - - - - - - - */
STDMETHODIMP_(ULONG) CAVIStream::CAVIStreamImpl::AddRef()
{
return m_pAVIStream->m_pUnknownOuter->AddRef();
}
/* - - - - - - - - */
STDMETHODIMP_(ULONG) CAVIStream::CAVIStreamImpl::Release()
{
return m_pAVIStream->m_pUnknownOuter->Release();
}
/* - - - - - - - - */
CAVIStream::CStreamingImpl::CStreamingImpl(
CAVIStream FAR* pAVIStream)
{
m_pAVIStream = pAVIStream;
}
/* - - - - - - - - */
CAVIStream::CStreamingImpl::~CStreamingImpl()
{
}
/* - - - - - - - - */
STDMETHODIMP CAVIStream::CStreamingImpl::QueryInterface(
const IID FAR& iid,
void FAR* FAR* ppv)
{
return m_pAVIStream->m_pUnknownOuter->QueryInterface(iid, ppv);
}
/* - - - - - - - - */
STDMETHODIMP_(ULONG) CAVIStream::CStreamingImpl::AddRef()
{
return m_pAVIStream->m_pUnknownOuter->AddRef();
}
/* - - - - - - - - */
STDMETHODIMP_(ULONG) CAVIStream::CStreamingImpl::Release()
{
return m_pAVIStream->m_pUnknownOuter->Release();
}
/* - - - - - - - - */