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

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? vtrans.cpp

?? 用DirectX制作高級動畫-[Advanced.Animation.with.DirectX]
?? CPP
?? 第 1 頁 / 共 2 頁
字號:
//------------------------------------------------------------------------------
// File: Vtrans.cpp
//
// Desc: DirectShow base classes.
//
// Copyright (c) 1992-2002 Microsoft Corporation.  All rights reserved.
//------------------------------------------------------------------------------


#include <streams.h>
#include <measure.h>
// #include <vtransfr.h>         // now in precomp file streams.h

CVideoTransformFilter::CVideoTransformFilter
    ( TCHAR *pName, LPUNKNOWN pUnk, REFCLSID clsid)
    : CTransformFilter(pName, pUnk, clsid)
    , m_itrLate(0)
    , m_nKeyFramePeriod(0)      // No QM until we see at least 2 key frames
    , m_nFramesSinceKeyFrame(0)
    , m_bSkipping(FALSE)
    , m_tDecodeStart(0)
    , m_itrAvgDecode(300000)    // 30mSec - probably allows skipping
    , m_bQualityChanged(FALSE)
{
#ifdef PERF
    RegisterPerfId();
#endif //  PERF
}


CVideoTransformFilter::~CVideoTransformFilter()
{
  // nothing to do
}


// Reset our quality management state

HRESULT CVideoTransformFilter::StartStreaming()
{
    m_itrLate = 0;
    m_nKeyFramePeriod = 0;       // No QM until we see at least 2 key frames
    m_nFramesSinceKeyFrame = 0;
    m_bSkipping = FALSE;
    m_tDecodeStart = 0;
    m_itrAvgDecode = 300000;     // 30mSec - probably allows skipping
    m_bQualityChanged = FALSE;
    m_bSampleSkipped = FALSE;
    return NOERROR;
}


// Overriden to reset quality management information

HRESULT CVideoTransformFilter::EndFlush()
{
    {
        //  Synchronize
        CAutoLock lck(&m_csReceive);

        // Reset our stats
        //
        // Note - we don't want to call derived classes here,
        // we only want to reset our internal variables and this
        // is a convenient way to do it
        CVideoTransformFilter::StartStreaming();
    }
    return CTransformFilter::EndFlush();
}


HRESULT CVideoTransformFilter::AbortPlayback(HRESULT hr)
{
    NotifyEvent(EC_ERRORABORT, hr, 0);
    m_pOutput->DeliverEndOfStream();
    return hr;
}


// Receive()
//
// Accept a sample from upstream, decide whether to process it
// or drop it.  If we process it then get a buffer from the
// allocator of the downstream connection, transform it into the
// new buffer and deliver it to the downstream filter.
// If we decide not to process it then we do not get a buffer.

// Remember that although this code will notice format changes coming into
// the input pin, it will NOT change its output format if that results
// in the filter needing to make a corresponding output format change.  Your
// derived filter will have to take care of that.  (eg. a palette change if
// the input and output is an 8 bit format).  If the input sample is discarded
// and nothing is sent out for this Receive, please remember to put the format
// change on the first output sample that you actually do send.
// If your filter will produce the same output type even when the input type
// changes, then this base class code will do everything you need.

HRESULT CVideoTransformFilter::Receive(IMediaSample *pSample)
{
    // If the next filter downstream is the video renderer, then it may
    // be able to operate in DirectDraw mode which saves copying the data
    // and gives higher performance.  In that case the buffer which we
    // get from GetDeliveryBuffer will be a DirectDraw buffer, and
    // drawing into this buffer draws directly onto the display surface.
    // This means that any waiting for the correct time to draw occurs
    // during GetDeliveryBuffer, and that once the buffer is given to us
    // the video renderer will count it in its statistics as a frame drawn.
    // This means that any decision to drop the frame must be taken before
    // calling GetDeliveryBuffer.

    ASSERT(CritCheckIn(&m_csReceive));
    AM_MEDIA_TYPE *pmtOut, *pmt;
#ifdef DEBUG
    FOURCCMap fccOut;
#endif
    HRESULT hr;
    ASSERT(pSample);
    IMediaSample * pOutSample;

    // If no output pin to deliver to then no point sending us data
    ASSERT (m_pOutput != NULL) ;

    // The source filter may dynamically ask us to start transforming from a
    // different media type than the one we're using now.  If we don't, we'll
    // draw garbage. (typically, this is a palette change in the movie,
    // but could be something more sinister like the compression type changing,
    // or even the video size changing)

#define rcS1 ((VIDEOINFOHEADER *)(pmt->pbFormat))->rcSource
#define rcT1 ((VIDEOINFOHEADER *)(pmt->pbFormat))->rcTarget

    pSample->GetMediaType(&pmt);
    if (pmt != NULL && pmt->pbFormat != NULL) {

	// spew some debug output
	ASSERT(!IsEqualGUID(pmt->majortype, GUID_NULL));
#ifdef DEBUG
        fccOut.SetFOURCC(&pmt->subtype);
	LONG lCompression = HEADER(pmt->pbFormat)->biCompression;
	LONG lBitCount = HEADER(pmt->pbFormat)->biBitCount;
	LONG lStride = (HEADER(pmt->pbFormat)->biWidth * lBitCount + 7) / 8;
	lStride = (lStride + 3) & ~3;
        DbgLog((LOG_TRACE,3,TEXT("*Changing input type on the fly to")));
        DbgLog((LOG_TRACE,3,TEXT("FourCC: %lx Compression: %lx BitCount: %ld"),
		fccOut.GetFOURCC(), lCompression, lBitCount));
        DbgLog((LOG_TRACE,3,TEXT("biHeight: %ld rcDst: (%ld, %ld, %ld, %ld)"),
		HEADER(pmt->pbFormat)->biHeight,
		rcT1.left, rcT1.top, rcT1.right, rcT1.bottom));
        DbgLog((LOG_TRACE,3,TEXT("rcSrc: (%ld, %ld, %ld, %ld) Stride: %ld"),
		rcS1.left, rcS1.top, rcS1.right, rcS1.bottom,
		lStride));
#endif

	// now switch to using the new format.  I am assuming that the
	// derived filter will do the right thing when its media type is
	// switched and streaming is restarted.

	StopStreaming();
	m_pInput->CurrentMediaType() = *pmt;
	DeleteMediaType(pmt);
	// if this fails, playback will stop, so signal an error
	hr = StartStreaming();
	if (FAILED(hr)) {
	    return AbortPlayback(hr);
	}
    }

    // Now that we have noticed any format changes on the input sample, it's
    // OK to discard it.

    if (ShouldSkipFrame(pSample)) {
        MSR_NOTE(m_idSkip);
        m_bSampleSkipped = TRUE;
        return NOERROR;
    }

    // Set up the output sample
    hr = InitializeOutputSample(pSample, &pOutSample);

    if (FAILED(hr)) {
        return hr;
    }

    m_bSampleSkipped = FALSE;

    // The renderer may ask us to on-the-fly to start transforming to a
    // different format.  If we don't obey it, we'll draw garbage

#define rcS ((VIDEOINFOHEADER *)(pmtOut->pbFormat))->rcSource
#define rcT ((VIDEOINFOHEADER *)(pmtOut->pbFormat))->rcTarget

    pOutSample->GetMediaType(&pmtOut);
    if (pmtOut != NULL && pmtOut->pbFormat != NULL) {

	// spew some debug output
	ASSERT(!IsEqualGUID(pmtOut->majortype, GUID_NULL));
#ifdef DEBUG
        fccOut.SetFOURCC(&pmtOut->subtype);
	LONG lCompression = HEADER(pmtOut->pbFormat)->biCompression;
	LONG lBitCount = HEADER(pmtOut->pbFormat)->biBitCount;
	LONG lStride = (HEADER(pmtOut->pbFormat)->biWidth * lBitCount + 7) / 8;
	lStride = (lStride + 3) & ~3;
        DbgLog((LOG_TRACE,3,TEXT("*Changing output type on the fly to")));
        DbgLog((LOG_TRACE,3,TEXT("FourCC: %lx Compression: %lx BitCount: %ld"),
		fccOut.GetFOURCC(), lCompression, lBitCount));
        DbgLog((LOG_TRACE,3,TEXT("biHeight: %ld rcDst: (%ld, %ld, %ld, %ld)"),
		HEADER(pmtOut->pbFormat)->biHeight,
		rcT.left, rcT.top, rcT.right, rcT.bottom));
        DbgLog((LOG_TRACE,3,TEXT("rcSrc: (%ld, %ld, %ld, %ld) Stride: %ld"),
		rcS.left, rcS.top, rcS.right, rcS.bottom,
		lStride));
#endif

	// now switch to using the new format.  I am assuming that the
	// derived filter will do the right thing when its media type is
	// switched and streaming is restarted.

	StopStreaming();
	m_pOutput->CurrentMediaType() = *pmtOut;
	DeleteMediaType(pmtOut);
	hr = StartStreaming();

	if (SUCCEEDED(hr)) {
 	    // a new format, means a new empty buffer, so wait for a keyframe
	    // before passing anything on to the renderer.
	    // !!! a keyframe may never come, so give up after 30 frames
            DbgLog((LOG_TRACE,3,TEXT("Output format change means we must wait for a keyframe")));
	    m_nWaitForKey = 30;

	// if this fails, playback will stop, so signal an error
	} else {

            //  Must release the sample before calling AbortPlayback
            //  because we might be holding the win16 lock or
            //  ddraw lock

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
成人激情黄色小说| 国产91在线看| 亚洲影院在线观看| 国产精品美女www爽爽爽| 国产视频一区在线观看| 国产三级欧美三级| 欧美激情一区二区| 1024亚洲合集| 亚洲免费在线播放| 午夜一区二区三区视频| 夜夜嗨av一区二区三区| 午夜久久电影网| 日本怡春院一区二区| 久久激情五月激情| 国产一区欧美一区| 成人午夜视频免费看| 91在线码无精品| 欧美日韩国产123区| 欧美久久久久中文字幕| 91精品中文字幕一区二区三区| 欧美一级在线观看| 久久精品网站免费观看| 国产精品免费视频网站| 亚洲另类色综合网站| 天堂一区二区在线免费观看| 美女视频黄久久| 成人免费观看视频| 日韩综合一区二区| 国产成人鲁色资源国产91色综| av一本久道久久综合久久鬼色| 欧美亚洲国产怡红院影院| 欧美一区二区三区思思人| 国产三级欧美三级| 亚洲国产精品久久一线不卡| 蜜桃精品视频在线| 99久久国产综合精品女不卡| 欧美精品成人一区二区三区四区| 久久综合色播五月| 亚洲综合区在线| 国产福利精品一区二区| 在线观看不卡视频| 久久久精品tv| 午夜欧美电影在线观看| 国产成人免费在线视频| 欧美电影一区二区三区| 日本一区二区三区视频视频| 亚洲www啪成人一区二区麻豆| 韩国在线一区二区| 久久这里都是精品| 亚洲精品一二三| 国产激情一区二区三区四区| 欧美日韩久久一区二区| 国产精品久久网站| 美女爽到高潮91| 欧美影院一区二区三区| 国产精品福利电影一区二区三区四区| 日韩二区三区在线观看| 在线免费观看视频一区| 国产精品毛片久久久久久久| 国产一二精品视频| 日韩精品一区二区三区蜜臀| 午夜亚洲福利老司机| 91在线看国产| 国产精品福利一区| 国v精品久久久网| 久久久影院官网| 看国产成人h片视频| 91精品国产日韩91久久久久久| 亚洲人xxxx| 91色porny在线视频| 中文字幕av一区二区三区高| 国产精品一区二区三区99| 26uuu欧美| 国产成人在线视频网站| 久久久久久黄色| 韩国午夜理伦三级不卡影院| 日韩欧美在线网站| 国产激情视频一区二区在线观看| 日韩精品一区二区三区swag | 欧美日韩成人高清| 一区二区免费视频| 欧美性生活久久| 亚洲成人综合网站| 欧美日韩国产高清一区| 免费视频一区二区| 2欧美一区二区三区在线观看视频| 麻豆精品国产91久久久久久| 欧美成人vr18sexvr| 黄色小说综合网站| 亚洲国产高清不卡| 91亚洲精品乱码久久久久久蜜桃| 亚洲另类一区二区| 欧美精品xxxxbbbb| 久久99国产精品久久99| 国产日韩欧美麻豆| 色综合欧美在线| 亚洲国产精品影院| 欧美不卡在线视频| 国产成人精品午夜视频免费 | 99在线热播精品免费| 亚洲免费视频成人| 欧美一级免费观看| 成人午夜免费av| 亚洲动漫第一页| 26uuu亚洲婷婷狠狠天堂| 丁香六月综合激情| 亚洲午夜在线电影| 精品国产sm最大网站| 成人国产在线观看| 五月婷婷激情综合| 国产欧美精品一区二区三区四区 | 国产精品一区二区不卡| 一区二区中文视频| 91精品国产一区二区| 大桥未久av一区二区三区中文| 亚洲人精品午夜| 欧美mv日韩mv国产网站app| 91在线观看视频| 极品少妇一区二区| 亚洲不卡一区二区三区| 国产欧美一区二区精品婷婷| 欧美日韩国产一级二级| 国产91在线观看丝袜| 日韩电影在线看| 亚洲精品v日韩精品| 欧美精品一区二区不卡| 欧美日韩aaaaa| 成人av综合一区| 精品亚洲成a人| 午夜电影一区二区| 中文字幕一区二区三区av| 欧美mv日韩mv亚洲| 国产日韩v精品一区二区| 欧美精品视频www在线观看| 成人av先锋影音| 国产一区二区不卡在线 | 久久成人免费电影| 亚洲一区在线电影| 亚洲欧美日韩一区| 中文字幕 久热精品 视频在线 | 国产精品色哟哟| 精品久久久久99| 欧美丰满少妇xxxbbb| 在线亚洲高清视频| 一本到高清视频免费精品| 夫妻av一区二区| 国产精品66部| 国产乱码精品一区二区三区av| 奇米精品一区二区三区四区| 亚洲福利视频导航| 丝袜美腿高跟呻吟高潮一区| 亚洲综合在线第一页| 一个色在线综合| 一区二区三区在线观看国产| 综合欧美亚洲日本| 18成人在线观看| 亚洲在线观看免费视频| 亚洲欧美色一区| 亚洲永久免费av| 日韩1区2区3区| 精彩视频一区二区| 懂色av一区二区三区免费看| 国产乱码精品一区二区三区忘忧草 | 欧美日韩一区中文字幕| 欧美午夜精品久久久久久孕妇| 在线亚洲高清视频| 欧美日韩精品一区二区| 欧美一区二区视频观看视频| 日韩欧美一级二级| 久久亚洲一区二区三区明星换脸| 久久精品一区二区三区av| 国产精品视频第一区| 亚洲另类在线制服丝袜| 午夜不卡在线视频| 九九国产精品视频| 成年人午夜久久久| 精品视频一区二区三区免费| 在线综合+亚洲+欧美中文字幕| 精品久久久久久久久久久久久久久久久| 精品国产伦理网| 综合激情网...| 日本不卡1234视频| 成人性视频网站| 欧美性猛交xxxx黑人交| 久久女同精品一区二区| 亚洲欧美另类久久久精品2019 | 欧美二区三区的天堂| 久久综合久色欧美综合狠狠| 国产精品女人毛片| 天天影视色香欲综合网老头| 久久66热re国产| 一本大道av一区二区在线播放| 欧美日韩国产高清一区二区三区 | 欧美激情综合五月色丁香 | 欧美日韩黄视频| 国产精品久久午夜夜伦鲁鲁| 午夜久久久久久久久| 成人午夜在线免费| 欧美大肚乱孕交hd孕妇| 亚洲视频中文字幕|