⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 umc_avi_channel.cpp

📁 这是在PCA下的基于IPP库示例代码例子,在网上下了IPP的库之后,设置相关参数就可以编译该代码.
💻 CPP
字号:
/*//////////////////////////////////////////////////////////////////////////////////                  INTEL CORPORATION PROPRIETARY INFORMATION//     This software is supplied under the terms of a license agreement or//     nondisclosure agreement with Intel Corporation and may not be copied//     or disclosed except in accordance with the terms of that agreement.//          Copyright(c) 2003-2005 Intel Corporation. All Rights Reserved.//*/#include "vm_debug.h"#include "umc_avi_channel.h"UMC::AVIChannel::AVIChannel():    m_FourccCode(0),    m_bRecPresent(false),    m_uiCurFrame(0),    m_ullCurStreamByte(0){}UMC::AVIChannel::~AVIChannel(){    Close();    }UMC::StatusUMC::AVIChannel::Init(LockableDataReaderRef Reader,                      tFOURCC       fourccCode,                      bool          bRecPresent){    Status umcRes = UMC_OK;    Close();    if (UMC_OK == umcRes)    {   umcRes = m_ChunkRdr.Init(Reader);   }    if (UMC_OK == umcRes)    {   umcRes = m_ChunkRdr.DescendRIFF(AVI_FOURCC_AVI_);   }    if (UMC_OK == umcRes)    {   umcRes = m_ChunkRdr.DescendLIST(AVI_FOURCC_MOVI);   }    if (UMC_OK == umcRes && bRecPresent)    {   umcRes = m_ChunkRdr.DescendLIST(AVI_FOURCC_REC_);   }    if (UMC_OK == umcRes)    {        m_FourccCode = fourccCode;        m_bRecPresent = bRecPresent;    }    if (UMC_OK != umcRes)    { vm_debug_trace(4, VM_STRING("AVIChannel Init failed\n"));  }    return umcRes;}voidUMC::AVIChannel::Close(){    m_FourccCode = 0;    m_bRecPresent = false;    m_uiCurFrame = 0;    m_ullCurStreamByte = 0;}UMC::StatusUMC::AVIChannel::FindNextChunk(){    UMC::Status umcRes = UMC_OK;    do {        //  Look for the chunk        if (UMC_OK == umcRes)        {            //  Some iterations in a way to skip less then 4 bytes chunks            do {                if (AVIChunk::CmpChunkNames(m_ChunkRdr.GetChunkFOURCC(),                                            m_FourccCode))                {                    m_ullCurStreamByte += m_ChunkRdr.GetChunkSize();                    umcRes = m_ChunkRdr.Ascend();                    m_uiCurFrame++;                }                if (UMC_OK == umcRes)                {   umcRes = m_ChunkRdr.DescendChunk(m_FourccCode); }            } while(UMC_OK == umcRes && m_ChunkRdr.GetChunkSize() < 4);        }        if (UMC_NOT_FIND_SYNCWORD == umcRes)        {            if (m_bRecPresent)            {                //  Hope we've reached the end of 'rec ' chunk - try to open next one                m_ullCurStreamByte += m_ChunkRdr.GetChunkSize();                umcRes = m_ChunkRdr.Ascend();                m_uiCurFrame++;                if (UMC_OK == umcRes)                {   umcRes = m_ChunkRdr.DescendLIST(AVI_FOURCC_REC_);   }            }            //  Guess we work with 1Gb< AVI file -            //  look for next RIFF('AVIX')            if (UMC_NOT_FIND_SYNCWORD == umcRes)            {                //  Ascend from current LIST('movi')                umcRes = m_ChunkRdr.Ascend();                //  Ascend from current RIFF                if (UMC_OK == umcRes)                {   umcRes = m_ChunkRdr.Ascend();   }                if (UMC_OK == umcRes)                {   umcRes = m_ChunkRdr.DescendRIFF(AVI_FOURCC_AVIX);   }                if (UMC_OK == umcRes)                {   umcRes = m_ChunkRdr.DescendLIST(AVI_FOURCC_MOVI);   }                if (UMC_OK == umcRes && m_bRecPresent)                {   umcRes = m_ChunkRdr.DescendLIST(AVI_FOURCC_REC_);   }            }        }    } while (UMC_OK == umcRes &&            !AVIChunk::CmpChunkNames(m_ChunkRdr.GetChunkFOURCC(), m_FourccCode));    if (UMC_NOT_FIND_SYNCWORD == umcRes)    //  Looks like no more data in file    {    umcRes = UMC_END_OF_STREAM;    }    if (UMC_OK != umcRes)    {   vm_debug_trace(4, VM_STRING("AVIChannel FindNextChunk failed\n"));  }    return umcRes;}UMC::StatusUMC::AVIChannel::ReadFrame(vm_byte* pbBuffer,                           const vm_var32 uiBufSize,                           vm_var32& ruiDataRead){    UMC::Status umcRes = UMC_OK;    //  Look for the chunk    if (UMC_OK == umcRes)    {   umcRes = FindNextChunk();   }    //  Read data from file    if (UMC_OK == umcRes)    {        assert(m_ChunkRdr.GetChunkSize() <= uiBufSize);        ruiDataRead = min(m_ChunkRdr.GetChunkSize(), uiBufSize);        umcRes = m_ChunkRdr.GetData(pbBuffer, ruiDataRead);    }    if (UMC_OK == umcRes)    {        m_ullCurStreamByte += m_ChunkRdr.GetChunkSize();        umcRes = m_ChunkRdr.Ascend();        m_uiCurFrame++;    }    if (UMC_OK != umcRes)    {   vm_debug_trace(4, VM_STRING("AVIChannel ReadFrame failed\n"));  }    return umcRes;}UMC::StatusUMC::AVIChannel::JumpToFilePos(const vm_sizet uiFilePos,                               const vm_var32 uiCurFrame,                               const vm_sizet ullCurStreamByte){    UMC::Status umcRes = m_ChunkRdr.JumpToFilePos(uiFilePos);    if (UMC_OK == umcRes)    {        m_uiCurFrame = uiCurFrame;        m_ullCurStreamByte = ullCurStreamByte;    }    if (UMC_OK != umcRes)    {   vm_debug_trace(4, VM_STRING("AVIChannel JumpToFilePos failed\n"));  }    return umcRes;}UMC::StatusUMC::AVIChannel::JumpToFrame(vm_var32 uiFrameIndex){    UMC::Status umcRes = UMC_OK;    if (UMC_OK == umcRes && m_uiCurFrame > uiFrameIndex)    {        if (AVIChunk::CmpChunkNames(m_ChunkRdr.GetChunkFOURCC(),                                    m_FourccCode))        {   umcRes = m_ChunkRdr.Ascend();   }        //  go to "movi" chunk head        m_ChunkRdr.GoChunkHead();        m_ullCurStreamByte = 0;        m_uiCurFrame = 0;    }    while (UMC_OK == umcRes && m_uiCurFrame + 1 < uiFrameIndex)    {   umcRes = FindNextChunk();   }    if (UMC_OK != umcRes)    {   vm_debug_trace(4, VM_STRING("AVIChannel JumpToFrame failed\n"));  }    return umcRes;}UMC::StatusUMC::AVIChannel::JumpToBytePos(vm_sizet& rullBytePos){    Status umcRes = UMC_OK;    if (UMC_OK == umcRes && m_ullCurStreamByte > rullBytePos)    {        if(AVIChunk::CmpChunkNames(m_ChunkRdr.GetChunkFOURCC(),                                    m_FourccCode))        {   umcRes = m_ChunkRdr.Ascend();   }        //  go to "movi" chunk head        m_ChunkRdr.GoChunkHead();        m_ullCurStreamByte = 0;        m_uiCurFrame = 0;    }    while (UMC_OK == umcRes && m_ullCurStreamByte < rullBytePos)    {   umcRes = FindNextChunk();   }    if (UMC_OK == umcRes) { rullBytePos = m_ullCurStreamByte;   }    if (UMC_OK != umcRes)    {   vm_debug_trace(4, VM_STRING("AVIChannel JumpToBytePos failed\n"));  }    return umcRes;}voidUMC::AVIChannel::GetChunkInfo(vm_var32 uiChunkNum,                              vm_var32& uiPos,                              vm_var32& uiSize,                              tFOURCC& fourCC){    unsigned int uiOldInd = GetCurFrameInd();    JumpToFrame(uiChunkNum);    uiPos  = m_ChunkRdr.GetChunkHead();    uiSize = m_ChunkRdr.GetChunkSize();    fourCC = m_ChunkRdr.GetChunkFOURCC();    JumpToFrame(uiOldInd);}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -