MÉTHODE IMFASFIndexer ::GetCompletedIndex (wmcontainer.h)

Récupère l’index terminé à partir de l’objet d’indexeur ASF.

Syntaxe

HRESULT GetCompletedIndex(
  [in] IMFMediaBuffer *pIIndexBuffer,
  [in] QWORD          cbOffsetWithinIndex
);

Paramètres

[in] pIIndexBuffer

Pointeur vers l’interface IMFMediaBuffer d’une mémoire tampon multimédia qui reçoit les données d’index.

[in] cbOffsetWithinIndex

Décalage des données à récupérer, en octets à partir du début des données d’index. Définissez sur 0 pour le premier appel. Si les appels suivants sont nécessaires (la mémoire tampon n’est pas suffisamment grande pour contenir l’index entier), définissez sur l’octet suivant le dernier récupéré.

Valeur retournée

Cette méthode retourne un code HRESULT. Les valeurs possibles sont notamment celles figurant dans le tableau suivant.

Code de retour Description
S_OK
S_OK
MF_E_INDEX_NOT_COMMITTED
L’index n’a pas été commité avant de tenter d’obtenir l’index terminé. Pour plus d'informations, consultez la section Notes.

Remarques

Cette méthode utilise autant de mémoire tampon que possible et met à jour la longueur de la mémoire tampon de manière appropriée.

Si pIIndexBuffer est suffisamment grand pour contenir la mémoire tampon entière, cbOffsetWithinIndex doit être 0 et l’appel ne doit être effectué qu’une seule fois. Sinon, il ne doit y avoir aucun écart entre les mémoires tampons successives.

L’utilisateur doit écrire ces données dans le contenu dans les octets cbOffsetFromIndexStart après la fin de l’objet de données ASF. Vous pouvez appeler IMFASFIndexer ::GetIndexPosition pour déterminer la position de début de l’index ASF.

Cet appel ne réussira que si IMFASFIndexer ::CommitIndex a été appelé. Après avoir appelé GetCompletedIndex, l’appelant doit appeler IMFASFContentInfo ::GenerateHeader et remplacer l’en-tête ASF existant par le nouvel en-tête ; sinon, l’en-tête ASF ne correspond pas au contenu et la lecture du fichier n’est pas garantie.

Vous ne pouvez pas utiliser cette méthode dans un scénario de lecture d’index. Vous ne pouvez utiliser cette méthode que lors de l’écriture d’index.

Exemples

L’exemple suivant montre comment écrire l’index ASF complet dans un flux d’octets.

HRESULT WriteASFIndex(IMFASFIndexer *pIndex,IMFByteStream *pStream)
{
    const DWORD cbChunkSize = 4096;

    IMFMediaBuffer *pBuffer = NULL;

    QWORD cbIndex = 0;
    DWORD cbIndexWritten = 0;

    HRESULT hr = pIndex->GetIndexWriteSpace(&cbIndex);
    if (FAILED(hr))
    {
        goto done;
    }

    hr = MFCreateMemoryBuffer(cbChunkSize, &pBuffer);
    if (FAILED(hr))
    {
        goto done;
    }

    while (cbIndexWritten < cbIndex)
    {
        BYTE *pData = NULL;
        DWORD cbData = 0;
        DWORD cbWritten = 0;

        hr = pIndex->GetCompletedIndex(pBuffer, cbIndexWritten);
        if (FAILED(hr))
        {
            goto done;
        }

        hr = pBuffer->Lock(&pData, NULL, &cbData);
        if (FAILED(hr))
        {
            goto done;
        }

        hr = pStream->Write(pData, cbData, &cbWritten);

        (void)pBuffer->Unlock();

        if (FAILED(hr))
        {
            goto done;
        }

        cbIndexWritten += cbData;
    }

done:
    SafeRelease(&pBuffer);
    return hr;
};

Configuration requise

Condition requise Valeur
Client minimal pris en charge Windows Vista [applications de bureau uniquement]
Serveur minimal pris en charge Windows Server 2008 [applications de bureau uniquement]
Plateforme cible Windows
En-tête wmcontainer.h
Bibliothèque Mfuuid.lib

Voir aussi

AsF Index, objet

IMFASFIndexer

Utilisation de l’indexeur pour écrire un nouvel index