Windows Vista의 DVD 재생 향상된 기능

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

이 섹션에서는 Windows Vista에서 DVD 재생 및 탐색의 향상된 기능을 설명합니다.

디코더 지정

이전 버전의 DirectShow에서는 DVD 재생 그래프를 빌드할 때 특정 MPEG-2 디코더를 지정하기가 어려웠습니다. Windows Vista부터 애플리케이션은 다음과 같이 디코더를 지정할 수 있습니다.

  1. IDvdGraphBuilder::RenderDvdVideoVolume을 호출 하기 전에 그래프에 디코더를 추가합니다.
  2. RenderDvdVideoVolume을 호출하고 AM_DVD_DO_NOT_CLEAR 플래그를 설정합니다. DVD 탐색기는 추가한 디코더를 기본 설정으로 제공합니다.

향상된 비디오 렌더러 지원

Windows Vista 이상용으로 작성된 애플리케이션은 비디오 재생에 EVR(고급 비디오 렌더러 )을 사용하는 것이 좋습니다. DVD 재생 애플리케이션에서 EVR을 사용하려면 RenderDvdVideoVolume을 호출할 때 AM_DVD_EVR_ONLY 플래그를 설정합니다.

그래프를 빌드하기 전에 EVR을 구성하려면 IDvdGraphBuilder::GetDvdInterface를 호출하고 IEVRFilterConfig 또는 IMFVideoRenderer 인터페이스를 쿼리합니다. (이러한 인터페이스는 Media Foundation SDK 설명서에 설명되어 있습니다.) DVD 재생 그래프에서 비디오 렌더러를 구성하는 방법에 대한 자세한 내용은 DVD 필터 그래프 빌드를 참조하세요.

디코더의 IAMDecoderCaps::GetDecoderCaps 메서드가 AM_GETDECODERCAP_QUERY_EVR_SUPPORT 플래그를 반환하지 않는 한 DVD 탐색기는 EVR을 사용하지 않습니다. 이 플래그는 애플리케이션이 기존 디코더와 호환되도록 정의됩니다. AM_DVD_EVR_ONLY 플래그를 사용하여 RenderDvdVideoVolume이 실패하는 경우 플래그 없이 메서드를 다시 호출하여 다른 비디오 렌더러로 대체합니다.

부드러운 역방향 재생

이제 DVD 탐색기가 부드러운 역방향 재생을 수행할 수 있습니다. 부드러운 역방향 재생에서 DVD 탐색기는 전체 VOBUS(비디오 개체 단위)를 디코더로 보내고 디코더는 프레임을 역순으로 내보낸다. 이 기능을 사용하려면 디코더가 부드러운 역방향 재생을 지원해야 합니다.

애플리케이션이 재생 속도를 음수 값으로 설정하면 DVD 탐색기가 디코더에 AM_RATE_ReverseMaxFullDataRate 속성을 쿼리합니다. 이 속성의 값은 최대 역방향 속도 x 10000의 절대값입니다. 예를 들어 최대 역방향 속도가 -2.0이면 값은 20000입니다.

비디오 디코더가 속성을 지원하는 경우 DVD 탐색기는 부드러운 역방향 재생을 사용합니다. 오디오 디코더가 속성을 지원하는 경우 오디오 스트림이 역방향으로 재생됩니다. 그렇지 않으면 오디오 스트림이 음소거됩니다. 비디오 디코더가 속성을 지원하지 않거나 재생 속도가 비디오 디코더의 최대 역방향 속도를 초과하면 DVD 탐색기가 스캔 모드전환됩니다. 스캔 모드에서 DVD 탐색기는 I 프레임만 디코더로 보내고 모든 B 및 P 프레임을 삭제합니다.

부드러운 역방향 재생 중에 DVD 탐색기는 전체 VOBUS를 디코더로 보냅니다. DVD 탐색기는 VOBUS를 역순으로 보내지만 각 VOBU 내의 프레임을 일반 정방향 순서로 보냅니다. 각 VOBU가 시작될 때 DVD 탐색기는 샘플에서 AM_ReverseBlockStart 플래그를 설정합니다. VOBU의 끝에서 DVD 탐색기는 AM_ReverseBlockEnd 플래그가 있는 빈 샘플을 보냅니다. 이러한 플래그를 검색하려면 샘플에서 IMediaSample2::GetProperties를 호출합니다. 플래그는 AM_SAMPLE2_PROPERTIES 구조체의 dwTypeSpecificFlags 멤버에 설정됩니다.

디코더는 AM_ReverseBlockEnd 플래그가 있는 샘플을 받을 때까지 비디오 데이터를 캐시합니다. 이 시점에서 디코더는 디코딩된 프레임을 역순으로 제공합니다. 예를 들어 VOBU 1에 프레임 1~4가 있고 VOBU 2에 프레임 5~8이 포함된 경우 DVD 탐색기는 다음 순서대로 프레임을 보냅니다.

(시작 차단) F5 F6 F7 F8(블록 끝)(블록 시작) F1 F2 F3 F4(블록 끝)

