HRESULT my12doomSourceStream::ChangeStart()
{
	{
		CAutoLock lock(CSourceSeeking::m_pLock);
		m_stream_start = m_rtStart;
		m_frame_number = m_rtStart * m_stream->packet_count / m_stream->length / 10000 ;

		// seek to key frame for video
		if (m_stream->type == 0 && m_stream->keyframe_count>0)
		{
			for(int i=0; i<m_stream->keyframe_count; i++)
			{
				if (m_stream->keyframes[i] == m_frame_number)
					goto flush;
			}

			for(int i=0; i<m_stream->keyframe_count-1; i++)
			{
				if (m_stream->keyframes[i] < m_frame_number && 
					m_frame_number < m_stream->keyframes[i+1])
				{
					m_frame_number = m_stream->keyframes[i];
					goto flush;
				}
			}

			m_frame_number = m_stream->keyframes[m_stream->keyframe_count-1];
		}
	}

flush:
	UpdateFromSeek();
	return S_OK;
}
Exemple #2
0
HRESULT CSubtitleStream::ChangeStart()
{
	{
		CAutoLock lock(CSourceSeeking::m_pLock);

		OnThreadCreate();
		/*
				if(m_mt.majortype == MEDIATYPE_Video && m_mt.subtype == MEDIASUBTYPE_ARGB32)
				{
					m_nPosition = (int)(m_rtStart/10000)*1/1000;
				}
				else if(m_mt.majortype == MEDIATYPE_Video && m_mt.subtype == MEDIASUBTYPE_RGB32)
				{
					int m_nSegments = 0;
					if(!m_rts.SearchSubs((int)(m_rtStart/10000), 25, &m_nPosition, &m_nSegments))
						m_nPosition = m_nSegments;
				}
				else
				{
					m_nPosition = m_rts.SearchSub((int)(m_rtStart/10000), 25);
					if(m_nPosition < 0) m_nPosition = 0;
					else if(m_rts[m_nPosition].end <= (int)(m_rtStart/10000)) m_nPosition++;
				}
		*/
	}

	UpdateFromSeek();

	return S_OK;
}
Exemple #3
0
//----------------------------------------------------------------------------
//! @brief	  	再生が開始された時にコールされる
//! @return		エラーコード
//----------------------------------------------------------------------------
HRESULT CDemuxSource::ChangeStart(void)
{
	UpdateFromSeek();
	if( m_rtStart > m_rtDuration  )
		m_rtStart = m_rtDuration;	// 丸め

	return Reader()->SetStartTime( m_rtStart );
}
HRESULT	mmSource::ChangeStart( )
{
	_RPT0(_CRT_WARN,"ChangeStart\n");
	{
		CAutoLock lock(CSourceSeeking::m_pLock);
		currentFrame = 0;
	}
	UpdateFromSeek();
	return S_OK;
}
HRESULT my12doomImageStream::ChangeStart()
{
	{
		CAutoLock lock(CSourceSeeking::m_pLock);
		m_frame_number = (int)(m_rtStart * FPS / 10000000 );
	}

	UpdateFromSeek();
	return S_OK;
}
HRESULT	mmSource::ChangeStop( )
{
	_RPT0(_CRT_WARN,"ChangeStop\n");
	{
		CAutoLock lock(CSourceSeeking::m_pLock);
		if (currentFrame < nr && times[currentFrame]*10000000 < m_rtStop) return S_OK;
	}
	UpdateFromSeek();
	return S_OK;
}
Exemple #7
0
HRESULT CFLICStream::ChangeStart()
{
    {
        CAutoLock lock(CSourceSeeking::m_pLock);
		m_rtSampleTime = 0;
		m_rtPosition = m_rtStart;
    }

    UpdateFromSeek();

    return S_OK;
}
HRESULT CSubtitleStream::ChangeStop()
{
    /*{
        CAutoLock lock(CSourceSeeking::m_pLock);
        if (m_rtPosition < m_rtStop)
            return S_OK;
    }*/
    // We're already past the new stop time -- better flush the graph.
    UpdateFromSeek();

    return S_OK;
}
Exemple #9
0
//----------------------------------------------------------------------------
//! @brief	  	再生レートが変更された時にコールされる
//! @return		エラーコード
//----------------------------------------------------------------------------
HRESULT CDemuxSource::ChangeRate(void)
{
	{	// クリティカル セクション ロックのスコープ。
		CAutoLock cAutoLock(&m_crtFilterLock);
		if( m_dRateSeeking <= 0 ) {
			m_dRateSeeking = 1.0;  // 適切な値にリセットする。
			return E_FAIL;
		}
	}
	UpdateFromSeek();
	return Reader()->SetRate( m_dRateSeeking );
}
Exemple #10
0
HRESULT CFLICStream::SetRate(double dRate)
{
	if(dRate <= 0)
		return E_INVALIDARG;

	{
		CAutoLock lock(CSourceSeeking::m_pLock);
		m_dRateSeeking = dRate;
	}

	UpdateFromSeek();

	return S_OK;
}
HRESULT my12doomSourceStream::ChangeStop()
{
	{
		CAutoLock lock(CSourceSeeking::m_pLock);
		if ((REFERENCE_TIME)(m_frame_number+1) * m_stream->length * 10000 / m_stream->packet_count < m_rtStop)
		{
			return S_OK;
		}
	}

	// We're already past the new stop time. Flush the graph.
	UpdateFromSeek();
	return S_OK;
}
HRESULT CAudioPin::ChangeRate()
{
  if( m_dRateSeeking <= 0 )
  {
    m_dRateSeeking = 1.0;  // Reset to a reasonable value.
    return E_FAIL;
  }
  
  LogDebug("audPin: ChangeRate, m_dRateSeeking %f, Force seek done %d, IsSeeking %d",(float)m_dRateSeeking, m_pTsReaderFilter->m_bSeekAfterRcDone, m_pTsReaderFilter->IsSeeking());
  if (!m_pTsReaderFilter->m_bSeekAfterRcDone && !m_pTsReaderFilter->IsSeeking()) //Don't force seek if another pin has already triggered it
  {
    m_pTsReaderFilter->m_bForceSeekAfterRateChange = true;
    m_pTsReaderFilter->SetSeeking(true);
    return UpdateFromSeek();
  }
  return S_OK;
}
HRESULT CVideoPin::ChangeRate()
{
  CDeMultiplexer& demux = m_pTsReaderFilter->GetDemultiplexer();

  if( m_dRateSeeking <= 0 )
  {
    m_dRateSeeking = 1.0;  // Reset to a reasonable value.
    return E_FAIL;
  }
  
  if( m_dRateSeeking > 4.0 && 
     ((demux.GetVideoServiceType()==SERVICE_TYPE_VIDEO_H264) || 
      (demux.GetVideoServiceType()==SERVICE_TYPE_VIDEO_MPEG4)||
      (demux.GetVideoServiceType()==SERVICE_TYPE_VIDEO_HEVC))
    )
  {
    m_dRateSeeking = 1.0;  // Reset to a reasonable value.
    return E_FAIL;
  }
  
  if( m_dRateSeeking > 2.0 && (m_pTsReaderFilter->m_videoDecoderCLSID == CLSID_FFDSHOWVIDEO))
  {
    //Some video decoders don't handle higher rates properly
    m_dRateSeeking = 1.0;  // Reset to a reasonable value.
    return E_FAIL;
  }

  LogDebug("vidPin: ChangeRate, m_dRateSeeking %f, Force seek done %d, IsSeeking %d",(float)m_dRateSeeking, m_pTsReaderFilter->m_bSeekAfterRcDone, m_pTsReaderFilter->IsSeeking());
  if (!m_pTsReaderFilter->m_bSeekAfterRcDone && !m_pTsReaderFilter->IsSeeking()) //Don't force seek if another pin has already triggered it
  {
    m_pTsReaderFilter->m_bForceSeekAfterRateChange = true;
    m_pTsReaderFilter->SetSeeking(true);
    return UpdateFromSeek();
  }

  return S_OK;
}
HRESULT CAudioPin::ChangeStop()
{
  m_pTsReaderFilter->SetSeeking(true);
  return UpdateFromSeek();
}
// CMediaSeeking
HRESULT CSubtitlePin::ChangeStart()
{
  m_pTsReaderFilter->SetSeeking(true);
  return UpdateFromSeek();
}
Exemple #16
0
//----------------------------------------------------------------------------
//! @brief	  	再生が停止された時にコールされる
//! @return		エラーコード
//----------------------------------------------------------------------------
HRESULT CDemuxSource::ChangeStop(void)
{
	UpdateFromSeek();
	return Reader()->SetEndTime(m_rtStop);
}
HRESULT my12doomImageStream::ChangeStop()
{
	// We're already past the new stop time. Flush the graph.
	UpdateFromSeek();
	return S_OK;
}