AVCSTRM_OPEN
Код функции AVCSTRM_OPEN открывает поток в определенном формате.
Блок состояния ввода-вывода
В случае успеха avcstrm.sys присваивает Irp-IoStatus.Status> значение STATUS_SUCCESS.
В случае успеха возвращается STATUS_SUCCESS вместе с контекстом потока в элементе AVCStreamContext структуры AVC_STREAM_REQUEST_BLOCK . Этот контекст впоследствии используется для других запросовavcstrm.sys .
Возможные возвращаемые значения ошибок:
Состояние ошибки | Описание |
---|---|
STATUS_DEVICE_REMOVED | Устройство, соответствующее операции AVCSTRM_READ , больше не существует. |
STATUS_CANCELLED | Не удалось выполнить запрос. |
STATUS_INVALID_PARAMETER | Параметр, указанный в IRP, является неправильным. |
STATUS_INSUFFICIENT_RESOURCES | Недостаточно системных ресурсов для выполнения запроса. |
STATUS_PENDING | Запрос получен, но требует дальнейшей обработки. Подпрограмма завершения ввода-вывода будет обрабатывать окончательный ответ. |
Входные данные AVC_STREAM_REQUEST_BLOCK
SizeOfThisBlock, версия и функция
Используйте макрос INIT_AVCSTRM_HEADER для инициализации этих элементов. Передайте AVCSTRM_OPEN в аргументе Request макроса.
AVCStreamContext
Указывает контекст потока (дескриптор). Для входных данных это значение должно иметь значение NULL , и если AVCSTRM_OPEN возвращается успешно, этот элемент содержит допустимый контекст потока для последующих операцийavcstrm.sys .
OpenStruct
Указывает описание создаваемого потока AV/C.
Перечисление AVCSTRM_FORMAT содержит список поддерживаемых форматов потоковой передачи AV/C (из спецификаций IEC 61883), поддерживаемых avcstrm.sys , например SDDV (61883-2) и MPEG2TS (61883-4).
Чтобы установить изохронное соединение, заголовки CIP и зависимые параметры подъединений являются обязательными и определяются в структуре AVCSTRM_FORMAT_INFO .
Ниже приведен пример сведений о формате MPEG2TS для получения данных:
//
// MPEG2TS
//
{
sizeof(AVCSTRM_FORMAT_INFO),
AVCSTRM_FORMAT_MPEG2TS,
{
0,0,
CIP_SPH_MPEG,
CIP_QPC_MPEG,
CIP_FN_MPEG,
IP_DBS_MPEG,
0,0
}, // CIP header[0]
{
0,0,0,
CIP_TSF_OFF,
CIP_FMT_MPEG,
2,
}, // CIP header[1]
SRC_PACKETS_PER_MPEG2TS_FRAME, // varies depending on number of source packets
BUFFER_SIZE_MPEG2TS_NO_SPH, // Remove source packet header
NUM_OF_XMT_BUFFERS_MPEG2TS, // Subunit defined
0,
FALSE, // not striping SPH is the default
0,
BLOCK_PERIOD_MPEG2TS, // 192, / number of 1394 cycle offset to send one block
0,0,0,0,
},
Драйвер подсоединения должен сначала выделить IRP и структуру AVC_STREAM_REQUEST_BLOCK .
Затем он должен использовать макрос INIT_AVCSTRM_HEADER для инициализации структуры AVC_STREAM_REQUEST_BLOCK, передавая AVCSTRM_OPEN в качестве аргумента Запроса в макрос.
Затем драйвер подсоединия задает для элемента AVCStreamContextзначение NULL.
При успешной операции этот элемент должен содержать допустимый контекст потока (дескриптор), который используется в последующих операцияхavcstrm.sys . Этот элемент не следует изменять после этого, пока поток не будет закрыт через AVCSTRM_CLOSE.. Наконец, драйвер подсоединения задает член OpenStruct объединения CommandData , описывающий открываемый поток.
Чтобы отправить этот запрос, подсоединительная единица отправляет IRP_MJ_INTERNAL_DEVICE_CONTROL IRP с элементом IoControlCode IRP, который имеет значение IOCTL_AVCSTRM_CLASS , а член Argument1 набора IRP — в структуру AVC_STREAM_REQUEST_BLOCK, описывающую операцию открытия.
Драйвер подсоединия может ожидать, что эта команда будет выполняться синхронно. Результат возвращается немедленно без ожидающих операций в avcstrm.sys.
Этот код функции должен вызываться по адресу IRQL = PASSIVE_LEVEL.
Комментарии
Эта функция использует элемент OpenStruct объединения CommandData в структуре AVC_STREAM_REQUEST_BLOCK, как показано ниже.
typedef struct _AVC_STREAM_REQUEST_BLOCK {
ULONG SizeOfThisBlock;
ULONG Version;
AVCSTRM_FUNCTION Function;
.
.
PVOID AVCStreamContext;
.
.
union _tagCommandData {
.
.
AVCSTRM_OPEN_STRUCT OpenStruct;
.
.
} CommandData;
} AVC_STREAM_REQUEST_BLOCK, *PAVC_STREAM_REQUEST_BLOCK;
Требования
Заголовки: Объявлен в avcstrm.h. Включите avcstrm.h.