Freigeben über


IMFASFIndexer::GetCompletedIndex-Methode (wmcontainer.h)

Ruft den abgeschlossenen Index aus dem ASF-Indexerobjekt ab.

Syntax

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

Parameter

[in] pIIndexBuffer

Zeiger auf die IMFMediaBuffer-Schnittstelle eines Medienpuffers, der die Indexdaten empfängt.

[in] cbOffsetWithinIndex

Der Offset der abzurufenden Daten in Bytes vom Anfang der Indexdaten. Legen Sie für den ersten Aufruf auf 0 fest. Wenn nachfolgende Aufrufe erforderlich sind (der Puffer ist nicht groß genug, um den gesamten Index zu enthalten), legen Sie auf das Byte nach dem letzten abgerufenen fest.

Rückgabewert

Die Methode gibt ein HRESULT zurück. Mögliches Werte (aber nicht die Einzigen) sind die in der folgenden Tabelle.

Rückgabecode BESCHREIBUNG
S_OK
Die Methode wurde erfolgreich ausgeführt.
MF_E_INDEX_NOT_COMMITTED
Der Index wurde vor dem Versuch, den abgeschlossenen Index abzurufen, nicht committet. Weitere Informationen finden Sie in den Hinweisen.

Hinweise

Diese Methode verwendet so viel Puffer wie möglich und aktualisiert die Länge des Puffers entsprechend.

Wenn pIIndexBuffer groß genug ist, um den gesamten Puffer zu enthalten, sollte cbOffsetWithinIndex 0 sein, und der Aufruf muss nur einmal erfolgen. Andernfalls sollte es keine Lücken zwischen aufeinanderfolgenden Puffern geben.

Der Benutzer muss diese Daten nach dem Ende des ASF-Datenobjekts in cbOffsetFromIndexStart-Bytes in den Inhalt schreiben. Sie können IMFASFIndexer::GetIndexPosition aufrufen, um die Startposition des ASF-Index zu bestimmen.

Dieser Aufruf ist nur erfolgreich, wenn IMFASFIndexer::CommitIndex aufgerufen wurde. Nach dem Aufruf von GetCompletedIndex muss der Aufrufer IMFASFContentInfo::GenerateHeader aufrufen und den vorhandenen ASF-Header mit dem neuen Header überschreiben. Andernfalls stimmt der ASF-Header nicht mit dem Inhalt überein, und die Datei wird nicht ordnungsgemäß wiedergegeben.

Sie können diese Methode nicht in einem Indexleseszenario verwenden. Sie können diese Methode nur beim Schreiben von Indizes verwenden.

Beispiele

Das folgende Beispiel zeigt, wie Sie den vollständigen ASF-Index in einen Bytedatenstrom schreiben.

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

Anforderungen

Anforderung Wert
Unterstützte Mindestversion (Client) Windows Vista [nur Desktop-Apps]
Unterstützte Mindestversion (Server) Windows Server 2008 [nur Desktop-Apps]
Zielplattform Windows
Kopfzeile wmcontainer.h
Bibliothek Mfuuid.lib

Weitere Informationen

ASF-Indexobjekt

IMFASFIndexer

Verwenden des Indexers zum Schreiben eines neuen Indexes