AVCSTRM_OPEN
O código da função AVCSTRM_OPEN abre um fluxo com um formato de fluxo específico.
Bloco de Status de E/S
Se tiver êxito, avcstrm.sysdefinirá Irp-IoStatus.Status> como STATUS_SUCCESS.
Se tiver êxito, um STATUS_SUCCESS será retornado junto com o contexto de fluxo no membro AVCStreamContext da estrutura AVC_STREAM_REQUEST_BLOCK . Esse contexto é usado posteriormente para outras solicitações avcstrm.sys .
Os possíveis valores retornados por erro incluem:
Status do erro | Descrição |
---|---|
STATUS_DEVICE_REMOVED | O dispositivo correspondente à operação de AVCSTRM_READ não existe mais. |
STATUS_CANCELLED | A solicitação não pôde ser concluída. |
STATUS_INVALID_PARAMETER | Um parâmetro especificado no IRP está incorreto, |
STATUS_INSUFFICIENT_RESOURCES | Não havia recursos suficientes do sistema para concluir a solicitação. |
STATUS_PENDING | A solicitação foi recebida, mas requer processamento adicional. A rotina de conclusão de E/S lidará com a resposta final. |
Entrada AVC_STREAM_REQUEST_BLOCK
SizeOfThisBlock, Versão e Função
Use a macro INIT_AVCSTRM_HEADER para inicializar esses membros. Passe AVCSTRM_OPEN no argumento Solicitação da macro.
AVCStreamContext
Especifica o contexto de fluxo (identificador). Isso deve ser NULL na entrada e, se AVCSTRM_OPEN retornar com êxito, esse membro conterá um contexto de fluxo válido para operações deavcstrm.sys subsequentes.
OpenStruct
Especifica a descrição do fluxo AV/C a ser criado.
A enumeração AVCSTRM_FORMAT fornece a lista de formatos de streaming AV/C com suporte (das especificações do IEC 61883) que avcstrm.sys dá suporte, como SDDV (61883-2) e MPEG2TS (61883-4).
Para fazer uma conexão isócrona, os cabeçalhos CIP e os parâmetros dependentes de subunidade são necessários e são definidos na estrutura AVCSTRM_FORMAT_INFO .
Veja a seguir um exemplo das informações de formato MPEG2TS para receber dados:
//
// 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,
},
Um driver de subunidade deve primeiro alocar um IRP e uma estrutura AVC_STREAM_REQUEST_BLOCK .
Em seguida, ele deve usar a macro INIT_AVCSTRM_HEADER para inicializar a estrutura AVC_STREAM_REQUEST_BLOCK, passando AVCSTRM_OPEN como o argumento Request para a macro.
Em seguida, o driver de subunidade define o membro AVCStreamContext como NULL.
Na operação bem-sucedida, esse membro deve conter um contexto de fluxo válido (um identificador) que é usado em operações deavcstrm.sys subsequentes. Esse membro não deve ser modificado depois disso até que o fluxo seja fechado por meio de AVCSTRM_CLOSE.. Por fim, o driver de subunidade define o membro OpenStruct da união CommandData que descreve o fluxo a ser aberto.
Para enviar essa solicitação, uma subunidade envia um IRP IRP_MJ_INTERNAL_DEVICE_CONTROL com o membro IoControlCode do IRP definido como IOCTL_AVCSTRM_CLASS e o membro Argument1 do IRP definido para a estrutura AVC_STREAM_REQUEST_BLOCK que descreve a operação aberta a ser realizada.
Um driver de subunidade pode esperar que esse comando seja concluído de forma síncrona. O resultado retorna imediatamente sem a operação pendente no avcstrm.sys.
Esse código de função deve ser chamado em IRQL = PASSIVE_LEVEL.
Comentários
Essa função usa o membro OpenStruct da união CommandData na estrutura AVC_STREAM_REQUEST_BLOCK conforme mostrado abaixo.
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;
Requisitos
Cabeçalhos: Declarado em avcstrm.h. Inclua avcstrm.h.