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; }
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; }
//---------------------------------------------------------------------------- //! @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; }
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; }
//---------------------------------------------------------------------------- //! @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 ); }
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(); }
//---------------------------------------------------------------------------- //! @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; }