Descripteurs de présentation

Une présentation est un ensemble de flux multimédias associés qui partagent une heure de présentation commune. Par exemple, une présentation peut se composer des flux audio et vidéo d’un film. Un descripteur de présentation est un objet qui contient la description d’une présentation particulière. Les descripteurs de présentation sont utilisés pour configurer des sources multimédias et certains récepteurs multimédias.

Chaque descripteur de présentation contient une liste d’un ou plusieurs descripteurs de flux. Ceux-ci décrivent les flux dans la présentation. Les flux peuvent être sélectionnés ou désélectionnés. Seuls les flux sélectionnés produisent des données. Les flux désélectionnés ne sont pas actifs et ne produisent aucune donnée. Chaque descripteur de flux a un gestionnaire de type multimédia, qui permet de modifier le type de média du flux ou d’obtenir le type de média actuel du flux. (Pour plus d’informations sur les types de médias, consultez Types de médias.)

Le tableau suivant montre les interfaces principales exposées par chacun de ces objets.

Object Interface
Descripteur de présentation IMFPresentationDescriptor
Descripteur de flux IMFStreamDescriptor
Gestionnaire de type de média IMFMediaTypeHandler

 

Présentations de sources multimédias

Chaque source multimédia fournit un descripteur de présentation qui décrit la configuration par défaut de la source. Dans la configuration par défaut, au moins un flux est sélectionné et chaque flux sélectionné a un type de média. Pour obtenir le descripteur de présentation, appelez IMFMediaSource::CreatePresentationDescriptor. La méthode retourne un pointeur IMFPresentationDescriptor .

Vous pouvez modifier le descripteur de présentation de la source pour sélectionner un autre ensemble de flux. Ne modifiez pas le descripteur de présentation, sauf si la source multimédia est arrêtée. Les modifications sont appliquées lorsque vous appelez IMFMediaSource::Start pour démarrer la source.

Pour obtenir le nombre de flux, appelez IMFPresentationDescriptor::GetStreamDescriptorCount. Pour obtenir le descripteur de flux d’un flux, appelez IMFPresentationDescriptor::GetStreamDescriptorByIndex et passez l’index du flux. Les flux sont indexés à partir de zéro. La méthode GetStreamDescriptorByIndex retourne un pointeur IMFStreamDescriptor . Il retourne également un indicateur booléen indiquant si le flux est sélectionné. Si le flux est sélectionné, la source multimédia produit des données pour ce flux. Sinon, la source ne produit pas de données pour ce flux. Pour sélectionner un flux, appelez IMFPresentationDescriptor::SelectStream avec l’index du flux. Pour désélectionner un flux, appelez IMFPresentationDescriptor::D eselectStream.

Le code suivant montre comment obtenir le descripteur de présentation à partir d’une source multimédia et énumérer les flux.

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);

Gestionnaires de types de média

Pour modifier le type de média du flux ou pour obtenir le type de média actuel du flux, utilisez le gestionnaire de type multimédia du descripteur de flux. Appelez IMFStreamDescriptor::GetMediaTypeHandler pour obtenir le gestionnaire de type multimédia. Cette méthode retourne un pointeur IMFMediaTypeHandler .

Si vous souhaitez simplement savoir quel type de données se trouve dans le flux, par exemple audio ou vidéo, appelez IMFMediaTypeHandler::GetMajorType. Cette méthode retourne le GUID pour le type de média principal. Par exemple, une application de lecture connecte généralement un flux audio au convertisseur audio et un flux vidéo au convertisseur vidéo. Si vous utilisez la session multimédia ou le chargeur de topologie pour créer une topologie, le GUID de type principal peut être les seules informations de format dont vous avez besoin.

Si votre application a besoin d’informations plus détaillées sur le format actuel, appelez IMFMediaTypeHandler::GetCurrentMediaType. Cette méthode retourne un pointeur vers l’interface IMFMediaType du type multimédia. Utilisez cette interface pour obtenir les détails du format.

Le gestionnaire de types de média contient également une liste des types de médias pris en charge pour le flux. Pour obtenir la taille de la liste, appelez IMFMediaTypeHandler::GetMediaTypeCount. Pour obtenir un type de média dans la liste, appelez IMFMediaTypeHandler::GetMediaTypeByIndex avec l’index du type de média. Les types de médias sont retournés dans l’ordre approximatif de préférence. Par exemple, pour les formats audio, des taux d’échantillonnage plus élevés sont préférés à des taux d’échantillonnage inférieurs. Cependant, il n’y a pas de règle définitive qui régit le classement. Vous devez donc le traiter simplement comme une ligne directrice.

La liste des types pris en charge peut ne pas contenir tous les types de médias possibles pris en charge par le flux. Pour tester si un type de média particulier est pris en charge, appelez IMFMediaTypeHandler::IsMediaTypeSupported. Pour définir le type de média, appelez IMFMediaTypeHandler::SetCurrentMediaType. Si la méthode réussit, le flux contient des données conformes au format spécifié. La méthode SetCurrentMediaType ne modifie pas la liste des types préférés.

Le code suivant montre comment obtenir le gestionnaire de types de média, énumérer les types de média préférés et définir le type de média. Cet exemple part du principe que l’application dispose d’un algorithme, qui n’est pas affiché ici, pour sélectionner le type de média. Les spécificités dépendent grandement de votre application.

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);

Sources multimédias

API de plateforme Media Foundation