Partilhar via


CD-ROM Real-Time Streaming

Streaming (ou streaming em tempo real) é um recurso fornecido por unidades ópticas para permitir solicitações de leitura e gravação mais rápidas. A partir do Windows 7, o suporte para streaming de DVD-Video foi implementado em todas as camadas da pilha de armazenamento, de Cdrom.sys a Reprodutor Multimídia do Windows, incluindo o driver do sistema de arquivos UDF, Udfs.sys e o subsistema de reprodução de vídeo.

Sobre o streaming em tempo real

Em geral, o acesso de leitura e gravação à mídia óptica é caracterizado por duas propriedades: confiabilidade e desempenho sustentado. Essas propriedades são interdependentes e não podem ser maximizadas ao mesmo tempo (maior confiabilidade é obtida em detrimento de um desempenho menor).

A maioria dos aplicativos para mídia óptica é focada na confiabilidade (ou seja, integridade de dados). No entanto, determinados aplicativos, como gravadores de DVD e filmadoras de vídeo digital, se concentram no desempenho sustentado e exigem um determinado nível de taxa de transferência de dados garantida para a operação adequada. Por design, esses aplicativos são resilientes à perda razoável de dados (por exemplo, codecs de vídeo pressupõem que alguns quadros podem ser perdidos). Para esses aplicativos, a confiabilidade não é a prioridade mais alta. As unidades ópticas resolvem essa necessidade fornecendo um modo de operação especial (chamado Real-Time Streaming). Para aumentar o desempenho nesse modo, erros de leitura ou gravação são ignorados e a unidade não executa novas tentativas ou correção ou prevenção de erros.

Suporte do desenvolvedor para streaming em tempo real no Windows

A partir do Windows 7, o driver de classe CD-ROM, Cdrom.sys, dá suporte a solicitações de leitura e gravação de streaming de baixo nível (os comandos READ12/WRITE12 da especificação do MMC). Os aplicativos no modo de usuário podem usar o IOCTL (código de controle de E/S) IOCTL_CDROM_ENABLE_STREAMING para habilitar ou desabilitar o streaming para solicitações de leitura e gravação brutas. Essas solicitações de leitura e gravação são executadas usando os identificadores abertos para o dispositivo CD/DVD-ROM bruto.

Além disso, para componentes do modo kernel, há alterações na maneira como Cdrom.sys lida com solicitações de IRP_MJ_READ e IRP_MJ_WRITE . O driver de classe valida que as solicitações de streaming em tempo real atendem aos recursos do dispositivo. Para implementar esse recurso, o Windows 7 introduziu um sinalizador de streaming, SL_REALTIME_STREAM, no IO_STACK_LOCATION do driver. Esse sinalizador é declarado para todas as solicitações de leitura ou gravação de streaming e limpo para todas as solicitações que não são de streaming.

Essas alterações na pilha do driver de armazenamento permitem que camadas mais altas (em particular, drivers do sistema de arquivos e aplicativos) executem operações de leitura/gravação em uma velocidade garantida para arquivos que contêm dados em tempo real. A partir do Windows 7, você pode marcar um arquivo para streaming em tempo real usando o Código de Controle FSCTL_MARK_HANDLE e especificando o modo de streaming definindo MARK_HANDLE_REALTIME sinalizador na estrutura MARK_HANDLE_INFO .

A Figura 1 ilustra a relação entre solicitações de leitura e gravação regulares e de streaming e o sistema de arquivos UDF e os drivers de classe CDROM.

figura 1: suporte a streaming em tempo real em cdrom.sys e udfs.sys.

Os aplicativos de reprodução de DVD e os drivers do sistema de arquivos têm a opção de usar IOCTLs para acessar o suporte bruto de streaming em Cdrom.sys (nível mais baixo) ou usar o suporte do sistema de arquivos para o modo de streaming introduzido no Udfs.sys. Os aplicativos também podem incluir o subsistema de reprodução de vídeo do Windows como um todo. Além da reprodução, as camadas Cdrom.sys e do sistema de arquivos também dão suporte à gravação de streaming.

Verificando o suporte do dispositivo para streaming em tempo real usando IOCTLs

Use IOCTL_CDROM_GET_CONFIGURATION para determinar se o recurso de streaming está presente e atual.

Habilitar ou desabilitar o streaming em tempo real usando IOCTLs

Use o código de controle de E/S IOCTL_CDROM_ENABLE_STREAMING para habilitar ou desabilitar o modo de streaming para solicitações de leitura e gravação brutas. Esse IOCTL não tem parâmetro de saída e dá suporte à estrutura CDROM_STREAMING_CONTROL como o parâmetro de entrada.

Esse IOCTL habilita ou desabilita o modo de streaming por identificador. Por padrão, o streaming é desabilitado para todos os identificadores CDROM brutos recém-abertos. Um aplicativo de reprodução que não deseja usar o sistema de arquivos e prefere trabalhar com dados brutos deve abrir dois identificadores de arquivo para o mesmo dispositivo: um regular para metadados do sistema de arquivos e um streaming para arquivos em tempo real.

Especificando o streaming em tempo real para solicitações de IRP_MJ_READ e IRP_MJ_WRITE

O sinalizador SL_REALTIME_STREAM no campo IoGetCurrentIrpStackLocation(Irp)-Flags controla solicitações de streaming de> leitura e gravação (IRP_MJ_READ e IRP_MJ_WRITE). O sinalizador é definido para todas as solicitações de leitura e gravação de streaming e limpo para todas as solicitações que não são de streaming. Se o sinalizador SL_REALTIME_STREAM estiver definido, Cdrom.sys executará solicitações de streaming usando comandos SCSI READ12 e WRITE12 em vez de comandos SCSI READ10 ou WRITE10. Se o sinalizador SL_REALTIME_STREAM estiver definido em um IRP, mas o dispositivo não oferecer suporte ao streaming para a mídia inserida no momento, o IRP será rejeitado com o código status STATUS_INVALID_DEVICE_REQUEST.

Especificando o streaming em tempo real para um arquivo usando FSCTLs

Você pode marcar qualquer arquivo para comportamento de leitura em tempo real, independentemente do tipo de arquivo. Para fazer isso, defina o sinalizador MARK_HANDLE_REALTIME na estrutura MARK_HANDLE_INFO e envie o código de controle FSCTL_MARK_HANDLE . Os arquivos marcados com esse sinalizador devem ser abertos para E/S não armazenada.

Um aplicativo pode desmarcar um arquivo que foi sinalizado anteriormente para comportamento em tempo real, definindo o sinalizador MARK_HANDLE_NOT_REALTIME na estrutura MARK_HANDLE_INFO.

Se FSCTL_MARK_HANDLE código de controle for enviado com MARK_HANDLE_REALTIME e a unidade de CD-ROM/DVD ou a mídia indicarem que o recurso de streaming em tempo real não tem suporte, IOCTL retornará STATUS_INVALID_DEVICE_REQUEST. Se o identificador for aberto sem buffer, o STATUS_INVALID_DEVICE_REQUEST também será retornado.

Executando OPC (Otimização de Calibragem de Energia) antes de gravar

Alguns aplicativos podem querer executar o procedimento OPC com antecedência, para que a primeira gravação de streaming não precise aguardar a conclusão do OPC. Para fazer isso, Cdrom.sys fornece um IOCTL chamado IOCTL_CDROM_SEND_OPC_INFORMATION.

Determinando a velocidade de leitura/gravação da unidade

A especificação do MMC recomenda que os aplicativos indiquem a velocidade de leitura e gravação desejável antes de usar a E/S de streaming, para que a unidade possa encontrar um melhor equilíbrio entre a qualidade de leitura e gravação e a taxa de transferência. Os aplicativos podem usar o IOCTL_CDROM_SET_SPEED para indicar a velocidade preferencial. Para determinar os recursos com suporte da unidade, o Windows 7 introduziu o código de controle IOCTL_CDROM_GET_PERFORMANCE , que usa como entrada uma estrutura CDROM_PERFORMANCE_REQUEST .

IOCTL_CDROM_ENABLE_STREAMING

IOCTL_CDROM_GET_PERFORMANCE

IOCTL_CDROM_SEND_OPC_INFORMATION

IOCTL_CDROM_SET_SPEED

FSCTL_MARK_HANDLE

MARK_HANDLE_INFO

CDROM_PERFORMANCE_REQUEST