DMO에서 데이터 처리
[이 페이지와 연결된 기능인 DirectShow는 레거시 기능입니다. MediaPlayer, IMFMediaEngine 및 Media Foundation의 오디오/비디오 캡처로 대체되었습니다. 이러한 기능은 Windows 10 및 Windows 11 최적화되었습니다. 가능한 경우 새 코드가 DirectShow 대신 Media Foundation에서 MediaPlayer, IMFMediaEngine 및 오디오/비디오 캡처를 사용하는 것이 좋습니다. 가능한 경우 레거시 API를 사용하는 기존 코드를 다시 작성하여 새 API를 사용하도록 제안합니다.]
이 섹션에서는 DMO를 사용하여 데이터 스트림을 처리하는 방법을 설명합니다. 이 섹션에 나열된 단계는 기본 동작입니다. 모든 DDO는 여기에 설명된 메서드를 지원해야 합니다. 이러한 메서드는 입력 및 출력에 별도의 버퍼를 사용합니다. 일부 DDO는 단일 버퍼를 사용하여 현재 위치 처리를 지원합니다. 현재 위치 처리에 대한 자세한 내용은 현재 위치 처리를 참조하세요.
버퍼 할당
클라이언트는 모든 버퍼 할당을 담당합니다. DMO에서 미디어 유형을 설정한 후 각 스트림의 버퍼 요구 사항에 대해 DMO를 쿼리합니다. 미디어 유형에 따라 변경이 가능합니다. 각 스트림에 대해 IMediaObject::GetInputSizeInfo 또는 IMediaObject::GetOutputSizeInfo 메서드를 호출합니다. 이러한 메서드는 다음 정보를 반환합니다.
- 최소 버퍼 크기(바이트)입니다.
- 맞춤 요구 사항(있는 경우) 시작 주소가 지정된 일부 정수의 배수인 경우 버퍼가 정렬됩니다.
- DMO가 lookahead에 보유할 최대 데이터 양입니다. 이 숫자는 입력 스트림에만 적용됩니다. 일부 종류의 데이터(예: MPEG 인코딩)의 경우 DMO가 스트림에서 기대해야 할 수 있습니다. lookahead 값은 DMO가 출력을 생성하기 전에 필요한 입력 데이터의 양을 나타냅니다.
클라이언트는 이러한 요구 사항과 일치하는 버퍼를 할당해야 합니다. 또한 DMO에는 클라이언트가 입력 데이터를 패키지하는 방법에 대한 요구 사항이 있을 수 있습니다. 예를 들어 DMO는 각 버퍼에 정확히 하나의 샘플(또는 비디오 프레임)을 포함해야 할 수 있습니다. 이러한 요구 사항을 확인하려면 IMediaObject::GetInputStreamInfo 메서드를 호출합니다. IMediaObject::GetOutputStreamInfo 메서드는 출력 스트림에 대한 유사한 정보를 반환합니다.
기본 스트리밍 모델에서 클라이언트는 원시 버퍼 포인터를 DMO에 전달하지 않습니다. 대신 IMediaBuffer 인터페이스를 노출하는 경량 COM 개체를 사용합니다. IMediaBuffer 인터페이스는 메모리 블록에 대한 COM 래퍼 역할을 합니다. COM 개체이므로 참조 계산을 지원하므로 버퍼가 계속 사용 중인 동안 해제되지 않도록 하는 데 도움이 됩니다.
참고
IMediaBuffer 인터페이스는 DirectShow의 IMediaSample 인터페이스와 유사한 함수를 제공합니다.
클라이언트는 IMediaBuffer 개체를 구현해야 합니다. 자세한 내용은 IMediaBuffer 구현을 참조하세요.
데이터 처리
데이터를 처리하려면 다음을 수행합니다.
- 각 입력 스트림에 대해 버퍼를 입력 데이터로 채웁니다.
- IMediaObject::P rocessInput을 호출하여 각 버퍼를 전달합니다.
- IMediaObject::P rocessOutput을 호출하여 데이터를 처리합니다. 이 메서드는 각 출력 스트림에 대해 하나씩 버퍼 배열을 사용합니다.
- 입력 데이터가 더 이상 없을 때까지 반복합니다.
ProcessInput 메서드는 한 번에 하나의 스트림에 대한 입력을 허용합니다. 일반적으로 메서드는 즉시 반환되고 DMO는 IMediaBuffer 개체에 대한 참조 횟수를 보유합니다. 버퍼의 모든 데이터를 처리하거나 애플리케이션이 DMO를 플러시할 때 개체를 해제합니다. DMO에서 버퍼를 해제할 때까지 버퍼를 다시 사용하지 마세요. 입력 스트림이 더 많은 데이터를 허용할 수 있는지 여부를 확인하려면 IMediaObject::GetInputStatus 메서드를 호출합니다. 스트림이 더 많은 입력을 허용할 수 있는 경우 이 메서드는 DMO_INPUT_STATUSF_ACCEPT_DATA 플래그를 반환합니다.
ProcessOutput 메서드는 모든 출력 스트림에 대한 출력을 한 번에 생성합니다. 애플리케이션은 각 출력 스트림에 대해 하나씩 DMO_OUTPUT_DATA_BUFFER 구조의 배열을 전달합니다. 배열의 각 구조체에는 IMediaBuffer 개체에 대한 포인터가 있습니다. DMO는 버퍼에 가능한 한 많은 출력 데이터를 씁니다. 또한 작업의 상태 보고하는 다양한 플래그를 설정합니다. DMO_OUTPUT_DATA_BUFFERF_INCOMPLETE 플래그는 DMO가 기존 입력에서 더 많은 출력을 생성할 수 있음을 나타냅니다. 이 경우 클라이언트는 ProcessOutput을 다시 호출할 수 있습니다. 그렇지 않으면 더 많은 입력 데이터를 사용하여 ProcessInput 을 호출해야 합니다. DMO는 입력 버퍼의 데이터를 수정하지 않습니다. 출력 버퍼에만 씁니다.
모든 데이터를 입력 스트림에 전달한 후 IMediaObject::D iscontinuity 메서드를 호출합니다. DMO는 나머지 출력을 처리하거나 DMO를 플러시할 때까지 해당 스트림에 대한 추가 입력을 허용하지 않습니다.
스트리밍이 시작된 후 언제든지 DMO는 입력을 받거나 출력 또는 둘 다를 생성할 수 있습니다. 따라서 GetInputStatus 는 DMO_INPUT_STATUSF_ACCEPT_DATA 반환하거나 ProcessOutput은 DMO_OUTPUT_DATA_BUFFERF_INCOMPLETE 반환합니다. 애플리케이션은 이러한 플래그를 테스트하고 그에 따라 ProcessInput 또는 ProcessOutput 을 호출하여 데이터가 계속 흐르게 합니다. 데이터 흐름을 중단하려면 IMediaObject::Flush 메서드를 호출합니다. 이 메서드를 사용하면 DMO가 내부적으로 보유하고 있는 버퍼를 모두 삭제합니다.
관련 항목