Улучшения воспроизведения DVD в Windows Vista

[Функция, связанная с этой страницей, DirectShow — это устаревшая функция. Он был заменен MediaPlayer, МВФMediaEngine и аудио/видеозахват в Media Foundation. Эти функции оптимизированы для Windows 10 и Windows 11. Корпорация Майкрософт настоятельно рекомендует использовать новый код MediaPlayer, МВФMediaEngine и аудио-видеозахват в Media Foundation вместо DirectShow, когда это возможно. Корпорация Майкрософт предлагает, что существующий код, использующий устаревшие API, будет перезаписан для использования новых API, если это возможно.]

В этом разделе описаны улучшения воспроизведения DVD-дисков и навигации в Windows Vista.

Указание декодера

В более ранних версиях DirectShow было трудно указать конкретный декодатор MPEG-2 при создании графа воспроизведения DVD. Начиная с Windows Vista, приложение может указать декодатор следующим образом:

  1. Добавьте декодировщик в граф перед вызовом IDvdGraphBuilder::RenderDvdVideoVolume.
  2. Вызовите RenderDvdVideoVolume и задайте флаг AM_DVD_DO_NOT_CLEAR. Навигатор DVD-диска будет предпочитать добавленный декодатор.

Поддержка расширенного отрисовщика видео

Рекомендуется, чтобы приложения, написанные для Windows Vista или более поздней версии, использовали расширенный отрисовщик видео (EVR) для воспроизведения видео. Чтобы использовать EVR в приложении воспроизведения DVD, задайте флаг AM_DVD_EVR_ONLY при вызове RenderDvdVideoVolume.

Чтобы настроить EVR перед сборкой графа, вызовите IDvdGraphBuilder::GetDvdInterface и запросите интерфейс IEVRFilterConfig или IMFVideoRenderer . (Эти интерфейсы описаны в документации по пакету SDK Media Foundation.) Дополнительные сведения о настройке отрисовщика видео в графе воспроизведения DVD см. в разделе "Создание графа фильтра DVD".

DVD-навигатор не будет использовать EVR, если только метод IAMDecoderCaps::GetDecoderCaps не возвращает флаг AM_GETDECODERCAP_QUERY_EVR_SUPPORT. Этот флаг определен для обеспечения совместимости приложений с существующими декодаторами. Если RenderDvdVideoVolume завершается ошибкой с использованием флага AM_DVD_EVR_ONLY, вернитесь к другому отрисовщику видео, вызвав метод еще раз без флага.

Плавное обратное воспроизведение

Теперь 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 в примере. Флаги задаются в элементе dwTypeSpecificFlags структуры AM_SAMPLE2_PROPERTIES.

Декодировщик кэширует видеоданные, пока не получит образец с флагом 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. VoBUs на DVD не закрыты GOP, поэтому кадр B в GOP может потребовать декодирования всех эталонных кадров в предыдущем GOP. Если декодировщик не имеет достаточно поверхностей для хранения всех декодированных кадров, может потребоваться повторно декодировать выбранные кадры.

Изменения скорости

По умолчанию DVD-навигатор сбрасывает график между изменениями скорости. Если декодатор поддерживает свойство AM_RATE_ResetOnTimeDisc , однако DVD-навигатор не будет сбрасывать граф, что приведет к более плавному переходу между скоростью воспроизведения.

Dvd-навигатор всегда метки времени для воспроизведения с частотой 1x независимо от фактической скорости воспроизведения. Декодатор должен масштабировать метки времени на декодированных примерах, чтобы соответствовать фактической скорости воспроизведения. (Дополнительные сведения см. в разделе свойство AM_RATE_SimpleRateChange.) В результате при воспроизведении на скоростях, отличных от 1x, метки времени на декодированных кадрах расходятся от тех, которые хранятся в закодированных кадрах. Когда DVD-навигатор устанавливает флаг AM_SAMPLE_TIMEDISCONTINUITY в образце, декодатор должен повторно изменить его метки времени. Другими словами, декодированные кадры должны иметь ту же метку времени, что и входной кадр. Чтобы получить флаг AM_SAMPLE_TIMEDISCONTINUITY, вызовите IMediaSample2::GetProperties в примере. Флаг задается в элементе dwSampleFlags структуры AM_SAMPLE2_PROPERTIES.

Управление питанием

В Windows Vista DVD-навигатор обеспечивает следующие улучшения управления питанием:

  • Более высокое разрешение таймера
  • Большой кэш данных

Разрешение таймера: приложения могут запрашивать минимальное разрешение таймера, вызвав функцию timeBeginPeriod . Более высокое разрешение (более короткий период) увеличивает скорость реагирования системы на периодические события, такие как тайм-ауты, но также может увеличить частоту переключений контекста потока.

По умолчанию эталонные часы в DirectShow задают разрешение таймера в 1 миллисекунда. При этом ЦП не будет вводить режимы экономии питания. Начиная с Windows Vista, DVD-навигатор переопределяет поведение часов ссылки по умолчанию путем вызова IReferenceClockTimerControl::SetDefaultTimerResolution на эталонные часы. Это удаляет запрос часов для разрешения таймера в 1 миллисекунда. Это может позволить ЦП ввести режим экономии питания.

Разрешение таймера — это глобальный параметр; Windows выбирает наименьшее запрошенное значение. Фильтры отрисовщика видеосмешивания (VMR) (VMR-7 и VMR-9) задают разрешение таймера в 1 миллисекунда. EVR обычно задает разрешение в диапазоне от 4 до 8 миллисекунд в зависимости от того, включена ли композиция рабочего стола и находится ли EVR в полноэкранном режиме. Другие приложения также могут задать разрешение.

Размер кэша: приложения могут указать, сколько данных кэширует DVD-навигатор, задав параметр DVD_CacheSizeInМБ в методе IDvdControl2::SetOption. Если приложение устанавливает для этого флага большое значение (>50 МБ), DVD-диск может открутиться после начальной предварительной выборки в зависимости от оборудования, что может снизить потребление энергии.

DVD-приложения