Выдача необработанных команд 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);
Связанные темы