2012-05-15 6 views
0

나는 간단한 AVI 로더를 작성하여 AVI 파일에서 각 프레임을 가져 와서 OpenGL 텍스처에 저장합니다. VFW를 사용하고 있으며 AVIStreamRead은 아무 것도 반환하지 않습니다. 이것은 각각의 프레임을 잡고 내 코드입니다 :AVIStreamRead가 아무 것도 읽지 않는 이유는 무엇입니까?

void CVideoControl::SetFrame(long frame) 
{ 
    HRESULT result; 
    long bytes, samples; 

    //Update variables 
    m_currentFrame = frame; 
    m_lastFrameChangeMS = gGlobalData->GetLastFrame(); 

    //Get the frame 
    result = AVIStreamRead(m_aviStream, m_currentFrame, 1, m_inputTexture, m_videoAdjustedWidth * m_videoAdjustedHeight * 3, &bytes, &samples); 
    if(FAILED(result)) 
     return; 

    //Decompress the stream 
    if(ICDecompress(m_decompressor, 0, m_inFormat, m_inputTexture, m_outFormat, m_outputTexture) != ICERR_OK) 
     return; 

    //Draw it to the OpenGL texture 
    glBindTexture(GL_TEXTURE_2D, m_videoOutputTexture); 
    glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, m_videoAdjustedWidth, m_videoAdjustedHeight, GL_BGR_EXT, GL_UNSIGNED_BYTE, m_outputTexture); 
} 

변수 bytes는 2740의 값을 가지고 있으며, samples 그러나, m_inputTexture가 비어 1입니다. 나쁜 포인터가 아니거나 그저 ... 비어 있습니다. AVIStreamRead은 오류를 반환하지 않습니다. documentation에서 읽을 수없는 유일한 데이터는 다음과 같습니다.

lpBuffer가 NULL이면이 함수는 데이터를 읽지 않습니다.

그러나 lpBuffer은 NULL이 아닙니다. 나는 더 많은 코드를 게시 할 것이지만, 여기 저기에 뒤섞여있다. 다른 곳에서는 명백한 오류가 없으며 디버거는 모든 정확한 정보를 보여줍니다.

답변

1

다른 AVI 파일은 다른 코덱을 사용하여 인코딩됩니다. 아마도 디코딩하려는 파일에 vfw에서 처리 할 수있는 코덱이 없을 것입니다.

또한 작업 샘플 코드로 시작하여 천천히 내 필요에 맞게 수정합니다. 비디오가 관련되어있을 때 너무 많은 세부 정보가있어 순수한 문서가 거의 쓸모 없게 만듭니다.

+0

여러 비디오를 시도했습니다. decompressor를 찾기 위해'ICLocate '를 사용하면 유효한 데이터로 성공합니다. 여기까지는 모든 것이 잘 돌아갑니다. 몇 가지 샘플을 살펴 보 겠지만 좋은 샘플은별로 없습니다. – smoth190