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

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

?? strmctl.cpp

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


#include <streams.h>
#include <strmctl.h>

CBaseStreamControl::CBaseStreamControl()
: m_StreamState(STREAM_FLOWING)
, m_StreamStateOnStop(STREAM_FLOWING) // means no pending stop
, m_tStartTime(MAX_TIME)
, m_tStopTime(MAX_TIME)
, m_dwStartCookie(0)
, m_dwStopCookie(0)
, m_pRefClock(NULL)
, m_FilterState(State_Stopped)
, m_bIsFlushing(FALSE)
, m_bStopSendExtra(FALSE)
{}

CBaseStreamControl::~CBaseStreamControl()
{
    // Make sure we release the clock.
    SetSyncSource(NULL);
    return;
}


STDMETHODIMP CBaseStreamControl::StopAt(const REFERENCE_TIME * ptStop, BOOL bSendExtra, DWORD dwCookie)
{
    CAutoLock lck(&m_CritSec);
    m_bStopSendExtra = FALSE;	// reset
    m_bStopExtraSent = FALSE;
    if (ptStop)
    {
        if (*ptStop == MAX_TIME)
        {
            DbgLog((LOG_TRACE,2,TEXT("StopAt: Cancel stop")));
            CancelStop();
	    // If there's now a command to start in the future, we assume
	    // they want to be stopped when the graph is first run
	    if (m_FilterState == State_Stopped && m_tStartTime < MAX_TIME) {
	        m_StreamState = STREAM_DISCARDING;
                DbgLog((LOG_TRACE,2,TEXT("graph will begin by DISCARDING")));
	    }
            return NOERROR;
        }
        DbgLog((LOG_TRACE,2,TEXT("StopAt: %dms extra=%d"),
				(int)(*ptStop/10000), bSendExtra));
	// if the first command is to stop in the future, then we assume they
        // want to be started when the graph is first run
	if (m_FilterState == State_Stopped && m_tStartTime > *ptStop) {
	    m_StreamState = STREAM_FLOWING;
            DbgLog((LOG_TRACE,2,TEXT("graph will begin by FLOWING")));
	}
        m_bStopSendExtra = bSendExtra;
        m_tStopTime = *ptStop;
        m_dwStopCookie = dwCookie;
        m_StreamStateOnStop = STREAM_DISCARDING;
    }
    else
    {
        DbgLog((LOG_TRACE,2,TEXT("StopAt: now")));
	// sending an extra frame when told to stop now would mess people up
        m_bStopSendExtra = FALSE;
        m_tStopTime = MAX_TIME;
        m_dwStopCookie = 0;
        m_StreamState = STREAM_DISCARDING;
        m_StreamStateOnStop = STREAM_FLOWING;	// no pending stop
    }
    // we might change our mind what to do with a sample we're blocking
    m_StreamEvent.Set();
    return NOERROR;
}

STDMETHODIMP CBaseStreamControl::StartAt
( const REFERENCE_TIME *ptStart, DWORD dwCookie )
{
    CAutoLock lck(&m_CritSec);
    if (ptStart)
    {
        if (*ptStart == MAX_TIME)
        {
            DbgLog((LOG_TRACE,2,TEXT("StartAt: Cancel start")));
            CancelStart();
	    // If there's now a command to stop in the future, we assume
	    // they want to be started when the graph is first run
	    if (m_FilterState == State_Stopped && m_tStopTime < MAX_TIME) {
                DbgLog((LOG_TRACE,2,TEXT("graph will begin by FLOWING")));
	        m_StreamState = STREAM_FLOWING;
	    }
            return NOERROR;
        }
        DbgLog((LOG_TRACE,2,TEXT("StartAt: %dms"), (int)(*ptStart/10000)));
	// if the first command is to start in the future, then we assume they
        // want to be stopped when the graph is first run
	if (m_FilterState == State_Stopped && m_tStopTime >= *ptStart) {
            DbgLog((LOG_TRACE,2,TEXT("graph will begin by DISCARDING")));
	    m_StreamState = STREAM_DISCARDING;
	}
        m_tStartTime = *ptStart;
        m_dwStartCookie = dwCookie;
        // if (m_tStopTime == m_tStartTime) CancelStop();
    }
    else
    {
        DbgLog((LOG_TRACE,2,TEXT("StartAt: now")));
        m_tStartTime = MAX_TIME;
        m_dwStartCookie = 0;
        m_StreamState = STREAM_FLOWING;
    }
    // we might change our mind what to do with a sample we're blocking
    m_StreamEvent.Set();
    return NOERROR;
}

