ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 소스 필터 - DirectShow
    미디어/필터 2009. 2. 20. 22:37
    파일 소스
    네트워크 소스
    외부 장치 소스
    화면 소스(?)    // 캡쳐??


    미디어 검색(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
    .Load()
    호출을 한 번만 지원해야 한다.

    call ReadTheFile()
    call MakeMediaType()

    전달된 파일을 열고 크기를 얻어온다.
    .GetCurFile()


    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()
    불연속성


    참조 사이트:
Designed by Tistory.