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

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

?? dmoimpl.h

?? directX8.1版本。的頭文件和庫 雖然現(xiàn)在directX9.0版本
?? H
?? 第 1 頁 / 共 2 頁
字號:
//------------------------------------------------------------------------------
// 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
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
久久亚洲精品国产精品紫薇| 久草精品在线观看| 久久久99久久精品欧美| 欧美理论片在线| 欧美人伦禁忌dvd放荡欲情| 欧美在线综合视频| 91麻豆国产自产在线观看| 99国内精品久久| 色国产综合视频| 欧美日韩国产一区二区三区地区| 日本国产一区二区| 欧美久久高跟鞋激| 欧美tk—视频vk| 国产欧美一区二区精品性色| 中文字幕一区二区日韩精品绯色| 国产精品福利在线播放| 亚洲视频一二三区| 亚洲午夜久久久久久久久久久| 一区二区三区在线影院| 亚洲韩国精品一区| 日韩精品成人一区二区三区| 久久国产精品99久久人人澡| 国产成人午夜视频| 99久久伊人久久99| 欧美视频中文字幕| 日韩免费视频一区二区| 欧美国产视频在线| 亚洲sss视频在线视频| 日韩av一区二| 成人亚洲一区二区一| 在线视频一区二区三区| 日韩一级视频免费观看在线| 国产亲近乱来精品视频| 亚洲国产一区二区三区 | 成人高清免费在线播放| 91啪亚洲精品| 精品国产髙清在线看国产毛片| 中文在线免费一区三区高中清不卡| 亚洲欧美偷拍卡通变态| 麻豆免费看一区二区三区| 成人av电影在线播放| 欧美日本精品一区二区三区| 中文幕一区二区三区久久蜜桃| 一区二区高清免费观看影视大全| 久久不见久久见免费视频1| 91在线视频网址| 欧美成人三级在线| 亚洲一区二区偷拍精品| 成人听书哪个软件好| 日韩欧美另类在线| 亚洲一区二区免费视频| 风流少妇一区二区| 日韩视频在线观看一区二区| 亚洲视频一区二区免费在线观看| 国产一区二区三区免费观看| 欧美最新大片在线看| 欧美国产视频在线| 国产精品一区三区| 91精品蜜臀在线一区尤物| 亚洲特黄一级片| 成人小视频免费在线观看| 欧美一区二区三区系列电影| 亚洲欧洲日产国码二区| 国产精品一区二区免费不卡| 91精品国产综合久久久久久久久久 | 国产精品日日摸夜夜摸av| 久久精品99国产精品| 欧美精品久久天天躁| 亚洲国产你懂的| 91成人免费电影| 一区二区视频免费在线观看| 成人黄页毛片网站| 国产精品视频第一区| 国产精品一区二区视频| 2020国产精品久久精品美国| 捆绑调教美女网站视频一区| 日韩午夜三级在线| 免费人成精品欧美精品| 欧美精品v日韩精品v韩国精品v| 一区二区高清免费观看影视大全| 日本高清成人免费播放| 亚洲欧美色图小说| 欧美私模裸体表演在线观看| 亚洲国产日韩在线一区模特| 欧美日韩一区视频| 日韩影院精彩在线| 欧美变态tickle挠乳网站| 蜜桃一区二区三区在线| 精品电影一区二区| 精品亚洲国产成人av制服丝袜| 亚洲精品一区二区三区蜜桃下载 | 日韩精品午夜视频| 欧美一级黄色录像| 国产精品一区二区无线| 国产精品欧美一区二区三区| 99久久免费精品高清特色大片| 一区二区三区免费看视频| 欧美影视一区二区三区| 日韩av网站免费在线| 精品免费99久久| 夫妻av一区二区| 亚洲综合在线视频| 91精品国产综合久久婷婷香蕉| 国产一区二区视频在线播放| 国产精品麻豆网站| 欧美日韩精品一区视频| 久久精品免费观看| 国产精品的网站| 欧美在线观看视频在线| 久久成人av少妇免费| 国产精品色噜噜| 69久久夜色精品国产69蝌蚪网| 国内精品不卡在线| 一个色在线综合| 久久先锋影音av| 日本韩国欧美三级| 国产毛片精品视频| 亚洲一区自拍偷拍| 久久精品亚洲国产奇米99| 欧美视频一区二区三区四区 | 国产精一品亚洲二区在线视频| 中文子幕无线码一区tr| 欧美丰满高潮xxxx喷水动漫| 国产精品99久久久久| 婷婷国产在线综合| 中文字幕制服丝袜成人av| 日韩一区二区三免费高清| www.性欧美| 韩国视频一区二区| 亚洲电影一区二区| 亚洲欧洲精品天堂一级| 欧美成人女星排行榜| 欧美系列日韩一区| jlzzjlzz亚洲日本少妇| 国产一区二区毛片| 日本亚洲视频在线| 亚洲综合小说图片| 亚洲欧洲成人精品av97| 日韩免费看网站| 欧美夫妻性生活| 欧美在线视频不卡| 白白色 亚洲乱淫| 国产精品99久久不卡二区| 毛片不卡一区二区| 日韩精品一二三| 亚洲无线码一区二区三区| 一区二区三区欧美视频| 中文字幕中文在线不卡住| 久久精品视频在线看| 精品久久久久久亚洲综合网| 91精品国产色综合久久| 欧美无人高清视频在线观看| 91在线精品一区二区| heyzo一本久久综合| 岛国精品在线播放| 国产成人久久精品77777最新版本 国产成人鲁色资源国产91色综 | 国产成人综合在线观看| 国产剧情在线观看一区二区| 国产剧情一区在线| 高清在线不卡av| 国产剧情一区二区三区| 成人久久视频在线观看| 成人一道本在线| 91亚洲精品久久久蜜桃网站| 白白色亚洲国产精品| 一本到不卡免费一区二区| 91一区一区三区| 欧美午夜精品免费| 欧美一区二区三区人| 日韩免费成人网| www激情久久| 中文一区在线播放| 亚洲一区二区三区四区五区黄| 亚洲影院理伦片| 蜜桃视频一区二区三区| 盗摄精品av一区二区三区| 99麻豆久久久国产精品免费优播| 色老汉一区二区三区| 91精品一区二区三区久久久久久| 欧美成人三级在线| 亚洲欧洲无码一区二区三区| 亚洲午夜久久久久久久久久久| 青青草国产精品亚洲专区无| 国产在线精品视频| 91在线免费播放| 精品少妇一区二区三区| 国产精品乱人伦中文| 亚洲国产精品久久久久秋霞影院| 免费成人性网站| 成人丝袜高跟foot| 欧美精品aⅴ在线视频| 久久久久久久久免费| 亚洲男人的天堂在线aⅴ视频| 日一区二区三区| 成人午夜激情视频| 欧美一级日韩不卡播放免费| 国产精品久久久久久久裸模| 五月婷婷综合激情| 成人免费视频app| 日韩一区二区在线看|