//  Retrieve information about current settings
STDMETHODIMP CBaseStreamControl::GetInfo(AM_STREAM_INFO *pInfo)
{
    if (pInfo == NULL)
	return E_POINTER;

    pInfo->tStart = m_tStartTime;
    pInfo->tStop  = m_tStopTime;
    pInfo->dwStartCookie = m_dwStartCookie;
    pInfo->dwStopCookie  = m_dwStopCookie;
    pInfo->dwFlags = m_bStopSendExtra ? AM_STREAM_INFO_STOP_SEND_EXTRA : 0;
    pInfo->dwFlags |= m_tStartTime == MAX_TIME ? 0 : AM_STREAM_INFO_START_DEFINED;
    pInfo->dwFlags |= m_tStopTime == MAX_TIME ? 0 : AM_STREAM_INFO_STOP_DEFINED;
    switch (m_StreamState) {
    default:
        DbgBreak("Invalid stream state");
    case STREAM_FLOWING:
        break;
    case STREAM_DISCARDING:
        pInfo->dwFlags |= AM_STREAM_INFO_DISCARDING;
        break;
    }
    return S_OK;
}


void CBaseStreamControl::ExecuteStop()
{
    ASSERT(CritCheckIn(&m_CritSec));
    m_StreamState = m_StreamStateOnStop;
    if (m_dwStopCookie && m_pSink) {
	DbgLog((LOG_TRACE,2,TEXT("*sending EC_STREAM_CONTROL_STOPPED (%d)"),
							m_dwStopCookie));
        m_pSink->Notify(EC_STREAM_CONTROL_STOPPED, (LONG_PTR)this, m_dwStopCookie);
    }
    CancelStop(); // This will do the tidy up
}

void CBaseStreamControl::ExecuteStart()
{
    ASSERT(CritCheckIn(&m_CritSec));
    m_StreamState = STREAM_FLOWING;
    if (m_dwStartCookie) {
	DbgLog((LOG_TRACE,2,TEXT("*sending EC_STREAM_CONTROL_STARTED (%d)"),
							m_dwStartCookie));
        m_pSink->Notify(EC_STREAM_CONTROL_STARTED, (LONG_PTR)this, m_dwStartCookie);
    }
    CancelStart(); // This will do the tidy up
}

void CBaseStreamControl::CancelStop()
{
    ASSERT(CritCheckIn(&m_CritSec));
    m_tStopTime = MAX_TIME;
    m_dwStopCookie = 0;
    m_StreamStateOnStop = STREAM_FLOWING;
}

void CBaseStreamControl::CancelStart()
{
    ASSERT(CritCheckIn(&m_CritSec));
    m_tStartTime = MAX_TIME;
    m_dwStartCookie = 0;
}


// This guy will return one of the three StreamControlState's.  Here's what the caller
// should do for each one:
//
// STREAM_FLOWING:      Proceed as usual (render or pass the sample on)
// STREAM_DISCARDING:   Calculate the time 'til *pSampleStart and wait that long
//                      for the event handle (GetStreamEventHandle()).  If the
//                      wait expires, throw the sample away.  If the event
//			fires, call me back, I've changed my mind.
//			I use pSampleStart (not Stop) so that live sources don't
// 			block for the duration of their samples, since the clock
//			will always read approximately pSampleStart when called


// All through this code, you'll notice the following rules:
// - When start and stop time are the same, it's as if start was first
// - An event is considered inside the sample when it's >= sample start time
//   but < sample stop time
// - if any part of the sample is supposed to be sent, we'll send the whole
//   thing since we don't break it into smaller pieces
// - If we skip over a start or stop without doing it, we still signal the event
//   and reset ourselves in case somebody's waiting for the event, and to make
//   sure we notice that the event is past and should be forgotten
// Here are the 19 cases that have to be handled (x=start o=stop <-->=sample):
//
// 1.	xo<-->		start then stop
// 2.	ox<-->		stop then start
// 3.	 x<o->		start
// 4.	 o<x->		stop then start
// 5.	 x<-->o		start
// 6.	 o<-->x		stop
// 7.	  <x->o		start
// 8.	  <o->x		no change
// 9.	  <xo>		start
// 10.	  <ox>		stop then start
// 11.	  <-->xo	no change
// 12.	  <-->ox	no change
// 13.	 x<-->		start
// 14.    <x->		start
// 15.    <-->x		no change
// 16.   o<-->		stop
// 17.	  <o->		no change
// 18.	  <-->o		no change
// 19.    <-->		no change


