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

📄 decode.cpp

📁 avs decoder sources, added a command line sample
💻 CPP
字号:
/** * Copyright (c) 2006 *      OpenAVS Developers. All Rights Reserved. * * Copyright (c) 2005-2006 *      NSCC. All Rights Reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software Foundation, * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. *//** * ! \file "decode.c" *   \brief Frame decoding API */#include "vlc.h"#include "block.h"#include "macroblock.h"#include "loopfilter.h"#include "image.h"#include "global.h"#include "stream.h"#include <time.h>#include <sys/timeb.h>//#include <endian.h>static AVS_DWORD PictureData(		AVS_BYTE*   pbData,		AVS_DWORD         dwFrameLen,		AVS_DWORD*        pdwBitOffset,		STREAMINFO*       StrmInfo,		VIDEODATA**       ppRefFrame, 		VIDEODATA*        pCurrFrame, 		MBINFO*           pMbInfo,		BWREFINFO*        pBwRefInfo);AVS_HRESULT DecodeOneFrame(AVS_BYTE * pbData,		AVS_DWORD dwFrameLen,		STREAMINFO * StrmInfo, 		VIDEODATA ** ppRefFrame,		VIDEODATA ** pCurrFrame, 		MBINFO * pMbInfo,		BWREFINFO * pBwRefInfo){	AVS_BYTE * pbCurrent = pbData; 	AVS_DWORD dwCode = *(AVS_DWORD *) pbCurrent;	AVS_DWORD dwBitOffset = 0;	if ((DWORD_SWAP(dwCode) != I_FRAME_START_CODE) && 	    (DWORD_SWAP(dwCode) != PB_FRAME_START_CODE))		return AVS_NOT_VALID_PIC_DATA;	GetImgHeaderInfo(pbCurrent, dwFrameLen, &dwBitOffset, StrmInfo);	// AVS_DWORD imgWid = StrmInfo->SeqInfo.dwWidth;	// AVS_DWORD imgHei = StrmInfo->SeqInfo.dwHeight;	StrmInfo->ImgInfo.dwImageType1 = StrmInfo->ImgInfo.dwImageType;	if(StrmInfo->ImgInfo.bPictureStructure)	{		// frame type decoding...		(*pCurrFrame)->dwDistanceIndex = StrmInfo->ImgInfo.dwPictureDistance * 2;		PictureData(pbCurrent, 				dwFrameLen,				&dwBitOffset,				StrmInfo, 				ppRefFrame,				*pCurrFrame, 				pMbInfo, 				pBwRefInfo);	}	else	{		return THIS_VERSION_NOT_SUPPORT;	}	if(StrmInfo->ImgInfo.dwImageType != B_IMG)	{		UpdateRefBuffer(&ppRefFrame, &pCurrFrame, 2);	}	return AVS_NOERROR;   }/** * Function: Initialize decoer. * #- Initialize VLC table * #- Initialize Clip table * #- Initialize TabBuf (Replace the process of evaluating ABS while decoding) * #- Analyze sequence header */AVS_HRESULT InitDecode(const AVS_BYTE* pbData, AVS_DWORD dwDataLen, STREAMINFO* strmInfo){	const AVS_BYTE* pbCurrent = pbData;	AVS_DWORD dwLeft = dwDataLen;	MakeVlcTable();	MakeClipTable();	MakeTabNoBuf();	while (dwLeft > 18) {		AVS_DWORD dwCode = *(AVS_DWORD *) pbCurrent;		if (#if __BYTE_ORDER == __LITTLE_ENDIAN		    ((dwCode & 0x00FFFFFF) == 0x00010000)#elif __BYTE_ORDER == __BIG_ENDIAN#else		    ((dwCode & 0xFFFFFF00) == 0x00000100)#error "Cannot determine byte order."#endif		) {			dwCode = DWORD_SWAP(dwCode);  			if(dwCode == SEQENCE_START_CODE) {				AVS_DWORD dwHeadLen = SeqenceHeader(pbCurrent, dwLeft, &(strmInfo->SeqInfo));				pbCurrent += dwHeadLen;				dwLeft -= dwHeadLen;				break;			}		}		pbCurrent++;		dwLeft--;	}	return dwLeft;}static AVS_DWORD PictureData(AVS_BYTE*   pbData,		AVS_DWORD         dwFrameLen,		AVS_DWORD*        pdwBitOffset,		STREAMINFO*   StrmInfo,		VIDEODATA**   ppRefFrame, 		VIDEODATA*    pCurrFrame, 		MBINFO*       pMbInfo,		BWREFINFO*    pBwRefInfo){	AVS_BYTE * pbCurrent = pbData;	AVS_DWORD dwLeft = dwFrameLen;	AVS_DWORD MbIndex = 0;	AVS_DWORD MbWidth = StrmInfo->SeqInfo.dwMbWidth;	AVS_DWORD MbHeight = StrmInfo->SeqInfo.dwMbHeight;	AVS_DWORD MbNum = MbHeight * MbWidth;	AVS_INT cod_counter = -1;	AVS_DWORD dwImgWidth = StrmInfo->SeqInfo.dwWidth;	AVS_SHORT LumaCoef[256];	AVS_SHORT ChromaCoef[256];	AVS_DWORD dwCurrDistanceIndex = pCurrFrame->dwDistanceIndex;	for (MbIndex = 0; MbIndex < MbNum; MbIndex++) { 		memset(&pMbInfo[MbIndex], 0, sizeof(MBINFO));		memset(LumaCoef, 0, sizeof(AVS_SHORT) * 256);		memset(ChromaCoef, 0, sizeof(AVS_SHORT) * 256);		if (MbIndex % MbWidth == 0) {			int offset = (((*pdwBitOffset+7) >> 3) << 3);			while(!IsSliceHeader(pbCurrent, offset)) {				offset += 8;				if (offset > 20 * 8)					break;			}			if (IsSliceHeader(pbCurrent, offset)) { 				*pdwBitOffset = offset;                          				*pdwBitOffset += 32;				SliceHeader(pbCurrent, dwLeft, MbIndex, pdwBitOffset, StrmInfo);			}		}		ParseOneMacroBlock(				&pbCurrent, 				dwLeft, 				pdwBitOffset,				StrmInfo, 				pMbInfo, 				MbIndex,				&cod_counter,				LumaCoef,				ChromaCoef);  		McIdctRecOneMarcroBlock(				pMbInfo, 				MbIndex, 				StrmInfo, 				(const VIDEODATA **) ppRefFrame, 				pCurrFrame, 				2,				MbWidth,				MbHeight,				dwCurrDistanceIndex,				pBwRefInfo,				LumaCoef,				ChromaCoef);  	}	for (MbIndex = 0; MbIndex < MbNum; MbIndex++) {		DeblockOneMacroBlock(pMbInfo, 				MbIndex,				dwImgWidth >> 4,				StrmInfo,				pCurrFrame				);	}   	return AVS_NOERROR;}

⌨️ 快捷键说明

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