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


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.

См. также:

AVC_STREAM_REQUEST_BLOCK

INIT_AVCSTRM_HEADER

IRP_MJ_INTERNAL_DEVICE_CONTROL

IOCTL_AVCSTRM_CLASS

AVCSTRM_OPEN_STRUCT

AVCSTRM_FUNCTION

AVCSTRM_FORMAT

AVCSTRM_FORMAT_INFO