다음을 통해 공유


비디오 렌더러의 원본 및 대상 사각형

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

비디오 미디어 유형의 VIDEOINFO, VIDEOINFOHEADERVIDEOINFOHEADER2 형식 구조에는 세 가지 크기가 있습니다. 이 문서에서는 해당 항목의 내용과 작동 방식에 대해 설명합니다.

첫째, 이 구조물의 bmiHeader 일원에 있는 크기가 있습니다. bmiHeader 멤버는 자체 너비 및 높이 멤버인 bmiHeader.biWidthbmiHeader.biHeight를 사용하는 BITMAPINFOHEADER 구조체입니다.

둘째, 이러한 구조체의 rcSource 멤버에 사각형이 있습니다. 마지막으로 이러한 구조체의 rcTarget 멤버에 사각형이 있습니다.

A와 B라는 두 개의 필터가 있고 이러한 필터가 특정 비디오 미디어 형식으로 서로 연결되어 있다고 가정합니다(왼쪽에는 A, 오른쪽에는 업스트림, B는 다운스트림).

필터 A와 B 간에 전달되는 버퍼의 크기는 (bmiHeader.biWidth, bmiHeader.biHeight)입니다. 필터 A는 rcSource 에 의해 결정된 입력 비디오의 일부를 가져와서 버퍼의 rcTarget 부분을 채우도록 해당 비디오를 늘여야 합니다. 사용할 입력 비디오의 부분은 rcSource 가 원래 연결된 A 및 B를 필터링하는 미디어 형식의 (biWidth, biHeight) 크기와 비교하는 방법을 기반으로 합니다. rcSource가 비어 있는 경우 필터 A는 전체 입력 비디오를 사용합니다. rcTarget이 비어 있으면 필터 A가 전체 출력 버퍼를 채웁니다.

예를 들어 필터 A가 160 x 120픽셀인 비디오 데이터를 수신한다고 가정합니다. 또한 필터 A가 다음 미디어 형식의 필터 B에 연결되어 있다고 가정합니다.

  • (biWidth, biHeight): 320, 240
  • rcSource: (0, 0, 0, 0)
  • rcTarget: (0, 0, 0, 0)

즉, 필터 A는 x와 y 방향 모두에서 수신하는 비디오를 2씩 확장하고 320 x 240 출력 버퍼를 채웁니다.

또 다른 예로 필터 A가 160 x 120 비디오 데이터를 수신하고 있으며 다음 미디어 형식의 필터 B에 연결되어 있다고 가정합니다.

  • (biWidth, biHeight): 320, 240
  • rcSource: (0, 0, 160, 240)
  • rcTarget: (0, 0, 0, 0)

rcSource 멤버는 연결된 버퍼 크기 320, 240을 기준으로 합니다. 지정된 rcSource (0, 0, 160, 240)은 버퍼의 왼쪽 절반이며, 필터 A는 입력 비디오의 왼쪽 절반 또는 (0, 0, 80, 120) 부분을 취하고 비디오를 (320, 240) 크기(x 방향으로 4, y 방향으로 2씩)로 확장하고 320 x 240 출력 버퍼를 채웁니다.

이제 필터 A가 CBaseAllocator::GetBuffer를 호출하고 반환된 미디어 샘플에 미디어 형식이 연결되어 있다고 가정합니다. 즉, 필터 B는 필터 A가 이전에 제공한 것과 다른 크기 또는 종류의 비디오를 제공하려고 합니다. 새 미디어 유형은 다음과 같습니다.

  • (biWidth, biHeight): 640, 480
  • rcSource: (0, 0, 160, 120)
  • rcTarget: (0, 0, 80, 60)

즉, 미디어 샘플의 크기는 640 x 480인 버퍼가 있습니다. rcSource 멤버는 새 미디어 유형(640, 480)이 아닌 원래 연결된 미디어 유형(320, 240)을 기준으로 하므로 rcSource는 입력 비디오의 왼쪽 위 모서리(25%)를 사용하도록 지정합니다. 입력 비디오의 이 부분은 rcTarget (0, 0, 80, 60)에 지정된 대로 640 x 480 출력 버퍼의 왼쪽 위(80, 60) 픽셀에 배치됩니다. 필터 A는 160 x 120 비디오를 수신하므로 입력 비디오의 왼쪽 위 모서리는 (80, 60) 조각이며 출력 비트맵의 크기가 동일하며 스트레칭이 필요하지 않습니다.

필터 A는 출력 버퍼의 다른 픽셀에 데이터를 배치하지 않으며 해당 비트를 그대로 유지합니다. rcSource 멤버는 필터 A와 B 간에 연결된 원래 미디어 형식의 biWidthbiHeight로 바인딩되고 rcTarget은 미디어 샘플의 새 biWidthbiHeight로 바인딩됩니다. 앞의 예제에서 rcSource 는 (0, 0, 320, 240)의 경계를 벗어날 수 없으며 rcTarget 은 (0, 0, 640, 480)의 경계를 벗어날 수 없습니다.