亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? dmoimpl.h

?? directX8.1版本。的頭文件和庫(kù) 雖然現(xiàn)在directX9.0版本
?? H
?? 第 1 頁(yè) / 共 2 頁(yè)
字號(hào):
//------------------------------------------------------------------------------
// File: DMOImpl.h
//
// Desc: Classes to implement a DMO.
//
// Copyright (c) 2000-2001, Microsoft Corporation.  All rights reserved.
//------------------------------------------------------------------------------


#ifndef _dmoimpl_h_
#define _dmoimpl_h_

#ifdef _DEBUG
#include <crtdbg.h>
#endif

//  Class to implement a DMO
//
//
//       Assumes the number of input and output streams is fixed
//       (these are template parameters)
//
//       Provides following services:
//
//          Basic parameter checking and locking
//          Fully implements :
//                 GetStreamCount
//                 SetInputType
//                 SetOutputType
//                 GetCurrentInputType
//                 GetCurrentOutputType
//
//          Checks if all types are set before streaming
//          Automatically calls AllocateStreamingResources before streaming
//              if it's not been called already
//          Prevents streaming until the types on all non-optional streams
//              have been set
//
//
//  Derived class implements the following methods :
//
/*
   HRESULT InternalGetInputStreamInfo(DWORD dwInputStreamIndex, DWORD *pdwFlags);
   HRESULT InternalGetOutputStreamInfo(DWORD dwOutputStreamIndex, DWORD *pdwFlags);
   HRESULT InternalCheckInputType(DWORD dwInputStreamIndex, const DMO_MEDIA_TYPE *pmt);
   HRESULT InternalCheckOutputType(DWORD dwOutputStreamIndex, const DMO_MEDIA_TYPE *pmt);
   HRESULT InternalGetInputType(DWORD dwInputStreamIndex, DWORD dwTypeIndex,
                            DMO_MEDIA_TYPE *pmt);
   HRESULT InternalGetOutputType(DWORD dwOutputStreamIndex, DWORD dwTypeIndex,
                            DMO_MEDIA_TYPE *pmt);
   HRESULT InternalGetInputSizeInfo(DWORD dwInputStreamIndex, DWORD *pcbSize,
                            DWORD *pcbMaxLookahead, DWORD *pcbAlignment);
   HRESULT InternalGetOutputSizeInfo(DWORD dwOutputStreamIndex, DWORD *pcbSize,
                             DWORD *pcbAlignment);
   HRESULT InternalGetInputMaxLatency(DWORD dwInputStreamIndex, REFERENCE_TIME *prtMaxLatency);
   HRESULT InternalSetInputMaxLatency(DWORD dwInputStreamIndex, REFERENCE_TIME rtMaxLatency);
   HRESULT InternalFlush();
   HRESULT InternalDiscontinuity(DWORD dwInputStreamIndex);
   HRESULT InternalAllocateStreamingResources();
   HRESULT InternalFreeStreamingResources();
   HRESULT InternalProcessInput(DWORD dwInputStreamIndex, IMediaBuffer *pBuffer,
                               DWORD dwFlags, REFERENCE_TIME rtTimestamp,
                               REFERENCE_TIME rtTimelength);
   HRESULT InternalProcessOutput(DWORD dwFlags, DWORD cOutputBufferCount,
                               DMO_OUTPUT_DATA_BUFFER *pOutputBuffers,
                           DWORD *pdwStatus);
   HRESULT InternalAcceptingInput(DWORD dwInputStreamIndex);
   void Lock();
   void Unlock();

   Notes:
       The derived class is meant to do most work to initialize streaming
       in AllocateStreamingResources rather than when types are set.

       This centralizes the work to one
       clear place based on the types set for all streams.

       The derived class implements locking.

       The derived class implements the IUnknown methods

   Usage example (1 input and 1 output) :
   class CMyDMO : public IMediaObjectImpl<CMyDmo, 1, 1>,
                  ...
*/


#define INTERNAL_CALL(_T_, _X_) \
    static_cast<_T_ *>(this)->Internal##_X_

