다음을 통해 공유


데이터 처리

[DirectShow 이 페이지와 연결된 기능은 레거시 기능입니다. MediaPlayer, IMFMediaEngine, 그리고 Media Foundation 의 오디오/비디오 캡처로 대체되었습니다. 이러한 기능은 Windows 10 및 Windows 11에 최적화되었습니다. Microsoft는 가능하면 새로운 코드에서 MediaPlayer, IMFMediaEngineAudio/Video Capture를 DirectShow대신 Media Foundation 사용하는 것이 좋습니다. 가능한 경우 레거시 API를 사용하는 기존 코드를 다시 작성하여 새 API를 사용하도록 제안합니다.]

미디어 데이터 구문 분석

필터가 미디어 데이터를 구문 분석하는 경우 콘텐츠의 헤더 또는 기타 자체 설명 데이터를 신뢰하지 마세요. 예를 들어 AVI RIFF 청크 또는 MPEG 패킷에 표시되는 크기 값을 신뢰하지 마세요. 이러한 종류의 오류의 일반적인 예는 다음과 같습니다.

  • N 바이트의 데이터를 읽습니다. 이때 N 값은 콘텐츠에서 나온 것이며, 버퍼의 실제 크기에 대해 N 제대로 확인하지 않았습니다.
  • 오프셋이 버퍼 내에 속하는지 확인하지 않고 버퍼 내에서 바이트 오프셋으로 점프합니다.

또 다른 일반적인 오류 클래스에는 콘텐츠에 있는 형식 설명의 유효성을 검사하지 않는 작업이 포함됩니다. 예를 들어:

  • BITMAPINFOHEADER 구조체 뒤에 색 테이블이 있을 수 있습니다. BITMAPINFO 구조체는 BITMAPINFOHEADER 구조체로 정의되고 그 뒤에 색 테이블을 구성하는 RGBQUAD 값 배열로 정의됩니다. 배열의 크기는 biClrUsed값에 따라 결정됩니다. BITMAPINFO 구조에 할당된 버퍼의 크기를 먼저 확인하지 않고 색 테이블을 BITMAPINFO 복사하지 마세요.
  • WAVEFORMATEX 구조체에는 구조체에 추가된 추가 형식 정보가 있을 수 있습니다. cbSize 멤버는 추가 정보의 크기를 지정합니다.

핀 연결 중에 필터는 모든 형식 구조가 올바른 형식이고 적절한 값을 포함하는지 확인해야 합니다. 그렇지 않은 경우 연결을 거부합니다. 형식 구조의 유효성을 검사하는 코드에서는 특히 산술 오버플로에 주의해야 합니다. 예를 들어 BITMAPINFOHEADER너비와 높이가 32비트 값이지만 이미지 크기(둘의 곱 함수)는 DWORD 값일 뿐입니다.

원본의 서식 데이터가 할당된 버퍼보다 큰 경우 버퍼에 복사하기 위해 원본 데이터를 잘라내지 마세요. 이렇게 하면 암시적 크기가 실제 크기보다 큰 구조를 만들 수 있습니다. 예를 들어 비트맵 헤더는 더 이상 존재하지 않는 색상표 테이블을 지정할 수 있습니다. 대신 버퍼를 다시 할당하거나 연결에 실패합니다.

스트리밍 중 발생한 오류

그래프가 실행 중일 때 필터가 잘못된 형식의 콘텐츠를 수신하는 경우 스트리밍을 종료해야 합니다. 다음을 수행합니다.

서식 변경

스트림 중간 형식을 변경하는 필터에 대한 몇 가지 메커니즘이 있습니다. 각 단계에는 둘 이상의 단계가 포함되며, 이는 거짓 수용 가능성을 만듭니다. 필터가 동적 형식 변경 요청을 받는 경우 요청을 거부하거나 새 형식이 도착하면 적용해야 합니다. 마찬가지로 다른 필터가 동의하지 않는 한 형식을 전환하지 않습니다. 자세한 내용은 동적 서식 변경참조하세요.