파일 소스
네트워크 소스
외부 장치 소스
화면 소스(?) // 캡쳐??
미디어 검색(IMediaSeeking or IMediaPosition) 기능을 구현가기 위해서는 소스 필터의 출력 핀에서 IMediaSeeking를 구현해야 한다.
pull 모드
파서 필터와 연결되기 위해서는 미디어형이 필요
주타입: MEDIATYPE_Stream
부타입: MEDIASUBTYPE_NULL // MEDIASUBTYPE_Avi, MEDIASUBTYPE_WAVE, MEDIASUBTYPE_AIFF(?), MEDIASUBTYPE_AU(?)
CAsyncReader -> CBaseFilter
.LoadType() // Access our media type
.Connect(()
m_Io // CAsyncIo
m_Stream // CAsyncStream
IFileSourceFilter
호출을 한 번만 지원해야 한다.
CAsyncOutputPin -> CBasePin
// 미디어 타입 협상
.GetMediaType()
.CheckMediaType()
.Connect()
m_pIo // CAsyncIo
IAsyncReader
.RequestAllocator()
.Request()
.WaitForNext()
.SyncReadAligned()
.SyncRead()
파서 필터가 연결(버퍼 협상) 전에 파싱할 수 있는 데이터인지 확인
IMediaSample
CAsyncIo
m_pStream // CAsyncStream
CAsyncStream
.Init()
파일 핸들과 사이즈를 넘긴다.
.SetPointer()
.Read()
push 모드
직접 파싱을 위한 루틴을 포함하고 있어야 한다. // 파서 필터 불필요
지원할 수 있는 파일인 경우 미디어형까지 추출하는 것이 좋다.
CSource -> CBaseFilter
출력 핀을 생성
.AddPin()
.RemovePin()
.GetPinCount()
.GetPin()
IFileSourceFilter
Load() // virtual
GetCurFile() // virtual
CSourceStream -> CBaseOutputPin
capCreateCaptureWindow()
capDriverConnect()
capCaptureGetSetup()
capCaptureSetSetup()
capSetCallbackOnVideoStream()
capSetCallbackOnFrame()
capDriverGetName()
capDriverGetVersion()
capDriverGetCaps()
capGetVideoFormatSize()
capGetVideoFormat()
capGrabFrame()
EOS의 생성 주체
.GetMediaType() // virtual
.DecideBufferSize() // virtual
아래 필터와 버퍼 협상
.Init()
.Exit()
.Run()
.Pause()
.Stop()
CAMThread
.CallWorker()
CMD_INIT
CMD_PAUSE
CMD_RUN
CMD_STOP
CMD_EXIT
.ThreadExists()
OnThreadCreate
OnThreadDestroy
OnThreadStartPlay
call DeliverNewSegment()
.FillBuffer() // virtual
.DeliverEndOfStream()
m_rtDuration
m_rtStart
m_rtStop
m_dRateSeeking
CSourceSeeking
on ChangeStart
미디어의 시작 위치가 바뀌었을 때
on ChangeStop
미디어의 정지 위치(?)가 변경되었을 때
on ChangeRate
재생 속도가 변경되었을 때
SetRate() // virtual
재생 속도를 변경
m_rtStart
미디어의 시작 위치(시간?)
m_rtStop
미디어의 정지 위치(시간?)
m_rtDuration
미디어의 재생 시간(?)
m_dRateSeeking // 재생 속도
.{UpdateFromSeek}()
call DeliverBeginFlush()
call Stop()
call DeliverEndFlush()
call Run()
CBasePin
Notify() // virtual
m_pFilter
CMediaType -> _AMMediaType
.AllocFormatBuffer()
IMediaSample
.GetPointer()
.GetSize()
.SetActualDataLength()
.GetActualDataLength()
.SetTime()
.SetSyncPoint()
검색의 기본 단위
.SetDiscontinuity()
불연속성
참조 사이트: