DirectX Video Acceleration IAMVideoAccelerator Operational Specification

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

Точный механизм работы выглядит следующим образом:

  1. Каждый профиль ограниченного режима, определенный здесь, имеет связанный GUID Виртуальной машины DirectX, который может поддерживаться IPin::QueryAccept и IPin::ReceiveConnection нижестоящего входного контакта и указан в IAMVideoAccelerator::GetVideoAcceleratorGUIDs.

  2. Аналогичным образом, каждый тип протокола шифрования для использования с DirectX VA должен иметь связанный guid типа протокола шифрования, который может поддерживаться IPin::QueryAccept и IPin::ReceiveConnection нижестоящего входного пина и указан в IAMVideoAccelerator::GetVideoAcceleratorGUIDs. DXVA_NoEncrypt GUID "без шифрования" не должны отправляться в этом списке, так как его поддержка является обязательной и, следовательно, неявной.

  3. После вызова метода IPin::ReceiveConnection для попытки подключения к нисходящему контакту входных данных IAMVideoAcceleratorNotify::GetCreateVideoAcceleratorData декодера возвращает указатель на структуру данных DXVA_ConnectMode, содержащую сведения о режиме подключения для соединения. IAMVideoAccelerator::GetCompBufferInfo должен вызываться с *pdwNumTypesCompBuffers = 16 и возвращать сжатые данные буфера в соответствии с соглашением о том, что номер типа каждого буфера (как определено в разделе 3.4 спецификации DirectX VA) может использоваться непосредственно в качестве отсчитываемого от нуля индекса в массиве возвращаемых структур данных AMVACompBufferInfo . Для этого требуется, чтобы для любых типов буферов, которые не будут использоваться (включая тип буфера 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 для получения информации из ускорителя должен указывать на область, в которой можно разместить альтернативную или дубликатную структуру данных конфигурации. Указатель pamvaBufferInfo для массива AMVABUFFERINFO должен иметь значение NULL, и dwNumBuffers должны быть равны нулю. Возвращаемый объект HRESULT содержит указание S_OK или S_FALSE либо E_FAIL, E_INVALIDARG или другое указание на ошибку HRESULT в случае серьезной проблемы при выполнении протокола (например, недопустимый параметр конфигурации). Все вызовы IAMVideoAccelerator::Execute для всех видов использования DXVA_ConfigQueryOrReplyFunc должны предшествовать всем остальным вызовам IAMVideoAccelerator::Execute.

    • Если dwFunction содержит DXVA_EncryptProtocolFunc, указатель lpPrivateInputData для передачи данных в ускоритель в этом вызове должен указывать на структуру данных протокола шифрования, которая начинается с DXVA_EncryptProtocolHeader. Указатель lpPrivateOutputData для получения информации из ускорителя должен указывать на область, в которой могут быть помещены данные, возвращаемые протоколом шифрования (например, сертификат) протоколом шифрования (который начинается с DXVA_EncryptProtocolHeader). Указатель pamvaBufferInfo для массива AMVABUFFERINFO должен иметь значение NULL, а dwNumBuffers — ноль. Возвращаемый объект HRESULT содержит S_OK, если протокол шифрования работает нормально, и содержит E_FAIL, E_INVALIDARG или другие признаки ошибки HRESULT в случае серьезной проблемы при выполнении протокола.

      После инициализации операции указанным выше способом фактическая работа декодера выполняется следующим образом:

  5. IAMVideoAccelerator::BeginFrame должен вызываться перед отправкой любого bDXVA_Func со сжатыми параметрами буфера, которые вызывают операции записи в несжатую область назначения. Цель IAMVideoAccelerator::BeginFrame в DirectX VA заключается в том, чтобы связать конечные поверхности со значениями индекса и уведомить драйвер видео акселератора о намерении инициировать запись поверхности, чтобы драйвер смог ответить, указывая, готова ли поверхность к перезаписи. Структура AMVABeginFrameInfo , переданная в IAMVideoAccelerator::BeginFrame , должна содержать указатель pInputData на один параметр WORD wBeginPictureIndex, соответствующий индексу кадра, переданного в IAMVideoAccelerator::BeginFrame (а dwSizeInputData — 2). Это индекс, используемый в сжатом буфере для выполнения операции записи в поверхность (например, для использования в качестве wDecodedPictureIndex, wDeblockedPictureIndex, wBlendedDestinationIndex или wPicResampleDestPicIndex). Каждый вызов IAMVideoAccelerator::BeginFrame должен быть связан с соответствующим вызовом IAMVideoAccelerator::EndFrame , как описано ниже. Например, если нужно декодировать сжатый рисунок, а затем использовать альфа-смешивание с помощью внешнего буфера в буфер с графическим изображением, вызов IAMVideoAccelerator::BeginFrame перед декодированием сжатого рисунка в поверхность, указанную в wDecodedPictureIndex, а затем вызов IAMVideoAccelerator::EndFrame после передачи всех сжатых буферов, используемых для декодирования рисунка, будет выполнен вызов IAMVideoAccelerator::EndFrame. затем второй вызов IAMVideoAccelerator::BeginFrame перед командой альфа-смешения графического источника с декодируемым рисунком в поверхность, указанную в wBlendedDestinationIndex, а затем второй вызов IAMVideoAccelerator::EndFrame после операции смешения альфа-смешения. Указатель pOutputData в AMVABeginFrameInfo должен иметь значение NULL (а dwSizeOutputData — "0"). HrESULT, возвращаемый IAMVideoAccelerator::BeginFrame , должен иметь следующий вид:

    • S_OK, доступна ли несжатая поверхность и готова к использованию.
    • E_PENDING, если несжатая поверхность еще не доступна для использования, но станет доступной в ближайшее время (если несжатая поверхность считывается для отображения и чтение/отображение поверхности еще не завершено).
    • E_FAIL или E_INVALIDARG другие признаки ошибки, только если обнаружен формат данных или ошибка протокола (например, неверное значение dwSizeInputData или pOutputData, отличное от NULL ).
  6. Указания функций DXVA и связанные буферы данных отправляются с помощью IAMVideoAccelerator::Execute. В одном вызове IAMVideoAccelerator::Execute может быть указано несколько bDXVA_Func значений. Значения bDXVA_Func должны быть упакованы в параметр dwFunction вызова с первой командой функции в восьми MSB, следующей командой в следующих восьми битах и т. д., при этом все оставшиеся биты заполняются нулями. Значение 0xFF для bDXVA_Func указывает, что bDXVA_Func расширяется до двух или четырех байтов. Если второй байт также 0xFF, это означает, что bDXVA_Func расширяется до четырех байтов. Если верхние четыре бита третьего байта 0xF или 0x0, это означает, что bDXVA_Func содержит DXVA_ConfigQueryOrReplyFunc или DXVA_EncryptProtocolFunc. Многобайтовые команды не должны указывать на продолжение после окончания dwFunction. Декодер должен соблюдать осторожность, чтобы гарантировать отсутствие последовательных зависимостей между разными bDXVA_Func значениями, указанными в одном вызове IAMVideoAccelerator::Execute , и чтобы все потенциальные условия гонки (например, между декодированием рисунков и наложением подснимков, между загрузкой под-рисунков и смешения вложенных рисунков и т. д.) были предотвращены соответствующими вызовами IAMVideoAccelerator:: BeginFrame и IAMVideoAccelerator::QueryRenderStatus перед последующими вызовами IAMVideoAccelerator::Execute.

    • Если dwFunction содержит DXVA_ConfigQueryOrReplyFunc, указатель lpPrivateInputData для передачи данных в ускоритель в этом вызове должен указывать на структуру данных конфигурации, указатель lpPrivateOutputData для получения информации из ускорителя должен указывать на область, в которой можно разместить альтернативную или дубликатную структуру данных конфигурации. Указатель pamvaBufferInfo для массива AMVABUFFERINFO должен иметь значение NULL, и dwNumBuffers должны быть равны нулю. Возвращенный объект HRESULT содержит S_OK или S_FALSE указание в ответ на запрос либо E_FAIL или E_INVALIDARG какое-либо другое указание об ошибке HRESULT в случае серьезной проблемы при выполнении протокола (например, недопустимый параметр конфигурации). Все вызовы IAMVideoAccelerator::Execute для всех видов использования DXVA_ConfigQueryOrReplyFunc должны предшествовать всем остальным вызовам IAMVideoAccelerator::Execute.

    • Если dwFunction содержит DXVA_EncryptProtocolFunc, указатель lpPrivateInputData для передачи данных в ускоритель в этом вызове должен указывать на структуру данных протокола шифрования, которая начинается с DXVA_EncryptProtocolHeader. Указатель lpPrivateOutputData для получения информации из ускорителя должен указывать на область, в которой могут быть помещены данные, возвращаемые протоколом шифрования (например, сертификат) протоколом шифрования (который начинается с DXVA_EncryptProtocolHeader). Указатель pamvaBufferInfo для массива AMVABUFFERINFO должен иметь значение NULL, а dwNumBuffers — ноль. Возвращаемый объект HRESULT содержит S_OK, если протокол шифрования работает нормально, и содержит E_FAIL, E_INVALIDARG или другие признаки ошибки HRESULT в случае серьезной проблемы при выполнении протокола.

    • Если dwFunction не содержит DXVA_ConfigQueryOrReplyFunc или DXVA_EncryptProtocolFunc, указатель lpPrivateInputData для передачи данных в ускоритель должен указывать на список описания буфера. Первые четыре записи в структуре списка описания буфера для каждого буфера (dwTypeIndex, dwBufferIndex, dwDataOffset и dwDataSize) должны быть равны записям в структуре данных AMVABUFFERINFO для одного буфера. Если bDXVA_Func равно "1", указывается в dwFunction, а bPicReadbackRequests — "1", Указатель lpPrivateOutputData для получения информации из ускорителя должен указывать на область постоянной памяти (например, кучу), которую нужно заполнить данными макроблока чтения из ускорителя (такие данные не гарантированно будут присутствовать до тех пор, пока IAMVideoAccelerator::QueryRenderStatus для записи в тот же буфер параметров рисунка указывает, S_OK, как описано в пункте 10 ниже). В противном случае указатель lpPrivateOutputData для получения сведений из ускорителя должен указывать на один DWORD, который должен иметь одно из следующих значений индикации (особенно полезно для сообщения об ошибках битового потока в операции VLD вне узла).

      Значение Описание
      0 Выполнение ОК.
      1 Возникла небольшая проблема в формате данных.
      2 Обнаружена значительная проблема в формате данных.
      3 Возникла серьезная проблема в формате данных.
      4 Возникла другая серьезная проблема.

       

      Если указан любой из типов "серьезных" проблем, программный декодер должен прекратить работу функций, если не будет предпринят корректирующее действие. Эти данные, возвращаемые из ускорителя, не будут считываться узлом до тех пор, пока не завершится отрисовка буфера для рисунка, что может быть проверено С помощью IAMVideoAccelerator::QueryRenderStatus. Возвращаемый объект HRESULT содержит S_OK, если операция интерфейса работает нормально, и может возвращать E_FAIL или E_INVALIDARG или другие признаки ошибки HRESULT в случае серьезной проблемы.

  7. Буфер параметров декодирования рисунков должен быть одним из первых буферов, отправленных для декодирования каждого рисунка при использовании IAMVideoAccelerator::Execute с bDXVA_Func равным "1", а все буферы для декодирования рисунка в битовом потоке должны отправляться перед любыми буферами для декодирования последующих рисунков. При отправке буфера команд управления макроблоком необходимо отправить соответствующий буфер данных остаточной разницы (содержащий данные для одних и те же макроблоков) с тем же вызовом IAMVideoAccelerator::Execute .

  8. IAMVideoAccelerator::EndFrame вызывается после отправки всех сжатых буферов, что приведет к созданию выходного содержимого в указанной несжатой поверхности (результат операций, указанных для wDecodedPictureIndex, wDeblockedPictureIndex, wBlendedDestinationIndex или wPicResampleDestPicIndex). Цель этого вызова IAMVideoAccelerator::EndFrame — уведомить оборудование видео акселератора о том, что все данные, необходимые для указанной операции, были отправлены. Указатель на данные, отправляемые ниже по протоколу IAMVideoAccelerator::EndFrame , должен указывать на один объект WORD wEndPictureIndex, содержащий индекс завершающегося кадра. Этот параметр должен соответствовать значению wBeginPictureIndex, указанному в предыдущем вызове IAMVideoAccelerator::BeginFrame перед отправкой соответствующих сжатых буферов. После вызова IAMVideoAccelerator::EndFrame, Несжатая поверхность с индексом wEndPictureIndex не должна находиться в wDecodedPictureIndex, wDeblockedPictureIndex, wBlendedDestinationIndex или wPicResampleDestPicIndex изображения до тех пор, пока после повторного вызова IAMVideoAccelerator::BeginFrame не будет выдано объявление о том, что это произойдет, и в результате будет возвращен S_OK. Однако этот индекс поверхности назначения может встречаться в последующих командах доступа на чтение, таких как wForwardRefPictureIndex, wBackwardRefPictureIndex, wPicResampleSourcePicIndex или bRefPicSelect[i]. HrESULT, возвращаемый IAMVideoAccelerator::EndFrame , должен быть S_OK, если не имеется какой-либо формат данных или ошибка протокола. В этом случае это может быть E_FAIL, E_INVALIDARG или какой-либо другой ошибке.

  9. В случае декодирования на основе полей (например, в битовых потоках MPEG-2) сопоставление функциональных изображений в битовом потоке с несжатой поверхностью в интерфейсе ускорителя не будет. При декодировании изображений полей в битовом потоке MPEG-2 будут декодированы два "рисунка" для создания одной полной выходной несжатой поверхности. В определении интерфейса DirectX VA каждый кадр соответствует каждому использованию wDecodedPictureIndex, wDeblockedPictureIndex, wBlendedDestinationIndex или wPicResampleDestPicIndex. Таким образом, две пары вызовов IAMVideoAccelerator::BeginFrame и IAMVideoAccelerator::EndFrame необходимы для декодирования рисунков полей в выходные несжатые поверхности.

  10. Вызов IAMVideoAccelerator::QueryRenderStatus с dwFlags равным нулю, который происходит через некоторое время после вызова IAMVideoAccelerator::EndFrame с определенным wEndPictureIndex и проверяет состояние отправленного буфера, содержащего wEndPictureIndex в wDecodedPictureIndex. wDeblockedPictureIndex, wBlendedDestinationIndex или wPicResampleDestPicIndex возвратит S_OK указание, завершены ли все операции записи данных в несжатую поверхность. и вернет E_PENDING, если операция еще не завершена. E_FAIL, E_INVALIDARG или другие признаки ошибки могут быть возвращены в случае ошибки протокола.

Сопоставление ускорения видео DirectX с IAMVideoAccelerator