📄 umc_avi_channel.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 + -