다음을 통해 공유


IMFASFIndexer::GetCompletedIndex 메서드(wmcontainer.h)

ASF 인덱서 개체에서 완료된 인덱스를 검색합니다.

구문

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

매개 변수

[in] pIIndexBuffer

인덱스 데이터를 수신하는 미디어 버퍼의 IMFMediaBuffer 인터페이스에 대한 포인터입니다.

[in] cbOffsetWithinIndex

검색할 데이터의 오프셋(인덱스 데이터 시작부터 바이트)입니다. 첫 번째 호출에 대해 0으로 설정합니다. 후속 호출이 필요한 경우(버퍼가 전체 인덱스 보유할 만큼 크지 않음) 마지막으로 검색한 후 바이트로 설정합니다.

반환 값

이 메서드는 HRESULT를 반환합니다. 가능한 값에는 다음 표에 있는 값이 포함되지만, 이에 국한되는 것은 아닙니다.

반환 코드 Description
S_OK
메서드가 성공했습니다.
MF_E_INDEX_NOT_COMMITTED
완료된 인덱스 가져오기 전에 인덱스가 커밋되지 않았습니다. 자세한 내용은 설명 부분을 참조하세요.

설명

이 메서드는 가능한 한 많은 버퍼를 사용하고 버퍼의 길이를 적절하게 업데이트합니다.

pIIndexBuffer가 전체 버퍼를 포함할 만큼 큰 경우 cbOffsetWithinIndex는 0이어야 하며 호출을 한 번만 수행해야 합니다. 그렇지 않으면 연속 버퍼 사이에 간격이 없어야 합니다.

사용자는 ASF 데이터 개체가 종료된 후 cbOffsetFromIndexStart 바이트의 콘텐츠에 이 데이터를 작성해야 합니다. IMFASFIndexer::GetIndexPosition을 호출하여 ASF 인덱스의 시작 위치를 확인할 수 있습니다.

IMFASFIndexer::CommitIndex가 호출되지 않는 한 이 호출은 성공하지 않습니다. GetCompletedIndex를 호출한 후 호출자는 IMFASFContentInfo::GenerateHeader를 호출하고 기존 ASF 헤더를 새 헤더로 덮어써야 합니다. 그렇지 않으면 ASF 헤더가 콘텐츠와 일치하지 않으며 파일이 올바르게 재생되지 않습니다.

인덱스 읽기 시나리오에서는 이 메서드를 사용할 수 없습니다. 인덱스를 작성할 때만 이 메서드를 사용할 수 있습니다.

예제

다음 예제에서는 전체 ASF 인덱스 바이트 스트림에 쓰는 방법을 보여 있습니다.

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

요구 사항

요구 사항
지원되는 최소 클라이언트 Windows Vista [데스크톱 앱만 해당]
지원되는 최소 서버 Windows Server 2008 [데스크톱 앱만 해당]
대상 플랫폼 Windows
헤더 wmcontainer.h
라이브러리 Mfuuid.lib

추가 정보

ASF 인덱스 개체

IMFASFIndexer

인덱서를 사용하여 새 인덱스 작성