template <class _DERIVED_, int NUMBEROFINPUTS, int NUMBEROFOUTPUTS>
class IMediaObjectImpl : public IMediaObject
{
private:
    // Member variables
    struct {
        DWORD   fTypeSet:1;
        DWORD   fIncomplete:1;
        DMO_MEDIA_TYPE CurrentMediaType;
    } m_InputInfo[NUMBEROFINPUTS], m_OutputInfo[NUMBEROFOUTPUTS];

    bool m_fTypesSet;
    bool m_fFlushed;
    bool m_fResourcesAllocated;

protected:

    //  Helpers
    bool InputTypeSet(DWORD ulInputStreamIndex) const
    {
        _ASSERTE(ulInputStreamIndex < NUMBEROFINPUTS);
        return 0 != m_InputInfo[ulInputStreamIndex].fTypeSet;
    }

    bool OutputTypeSet(DWORD ulOutputStreamIndex) const
    {
        _ASSERTE(ulOutputStreamIndex < NUMBEROFOUTPUTS);
        return 0 != m_OutputInfo[ulOutputStreamIndex].fTypeSet;
    }
    const DMO_MEDIA_TYPE *InputType(DWORD ulInputStreamIndex)
    {
        if (!InputTypeSet(ulInputStreamIndex)) {
            return NULL;
        }
        return &m_InputInfo[ulInputStreamIndex].CurrentMediaType;
    }
    const DMO_MEDIA_TYPE *OutputType(DWORD ulOutputStreamIndex)
    {
        if (!OutputTypeSet(ulOutputStreamIndex)) {
            return NULL;
        }
        return &m_OutputInfo[ulOutputStreamIndex].CurrentMediaType;
    }


    class LockIt
    {
    public:
        LockIt(_DERIVED_ *p) : m_p(p)
        {
            static_cast<_DERIVED_ *>(m_p)->Lock();
        }
        ~LockIt()
        {
            static_cast<_DERIVED_ *>(m_p)->Unlock();
        }
        _DERIVED_ *const m_p;
    };

    bool CheckTypesSet()
    {
        m_fTypesSet = false;
        DWORD dw;
        for (dw = 0; dw < NUMBEROFINPUTS; dw++) {
            if (!InputTypeSet(dw)) {
                return false;
            }
        }
        for (dw = 0; dw < NUMBEROFOUTPUTS; dw++) {
            if (!OutputTypeSet(dw)) {
                //  Check if it's optional
                DWORD dwFlags;
#ifdef _DEBUG
                dwFlags = 0xFFFFFFFF;
#endif
                INTERNAL_CALL(_DERIVED_, GetOutputStreamInfo)(dw, &dwFlags);
                _ASSERTE(0 == (dwFlags & ~(DMO_OUTPUT_STREAMF_WHOLE_SAMPLES |
                                         DMO_OUTPUT_STREAMF_SINGLE_SAMPLE_PER_BUFFER |
                                         DMO_OUTPUT_STREAMF_FIXED_SAMPLE_SIZE |
                                         DMO_OUTPUT_STREAMF_DISCARDABLE |
                                         DMO_OUTPUT_STREAMF_OPTIONAL)));
                if (!(dwFlags & DMO_OUTPUT_STREAMF_OPTIONAL)) {
                    return false;
                }
            }
        }
        m_fTypesSet = true;
        return true;
    }


    IMediaObjectImpl() :
        m_fTypesSet(false),
        m_fFlushed(true),
        m_fResourcesAllocated(false)
    {
        ZeroMemory(&m_InputInfo, sizeof(m_InputInfo));
        ZeroMemory(&m_OutputInfo, sizeof(m_OutputInfo));
    }

    virtual ~IMediaObjectImpl() {
        DWORD dwCurrentType;

        for (dwCurrentType = 0; dwCurrentType < NUMBEROFINPUTS; dwCurrentType++) {
            if(InputTypeSet(dwCurrentType)) {
                MoFreeMediaType(&m_InputInfo[dwCurrentType].CurrentMediaType);
            }
        }

        for (dwCurrentType = 0; dwCurrentType < NUMBEROFOUTPUTS; dwCurrentType++) {
            if(OutputTypeSet(dwCurrentType)) {
                MoFreeMediaType(&m_OutputInfo[dwCurrentType].CurrentMediaType);
            }
        }
    }


    // IMediaObject methods