enum CBaseStreamControl::StreamControlState CBaseStreamControl::CheckSampleTimes
( const REFERENCE_TIME * pSampleStart, const REFERENCE_TIME * pSampleStop )
{
    CAutoLock lck(&m_CritSec);

    ASSERT(!m_bIsFlushing);
    ASSERT(pSampleStart && pSampleStop);

    // Don't ask me how I came up with the code below to handle all 19 cases
    // - DannyMi

    if (m_tStopTime >= *pSampleStart)
    {
        if (m_tStartTime >= *pSampleStop)
	    return m_StreamState;		// cases  8 11 12 15 17 18 19
	if (m_tStopTime < m_tStartTime)
	    ExecuteStop();			// case 10
	ExecuteStart();                         // cases 3 5 7 9 13 14
	return m_StreamState;
    }

    if (m_tStartTime >= *pSampleStop)
    {
        ExecuteStop();                          // cases 6 16
        return m_StreamState;
    }

    if (m_tStartTime <= m_tStopTime)
    {
	ExecuteStart();
	ExecuteStop();
        return m_StreamState;		// case 1
    }
    else
    {
	ExecuteStop();
	ExecuteStart();
        return m_StreamState;		// cases 2 4
    }
}


enum CBaseStreamControl::StreamControlState CBaseStreamControl::CheckStreamState( IMediaSample * pSample )
{

    REFERENCE_TIME rtBufferStart, rtBufferStop;
    const BOOL bNoBufferTimes =
              pSample == NULL ||
              FAILED(pSample->GetTime(&rtBufferStart, &rtBufferStop));

    StreamControlState state;
    LONG lWait;

    do
        {
 	    // something has to break out of the blocking
            if (m_bIsFlushing || m_FilterState == State_Stopped)
		return STREAM_DISCARDING;

            if (bNoBufferTimes) {
                //  Can't do anything until we get a time stamp
                state = m_StreamState;
                break;
            } else {
                state = CheckSampleTimes( &rtBufferStart, &rtBufferStop );
                if (state == STREAM_FLOWING)
		    break;

		// we aren't supposed to send this, but we've been
		// told to send one more than we were supposed to
		// (and the stop isn't still pending and we're streaming)
		if (m_bStopSendExtra && !m_bStopExtraSent &&
					m_tStopTime == MAX_TIME &&
					m_FilterState != State_Stopped) {
		    m_bStopExtraSent = TRUE;
		    DbgLog((LOG_TRACE,2,TEXT("%d sending an EXTRA frame"),
							    m_dwStopCookie));
		    state = STREAM_FLOWING;
		    break;
		}
            }

            // We're in discarding mode

            // If we've no clock, discard as fast as we can
            if (!m_pRefClock) {
		break;

	    // If we're paused, we can't discard in a timely manner because
	    // there's no such thing as stream times.  We must block until
	    // we run or stop, or we'll end up throwing the whole stream away
	    // as quickly as possible
	    } else if (m_FilterState == State_Paused) {
		lWait = INFINITE;

	    } else {
	        // wait until it's time for the sample until we say "discard"
	        // ("discard in a timely fashion")
	        REFERENCE_TIME rtNow;
                EXECUTE_ASSERT(SUCCEEDED(m_pRefClock->GetTime(&rtNow)));
                rtNow -= m_tRunStart;   // Into relative ref-time
                lWait = LONG((rtBufferStart - rtNow)/10000); // 100ns -> ms
                if (lWait < 10) break; // Not worth waiting - discard early
	    }

    } while(WaitForSingleObject(GetStreamEventHandle(), lWait) != WAIT_TIMEOUT);

    return state;
}


void CBaseStreamControl::NotifyFilterState( FILTER_STATE new_state, REFERENCE_TIME tStart )
{
    CAutoLock lck(&m_CritSec);

    // or we will get confused
    if (m_FilterState == new_state)
	return;

    switch (new_state)
    {
        case State_Stopped:

            DbgLog((LOG_TRACE,2,TEXT("Filter is STOPPED")));

	    // execute any pending starts and stops in the right order,
	    // to make sure all notifications get sent, and we end up
	    // in the right state to begin next time (??? why not?)

	    if (m_tStartTime != MAX_TIME && m_tStopTime == MAX_TIME) {
		ExecuteStart();
	    } else if (m_tStopTime != MAX_TIME && m_tStartTime == MAX_TIME) {
		ExecuteStop();
	    } else if (m_tStopTime != MAX_TIME && m_tStartTime != MAX_TIME) {
		if (m_tStartTime <= m_tStopTime) {
		    ExecuteStart();
		    ExecuteStop();
		} else {
		    ExecuteStop();
		    ExecuteStart();
		}
	    }
	    // always start off flowing when the graph starts streaming
	    // unless told otherwise
	    m_StreamState = STREAM_FLOWING;
            m_FilterState = new_state;
            break;

        case State_Running:

            DbgLog((LOG_TRACE,2,TEXT("Filter is RUNNING")));

            m_tRunStart = tStart;
            // fall-through

        default: // case State_Paused:
            m_FilterState = new_state;
    }
    // unblock!
    m_StreamEvent.Set();
}