디코더는 다음과 같이 프레임을 처리해야 합니다.

  1. VOBU 2 디코딩
  2. 출력 프레임: F8 F7 F6 F5
  3. VOBU 1을 디코딩합니다.
  4. 출력 프레임: F4 F3 F2 F1

DVD 탐색기는 VOBU의 첫 번째 샘플에 타임스탬프를 설정하지만(이 예제에서는 F1 및 F5), 타임스탬프에는 블록 시작의 프레젠테이션 시간이 포함되므로 디코더는 이 시간을 블록의 마지막 샘플(F4 및 F8)에 적용해야 합니다. 역방향 재생 중에 프레젠테이션 시간이 증가합니다.

일반적으로 VOBU는 최대 42개의 프레임을 포함하며 둘 이상의 GOP(사진 그룹)를 포함할 수 있습니다. 전체 VOBU를 디코딩할 수 있도록 디코더가 디코딩된 I 및 P 프레임을 캐시해야 합니다. DVD의 VOBUS는 닫힌 GOP가 아니므로 GOP 내의 B 프레임은 이전 GOP의 모든 참조 프레임을 디코딩해야 할 수 있습니다. 디코더에 디코딩된 프레임을 모두 저장할 수 있는 충분한 표면이 없는 경우 선택한 프레임을 다시 디코딩해야 할 수 있습니다.

속도 변경

기본적으로 DVD 탐색기는 속도 변경 사이에 그래프를 플러시합니다. 그러나 디코더가 AM_RATE_ResetOnTimeDisc 속성을 지원하는 경우 DVD 탐색기는 그래프를 플러시하지 않으므로 재생 속도 간에 원활한 전환이 수행됩니다.

DVD 탐색기는 실제 재생 속도에 관계없이 항상 1배 속도로 재생을 위한 샘플을 타임스탬프를 찍습니다. 디코더는 실제 재생 속도와 일치하도록 디코딩된 샘플의 타임스탬프를 확장해야 합니다. (자세한 내용은 다음을 참조하세요 .AM_RATE_SimpleRateChange 속성입니다.) 따라서 1x가 아닌 속도로 재생할 때 디코딩된 프레임의 타임스탬프는 인코딩된 프레임의 타임스탬프를 구분합니다. DVD 탐색기가 샘플에서 AM_SAMPLE_TIMEDISCONTINUITY 플래그를 설정하면 디코더가 타임스탬프를 다시 동기화해야 합니다. 즉, 디코딩된 프레임은 입력 프레임과 동일한 타임스탬프를 가져야 합니다. AM_SAMPLE_TIMEDISCONTINUITY 플래그를 검색하려면 샘플에서 IMediaSample2::GetProperties를 호출합니다. 플래그는 AM_SAMPLE2_PROPERTIES 구조체의 dwSampleFlags 멤버에 설정됩니다.

전원 관리

Windows Vista에서 DVD 탐색기를 사용하면 전원 관리를 다음과 같이 개선할 수 있습니다.

  • 더 높은 타이머 해상도
  • 더 큰 데이터 캐시

타이머 확인: 애플리케이션은 timeBeginPeriod 함수를 호출하여 최소 타이머 해상도를 요청할 수 있습니다. 더 높은 해상도(짧은 기간)는 시간 제한과 같은 주기적 이벤트에 대한 시스템의 응답성을 증가하지만 스레드 컨텍스트 전환의 빈도를 증가시킬 수도 있습니다.

기본적으로 DirectShow의 참조 클록은 타이머 해상도를 1밀리초로 설정합니다. 이 해상도에서는 CPU가 절전 모드로 들어가지 않습니다. Windows Vista부터 DVD 탐색기는 참조 클록에서 IReferenceClockTimerControl::SetDefaultTimerResolution을 호출하여 참조 시계의 기본 동작을 재정의합니다. 이렇게 하면 1밀리초 타이머 해상도에 대한 클록 요청이 제거됩니다. 이렇게 하면 CPU가 절전 모드로 전환될 수 있습니다.

타이머 해상도는 전역 설정입니다. Windows에서 요청된 가장 낮은 값을 선택합니다. VMR(비디오 혼합 렌더러) 필터(VMR-7 및 VMR-9)는 타이머 해상도를 1밀리초로 설정합니다. EVR은 일반적으로 데스크톱 컴퍼지션이 사용되는지 여부와 EVR이 전체 화면 모드에 있는지 여부에 따라 해상도를 4~8밀리초 사이의 값으로 설정합니다. 다른 애플리케이션도 해결을 설정할 수 있습니다.

캐시 크기: 애플리케이션은 IDvdControl2::SetOption 메서드에서 DVD_CacheSizeInMB 옵션을 설정하여 DVD 탐색기에서 캐시하는 데이터의 양을 지정할 수 있습니다. 애플리케이션에서 이 플래그를 큰 값(> 50MB)으로 설정하는 경우 DVD 드라이브는 하드웨어에 따라 초기 사전 인출 후 스핀다운되어 전력 소비를 줄일 수 있습니다.

DVD 응용 프로그램