    //
    // IMediaObject methods
    //
    STDMETHODIMP GetStreamCount(unsigned long *pulNumberOfInputStreams, unsigned long *pulNumberOfOutputStreams)
    {
        LockIt lck(static_cast<_DERIVED_ *>(this));
        if (pulNumberOfInputStreams == NULL ||
            pulNumberOfOutputStreams == NULL) {
            return E_POINTER;
        }
        *pulNumberOfInputStreams  = NUMBEROFINPUTS;
        *pulNumberOfOutputStreams = NUMBEROFOUTPUTS;
        return S_OK;
    }

    STDMETHODIMP GetInputStreamInfo(ULONG ulStreamIndex, DWORD *pdwFlags)
    {
        LockIt lck(static_cast<_DERIVED_ *>(this));
        if (ulStreamIndex >= NUMBEROFINPUTS) {
            return DMO_E_INVALIDSTREAMINDEX;
        }
        if (pdwFlags == NULL) {
            return E_POINTER;
        }
        HRESULT hr = INTERNAL_CALL(_DERIVED_, GetInputStreamInfo)(ulStreamIndex, pdwFlags);
        _ASSERTE(0 == (*pdwFlags & ~(DMO_INPUT_STREAMF_WHOLE_SAMPLES |
                                   DMO_INPUT_STREAMF_SINGLE_SAMPLE_PER_BUFFER |
                                   DMO_INPUT_STREAMF_FIXED_SAMPLE_SIZE |
                                   DMO_INPUT_STREAMF_HOLDS_BUFFERS)));
        return hr;
    }

    STDMETHODIMP GetOutputStreamInfo(ULONG ulStreamIndex, DWORD *pdwFlags)
    {
        LockIt lck(static_cast<_DERIVED_ *>(this));
        if (ulStreamIndex >= NUMBEROFOUTPUTS) {
            return DMO_E_INVALIDSTREAMINDEX;
        }
        if (pdwFlags == NULL) {
            return E_POINTER;
        }
        HRESULT hr = INTERNAL_CALL(_DERIVED_, GetOutputStreamInfo)(ulStreamIndex, pdwFlags);
        _ASSERTE(0 == (*pdwFlags & ~(DMO_OUTPUT_STREAMF_WHOLE_SAMPLES |
                                   DMO_OUTPUT_STREAMF_SINGLE_SAMPLE_PER_BUFFER |
                                   DMO_OUTPUT_STREAMF_FIXED_SAMPLE_SIZE |
                                   DMO_OUTPUT_STREAMF_DISCARDABLE |
                                   DMO_OUTPUT_STREAMF_OPTIONAL)));
        return hr;
    }

    STDMETHODIMP GetInputType(ULONG ulStreamIndex, ULONG ulTypeIndex, DMO_MEDIA_TYPE *pmt) {
        if (ulStreamIndex >= NUMBEROFINPUTS) {
            return DMO_E_INVALIDSTREAMINDEX;
        }
        LockIt lck(static_cast<_DERIVED_ *>(this));
        return INTERNAL_CALL(_DERIVED_, GetInputType)(ulStreamIndex, ulTypeIndex, pmt);
    }

    STDMETHODIMP GetOutputType(ULONG ulStreamIndex, ULONG ulTypeIndex, DMO_MEDIA_TYPE *pmt) {
        if (ulStreamIndex >= NUMBEROFOUTPUTS) {
            return DMO_E_INVALIDSTREAMINDEX;
        }
        LockIt lck(static_cast<_DERIVED_ *>(this));
        return INTERNAL_CALL(_DERIVED_, GetOutputType)(ulStreamIndex, ulTypeIndex, pmt);
    }

    STDMETHODIMP GetInputCurrentType(ULONG ulStreamIndex, DMO_MEDIA_TYPE *pmt) {
        if (ulStreamIndex >= NUMBEROFINPUTS) {
            return DMO_E_INVALIDSTREAMINDEX;
        }
        if (NULL == pmt) {
            return E_POINTER;
        }
        LockIt lck(static_cast<_DERIVED_ *>(this));
        if (InputTypeSet(ulStreamIndex))
            return MoCopyMediaType(pmt,
                                   &m_InputInfo[ulStreamIndex].CurrentMediaType);
        else
           return DMO_E_TYPE_NOT_SET;
    }

    STDMETHODIMP GetOutputCurrentType(ULONG ulStreamIndex, DMO_MEDIA_TYPE *pmt) {
        if (ulStreamIndex >= NUMBEROFOUTPUTS) {
            return DMO_E_INVALIDSTREAMINDEX;
        }
        if (NULL == pmt) {
            return E_POINTER;
        }
        LockIt lck(static_cast<_DERIVED_ *>(this));
        if (OutputTypeSet(ulStreamIndex))
            return MoCopyMediaType(pmt,
                                   &m_OutputInfo[ulStreamIndex].CurrentMediaType);
        else
           return DMO_E_TYPE_NOT_SET;
    }

    STDMETHODIMP GetInputSizeInfo(ULONG ulStreamIndex, ULONG *pulSize, ULONG *pcbMaxLookahead, ULONG *pulAlignment) {
        if (ulStreamIndex >= NUMBEROFINPUTS) {
            return DMO_E_INVALIDSTREAMINDEX;
        }
        if (NULL == pulSize || NULL == pulAlignment ||
            NULL == pcbMaxLookahead) {
            return E_POINTER;
        }
        LockIt lck(static_cast<_DERIVED_ *>(this));
        if (!InputTypeSet(ulStreamIndex)) {
           return DMO_E_TYPE_NOT_SET;
        }
        return INTERNAL_CALL(_DERIVED_, GetInputSizeInfo)(ulStreamIndex, pulSize, pcbMaxLookahead, pulAlignment);
    }

    STDMETHODIMP GetOutputSizeInfo(ULONG ulStreamIndex, ULONG *pulSize, ULONG *pulAlignment) {
        if (ulStreamIndex >= NUMBEROFOUTPUTS) {

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲成人av一区| 亚洲黄网站在线观看| va亚洲va日韩不卡在线观看| 国产女主播视频一区二区| 91视频免费看| 蜜臀av一区二区在线观看| 国产日本欧洲亚洲| 欧美军同video69gay| 成人永久免费视频| 亚洲成a人片在线观看中文| 国产丝袜在线精品| 欧美天堂一区二区三区| 国产999精品久久| 91国产丝袜在线播放| 国产麻豆日韩欧美久久| 一区二区三区高清| 中文字幕第一区二区| 制服丝袜中文字幕一区| 99久久99久久精品免费看蜜桃| 美腿丝袜亚洲色图| 亚洲国产美国国产综合一区二区| 中文字幕欧美三区| 久久久久九九视频| 久久婷婷综合激情| 久久综合九色综合97_久久久| 91精品婷婷国产综合久久| 色av成人天堂桃色av| 国产成人精品三级麻豆| 日韩精品电影一区亚洲| 亚洲欧美日韩国产中文在线| 久久一二三国产| 欧美成人高清电影在线| 欧美怡红院视频| 欧美在线视频全部完| 99国产欧美另类久久久精品| av亚洲精华国产精华精| 国产一区二区精品久久91| 六月丁香婷婷久久| 国产美女一区二区| 成人av在线播放网站| 国产精品亚洲一区二区三区在线 | 亚洲国产精品久久久男人的天堂| 久久精品这里都是精品| 亚洲sss视频在线视频| 欧美一区二区精品久久911| 91精品国产色综合久久不卡蜜臀| 国产欧美在线观看一区| 亚洲一区二区三区小说| 粉嫩蜜臀av国产精品网站| 日本国产一区二区| 国产日韩亚洲欧美综合| 日精品一区二区| 国产在线日韩欧美| 97国产精品videossex| 欧美日韩国产在线观看| 国产精品视频免费| 激情欧美一区二区三区在线观看| 欧美日韩一级片网站| 黄色小说综合网站| 色婷婷精品久久二区二区蜜臀av| 在线电影欧美成精品| 亚洲精品久久7777| 国产一区91精品张津瑜| 日韩视频一区二区三区在线播放| 夜夜揉揉日日人人青青一国产精品| 国产成人综合亚洲网站| 欧美一区二区三区不卡| 亚洲激情自拍偷拍| 国产在线视视频有精品| 欧美日韩国产综合草草| 亚洲欧洲韩国日本视频| 激情综合五月婷婷| 2022国产精品视频| 国产一区二区在线影院| 精品国精品国产| 亚洲一区二区三区四区中文字幕| 粉嫩一区二区三区在线看| 欧美精品国产精品| 亚洲亚洲人成综合网络| 色婷婷精品久久二区二区蜜臂av| 国产色产综合产在线视频| 国产很黄免费观看久久| 国产日韩欧美制服另类| 国产尤物一区二区| 91精品国产91综合久久蜜臀| 午夜av一区二区三区| 欧美一区二区三区在| 美腿丝袜亚洲三区| 日本一区二区三区免费乱视频| 国产成人av在线影院| 欧美激情一区二区三区四区| 国内精品久久久久影院薰衣草| 久久久国产综合精品女国产盗摄| 成人高清伦理免费影院在线观看| 热久久国产精品| 亚洲欧美日韩国产综合| 国产视频视频一区| 久久久www成人免费毛片麻豆| 欧美精品在线视频| 26uuuu精品一区二区| 日韩精品1区2区3区| 日韩欧美国产三级电影视频| 男男gaygay亚洲| 亚洲人成网站影音先锋播放| 国产精品无遮挡| 欧美日韩国产首页在线观看| 国产精一品亚洲二区在线视频| 亚洲妇女屁股眼交7| 久久综合国产精品| 51精品久久久久久久蜜臀| 国产精品系列在线播放| 全国精品久久少妇| 有码一区二区三区| 日韩欧美的一区| 色婷婷久久久久swag精品 | 天天色 色综合| 亚洲欧美日韩国产成人精品影院 | 日韩精品在线一区二区| 国产在线日韩欧美| 日韩不卡一二三区| 免费成人美女在线观看| 老司机精品视频导航| 九九视频精品免费| 国产精品1区2区| 91啪亚洲精品| 欧美妇女性影城| ww亚洲ww在线观看国产| 亚洲国产成人私人影院tom| 91精品国产综合久久精品app| 日韩经典一区二区| 国产精品无人区| 国模冰冰炮一区二区| 亚洲日本乱码在线观看| 欧美日韩www| 国产成人亚洲综合色影视| 亚洲午夜一二三区视频| 国产欧美精品一区二区色综合朱莉 | 99久久综合国产精品| 欧美性色黄大片| 亚洲国产综合91精品麻豆| 欧美日韩成人在线| 久草在线在线精品观看| 久久久久久综合| a在线欧美一区| 日本欧美韩国一区三区| 欧美va在线播放| 懂色av一区二区在线播放| 亚洲妇女屁股眼交7| 欧美xxxxxxxx| www.亚洲人| 99re免费视频精品全部| 久久99精品久久久久久国产越南 | 亚洲成人激情av| 亚洲国产日韩av| 日本伊人午夜精品| 激情另类小说区图片区视频区| 激情深爱一区二区| 91免费看片在线观看| 精品视频999| 日韩精品影音先锋| 亚洲免费视频成人| 国内精品国产成人国产三级粉色| 免费一区二区视频| 欧美人牲a欧美精品| 欧美性三三影院| 日本色综合中文字幕| 555www色欧美视频| 亚洲国产精品一区二区www在线| 热久久国产精品| 黄页视频在线91| 欧美中文字幕一区二区三区亚洲| 欧美电影免费观看高清完整版 | 波波电影院一区二区三区| 日韩中文字幕一区二区三区| 欧美成人在线直播| 在线亚洲精品福利网址导航| 国产麻豆午夜三级精品| 日本欧美肥老太交大片| 亚洲一区二区三区四区不卡| 国产精品伦一区二区三级视频| 精品免费国产二区三区| 欧美精品色一区二区三区| 色伊人久久综合中文字幕| 成人激情午夜影院| 久久国产剧场电影| 婷婷国产v国产偷v亚洲高清| 一个色综合av| 亚洲免费观看视频| 中文字幕在线一区免费| 国产日韩欧美高清| 精品国产凹凸成av人网站| 日韩视频一区二区三区在线播放| 欧美日韩国产在线观看| 欧美亚洲精品一区| 色偷偷成人一区二区三区91| 国产精品福利影院| 国产成人免费视| 国产欧美一区二区三区在线老狼| 日本最新不卡在线| 日韩欧美一卡二卡|