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

📄 newpred.cpp

📁 完整的RTP RTSP代码库
💻 CPP
📖 第 1 页 / 共 2 页
字号:
/**************************************************************************This software module was originally developed by 	Hideaki Kimata (NTT)in the course of development of the MPEG-4 Video (ISO/IEC 14496-2) standard.This software module is an implementation of a part of one or more MPEG-4 Video (ISO/IEC 14496-2) tools as specified by the MPEG-4 Video (ISO/IEC 14496-2) standard. ISO/IEC gives users of the MPEG-4 Video (ISO/IEC 14496-2) standard free license to this software module or modifications thereof for use in hardwareor software products claiming conformance to the MPEG-4 Video (ISO/IEC 14496-2) standard. Those intending to use this software module in hardware or software productsare advised that its use may infringe existing patents. The original developer of this software module and his/her company, the subsequent editors and their companies, and ISO/IEC have no liability for use of this software module or modifications thereof in an implementation. Copyright is not released for non MPEG-4 Video (ISO/IEC 14496-2) standard conforming products. NTT retains full right to use the code for his/her own purpose, assign or donate the code to a third party and to inhibit third parties from using the code for non MPEG-4 Video (ISO/IEC 14496-2) standardconforming products. This copyright notice must be included in all copies orderivative works. Copyright (c) 1999.Module Name:	newpred.cppAbstract:	Implementation of the CNewPred class.Revision History:	Aug.30, 1999:   change position of #ifdef _DEBUG by Hideaki Kimata (NTT)**************************************************************************/#ifdef __MFC_#ifdef _DEBUG#undef THIS_FILEstatic char BASED_CODE THIS_FILE[] = __FILE__;#endif#define new DEBUG_NEW#endif // __MFC_#include "basic.hpp"#include "typeapi.h"#include "codehead.h"#include "mode.hpp"#include "global.hpp"#include "entropy/bitstrm.hpp"#include "newpred.hpp"#include <string.h>#ifdef _DEBUG#include <crtdbg.h>#define _CRTDBG_MAP_ALLOC//CMemoryState CMemOld, CMemNew;#endifCNewPred::CNewPred(){	m_iVopID = 0;	m_pDecbufY = NULL;	m_pDecbufU = NULL;	m_pDecbufV = NULL;	m_pchNewPredRefY = NULL;	m_pchNewPredRefU = NULL;	m_pchNewPredRefV = NULL;	m_piSlicePoint = NULL;}CNewPred::~CNewPred(){	if (m_pchNewPredRefY != NULL) delete []m_pchNewPredRefY; 	if (m_pchNewPredRefU != NULL) delete []m_pchNewPredRefU;	if (m_pchNewPredRefV != NULL) delete []m_pchNewPredRefV;	if (m_piSlicePoint != NULL)	delete[] m_piSlicePoint;}Bool CNewPred::CheckSlice(int iMBX, int iMBY, Bool bChkTop){	int iNumMBX = m_iWidth / MB_SIZE;	int iMBNum = iMBX + (iMBY * iNumMBX);	for( int iLocal = 0; *(m_piSlicePoint + iLocal) >= 0; iLocal++ ) {		if( *(m_piSlicePoint + iLocal) > iMBNum )			break;		if( *(m_piSlicePoint + iLocal) == iMBNum ) {			if( bChkTop )				return TRUE;			else {				if( iMBNum )					return TRUE;			}		}	}	return FALSE;}int CNewPred::GetSliceNum(int iMBX, int iMBY){		int iNumMBX = m_iWidth / MB_SIZE;	int iMBNum = iMBX + (iMBY * iNumMBX);	int iLocal;	for( iLocal = 0; *(m_piSlicePoint + iLocal) >= 0; iLocal++ ) {		if( iMBNum < *(m_piSlicePoint + iLocal))			return (iLocal-1);	}	return (iLocal-1); // return Slice number}void CNewPred::IncrementVopID(){	for( int iLocal = 0, iMask = 1; iLocal < m_iNumBitsVopID; iLocal++, iMask <<= 1 ) {		if( m_iVopID & iMask )			continue;		else {			++m_iVopID;			return;		}	}	m_iVopID = 1;}int CNewPred::NextSliceHeadMBA(int iMBX, int iMBY){		int iNumMBX = m_iWidth / MB_SIZE;	int iMBNum = iMBX + (iMBY * iNumMBX);	for( int iLocal = 0; *(m_piSlicePoint + iLocal) >= 0; iLocal++ ) {		if( *(m_piSlicePoint + iLocal) > iMBNum ) {				return(*(m_piSlicePoint + iLocal));		}	}	return(-1);}int CNewPred::NowMBA(int vp_id){  int i;	for( i = 0; *(m_piSlicePoint + i) >= 0; i++ );	if(vp_id >= i) return(-1);	return(*(m_piSlicePoint + vp_id));}int CNewPred::GetCurrentVOP_id(){	return( m_iVopID );}void CNewPred::CopyBuftoNPRefBuf(int iSlice, int iBufCnt){	if (m_bShapeOnly == FALSE) {			CopyBufUtoNPRefBufY(iSlice, iBufCnt);		CopyBufUtoNPRefBufU(iSlice, iBufCnt);		CopyBufUtoNPRefBufV(iSlice, iBufCnt);	}	return;}void CNewPred::SetQBuf( CVOPU8YUVBA *pRefQ0, CVOPU8YUVBA *pRefQ1 ){                                                         	m_pNPvopcRefQ0 = pRefQ0;	m_pNPvopcRefQ1 = pRefQ1;	return;}void CNewPred::CopyBufUtoNPRefBufY(int iSlice, int iBufCnt){	Int i;	Int iSize;	iSize =0;	for( i=0; i < iSlice; i++ ) {		if (*(m_piSlicePoint+i+1)%m_iNPNumMBX)			continue;		iSize += m_pNewPredControl->NPRefBuf[i][iBufCnt]->iSizeY;	}	PixelC* RefpointY = (PixelC*) m_pNPvopcRefQ1->pixelsY () +		(EXPANDY_REF_FRAME * m_rctNPFrameY.width) + iSize;	memcpy(m_pNewPredControl->NPRefBuf[iSlice][iBufCnt]->pdata.pchY, RefpointY,		 m_pNewPredControl->NPRefBuf[iSlice][iBufCnt]->iSizeY);	return;}void CNewPred::CopyBufUtoNPRefBufU(int iSlice, int iBufCnt){	Int i;	Int iSize; 	iSize =0; 	for( i=0; i < iSlice; i++ ) {		if (*(m_piSlicePoint+i+1)%m_iNPNumMBX)			continue;		iSize += m_pNewPredControl->NPRefBuf[i][iBufCnt]->iSizeUV;	}	PixelC* RefpointU = (PixelC*) m_pNPvopcRefQ1->pixelsU () +		((EXPANDY_REF_FRAME/2) * m_rctNPFrameUV.width) + iSize;	memcpy(m_pNewPredControl->NPRefBuf[iSlice][iBufCnt]->pdata.pchU, RefpointU,		 m_pNewPredControl->NPRefBuf[iSlice][iBufCnt]->iSizeUV);	return;}void CNewPred::CopyBufUtoNPRefBufV(int iSlice, int iBufCnt){	Int i;	Int iSize;	iSize =0; 	for( i=0; i < iSlice; i++ ) {		if (*(m_piSlicePoint+i+1)%m_iNPNumMBX)			continue;		iSize += m_pNewPredControl->NPRefBuf[i][iBufCnt]->iSizeUV;	}	PixelC* RefpointV = (PixelC*) m_pNPvopcRefQ1->pixelsV () +		((EXPANDY_REF_FRAME/2) * m_rctNPFrameUV.width) + iSize;	memcpy(m_pNewPredControl->NPRefBuf[iSlice][iBufCnt]->pdata.pchV, RefpointV,		 m_pNewPredControl->NPRefBuf[iSlice][iBufCnt]->iSizeUV);	return;}NP_WHO_AM_I CNewPred::Who_Am_I(){	return this->m_enumWho;}void * CNewPred::aalloc(int col, int row , int size){	int i;	void **buf1;	void *buf2;    	buf1 = (void **)malloc(col*size);	if (buf1 == NULL) {		return ((void *)NULL);	}	buf2 = (void *)calloc(size,col*row);	if (buf2 == NULL) {		free(buf1);		return ((void *)NULL);	}	for(i=0; i<col;i++){		buf1[i] = (void *)((char *)buf2+ row*size*i );	}	return(buf1);}void CNewPred::afree(int **p){	free(p[0]);	free(p);}void CNewPred::SetNPRefBuf(NEWPRED_buf **pNewBuf, int vop_id, int iBufCnt){	pNewBuf[iBufCnt]->vop_id = vop_id;	CopyBuftoNPRefBuf(pNewBuf[iBufCnt]->iSlice, iBufCnt);	return;}void CNewPred::ChangeRefOfSliceYUV(const PixelC*	ppxlcRef, const PixelC* Refbuf0,		 Int iMBX, Int iMBY,CRct RefSize, char mode){	Int i=0;	Int	MBA;	Int magnification = 0;	Int flag = 0;         // check whether padding in horizontal direction	Int	head_x, length_x;	PixelC  *left_pix, *right_pix, *point;	Int p, q;	PixelC*		Refpoint = (PixelC *)ppxlcRef + RefSize.left;	switch(mode)	{	case 'Y':		CopyBufYtoRefY(Refbuf0, RefSize);		magnification = 1;		break;	case 'U':		CopyBufUtoRefU(Refbuf0, RefSize);		magnification = MB_SIZE/BLOCK_SIZE;		break;	case 'V':		CopyBufVtoRefV(Refbuf0, RefSize);		magnification = MB_SIZE/BLOCK_SIZE;		break;	default:		assert(0);		break;	}	MBA = NextSliceHeadMBA(iMBX, iMBY);	head_x = iMBX * MB_SIZE / magnification;	length_x = (((MBA - 1) % (m_iWidth / MB_SIZE)) + 1) * MB_SIZE / magnification - head_x;	if (length_x < 0)		length_x = m_iWidth / magnification - head_x;	if ((head_x == 0) && (length_x == m_iWidth/magnification))		flag = 1;	// padding in horizontal direction	if (flag == 0) {		for (p = 0; p <	MB_SIZE / magnification; p++) {			left_pix = Refpoint + (-RefSize.left) + head_x;			right_pix = left_pix + length_x - 1;			point = Refpoint;			for (q = 0; q < head_x + (-RefSize.left); q++) {				memcpy(point++, left_pix, 1);			}			point = right_pix + 1;			for (q = 0; q < m_iWidth / magnification - head_x - length_x + (-RefSize.left); q++) {				memcpy(point++, right_pix, 1);			}			Refpoint += RefSize.width;		}	}	// padding above	Refpoint = (PixelC *)ppxlcRef + RefSize.left;	while(1) {

⌨️ 快捷键说明

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