Descriptores de presentación
Una presentación es un conjunto de secuencias multimedia relacionadas que comparten un tiempo de presentación común. Por ejemplo, una presentación podría constar de las secuencias de audio y vídeo de una película. Un descriptor de presentación es un objeto que contiene la descripción de una presentación determinada. Los descriptores de presentación se usan para configurar orígenes multimedia y algunos receptores de medios.
Cada descriptor de presentación contiene una lista de uno o varios descriptores de secuencia. Describen las secuencias de la presentación. Las secuencias se pueden seleccionar o anular la selección. Solo los flujos seleccionados generan datos. Las secuencias deseleccionada no están activas y no generan ningún dato. Cada descriptor de secuencia tiene un controlador de tipo multimedia, que se usa para cambiar el tipo de medio de la secuencia o obtener el tipo de medio actual de la secuencia. (Para obtener más información sobre los tipos de medios, vea Tipos de medios).
En la tabla siguiente se muestran las interfaces principales que expone cada uno de estos objetos.
Object | Interfaz |
---|---|
Descriptor de presentación | IMFPresentationDescriptor |
Descriptor de secuencia | IMFStreamDescriptor |
Controlador de tipos de medios | IMFMediaTypeHandler |
Presentaciones de origen multimedia
Cada origen multimedia proporciona un descriptor de presentación que describe la configuración predeterminada para el origen. En la configuración predeterminada, se selecciona al menos una secuencia y cada secuencia seleccionada tiene un tipo de medio. Para obtener el descriptor de presentación, llame a IMFMediaSource::CreatePresentationDescriptor. El método devuelve un puntero IMFPresentationDescriptor .
Puede modificar el descriptor de presentación del origen para seleccionar un conjunto diferente de secuencias. No modifique el descriptor de presentación a menos que se detenga el origen multimedia. Los cambios se aplican cuando se llama a IMFMediaSource::Start para iniciar el origen.
Para obtener el número de secuencias, llame a IMFPresentationDescriptor::GetStreamDescriptorCount. Para obtener el descriptor de secuencia de una secuencia, llame a IMFPresentationDescriptor::GetStreamDescriptorByIndex y pase el índice de la secuencia. Los flujos se indexan desde cero. El método GetStreamDescriptorByIndex devuelve un puntero IMFStreamDescriptor . También devuelve una marca booleana que indica si está seleccionada la secuencia. Si se selecciona la secuencia, el origen multimedia genera datos para esa secuencia. De lo contrario, el origen no genera ningún dato para esa secuencia. Para seleccionar una secuencia, llame a IMFPresentationDescriptor::SelectStream con el índice de la secuencia. Para anular la selección de una secuencia, llame a IMFPresentationDescriptor::D eselectStream.
En el código siguiente se muestra cómo obtener el descriptor de presentación de un origen multimedia y enumerar las secuencias.
HRESULT hr = S_OK;
DWORD cStreams = 0;
BOOL fSelected = FALSE;
IMFPresentationDescriptor *pPresentation = NULL;
IMFStreamDescriptor *pStreamDesc = NULL;
hr = pSource->CreatePresentationDescriptor(&pPresentation);
if (SUCCEEDED(hr))
{
hr = pPresentation->GetStreamDescriptorCount(&cStreams);
}
if (SUCCEEDED(hr))
{
for (DWORD iStream = 0; iStream < cStreams; iStream++)
{
hr = pPresentation->GetStreamDescriptorByIndex(
iStream, &fSelected, &pStreamDesc);
if (FAILED(hr))
{
break;
}
/* Use the stream descriptor. (Not shown.) */
SAFE_RELEASE(pStreamDesc);
}
}
SAFE_RELEASE(pPresentation);
SAFE_RELEASE(pStreamDesc);
Controladores de tipos de medios
Para cambiar el tipo de medio de la secuencia o para obtener el tipo de medio actual de la secuencia, use el controlador de tipos multimedia del descriptor de secuencia. Llame a IMFStreamDescriptor::GetMediaTypeHandler para obtener el controlador de tipos multimedia. Este método devuelve un puntero IMFMediaTypeHandler .
Si simplemente desea saber qué tipo de datos se encuentra en la secuencia, como audio o vídeo, llame a IMFMediaTypeHandler::GetMajorType. Este método devuelve el GUID para el tipo de medio principal. Por ejemplo, una aplicación de reproducción normalmente conecta una secuencia de audio al representador de audio y una secuencia de vídeo al representador de vídeo. Si usa la sesión multimedia o el cargador de topología para compilar una topología, el GUID de tipo principal podría ser la única información de formato que necesita.
Si la aplicación necesita información más detallada sobre el formato actual, llame a IMFMediaTypeHandler::GetCurrentMediaType. Este método devuelve un puntero a la interfaz IMFMediaType del tipo de medio. Use esta interfaz para obtener los detalles del formato.
El controlador de tipos de medios también contiene una lista de tipos de medios admitidos para la secuencia. Para obtener el tamaño de la lista, llame a IMFMediaTypeHandler::GetMediaTypeCount. Para obtener un tipo de medio de la lista, llame a IMFMediaTypeHandler::GetMediaTypeByIndex con el índice del tipo de medio. Los tipos de medios se devuelven en el orden aproximado de preferencia. Por ejemplo, en el caso de los formatos de audio, se prefieren velocidades de muestreo más altas sobre las tasas de muestreo más bajas. Sin embargo, no hay ninguna regla definitiva que regule la ordenación, por lo que debe tratarla simplemente como una guía.
Es posible que la lista de tipos admitidos no contenga todos los tipos de medios posibles que admite la secuencia. Para comprobar si se admite un tipo de medio determinado, llame a IMFMediaTypeHandler::IsMediaTypeSupported. Para establecer el tipo de medio, llame a IMFMediaTypeHandler::SetCurrentMediaType. Si el método se ejecuta correctamente, la secuencia contendrá datos que se ajustan al formato especificado. El método SetCurrentMediaType no cambia la lista de tipos preferidos.
En el código siguiente se muestra cómo obtener el controlador de tipos de medios, enumerar los tipos de medios preferidos y establecer el tipo de medio. En este ejemplo se supone que la aplicación tiene algún algoritmo, no se muestra aquí, para seleccionar el tipo de medio. Los detalles dependerán en gran medida de la aplicación.
HRESULT hr = S_OK;
DWORD cTypes = 0;
BOOL bTypeOK = FALSE;
IMFMediaTypeHandler *pHandler = NULL;
IMFMediaType *pMediaType = NULL;
hr = pStreamDesc->GetMediaTypeHandler(&pHandler);
if (SUCCEEDED(hr))
{
hr = pHandler->GetMediaTypeCount(&cTypes);
}
if (SUCCEEDED(hr))
{
for (DWORD iType = 0; iType < cTypes; iType++)
{
hr = pHandler->GetMediaTypeByIndex(iType, &pMediaType);
if (FAILED(hr))
{
break;
}
/* Examine the media type. (Not shown.) */
/* If this media type is acceptable, set the media type. */
if (bTypeOK)
{
hr = pHandler->SetCurrentMediaType(pMediaType);
break;
}
SAFE_RELEASE(pMediaType);
}
}
SAFE_RELEASE(pMediaType);
SAFE_RELEASE(pHandler);
Temas relacionados