Metodo IMFASFIndexer::GetCompletedIndex (wmcontainer.h)
Recupera l'indice completato dall'oggetto indicizzatore ASF.
Sintassi
HRESULT GetCompletedIndex(
[in] IMFMediaBuffer *pIIndexBuffer,
[in] QWORD cbOffsetWithinIndex
);
Parametri
[in] pIIndexBuffer
Puntatore all'interfaccia IMFMediaBuffer di un buffer multimediale che riceve i dati dell'indice.
[in] cbOffsetWithinIndex
Offset dei dati da recuperare, in byte dall'inizio dei dati dell'indice. Impostare su 0 per la prima chiamata. Se sono necessarie chiamate successive (il buffer non è sufficientemente grande da contenere l'intero indice), impostare sul byte dopo l'ultimo recuperato.
Valore restituito
Il metodo restituisce un valore HRESULT. I valori possibili includono, ma non sono limitati a, quelli indicati nella tabella seguente.
Codice restituito | Descrizione |
---|---|
|
Il metodo è riuscito. |
|
Non è stato eseguito il commit dell'indice prima di tentare di ottenere l'indice completato. Per altre informazioni, vedere la sezione Osservazioni. |
Commenti
Questo metodo usa il maggior numero possibile di buffer e aggiorna la lunghezza del buffer in modo appropriato.
Se pIIndexBuffer è sufficientemente grande da contenere l'intero buffer, cbOffsetWithinIndex deve essere 0 e la chiamata deve essere eseguita una sola volta. In caso contrario, non devono esistere spazi tra buffer successivi.
L'utente deve scrivere questi dati nel contenuto in cbOffsetFromIndexStart byte dopo la fine dell'oggetto dati ASF. È possibile chiamare IMFASFIndexer::GetIndexPosition per determinare la posizione iniziale dell'indice ASF.
Questa chiamata non riesce a meno che non sia stato chiamato IMFASFIndexer::CommitIndex . Dopo aver chiamato GetCompletedIndex, il chiamante deve chiamare IMFASFContentInfo::GenerateHeader e sovrascrivere l'intestazione ASF esistente con la nuova intestazione; in caso contrario, l'intestazione ASF non corrisponderà al contenuto e il file non è garantito che venga riprodotto correttamente.
Non è possibile utilizzare questo metodo in uno scenario di lettura dell'indice. È possibile utilizzare questo metodo solo quando si scrivono indici.
Esempio
Nell'esempio seguente viene illustrato come scrivere l'indice ASF completo in un flusso di byte.
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;
};
Requisiti
Requisito | Valore |
---|---|
Client minimo supportato | Windows Vista [solo app desktop] |
Server minimo supportato | Windows Server 2008 [solo app desktop] |
Piattaforma di destinazione | Windows |
Intestazione | wmcontainer.h |
Libreria | Mfuuid.lib |