📄 umc_wmv_spl.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_spl_base.h"#include "umc_wmv_spl.h"#include "umc_media_data.h"#ifdef __ICL#pragma message("Warning: Don't use Intel(R) compiler to build this file")#endifUMC::StatusUMC::WMVSplitter::SelectVideoStream(vm_var32 uiInd, VideoStreamType& rvType, VideoStreamSubType& /*rvSubType*/){ Status umcRes = UMC_OK; vm_var32 fccHandler = m_pStreams[uiInd].sStrmHdr.fccHandler; if (AVI_FOURCC_WMV3 == fccHandler) { if (AVI_FOURCC_VIDEOSTRM == m_pStreams[uiInd].sStrmHdr.fccType) { rvType = WMV_VIDEO; } } else { umcRes = UMC_BAD_STREAM; } if (UMC_OK != umcRes) { vm_debug_trace(4, VM_STRING("WMVSplitter SelectVideoStream failed\n")); } return umcRes;}static void SwapBuffer(unsigned long *data, long len){ int i;// int j; unsigned char temp, temp1, temp2, temp3; int remove_cnt = 0; int prev_zero_cnt = 0; unsigned char *read_pos = (unsigned char *)data; unsigned char *write_pos = (unsigned char *)data; len = (len + 3) >> 2; for(i = 0; i < len; i++) { if(!read_pos[0] && !read_pos[1] && (read_pos[2] == 3) && ((read_pos[3]&0xfc) == 0)) { temp = read_pos[0]; temp1 = read_pos[1]; temp2 = read_pos[3]; temp3 = read_pos[4]; write_pos[0] = temp3; write_pos[3] = temp; write_pos[1] = temp2; write_pos[2] = temp1; read_pos+= 5; prev_zero_cnt = 0; } else if(!read_pos[1] && !read_pos[2] && (read_pos[3] == 3) && ((read_pos[4]&0xfc) == 0)) { temp = read_pos[0]; temp1 = read_pos[1]; temp2 = read_pos[2]; temp3 = read_pos[4]; write_pos[0] = temp3; write_pos[3] = temp; write_pos[1] = temp2; write_pos[2] = temp1; read_pos+= 5; remove_cnt++; if(remove_cnt == 4) { remove_cnt = 0; i++; } prev_zero_cnt = 0; } else if((prev_zero_cnt==2) && (read_pos[0] == 3) && ((read_pos[1]&0xfc) == 0)) { temp = read_pos[1]; temp1 = read_pos[2]; temp2 = read_pos[3]; temp3 = read_pos[4]; write_pos[0] = temp3; write_pos[3] = temp; write_pos[1] = temp2; write_pos[2] = temp1; read_pos+= 5; prev_zero_cnt = 0; } else if((prev_zero_cnt==1) && !read_pos[0] && (read_pos[1] == 3) && ((read_pos[2]&0xfc) == 0)) { temp = read_pos[0]; temp1 = read_pos[2]; temp2 = read_pos[3]; temp3 = read_pos[4]; write_pos[0] = temp3; write_pos[3] = temp; temp = read_pos[2]; write_pos[1] = temp2; write_pos[2] = temp1; read_pos+= 5; prev_zero_cnt = 0; } else { temp = read_pos[0]; temp1 = read_pos[1]; temp2 = read_pos[2]; temp3 = read_pos[3]; prev_zero_cnt = 0; if(!read_pos[2] && !read_pos[3]) prev_zero_cnt = 2; else if(!read_pos[3]) prev_zero_cnt=1; write_pos[0] = temp3; write_pos[3] = temp; write_pos[1] = temp2; write_pos[2] = temp1; read_pos+= 4; } write_pos+= 4; }}UMC::StatusUMC::WMVSplitter::GetNextVideoData(MediaData* pMData, vm_var32 uiIndex){ Status umcRes = BaseAVISplitter::GetNextVideoData(pMData, uiIndex); if (UMC_OK == umcRes) { unsigned long* pulData = (unsigned long*)pMData->GetDataPointer(); vm_var32 uiDataSize = pMData->GetDataSize(); SwapBuffer(pulData, uiDataSize); } if (UMC_OK != umcRes) { vm_debug_trace(4, VM_STRING("MPEG4Splitter GetNextVideoData failed\n")); } return umcRes;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -