Método IMFASFIndexer::GetCompletedIndex (wmcontainer.h)

Recupera o índice concluído do objeto indexador ASF.

Sintaxe

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

Parâmetros

[in] pIIndexBuffer

Ponteiro para a interface IMFMediaBuffer de um buffer de mídia que recebe os dados do índice.

[in] cbOffsetWithinIndex

O deslocamento dos dados a serem recuperados, em bytes desde o início dos dados do índice. Defina como 0 para a primeira chamada. Se forem necessárias chamadas subsequentes (o buffer não é grande o suficiente para manter o índice inteiro), defina como o byte após o último recuperado.

Retornar valor

O método retorna um HRESULT. Os possíveis valores incluem, mas sem limitação, aqueles na tabela a seguir.

Código de retorno Descrição
S_OK
O método foi bem-sucedido.
MF_E_INDEX_NOT_COMMITTED
O índice não foi confirmado antes de tentar obter o índice concluído. Para obter mais informações, consulte Comentários.

Comentários

Esse método usa o máximo possível do buffer e atualiza o comprimento do buffer adequadamente.

Se pIIndexBuffer for grande o suficiente para conter todo o buffer, cbOffsetWithinIndex deverá ser 0 e a chamada precisará ser feita apenas uma vez. Caso contrário, não deve haver lacunas entre buffers sucessivos.

O usuário deve gravar esses dados no conteúdo em cbOffsetFromIndexStart bytes após o final do objeto de dados ASF. Você pode chamar IMFASFIndexer::GetIndexPosition para determinar a posição inicial do índice ASF.

Essa chamada não terá êxito, a menos que IMFASFIndexer::CommitIndex tenha sido chamado. Depois de chamar GetCompletedIndex, o chamador deve chamar IMFASFContentInfo::GenerateHeader e substituir o cabeçalho ASF existente pelo novo cabeçalho; caso contrário, o cabeçalho ASF não corresponderá ao conteúdo e não há garantia de que o arquivo seja reproduzido corretamente.

Você não pode usar esse método em um cenário de leitura de índice. Você só pode usar esse método ao escrever índices.

Exemplos

O exemplo a seguir mostra como gravar o índice ASF completo em um fluxo de bytes.

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

Requisitos

Requisito Valor
Cliente mínimo com suporte Windows Vista [somente aplicativos da área de trabalho]
Servidor mínimo com suporte Windows Server 2008 [somente aplicativos da área de trabalho]
Plataforma de Destino Windows
Cabeçalho wmcontainer.h
Biblioteca Mfuuid.lib

Confira também

Objeto Index do ASF

IMFASFIndexer

Usando o indexador para gravar um novo índice