DirectX 비디오 가속 IAMVideoAccelerator 운영 사양

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

정확한 작업 메커니즘은 다음과 같습니다.

  1. 여기에 정의된 각 제한된 모드 프로필에는 다운스트림 입력 핀의 IPin::QueryAccept 및 IPin::ReceiveConnection에서 지원되고 IAMVideoAccelerator::GetVideoAcceleratorGUIDs에 나열될 수 있는 연결된 DirectX VA GUID가 있습니다.

  2. 마찬가지로 DirectX VA에 사용할 각 암호화 프로토콜 유형에는 다운스트림 입력 핀의 IPin::QueryAccept 및 IPin::ReceiveConnection에서 지원되고 IAMVideoAccelerator::GetVideoAcceleratorGUIDs에 나열될 수 있는 연결된 암호화 프로토콜 형식 GUID가 있어야 합니다. "암호화 없음" GUID DXVA_NoEncrypt 지원이 필요하므로 암시적이므로 이 목록에 전송되지 않습니다.

  3. IPin::ReceiveConnection을 호출하여 다운스트림 입력 핀에 대한 연결을 시도한 후 디코더의 IAMVideoAcceleratorNotify::GetCreateVideoAcceleratorData는 연결에 대한 연결 모드 정보를 포함하는 DXVA_ConnectMode 데이터 구조에 대한 포인터를 반환합니다. IAMVideoAccelerator::GetCompBufferInfo 는 *pdwNumTypesCompBuffers = 16으로 호출되어야 하며 각 버퍼의 형식 번호(DirectX VA 사양의 섹션 3.4에 정의된 대로)를 반환되는 AMVACompBufferInfo 데이터 구조의 배열에 대한 0부터 시작하는 인덱스로 직접 사용할 수 있다는 규칙에 따라 압축된 버퍼 정보를 반환해야 합니다. 이렇게 하려면 사용되지 않는 버퍼 형식(버퍼 유형 0 포함)이 필요합니다. 해당 버퍼 형식을 정의하지 않으므로 가속기 드라이버는 AMVACompBufferInfo 데이터 구조에 "더미" 매개 변수 값(예: dwNumCompBuffers=0, dwWidthToCreate=0, dwHeightToCreate=0 및 dwBytesToAllocate=0)을 제공합니다.

  4. DXVA 함수 표시 및 관련 데이터 버퍼는 IAMVideoAccelerator::Execute를 사용하여 전송됩니다. DXVA 함수는 호출의 dwFunction 매개 변수에 표시됩니다. 초기화와 관련된 유일한 DXVA 함수는 DXVA_ConfigQueryOrReplyFunc DXVA_EncryptProtocolFunc.

    • dwFunction에 DXVA_ConfigQueryOrReplyFunc 포함된 경우 이 호출에서 가속기로 데이터를 전달하기 위한 lpPrivateInputData 포인터는 구성 데이터 구조를 가리킵니다. 액셀러레이터에서 정보를 수신하기 위한 lpPrivateOutputData 포인터는 대체 또는 중복 구성 데이터 구조를 배치할 수 있는 영역을 가리킵니다. AMVABUFFERINFO 배열에 대한 pamvaBufferInfo 포인터는 NULL이어야 합니다. dwNumBuffers는 0이어야 합니다. 반환된 HRESULT에는 프로토콜 실행 시 심각한 문제(예: 잘못된 구성 매개 변수)가 발생할 경우 S_OK 또는 S_FALSE 표시, E_FAIL 또는 E_INVALIDARG 또는 기타 오류 표시 HRESULT가 포함됩니다. DXVA_ConfigQueryOrReplyFunc 모든 용도에 대해 IAMVideoAccelerator::Execute 에 대한 모든 호출은 IAMVideoAccelerator::Execute에 대한 다른 모든 호출보다 우선합니다.

    • dwFunction에 DXVA_EncryptProtocolFunc 포함된 경우 이 호출에서 가속기로 데이터를 전달하기 위한 lpPrivateInputData 포인터는 DXVA_EncryptProtocolHeader 시작하는 암호화 프로토콜 데이터 구조를 가리킵니다. 액셀러레이터에서 정보를 수신하기 위한 lpPrivateOutputData 포인터는 암호화 프로토콜 DXVA_EncryptProtocolHeader에 의해 반환될 데이터(예: 인증서)를 배치할 수 있는 영역을 가리킵니다. AMVABUFFERINFO 배열에 대한 pamvaBufferInfo 포인터는 NULL이어야 하며 dwNumBuffers는 0이어야 합니다. 반환된 HRESULT는 암호화 프로토콜이 정상적으로 작동하는 한 S_OK 포함하며 프로토콜 실행에 심각한 문제가 발생할 경우 E_FAIL 또는 E_INVALIDARG 또는 기타 오류 표시 HRESULT를 포함합니다.

      위의 방식으로 작업을 초기화한 후 디코더의 실제 작업은 다음과 같이 진행됩니다.

  5. IAMVideoAccelerator::BeginFrame 은 압축되지 않은 대상 화면에 쓰기를 발생시키는 압축된 버퍼 매개 변수가 있는 bDXVA_Func 보내기 전에 호출되어야 합니다. DirectX VA의 IAMVideoAccelerator::BeginFrame 의 목적은 대상 표면을 인덱스 값과 연결하고, 드라이버가 표면을 덮어쓸 준비가 되었는지 여부를 표시하여 응답할 수 있도록 화면 쓰기를 시작하려는 의도를 비디오 가속기 드라이버에 알리는 것입니다. IAMVideoAccelerator::BeginFrame에 전달된 AMVABeginFrameInfo 구조체에는 IAMVideoAccelerator::BeginFrame에 전달된 프레임 인덱스와 일치하는 단일 WORD wBeginPictureIndex 매개 변수에 대한 pInputData 포인터가 포함되어야 합니다(및 dwSizeInputData는 2). 이는 압축 버퍼에서 표면에 쓰기를 명령하는 데 사용되는 인덱스입니다(예: wDecodedPictureIndex, wDeblockedPictureIndex, wBlendedDestinationIndex 또는 wPicResampleDestPicIndex로 사용). IAMVideoAccelerator::BeginFrame에 대한 각 호출은 아래 설명된 대로 IAMVideoAccelerator::EndFrame에 대한 해당 호출과 쌍을 이루어야 합니다. 예를 들어 압축된 그림을 디코딩한 다음 프런트 엔드 버퍼-버퍼 혼합을 사용하여 알파 혼합을 그래픽 이미지와 혼합하는 경우 압축된 그림을 wDecodedPictureIndex에 지정된 표면으로 디코딩하기 전에 IAMVideoAccelerator::BeginFrame 을 호출한 다음, 그림을 디코딩하는 데 사용되는 모든 압축 버퍼를 전달한 후 IAMVideoAccelerator::EndFrame 을 호출합니다. 그런 다음, 디코딩된 그림과 함께 그래픽 소스의 알파 혼합 조합을 wBlendedDestinationIndex에 지정된 표면으로 명령하기 전에 IAMVideoAccelerator::BeginFrame 에 대한 두 번째 호출을 수행한 다음 알파 혼합 조합 작업 후 IAMVideoAccelerator::EndFrame 을 두 번째로 호출합니다. AMVABeginFrameInfo의 pOutputData 포인터는 NULL 이어야 합니다(dwSizeOutputData는 "0"이어야 함). IAMVideoAccelerator::BeginFrame에서 반환되는 HRESULT는 다음과 같습니다.

    • 압축되지 않은 표면을 사용할 수 있고 사용할 준비가 되었는지 S_OK.
    • E_PENDING 압축되지 않은 표면을 아직 사용할 수 없지만 곧 사용할 수 있게 될 경우(압축되지 않은 표면이 디스플레이를 위해 읽혀지고 있고 표면의 읽기/표시가 아직 완료되지 않은 경우)
    • 데이터 형식 또는 프로토콜 오류가 검색된 경우에만 다른 오류 표시를 E_FAIL 또는 E_INVALIDARG(예: dwSizeInputData의 잘못된 값 또는 NULL 이 아닌 pOutputData).
  6. DXVA 함수 표시 및 관련 데이터 버퍼는 IAMVideoAccelerator::Execute를 사용하여 전송됩니다. IAMVideoAccelerator::Execute에 대한 동일한 호출에서 둘 이상의 bDXVA_Func 값이 표시될 수 있습니다. bDXVA_Func 값은 8개의 MSB에서 첫 번째 함수 명령, 다음 8비트의 다음 명령 등을 사용하여 호출의 dwFunction 매개 변수로 압축되고 나머지 비트는 0으로 채워져야 합니다. bDXVA_Func 0xFF 값은 bDXVA_Func 2바이트 또는 4바이트로 확장되었음을 나타냅니다. 두 번째 바이트도 0xFF 경우 bDXVA_Func 4바이트로 확장되었음을 나타냅니다. 세 번째 바이트의 상위 4비트가 0xF 또는 0x0 경우 bDXVA_Func DXVA_ConfigQueryOrReplyFunc 또는 DXVA_EncryptProtocolFunc 포함됨을 나타냅니다. 다중 바이트 명령은 dwFunction이 끝난 후의 연속을 나타내지 않습니다. IAMVideoAccelerator::Execute에 대한 동일한 호출에 지정된 서로 다른 bDXVA_Func 값 사이에 순차적 종속성이 없는지, 그리고 IAMVideoAccelerator::Execute에 대한 적절한 호출로 인해 그림 디코딩과 하위 그림 혼합 간의 모든 잠재적 경합 조건(예: 그림 디코딩과 하위 그림 혼합 사이)이 방지되도록 디코더에서 주의해야 합니다.IAMVideoAccelerator::Execute에 대한 후속 호출 전에 BeginFrame 및 IAMVideoAccelerator::QueryRenderStatus.

    • dwFunction에 DXVA_ConfigQueryOrReplyFunc 포함된 경우 이 호출에서 가속기로 데이터를 전달하기 위한 lpPrivateInputData 포인터는 구성 데이터 구조를 가리킵니다. 액셀러레이터에서 정보를 수신하기 위한 lpPrivateOutputData 포인터는 대체 또는 중복 구성 데이터 구조를 배치할 수 있는 영역을 가리킵니다. AMVABUFFERINFO 배열에 대한 pamvaBufferInfo 포인터는 NULL이어야 합니다. dwNumBuffers는 0이어야 합니다. 반환된 HRESULT는 쿼리에 대한 응답으로 S_OK 또는 S_FALSE 표시를 포함하거나, 프로토콜 실행 시 심각한 문제(예: invalid.configuration 매개 변수)가 발생할 경우 다른 오류 표시 HRESULT를 E_FAIL 또는 E_INVALIDARG. DXVA_ConfigQueryOrReplyFunc 모든 용도에 대해 IAMVideoAccelerator::Execute 에 대한 모든 호출은 IAMVideoAccelerator::Execute에 대한 다른 모든 호출보다 우선합니다.

    • dwFunction에 DXVA_EncryptProtocolFunc 포함된 경우 이 호출에서 가속기로 데이터를 전달하기 위한 lpPrivateInputData 포인터는 DXVA_EncryptProtocolHeader 시작하는 암호화 프로토콜 데이터 구조를 가리킵니다. 액셀러레이터에서 정보를 수신하기 위한 lpPrivateOutputData 포인터는 암호화 프로토콜 DXVA_EncryptProtocolHeader에 의해 반환될 데이터(예: 인증서)를 배치할 수 있는 영역을 가리킵니다. AMVABUFFERINFO 배열에 대한 pamvaBufferInfo 포인터는 NULL이어야 하며 dwNumBuffers는 0이어야 합니다. 반환된 HRESULT는 암호화 프로토콜이 정상적으로 작동하는 한 S_OK 포함하며 프로토콜 실행에 심각한 문제가 발생할 경우 E_FAIL 또는 E_INVALIDARG 또는 기타 오류 표시 HRESULT를 포함합니다.

    • dwFunction에 DXVA_ConfigQueryOrReplyFunc 또는 DXVA_EncryptProtocolFunc 포함되어 있지 않으면 데이터를 가속기로 전달하기 위한 lpPrivateInputData 포인터가 버퍼 설명 목록을 가리킵니다. 각 버퍼에 대한 버퍼 설명 목록 구조의 처음 4개 항목(dwTypeIndex, dwBufferIndex, dwDataOffset 및 dwDataSize)은 동일한 버퍼에 대한 AMVABUFFERINFO 데이터 구조의 항목과 같아야 합니다. bDXVA_Func "1"과 같으면 dwFunction 내에 지정되고 bPicReadbackRequests는 "1"입니다. 액셀러레이터에서 정보를 수신하기 위한 lpPrivateOutputData 포인터는 영구 메모리 영역(예: 힙)이 가속기에서 읽기-뒤로 매크로 블록 데이터로 채워지도록 가리킵니다(이러한 데이터는 IAMVideoAccelerator::QueryRenderStatus 가 동일한 그림 매개 변수 버퍼에 쓸 때까지는 존재하지 않음) 아래 항목 10에 설명된 대로 S_OK 나타냅니다. 그렇지 않으면 가속기에서 정보를 수신하기 위한 lpPrivateOutputData 포인터는 단일 DWORD를 다음 표시 값 중 하나로 설정하도록 가리킵니다(오프 호스트 VLD 작업에서 비트스트림 오류를 보고하는 데 특히 유용).

      Description
      0 실행 확인.
      1 데이터 형식의 사소한 문제가 발생했습니다.
      2 데이터 형식에서 심각한 문제가 발생했습니다.
      3 데이터 형식의 심각한 문제가 발생했습니다.
      4 다른 심각한 문제가 발생했습니다.

       

      두 가지 유형의 "심각한" 문제가 표시되면 수정 작업을 수행할 수 없는 한 소프트웨어 디코더가 함수 작동을 중단해야 합니다. 액셀러레이터에서 반환된 이 데이터는 IAMVideoAccelerator::QueryRenderStatus에서 테스트할 수 있는 것처럼 그림에 대한 버퍼 렌더링이 완료될 때까지 호스트에서 읽을 수 없습니다. 반환된 HRESULT는 인터페이스 작업이 정상적으로 작동하는 한 S_OK 포함하며 심각한 문제가 발생할 경우 E_FAIL 또는 E_INVALIDARG 또는 기타 오류 표시 HRESULT를 반환할 수 있습니다.

  7. 그림 디코딩 매개 변수 버퍼는 IAMVideoAccelerator::Execute 를 "1"과 같은 bDXVA_Func 사용할 때 각 그림의 디코딩을 위해 전송된 첫 번째 버퍼 중 하나여야 하며, 비트스트림에서 그림을 디코딩하기 위한 모든 버퍼는 후속 그림을 디코딩하기 위한 버퍼 전에 전송되어야 합니다. macroblock 컨트롤 명령 버퍼가 전송되면 동일한 IAMVideoAccelerator::Execute 호출을 사용하여 해당 잔차 데이터 버퍼(동일한 매크로 블록에 대한 데이터 포함)가 전송됩니다.

  8. IAMVideoAccelerator::EndFrame 은 지정된 압축되지 않은 표면에서 출력 콘텐츠를 만드는 모든 압축 버퍼가 전송된 후에 호출됩니다(wDecodedPictureIndex, wDeblockedPictureIndex, wBlendedDestinationIndex 또는 wPicResampleDestPicIndex에 대해 지정된 작업의 결과). IAMVideoAccelerator::EndFrame에 대한 이 호출의 목적은 비디오 가속기 하드웨어에 지정된 작업에 필요한 모든 데이터가 전송되었음을 알리는 것입니다. IAMVideoAccelerator::EndFrame을 통해 다운스트림을 보낼 데이터에 대한 포인터는 끝나는 프레임의 인덱스를 포함하는 단일 WORD wEndPictureIndex를 가리킵니다. 이 매개 변수는 관련 압축 버퍼를 보내기 전에 IAMVideoAccelerator::BeginFrame 에 대한 이전 호출에 지정된 wBeginPictureIndex 값과 일치해야 합니다. IAMVideoAccelerator::EndFrame을 호출한 후 인덱스 wEndPictureIndex가 있는 압축되지 않은 표면은 그림의 wDecodedPictureIndex에서 찾을 수 없습니다. wDeblockedPictureIndex, wBlendedDestinationIndex 또는 wPicResampleDestPicIndex는 IAMVideoAccelerator::BeginFrame에 대한 또 다른 호출이 실행되어 이 문제가 발생하고 결과적으로 S_OK 반환되었음을 알릴 때까지 발생합니다. 그러나 해당 대상 표면 인덱스는 wForwardRefPictureIndex, wBackwardRefPictureIndex, wPicResampleSourcePicIndex 또는 bRefPicSelect[i]와 같은 후속 읽기 액세스 명령에서 발생할 수 있습니다. IAMVideoAccelerator::EndFrame에서 반환하는 HRESULT는 데이터 형식 또는 프로토콜 오류의 종류가 없는 한 S_OK 합니다. 이 경우 E_FAIL 또는 E_INVALIDARG 또는 기타 오류 표시일 수 있습니다.

  9. 필드 기반 디코딩(예: MPEG-2 비트스트림)의 경우 비트스트림의 기능 그림을 액셀러레이터 인터페이스의 압축되지 않은 표면에 일대일로 매핑하지 않습니다. MPEG-2 비트스트림에서 필드 그림을 디코딩할 때 압축되지 않은 하나의 완전한 출력 표면을 생성하기 위해 디코딩된 두 개의 "그림"이 있습니다. DirectX VA 인터페이스 정의에서 각 프레임은 wDecodedPictureIndex, wDeblockedPictureIndex, wBlendedDestinationIndex 또는 wPicResampleDestPicIndex의 각 사용에 해당합니다. 따라서 필드 그림을 압축되지 않은 출력 화면으로 디코딩하려면 IAMVideoAccelerator::BeginFrameIAMVideoAccelerator::EndFrame 에 대한 두 쌍의 호출이 필요합니다.

  10. dwFlags가 있는 IAMVideoAccelerator::QueryRenderStatus에 대한 호출은 특정 wEndPictureIndex를 사용하여 IAMVideoAccelerator::EndFrame을 호출한 후 발생하는 0과 같으며 wDecodedPictureIndex의 wEndPictureIndex를 포함하는 전송된 버퍼의 상태 확인합니다. wDeblockedPictureIndex, wBlendedDestinationIndex 또는 wPicResampleDestPicIndex는 모든 작업이 압축되지 않은 에 데이터를 쓰는 경우 S_OK 표시를 반환합니다. surface가 완료되었으며 작업이 아직 완료되지 않은 경우 E_PENDING 반환합니다. 프로토콜 오류 발생 시 E_FAIL 또는 E_INVALIDARG 또는 기타 오류 표시가 반환될 수 있습니다.

DirectX 비디오 가속을 IAMVideoAccelerator에 매핑