📄 newpenc.cpp
字号:
/**************************************************************************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: newpenc.cppAbstract: Implementation of the CNewPredEncoder class.Revision History:**************************************************************************/#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>CNewPredEncoder::CNewPredEncoder() : CNewPred(){ m_enumWho = NP_ENCODER;}CNewPredEncoder::~CNewPredEncoder(){ endNEWPREDcnt( m_pNewPredControl );}void CNewPredEncoder::SetObject ( int iNumBitsTimeIncr, int iWidth, int iHeight, UInt uiVOId, char* pchRefname, char* pchSlicePointParam, Bool bNewpredSegmentType, int iAUsage, int bShapeOnly, CVOPU8YUVBA* pNPvopcRefQ0, CVOPU8YUVBA* pNPvopcRefQ1, CRct rctNPFrameY, CRct rctNPFrameUV ){ m_iNumBitsVopID = iNumBitsTimeIncr + NUMBITS_VOP_ID_PLUS; if( m_iNumBitsVopID > NP_MAX_NUMBITS_VOP_ID ) m_iNumBitsVopID = NP_MAX_NUMBITS_VOP_ID; m_iWidth = iWidth; m_iHeight = iHeight; m_iNPNumMBX = m_iWidth/MB_SIZE; m_iNPNumMBY = m_iHeight/MB_SIZE; m_iNumBuffEnc = ENC_BUFCNT; m_bNewPredSegmentType = bNewpredSegmentType; m_iAUsage = iAUsage; m_bShapeOnly = bShapeOnly; m_pNPvopcRefQ0 = pNPvopcRefQ0; // set reference picture memory m_pNPvopcRefQ1 = pNPvopcRefQ1; // set original picture memory m_rctNPFrameY = rctNPFrameY; m_rctNPFrameUV = rctNPFrameUV; Int iHeightUV = iHeight/(MB_SIZE/BLOCK_SIZE); Int iWidthUV = iWidth/(MB_SIZE/BLOCK_SIZE); if (m_bShapeOnly == FALSE) { m_pchNewPredRefY = new PixelC[(2*EXPANDY_REF_FRAME+iWidth)*(2*EXPANDY_REF_FRAME+iHeight)]; m_pchNewPredRefU = new PixelC[(2*EXPANDUV_REF_FRAME+iWidthUV)*(2*EXPANDUV_REF_FRAME+iHeightUV)]; m_pchNewPredRefV = new PixelC[(2*EXPANDUV_REF_FRAME+iWidthUV)*(2*EXPANDUV_REF_FRAME+iHeightUV)]; } GetSlicePoint(pchSlicePointParam); m_pNewPredControl = initNEWPREDcnt( uiVOId ); sprintf( refname, "%s", pchRefname); load_ref_ind(); }Int CNewPredEncoder::SetVPData ( NP_SYNTAX_TYPE mode, int *md_iVopID, int *md_iNumBitsVopID, int *md_iVopID4Prediction_Indication, int *md_iVopID4Prediction ){ Int iPut = 0; static int CurrentSlice = 0; switch( mode ) { case NP_VOP_HEADER: CurrentSlice = 0; m_iVopID4Prediction = m_pNewPredControl->ref[CurrentSlice]; IncrementVopID(); iPut += m_iNumBitsVopID; if((m_iVopID - 1) == m_iVopID4Prediction || m_iVopID4Prediction == 0) m_iVopID4Prediction_Indication = 0; else m_iVopID4Prediction_Indication = 1; iPut += NUMBITS_VOP_ID_FOR_PREDICTION_INDICATION; if( m_iVopID4Prediction_Indication ) { iPut += m_iNumBitsVopID; } iPut += MARKER_BIT; break; case NP_VP_HEADER: if (m_bNewPredSegmentType == 0) CurrentSlice ++; m_iVopID4Prediction = m_pNewPredControl->ref[CurrentSlice]; iPut += m_iNumBitsVopID; if((m_iVopID - 1) == m_iVopID4Prediction || m_iVopID4Prediction == 0) m_iVopID4Prediction_Indication = 0; else m_iVopID4Prediction_Indication = 1; iPut += NUMBITS_VOP_ID_FOR_PREDICTION_INDICATION; if( m_iVopID4Prediction_Indication ) { iPut += m_iNumBitsVopID; } iPut += MARKER_BIT; break; } *md_iVopID = m_iVopID; *md_iNumBitsVopID = m_iNumBitsVopID; *md_iVopID4Prediction_Indication = m_iVopID4Prediction_Indication; *md_iVopID4Prediction = m_iVopID4Prediction; return iPut;}/* move from newpred.cpp */void CNewPredEncoder::load_ref_ind(){ int i, j; FILE *read_file; char buf[256]; char *dtp; int count=0; int line=0; int err_flag = 0; int int_dt; int frameNo; int first = 1; memset(m_pNewPredControl->ref_tbl, 0x00, 0x800*MAX_NumGOB*sizeof(int)); if( (read_file = fopen(refname,"r")) == NULL ) { fprintf( stdout, "Unable to open Ref_Indication_file: %s\n", refname); exit( -1 ); } while( !feof(read_file) ) { line++; if( first ) { if( fgets(buf,256,read_file) == 0 ) { fprintf( stderr, "Read error!! : %s\n", refname ); exit( -1 ); } first = 0; } check_comment( buf ); if( check_space(buf)!=0 ) { fgets( buf,256,read_file ); continue; } i = 0, j = 0; dtp = strtok( buf, " \t\n" ); frameNo = atoi( dtp ); while( (dtp = strtok(NULL, " \t\n")) != NULL ) { int_dt = atoi( dtp ); if( int_dt < 0 || int_dt > count + 1 ) { err_flag = 1; } if(int_dt > (int)~(0xffffffff<<m_iNumBitsVopID)) { err_flag = 1; } m_pNewPredControl->ref_tbl[count][i++] = int_dt; if( i >= MAX_NumGOB ) break; } if( err_flag != 0 || i > (m_iHeight/MB_SIZE) ) { fprintf( stdout, "Error reference frame table: %s(%d Line)\n", refname, line ); exit( -1 ); } count++; if( count >= 0x800 ) break; fgets( buf, 256, read_file ); } fclose( read_file ); first = 1;}NEWPREDcnt* CNewPredEncoder::initNEWPREDcnt( UInt uiVO_id){ int i, j; NEWPREDcnt* newpredCnt; newpredCnt = (NEWPREDcnt *) malloc(sizeof (NEWPREDcnt)); memset(newpredCnt, 0, sizeof(NEWPREDcnt)); m_iNumSlice = 1; for( i = 0; i < NP_MAX_NUMSLICE; i++ ) { if( m_piSlicePoint[i] < 0 ) break; m_iNumSlice++; } --m_iNumSlice; newpredCnt->NPRefBuf = (NEWPRED_buf***)aalloc(m_iNumSlice,m_iNumBuffEnc,sizeof(NEWPRED_buf*)); if (newpredCnt->NPRefBuf == NULL) { fprintf(stderr, "initNEWPREDcnt: ERROR Memory allocate error(NEWPRED_buf)\n"); return newpredCnt; } newpredCnt->ref = new int[m_iNumSlice]; if (newpredCnt->ref == NULL) { fprintf(stderr, "initNEWPREDcnt: ERROR Memory allocate error(ref)\n"); return newpredCnt; } memset(newpredCnt->ref, 0, sizeof(int)*m_iNumSlice); Int *iY = new int[m_iNumSlice]; m_iHMBNum = new int[m_iNumSlice]; for (i= 0; (i < m_iNumSlice); i++) { if (i+1 < m_iNumSlice) { iY[i] = *(m_piSlicePoint + i+1) - *(m_piSlicePoint + i); } else { iY[i] = (m_iNPNumMBX*m_iNPNumMBY) - *(m_piSlicePoint + i); } m_iHMBNum[i] = iY[i] / m_iNPNumMBX; if (m_iHMBNum[i] == 0) m_iHMBNum[i] = 1; } delete []iY; for (i= 0; (i < m_iNumSlice) && (*(m_piSlicePoint + i) >= 0); i++) { Int iWidthUV = m_iWidth/(MB_SIZE/BLOCK_SIZE); Int iHeightUV = (MB_SIZE * m_iHMBNum[i])/(MB_SIZE/BLOCK_SIZE); for (j= 0; j<m_iNumBuffEnc; j++) { newpredCnt->NPRefBuf[i][j] = new NEWPRED_buf; if (newpredCnt->NPRefBuf[i][j] == NULL) { fprintf(stderr, "initNEWPREDcnt: ERROR Memory allocate error(NEWPRED_buf)\n"); return newpredCnt; } newpredCnt->NPRefBuf[i][j]->vop_id = 0; newpredCnt->NPRefBuf[i][j]->iSizeY = (2*EXPANDY_REF_FRAME+m_iWidth)*(MB_SIZE* m_iHMBNum[i]); newpredCnt->NPRefBuf[i][j]->iSizeUV = (EXPANDY_REF_FRAME+iWidthUV)* iHeightUV; newpredCnt->NPRefBuf[i][j]->iSlice = i; newpredCnt->NPRefBuf[i][j]->pdata.pchY = new PixelC[newpredCnt->NPRefBuf[i][j]->iSizeY]; if (newpredCnt->NPRefBuf[i][j]->pdata.pchY == NULL) { fprintf(stderr, "initNEWPREDcnt: ERROR Memory allocate error(pchY)\n"); return newpredCnt; } newpredCnt->NPRefBuf[i][j]->pdata.pchU = new PixelC[newpredCnt->NPRefBuf[i][j]->iSizeUV]; if (newpredCnt->NPRefBuf[i][j]->pdata.pchU == NULL) { fprintf(stderr, "initNEWPREDcnt: ERROR Memory allocate error(pchU)\n"); return newpredCnt; } newpredCnt->NPRefBuf[i][j]->pdata.pchV = new PixelC[newpredCnt->NPRefBuf[i][j]->iSizeUV]; if (newpredCnt->NPRefBuf[i][j]->pdata.pchV == NULL) { fprintf(stderr, "initNEWPREDcnt: ERROR Memory allocate error(pchV)\n"); return newpredCnt; } memset(newpredCnt->NPRefBuf[i][j]->pdata.pchY, 0, newpredCnt->NPRefBuf[i][j]->iSizeY); memset(newpredCnt->NPRefBuf[i][j]->pdata.pchU, 0, newpredCnt->NPRefBuf[i][j]->iSizeUV); memset(newpredCnt->NPRefBuf[i][j]->pdata.pchV, 0, newpredCnt->NPRefBuf[i][j]->iSizeUV); } } return(newpredCnt);}void CNewPredEncoder::endNEWPREDcnt( NEWPREDcnt* newpredCnt ){ { int i, j; for (i= 0; (i < m_iNumSlice) && (*(m_piSlicePoint + i) >= 0); i++) { for (j= 0; j<m_iNumBuffEnc; j++) { delete newpredCnt->NPRefBuf[i][j]->pdata.pchY; delete newpredCnt->NPRefBuf[i][j]->pdata.pchU; delete newpredCnt->NPRefBuf[i][j]->pdata.pchV; delete newpredCnt->NPRefBuf[i][j]; } } delete []newpredCnt->ref; if (newpredCnt->NPRefBuf != NULL) { afree((int**)(newpredCnt->NPRefBuf)); } } delete []m_iHMBNum; free(newpredCnt);}void CNewPredEncoder::makeNextRef( NEWPREDcnt* newpredCnt, int slice_no){ static int count=m_iNumSlice-1; if (m_iVopID == 0 && slice_no == 0) count = m_iNumSlice-1; count++; newpredCnt->ref[slice_no] = newpredCnt->ref_tbl[((count/m_iNumSlice)+1)-2][slice_no]; return;}void CNewPredEncoder::makeNextBuf( NEWPREDcnt* newpredCnt, int vop_id, int slice_no){ m_pShiftBufTmp = newpredCnt->NPRefBuf[slice_no]; shiftBuffer(vop_id, m_iNumBuffEnc);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -