DirectShow DirectShow 의 사용법 엔코더와 디코더의 개발 디코더의 인터페이스 및 사양 디코더에 의한 IAMVideoAccelerator 의 사용법   [목차열람] [주소복사] [슬롯비우기]
디코더에 의한 IAMVideoAccelerator 의 사용법
 
Microsoft DirectX 9.0

디코더에 의한 IAMVideoAccelerator 의 사용법

IAMVideoAccelerator 인터페이스를 사용하면 DirectX 비디오 가속화 (VA)를 포함한 범용 비디오 가속화 처리가 가능하게 된다. DirectX VA 이외의 가속화의 경우, 디코더와 비디오 드라이버는 양쪽 모두, 공통 프로토콜에 따르지 않으면 안 된다.

여기에서는, 이 인터페이스를 사용하기에 즈음해, 디코더가 따르지 않으면 안 되는, 조작의 일반적인 순서에 대해 설명한다. DirectX VA 베이스의 디코더에 고유의 정보에 대해서는, 「IAMVideoAccelerator 에의 DirectX 비디오 가속화의 맵핑」을 참조할것.

주 :  이 인터페이스는, Microsoft Windows® 2000 이후에 이용 가능하다.

IAMVideoAccelerator 인터페이스는,오버레이 믹서 또는 Video Mixing Renderer (VMR)의 입력 핀으로 공개되고 있다. IAMVideoAcceleratorNotify 인터페이스는, 비디오 디코더의 출력 핀으로 공개되고 있다. 필터 핀 접속의 이벤트는 다음의 순서로 발생한다.

  1. 필터 그래프 매니저가 디코더의 출력 핀의 IPin::Connect 를 호출한다. AM_MEDIA_TYPE 는 옵션 파라미터이다.
  2. 디코더측에서, 특정의 AM_MEDIA_TYPE (비디오 가속기 GUID 를 포함한다)가 다운 스트림 입력 핀에 의해 지원 되고 있는지를 조사할 필요가 있는 경우, 그 핀의 IPin::QueryAccept (AM_MEDIA_TYPE 의 서브 타입으로서 비디오 가속기 GUID 를 지정)를 호출하는지, 또는 후술의 항목 5 로 해설하도록(듯이), 그 핀에 접속을 시도하는 것에 의해 조사할 수가 있다.
  3. 디코더측에서, 다운 스트림 입력 핀이 어느 비디오 가속기 GUID 를 지원 하고 있는지를 인식하고 있지 않고, 또 다운 스트림 입력 핀의 IPin::QueryAccept 를 호출해 특정의 몇개의 비디오 가속기 GUID 만을 지명하는 것을 피하고 싶은 경우, 디코더는,IAMVideoAccelerator::GetVideoAcceleratorGUIDs 를 호출해, 그 핀이 지원 하고 있는 비디오 가속기 GUID 의 일람을 취득할 수 있다.
  4. 몇개의 특정의 비디오 가속기 GUID 에 대해서는, 디코더는 다운 스트림 입력 핀의 IAMVideoAccelerator::GetUncompFormatsSupported 를 호출해, 특정의 비디오 가속기 GUID 의 렌더링에 사용할 수 있는 DDPIXELFORMAT 픽셀 포맷의 일람을 취득할 수 있다. 돌려받는 일람은, 추천의 정도가 높은 것으로부터 순서에 리스트 되고 있는 (가장 추천 되는 포맷이 최초로 기재된다) 것이라고 생각해도 좋다.
  5. 디코더는 다운 스트림 입력 핀의 IPin::ReceiveConnection 를 호출한다. 그 때, 미디어 타입의 서브 타입으로서 적절한 비디오 가속기 GUID 를 지정한 AM_MEDIA_TYPE 를 건네준다. 이것에 의해, 비압축 출력 표면의 생성을 포함해 동작에 필요한 접속이 설정된다. 이 표면의 할당에는, AM_MEDIA_TYPE 에 있는 폭과 높이나, 후술 하는 호출에 의해 발견한 할당하는 표면의 수나, 그 외의 비디오 가속기가 보관 유지하고 있어 표면 생성 목적으로 사용하고 싶은 정보 (비디오 가속기 GUID 자체등)를 사용한다. 다운 스트림 입력 핀이, 비디오 가속기 GUID, 또는 그 외의 접속에 관한 어떠한 요소를 거부했을 경우는,IPin::ReceiveConnection 가 실패하는 일이 있다. IPin::ReceiveConnection 가 실패했을 경우는, 돌려받는 HRESULT 로 그것을 알 수 있다. 디코더는, AM_MEDIA_TYPE 구조체에 있는 다른 비디오 가속기 GUID 를 사용하는 등 해, 호출을 재시행할 수 있다.

    주 :  IPin::ReceiveConnection 를 호출해 접속을 시행해, 접속이 성공했는지 어떠했는지를 체크 하면 말하는 것은, 다운 스트림 입력 핀이 지원 하고 있는 미디어 타입을 디코더측에서 조사하는 이제 1 개의 방법이며, 가장 확실한 방법이기도 하다.

  6. 렌더러는 디코더의 IAMVideoAcceleratorNotify::SetUncompSurfacesInfo 를 호출한다. 그 때 디코더에, 실제로 할당된 비압축 표면의 수를 건네준다.
  7. 렌더러는, 비디오 가속기의 초기화에 필요한 데이터를 얻어온다 모아 두어 디코더의 IAMVideoAcceleratorNotify::GetCreateVideoAcceleratorData 를 호출한다.
  8. 디코더는, 일련의 AMVACompBufferInfo 데이터 구조체 (비디오 가속기 GUID 에 사용되는 압축 데이터 버퍼의 각 타입 마다 1 개가 대응한다)를 얻어온다 모아 두어IAMVideoAccelerator::GetCompBufferInfo 를 호출한다. 그 때, 비디오 가속기 GUID, AMVAUncompDataInfo 구조체, 압축 버퍼 타입의 수를 건네준다.

주 :  몇개의 디코더의 IAMVideoAcceleratorNotify 인터페이스 메서드에의 렌더러의 호출은, 렌더러의 IPin::ReceiveConnection 에의 디코더의 호출내에서 행해질 수 있고, 보통 그처럼 발생한다. 이것은 특히 다음의 경우에 들어맞는다.

주 :  동적 포맷 변경을 지원 하기 위한(해), 필터가 접속되고 실행되고 있는 동안, 디코더는 위의 메서드에 의해 IPin::ReceiveConnection 및 그 외의 메서드를 호출할 수가 있다. 이 기능은 동적 포맷 변경을 지원 하기 위해서 준비되어 있지만, 다만 모든 데이터 세트가 최초부터 한번 더 시작 되어 모든 참조 픽쳐 정보가 없어지는 H. 263, Annex P 의 동적 포맷 변경은 대상이 되지 않는다.

초기화 후의 처리중의 IAMVideoAccelerator 의 사용에 대해 다음에 해설한다.

  1. 디코더는, 출력 픽쳐의 생성 처리를 시작 하기 위한(해), 각 비압축 표면에 대해서 IAMVideoAccelerator::BeginFrame 를 호출한다. 그 때,AMVABeginFrameInfo 구조체를 송신한다.
  2. 비압축 데이터를 가속기에 송신하기 위해서, 디코더는 다음의 메서드를 호출한다.
  3. 디코더는, 목적지 버퍼의 출력 처리를 완료하기 위해서,IAMVideoAccelerator::EndFrame 를 호출한다. 이 호출 시에 임의의 데이터를 다운 스트림에 건네줄 수가 있다 (이 호출의 결과 실행되는 것은, 기본적으로는 이만큼이다). 이 호출에서는 목적지 버퍼의 인덱스는 송신하지 않기 때문에, 여기서 건네주는 임의의 데이터내에서 가리키지 않는 이상 어느 목적지 버퍼가 완료했는지를 가속기에 정확하게 전할 수 없다.
  4. 디코더는, 프레임을 표시하기 위해서, 표시하는 프레임의 인덱스와 시작 및 종료의 타임 스탬프를 포함한 IMediaSample 구조체와dwTypeSpecificFlags (AM_SAMPLE2_PROPERTIES 구조체)나 dwInterlaceFlags (VIDEOINFOHEADER2 구조체)등의 관련 플래그와 함께,IAMVideoAccelerator::DisplayFrame 를 호출한다. 디코더는,DisplayFrame 를 호출하기 전에, 프레임의 내용에 영향을 주는 압축 해제 조작이 모두 완료했는지 어떠했는지를 확인할 필요가 있다.
  5. 마지막으로, 디코더는, 모든 처리가 완료했을 때에,IAMVideoAccelerator::EndFrame 를 호출해, 시작 된 나머지의 출력 프레임이 모두 완료한 것을 나타내, 미릴리즈의 각 버퍼에 대해서 IAMVideoAccelerator::ReleaseBuffer 를 호출해, 잠금 된 버퍼를 모두 릴리즈 할 필요가 있다.
↑TOP