Поделиться через


Выдача необработанных команд AV/C

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

Интерфейсы IAMExtDevice, IAMExtTransport и IAMTimecodeReader работают путем преобразования вызовов методов в команды для драйвера, а затем интерпретируют ответ драйвера и возвращают его через HRESULT или выходной параметр. Однако некоторые функции устройств могут быть недоступны с помощью этих методов. Поэтому MSDV поддерживает отправку необработанных команд AV/C на устройство.

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

  • Команда передается непосредственно на устройство без проверки ошибок или проверки параметров. По этой причине следует выполнять необработанные команды AV/C только в том случае, если интерфейсы DirectShow не реализуют необходимые функции.
  • Все необработанные команды AV/C являются синхронными. Поток, выдающий команду, блокируется до тех пор, пока команда не вернется.
  • Одновременно может быть предоставлена только одна команда. Во время обработки команды устройство отклоняет все дополнительные команды.
  • Драйвер UVC не поддерживает необработанные команды AV/C.

Чтобы отправить команду AV/C, отформатируйте команду как массив байтов. Затем вызовите IAMExtTransport::GetTransportBasicParameters. Передайте флаг ED_RAW_EXT_DEV_CMD, размер массива и массив. Необходимо привести адрес массива к типу LPOLESTR* , так как первоначальная цель этого параметра заключалась в возврате строкового значения.

BYTE AvcCmd[] = { ... }; // Contains the AV/C command (not shown)
long cbCmd = sizeof(AvcCmd);
hr = pTransport->GetTransportBasicParameters(
    ED_RAW_EXT_DEV_CMD, 
    &cbCmd,
    (LPOLESTR*) AvcCmd);

Содержимое массива передается непосредственно на устройство, поэтому необходимо тщательно отформатировать его. Команда может быть нацелена на единицу (видеокамеру) или подсеть (ленту или камеру). Соответствующие стандарты доступны на веб-сайте Торговой ассоциации 1394.

  • Общая спецификация набора команд цифрового интерфейса AV/C
  • Спецификация видеомагнитофона или подсоединителя проигрывателя AV/C

В первом описано, как форматировать команды AV/C, и перечислены команды модуля. В последней спецификации перечислены команды подсоединений.

Метод GetTransportBasicParameters может возвращать один из следующих кодов ошибок:

Код ошибки Описание
ERROR_TIMEOUT Истекло время ожидания команды.
ERROR_REQ_NOT_ACCEP Устройство не приняло команду .
ERROR_NOT_SUPPORTED Устройство не поддерживает команду .
ERROR_REQUEST_ABORTED Команда была прервана. По возможности устройство было удалено или произошел сброс шины.

 

Примечание

Эти ошибки возвращаются как коды ошибок Win32, а не HRESULT, поэтому следует проверять эти значения напрямую, а не использовать макросы SUCCEEDED и FAILED .

 

Если метод возвращает S_OK, ответ с устройства копируется в массив. Полезные данные ответа могут быть больше, чем команда, поэтому необходимо выделить буфер достаточно большой, чтобы вместить его. Максимальный размер полезных данных составляет 512 байт. Обратите внимание, что возвращаемое значение S_OK не всегда означает, что устройство успешно выполнило команду. Чтобы определить состояние, приложение должно изучить полезные данные ответа.

В следующем примере показана команда для поиска по абсолютному номеру дорожки:

// Set up the ATN search command.
BYTE AvcCmd[] = 
{ 
    0x00,   // ctype = "control"
    0x20,   // subunit_type, subunit_id
    0x52,   // opcode (ATN)
    0x20,   // operand 0 = "search"
    0x00,   // operand 1 = ATN
    0x00,   // operand 2 = ATN
    0x00,   // operand 3 = ATN
    0xFF   //  operand 4 = D-VCR medium type.
};
// Specify a track number.
ULONG ulTrackNumber = track_number; // Specify the track number here.
// Shift over by 1 (LSB of operand 1 is a 1-bit blank flag)
ulTrackNumber = ulTrackNumber << 1; 
// Plug this number into operands 1 - 3.
AvcCmd[4] = (BYTE) (ulTrackNumber & 0x000000FF);
AvcCmd[5] = (BYTE)((ulTrackNumber & 0x0000FF00) >> 8);
AvcCmd[6] = (BYTE)((ulTrackNumber & 0x00FF0000) >> 16);

Управление dv camcorder