Negociación de tipos de medios

[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.

Cuando el Administrador de gráficos de filtros llama al método IPin::Connect , tiene varias opciones para especificar un tipo de medio:

  • Tipo completo: Si el tipo de medio está completamente especificado, las patillas intentan conectarse con ese tipo. Si no pueden, se produce un error en el intento de conexión.
  • Tipo de medio parcial: Un tipo de medio es parcial si el tipo principal, subtipo o tipo de formato es GUID_NULL. El valor GUID_NULL actúa como "comodín", lo que indica que cualquier valor es aceptable. Las patillas negocian un tipo que es coherente con el tipo parcial.
  • Sin tipo de medio: Si el Administrador de gráficos de filtros pasa un puntero NULL , las patillas pueden aceptar cualquier tipo de medio que sea aceptable para ambos pines.

Si los pines se conectan, la conexión siempre tiene un tipo de medio completo. El propósito del tipo de medio proporcionado por el Administrador de gráficos de filtros es limitar los tipos de conexión posibles.

Durante el proceso de negociación, el pin de salida propone un tipo multimedia llamando al método IPin::ReceiveConnection del pin de entrada. El pin de entrada puede aceptar o rechazar el tipo propuesto. Este proceso se repite hasta que el pin de entrada acepta un tipo o el pin de salida se queda sin tipos y se produce un error en la conexión.

La forma en que un pin de salida selecciona los tipos de medios que se van a proponer depende de la implementación. En las clases base directShow, el pin de salida llama a IPin::EnumMediaTypes en el pin de entrada. Este método devuelve un enumerador que enumera los tipos de medios preferidos del pin de entrada. Si se produce un error, el pin de salida enumera sus propios tipos preferidos.

Trabajar con tipos de medios

En cualquier función que reciba un parámetro AM_MEDIA_TYPE , valide siempre los valores de cbFormat y formattype antes de desreferenciar el miembro pbFormat . El código siguiente es incorrecto:

if (pmt->formattype == FORMAT_VideoInfo)
{
    VIDEOINFOHEADER *pVIH = (VIDEOINFOHEADER*)pmt->pbFormat;
    // Wrong!
}

El código siguiente es correcto:

if ((pmt->formattype == FORMAT_VideoInfo) && 
    (pmt->cbFormat > sizeof(VIDEOINFOHEADER) &&
    (pbFormat != NULL))
{
    VIDEOINFOHEADER *pVIH = (VIDEOINFOHEADER*)pmt->pbFormat;
    // Now you can dereference pVIH.
}