AVCSTRM_OPEN

AVCSTRM_OPEN函数代码使用特定流格式打开流。

I/O 状态块

如果成功, avcstrm.sysIrp-IoStatus.Status> 设置为 STATUS_SUCCESS。

如果成功,将返回STATUS_SUCCESS以及 AVC_STREAM_REQUEST_BLOCK 结构的 AVCStreamContext 成员中的流上下文。 此上下文随后用于其他 avcstrm.sys 请求。

可能的错误返回值包括:

错误状态 说明
STATUS_DEVICE_REMOVED AVCSTRM_READ 操作对应的设备不再存在。
STATUS_CANCELLED 请求无法完成。
STATUS_INVALID_PARAMETER IRP 中指定的参数不正确,
STATUS_INSUFFICIENT_RESOURCES 系统资源不足,无法完成请求。
STATUS_PENDING 已收到请求,但需要进一步处理。 I/O 完成例程将处理最终响应。

AVC_STREAM_REQUEST_BLOCK输入

SizeOfThisBlock、版本和函数
使用 INIT_AVCSTRM_HEADER 宏初始化这些成员。 在宏的 Request 参数中传递 AVCSTRM_OPEN

AVCStreamContext
指定流上下文 (处理) 。 输入时应为 NULL ,如果 AVCSTRM_OPEN 成功返回,则此成员包含用于后续 avcstrm.sys 操作的有效流上下文。

OpenStruct
指定要创建的 AV/C 流的说明。

AVCSTRM_FORMAT 枚举提供avcstrm.sys支持的 IEC 61883 规范) (支持的 AV/C 流格式列表,例如 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 作为 Request 参数传递给宏。

接下来,子单元驱动程序将 AVCStreamContext 成员设置为 NULL

成功操作时,此成员应包含有效的流上下文 (在后续avcstrm.sys操作中使用的句柄 ) 。 此后不应修改此成员,直到通过 AVCSTRM_CLOSE 关闭流。 最后,子单元驱动程序设置描述要打开的流的 CommandData 联合的 OpenStruct 成员。

为了发送此请求,子单元提交 一个IRP_MJ_INTERNAL_DEVICE_CONTROL IRP,其中 IRP 的 IoControlCode 成员设置为 IOCTL_AVCSTRM_CLASS IRP 的 Argument1 成员设置为描述要执行的打开操作的 AVC_STREAM_REQUEST_BLOCK 结构。

子单元驱动程序预期此命令同步完成。 结果立即返回,而不会在 avcstrm.sys中挂起操作。

必须在 IRQL = PASSIVE_LEVEL 调用此函数代码。

注释

此函数在 AVC_STREAM_REQUEST_BLOCK 结构中使用 CommandData 联合的 OpenStruct 成员,如下所示。

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