void CBaseStreamControl::Flushing(BOOL bInProgress)
{
    CAutoLock lck(&m_CritSec);
    m_bIsFlushing = bInProgress;
    m_StreamEvent.Set();
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲欧美激情在线| 99精品黄色片免费大全| 处破女av一区二区| 欧美肥胖老妇做爰| 国产精品久久久久久亚洲毛片 | 成人在线一区二区三区| 欧美日韩一区 二区 三区 久久精品| 精品国产凹凸成av人导航| 亚洲小说春色综合另类电影| 成人永久aaa| 久久久久久夜精品精品免费| 日韩av电影天堂| 色婷婷av一区二区三区之一色屋| 国产亚洲一区二区三区在线观看| 日本一不卡视频| 欧美日韩视频在线一区二区| 又紧又大又爽精品一区二区| 成人国产精品视频| 欧美经典一区二区| 国产乱人伦偷精品视频免下载| 制服丝袜亚洲色图| 国产综合久久久久影院| 欧美日本免费一区二区三区| 亚洲综合在线电影| 色综合久久88色综合天天| 国产精品欧美经典| 盗摄精品av一区二区三区| 久久精品一区二区三区av| 国产美女娇喘av呻吟久久| 精品国产乱码久久久久久影片| 免费观看91视频大全| 69成人精品免费视频| 偷拍与自拍一区| 69av一区二区三区| 精品影院一区二区久久久| 欧美草草影院在线视频| 国产在线播放一区三区四| 久久久久久久免费视频了| 韩国午夜理伦三级不卡影院| 久久精品夜色噜噜亚洲a∨| 国产精品一区二区在线观看不卡| 国产亚洲福利社区一区| 国产盗摄一区二区三区| 国产精品久久午夜| 91黄色免费观看| 天堂va蜜桃一区二区三区漫画版| 日韩一区二区精品葵司在线 | 亚洲男女一区二区三区| 欧美亚洲国产一区二区三区va| 亚洲国产精品欧美一二99| 欧美一区二区三区免费视频| 精品亚洲aⅴ乱码一区二区三区| 久久久噜噜噜久久中文字幕色伊伊 | 在线免费观看日本一区| 婷婷综合久久一区二区三区| 欧美一区二区三区视频| 国产91精品一区二区| 亚洲精品国产品国语在线app| 欧美人妇做爰xxxⅹ性高电影| 久久99精品国产麻豆不卡| 国产精品美女久久久久aⅴ国产馆| 91亚洲精品久久久蜜桃| 日韩高清中文字幕一区| 国产欧美一区二区三区网站| 欧美性受xxxx黑人xyx| 狠狠色综合色综合网络| 亚洲日本在线看| 精品国产亚洲一区二区三区在线观看| 国产白丝精品91爽爽久久| 亚洲成人综合网站| 国产欧美精品一区二区三区四区| 欧美最新大片在线看| 国产一区二区不卡| 亚洲国产成人av网| 欧美精彩视频一区二区三区| 欧美日韩综合色| 成人黄页在线观看| 蜜臂av日日欢夜夜爽一区| 国产精品不卡视频| 日韩视频一区二区三区在线播放 | 婷婷综合久久一区二区三区| 欧美国产欧美综合| 欧美一区二区三区免费视频 | 国产一区二区在线视频| 亚洲午夜私人影院| 国产精品久久久久久久蜜臀| 欧美成人综合网站| 91麻豆精品国产91久久久久久久久| caoporn国产精品| 国产曰批免费观看久久久| 天天综合日日夜夜精品| 伊人夜夜躁av伊人久久| 国产精品色婷婷| 久久久久国色av免费看影院| 91精品国产乱码| 欧美亚洲国产一区二区三区va| 成人黄色小视频| 国产精品1024| 黄色日韩网站视频| 精品亚洲成a人| 美女一区二区在线观看| 天天影视色香欲综合网老头| 一区二区三区**美女毛片| 亚洲欧洲日本在线| 1区2区3区欧美| 国产精品短视频| 中文字幕第一区二区| 中文字幕不卡三区| 综合网在线视频| 1区2区3区欧美| 亚洲视频免费在线| 亚洲欧美一区二区三区极速播放| 国产精品少妇自拍| 国产精品久久久久久久久免费相片 | 亚洲国产精品ⅴa在线观看| 日韩欧美一区二区视频| 欧美一区二区三区在线| 日韩视频国产视频| 久久久久久电影| 国产精品沙发午睡系列990531| 国产精品久久毛片av大全日韩| 国产精品乱人伦| 天天操天天综合网| 日韩精品免费视频人成| 看电视剧不卡顿的网站| 国产一区欧美二区| 成人精品国产免费网站| 91亚洲精品久久久蜜桃网站| 在线看国产日韩| 91精品国产手机| 久久久噜噜噜久久中文字幕色伊伊| 国产日韩av一区二区| 日韩一区有码在线| 午夜精品久久久久久不卡8050| 奇米影视在线99精品| 国产精品夜夜爽| 色av综合在线| 日韩免费观看高清完整版在线观看| 久久综合九色综合97婷婷| 国产精品久久久久久户外露出| 亚洲综合一区二区| 精品无人区卡一卡二卡三乱码免费卡| 国产精一区二区三区| 色综合久久久网| 精品欧美久久久| 亚洲欧美日韩一区二区| 免费成人av在线播放| 99久久精品免费看| 欧美一区二区美女| 亚洲婷婷综合色高清在线| 免费精品视频在线| 99久久婷婷国产综合精品| 欧美一区午夜精品| 国产精品久久久久国产精品日日| 五月婷婷综合激情| 成人av午夜电影| 欧美电影免费观看高清完整版在线| 国产精品私人影院| 蜜桃久久精品一区二区| 99视频热这里只有精品免费| 欧美一区二区美女| 亚洲精品视频免费看| 国产精品自拍一区| 91麻豆精品国产91久久久久久久久| 久久久久97国产精华液好用吗| 亚洲1区2区3区4区| 粉嫩在线一区二区三区视频| 欧美精品在线观看播放| 国产精品久久久一本精品| 激情综合一区二区三区| 欧美日韩中文国产| ...xxx性欧美| 国产乱码一区二区三区| 日韩一卡二卡三卡四卡| 一区二区三区毛片| 99精品热视频| 中文字幕欧美日韩一区| 狠狠色丁香九九婷婷综合五月| 欧美日韩在线播放一区| 一区二区在线观看视频在线观看| 懂色av一区二区夜夜嗨| 精品国产1区2区3区| 成人综合婷婷国产精品久久| 日韩欧美久久久| 日本成人在线视频网站| 欧美日韩在线播| 亚洲国产精品一区二区尤物区| av高清不卡在线| 国产精品色婷婷| 国产91在线看| 国产欧美日韩不卡| 国产精品自拍一区| 国产日韩欧美一区二区三区综合| 精品一区二区久久| 精品国产91久久久久久久妲己| 三级欧美在线一区| 91麻豆精品国产无毒不卡在线观看| 香蕉影视欧美成人| 欧美人动与zoxxxx乱| 日本最新不卡在线|