Compartir a través de


Emisión de comandos DE AV/C sin formato

[La característica asociada a esta página, DirectShow, es una característica heredada. Se ha reemplazado por MediaPlayer, IMFMediaEngine y Captura de audio/vídeo en Media Foundation. Esas características se han optimizado para Windows 10 y Windows 11. Microsoft recomienda encarecidamente que el nuevo código use MediaPlayer, IMFMediaEngine y Audio/Video Capture en Media Foundation en lugar de DirectShow, siempre que sea posible. Microsoft sugiere que el código existente que usa las API heredadas se reescriba para usar las nuevas API si es posible.

Las interfaces IAMExtDevice, IAMExtTransport e IAMTimecodeReader funcionan traduciendo las llamadas de método a comandos para el controlador, interpretando la respuesta del controlador y devolviéndolo a través de un HRESULT o un parámetro de salida. Sin embargo, es posible que algunas funciones de dispositivo no sean accesibles a través de estos métodos. Por lo tanto, MSDV admite el envío de comandos AV/C sin formato al dispositivo.

Debe tener en cuenta los siguientes puntos al usar esta característica:

  • El comando se pasa directamente al dispositivo, sin comprobación de errores ni validación de parámetros. Por este motivo, debe emitir comandos AV/C sin procesar solo cuando las interfaces directShow no implementan la funcionalidad que necesita.
  • Todos los comandos AV/C sin procesar son sincrónicos. El subproceso que emite el comando se bloquea hasta que el comando vuelva.
  • Solo se puede proporcionar un comando a la vez. Mientras se procesa el comando, el dispositivo rechazará los comandos adicionales.
  • El controlador UVC no admite comandos AV/C sin procesar.

Para enviar un comando AV/C, dé formato al comando como una matriz de bytes. A continuación, llame a IAMExtTransport::GetTransportBasicParameters. Pase la marca ED_RAW_EXT_DEV_CMD, el tamaño de la matriz y la matriz. Debe convertir la dirección de matriz a un tipo LPOLESTR* , ya que el propósito original de este parámetro era devolver un valor de cadena.

BYTE AvcCmd[] = { ... }; // Contains the AV/C command (not shown)
long cbCmd = sizeof(AvcCmd);
hr = pTransport->GetTransportBasicParameters(
    ED_RAW_EXT_DEV_CMD, 
    &cbCmd,
    (LPOLESTR*) AvcCmd);

El contenido de la matriz se pasa directamente al dispositivo, por lo que debe tener cuidado de darle formato correctamente. Un comando puede dirigirse a la unidad (videocámara) o a una subunidad (cinta o cámara). Las normas pertinentes están disponibles en el sitio web de la Asociación comercial de 1394.

  • Especificación general del conjunto de comandos de interfaz digital de AV/C
  • Especificación de subunidad del reproductor/grabadora de cinta AV/C

El primero describe cómo dar formato a los comandos AV/C y enumera los comandos de unidad. En la última especificación se enumeran los comandos de subbúnit.

El método GetTransportBasicParameters puede devolver uno de los siguientes códigos de error:

Código de error Descripción
ERROR_TIMEOUT Se agota el tiempo de espera del comando.
ERROR_REQ_NOT_ACCEP El dispositivo no aceptó el comando .
ERROR_NOT_SUPPORTED El dispositivo no admite el comando .
ERROR_REQUEST_ABORTED Se anuló el comando. Possbly se quitó el dispositivo o se produjo un restablecimiento de bus.

 

Nota:

Estos errores se devuelven como códigos de error win32, no HRESULT, por lo que debe probar estos valores directamente, en lugar de usar las macros SUCCEEDED y FAILED .

 

Si el método devuelve S_OK, la respuesta del dispositivo se copia en la matriz. La carga de respuesta puede ser mayor que el comando, por lo que debe asignar un búfer lo suficientemente grande como para contenerlo. El tamaño máximo de carga es de 512 bytes. Tenga en cuenta que un valor devuelto de S_OK no siempre significa que el dispositivo haya realizado correctamente el comando. La aplicación debe examinar la carga de respuesta para determinar el estado.

En el ejemplo siguiente se muestra el comando para buscar una búsqueda de número de seguimiento absoluto:

// Set up the ATN search command.
BYTE AvcCmd[] = 
{ 
    0x00,   // ctype = "control"
    0x20,   // subunit_type, subunit_id
    0x52,   // opcode (ATN)
    0x20,   // operand 0 = "search"
    0x00,   // operand 1 = ATN
    0x00,   // operand 2 = ATN
    0x00,   // operand 3 = ATN
    0xFF   //  operand 4 = D-VCR medium type.
};
// Specify a track number.
ULONG ulTrackNumber = track_number; // Specify the track number here.
// Shift over by 1 (LSB of operand 1 is a 1-bit blank flag)
ulTrackNumber = ulTrackNumber << 1; 
// Plug this number into operands 1 - 3.
AvcCmd[4] = (BYTE) (ulTrackNumber & 0x000000FF);
AvcCmd[5] = (BYTE)((ulTrackNumber & 0x0000FF00) >> 8);
AvcCmd[6] = (BYTE)((ulTrackNumber & 0x00FF0000) >> 16);

Control de una videocámara DV