AVStream 코덱에서 Stride 처리

디코더가 EVR(Enhanced Video Renderer)과 같은 렌더러 또는 Direct3D를 지원하는 구성 요소에 연결되면 미니드라이버가 시스템 메모리 버퍼 대신 D3D 버퍼를 받습니다.

렌더링하기 전에 D3D 화면에 복사해야 하는 시스템 메모리 버퍼와 달리 D3D 버퍼는 렌더링 엔진에서 직접 표시할 수 있습니다. 따라서 시스템 메모리 버퍼 대신 D3D 버퍼를 사용하면 미니드라이버가 각 버퍼에 대한 복사 작업을 저장합니다.

SHED 지원 미니드라이버가 D3D 버퍼를 받으면 D3D 표면이 잠기고 포인터가 KSSTREAM_HEADER. 데이터. 표면 보폭 정보는 다음 코드 예제와 같이 KS_FRAME_INFO 확장에서 KSSTREAM_HEADER 제공됩니다.

typedef struct KS_FRAME_INFO {
    ULONG                   ExtendedHeaderSize; // Size of this extended header
    DWORD                   dwFrameFlags;       // Field1, Field2, or Frame
    LONGLONG                PictureNumber;
    LONGLONG                DropCount;

    // The following are only set when you use OverlayMixer
    HANDLE                  hDirectDraw;        // user mode DDraw handle
    HANDLE                  hSurfaceHandle;     // user mode surface handle
    RECT                    DirectDrawRect;     // portion of surface locked
    union {
  LONG               lSurfacePitch;  // Contains surface pitch a.k.a stride
         DWORD              Reserved1;
    };
    // Reserved fields, never reference these
    DWORD                   Reserved2;
    DWORD                   Reserved3;
    DWORD                   Reserved4;
} KS_FRAME_INFO, *PKS_FRAME_INFO;

미니 드라이버는 KS_BITMAPINFOHEADER 구조체의 biWidth 멤버를 표면 너비로 사용해야 합니다.

(KS_VIDEOINFOHEADER. bmiHeader 는 KS_BITMAPINFOHEADER 유형입니다. KS_DATARANGE_VIDEO. VideoInfoHeader 는 KS_VIDEOINFOHEADER 형식입니다.)

If KS_FRAME_INFO. lSurfacePitch 에는 0이 아닌 값이 있습니다. 미니 드라이버는 관련 KSSTREAM_HEADER 지정된 버퍼의 너비/보폭으로 lSurfacePitch 를 사용해야 합니다. 그렇지 않으면 출력 이미지가 왜곡된 것처럼 보입니다.