pstream.cpp.svn-base

来自「ffshow源码」· SVN-BASE 代码 · 共 197 行

SVN-BASE
197
字号
//------------------------------------------------------------------------------// File: PStream.cpp//// Desc: DirectShow base classes.//// Copyright (c) 1992-2002 Microsoft Corporation.  All rights reserved.//------------------------------------------------------------------------------#include "stdafx.h"#ifdef PERF#include <measure.h>#endif//// Constructor//CPersistStream::CPersistStream(IUnknown *punk, HRESULT *phr)    : mPS_fDirty(FALSE){    mPS_dwFileVersion = GetSoftwareVersion();}//// Destructor//CPersistStream::~CPersistStream() {    // Nothing to do}#if 0SAMPLE CODE TO COPY - not active at the moment//// NonDelegatingQueryInterface//// This object supports IPersist & IPersistStreamSTDMETHODIMP CPersistStream::NonDelegatingQueryInterface(REFIID riid, void **ppv){    if (riid == IID_IPersist) {        return GetInterface((IPersist *) this, ppv);    }    else if (riid == IID_IPersistStream) {        return GetInterface((IPersistStream *) this, ppv);    }    else {        return CUnknown::NonDelegatingQueryInterface(riid, ppv);    }}#endif//// WriteToStream//// Writes to the stream (default action is to write nothing)HRESULT CPersistStream::WriteToStream(IStream *pStream){    // You can override this to do things like    // hr = pStream->Write(MyStructure, sizeof(MyStructure), NULL);    return NOERROR;}HRESULT CPersistStream::ReadFromStream(IStream * pStream){    // You can override this to do things like    // hr = pStream->Read(MyStructure, sizeof(MyStructure), NULL);    return NOERROR;}//// Load//// Load all the data from the given streamSTDMETHODIMP CPersistStream::Load(LPSTREAM pStm){    HRESULT hr;    // Load the version number then the data    mPS_dwFileVersion = ReadInt(pStm, hr);    if (FAILED(hr)) {        return hr;    }    return ReadFromStream(pStm);}  // Load//// Save//// Save the contents of this Stream.STDMETHODIMP CPersistStream::Save(LPSTREAM pStm, BOOL fClearDirty){    HRESULT hr = WriteInt(pStm, GetSoftwareVersion());    if (FAILED(hr)) {        return hr;    }    hr = WriteToStream(pStm);    if (FAILED(hr)) {        return hr;    }    mPS_fDirty = !fClearDirty;    return hr;} // Save// WriteInt//// Writes an integer to an IStream as 11 UNICODE characters followed by one space.// You could use this for shorts or unsigneds or anything (up to 32 bits)// where the value isn't actually truncated by squeezing it into 32 bits.// Values such as (unsigned) 0x80000000 would come out as -2147483648// but would then load as 0x80000000 through ReadInt.  Cast as you please.STDAPI WriteInt(IStream *pIStream, int n){    WCHAR Buff[13];  // Allows for trailing null that we don't write    wsprintfW(Buff, L"%011d ",n);    return pIStream->Write(&(Buff[0]), 12*sizeof(WCHAR), NULL);} // WriteInt// ReadInt//// Reads an integer from an IStream.// Read as 4 bytes.  You could use this for shorts or unsigneds or anything// where the value isn't actually truncated by squeezing it into 32 bits// Striped down subset of what sscanf can do (without dragging in the C runtime)STDAPI_(int) ReadInt(IStream *pIStream, HRESULT &hr){    int Sign = 1;    unsigned int n = 0;    // result wil be n*Sign    WCHAR wch;    hr = pIStream->Read( &wch, sizeof(wch), NULL);    if (FAILED(hr)) {        return 0;    }    if (wch==L'-'){        Sign = -1;        hr = pIStream->Read( &wch, sizeof(wch), NULL);        if (FAILED(hr)) {            return 0;        }    }    for( ; ; ) {        if (wch>=L'0' && wch<=L'9') {            n = 10*n+(int)(wch-L'0');        } else if (  wch == L' '                  || wch == L'\t'                  || wch == L'\r'                  || wch == L'\n'                  || wch == L'\0'                  ) {            break;        } else {            hr = VFW_E_INVALID_FILE_FORMAT;            return 0;        }        hr = pIStream->Read( &wch, sizeof(wch), NULL);        if (FAILED(hr)) {            return 0;        }    }    if (n==0x80000000 && Sign==-1) {        // This is the negative number that has no positive version!        return (int)n;    }    else return (int)n * Sign;} // ReadInt// The microsoft C/C++ compile generates level 4 warnings to the effect that// a particular inline function (from some base class) was not needed.// This line gets rid of hundreds of such unwanted messages and makes// -W4 compilation feasible:#pragma warning(disable: 4514)

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?