📄 newpred.cpp
字号:
Refpoint -= RefSize.width; memcpy(Refpoint , ppxlcRef + RefSize.left, RefSize.width); if(Refpoint == Refbuf0) break; assert(Refpoint > Refbuf0); } Refpoint = (PixelC *)ppxlcRef + RefSize.left; if(MBA == -1){ Refpoint += (m_iHeight/MB_SIZE - iMBY) * RefSize.width * MB_SIZE / magnification; }else{ i = MBA/(m_iWidth / MB_SIZE) - iMBY; if (flag == 0) i = 1; Refpoint += i*RefSize.width * MB_SIZE / magnification; } // padding below memcpy(Refpoint, Refpoint - RefSize.width, RefSize.width); while(1){ Refpoint += RefSize.width; memcpy(Refpoint, Refpoint - RefSize.width, RefSize.width); if(Refpoint == Refbuf0 + (RefSize.bottom - RefSize.top - 1) * RefSize.width) break; assert(Refpoint < Refbuf0 + (RefSize.bottom - RefSize.top- 1) * RefSize.width); }}void CNewPred::CopyReftoBuf(const PixelC* RefbufY, const PixelC* RefbufU, const PixelC* RefbufV, CRct rctRefFrameY, CRct rctRefFrameUV){ CopyRefYtoBufY(RefbufY, rctRefFrameY); CopyRefUtoBufU(RefbufU, rctRefFrameUV); CopyRefVtoBufV(RefbufV, rctRefFrameUV);}void CNewPred::CopyRefYtoBufY(const PixelC* ppxlcRefY,CRct RefSize){ memcpy(m_pchNewPredRefY, ppxlcRefY, RefSize.width*(RefSize.bottom - RefSize.top));}void CNewPred::CopyBufYtoRefY(const PixelC* ppxlcRefY,CRct RefSize){ memcpy((PixelC *)ppxlcRefY, m_pchNewPredRefY, RefSize.width*(RefSize.bottom - RefSize.top));}void CNewPred::CopyRefUtoBufU(const PixelC* ppxlcRefU,CRct RefSize){ memcpy(m_pchNewPredRefU, ppxlcRefU, RefSize.width*(RefSize.bottom - RefSize.top));}void CNewPred::CopyBufUtoRefU(const PixelC* ppxlcRefU,CRct RefSize){ memcpy((PixelC *)ppxlcRefU, m_pchNewPredRefU, RefSize.width*(RefSize.bottom - RefSize.top));}void CNewPred::CopyRefVtoBufV(const PixelC* ppxlcRefV,CRct RefSize){ memcpy(m_pchNewPredRefV, ppxlcRefV, RefSize.width*(RefSize.bottom - RefSize.top));}void CNewPred::CopyBufVtoRefV(const PixelC* ppxlcRefV,CRct RefSize){ memcpy((PixelC *)ppxlcRefV, m_pchNewPredRefV, RefSize.width*(RefSize.bottom - RefSize.top));}void CNewPred::ChangeRefOfSlice(const PixelC* ppxlcRefY, const PixelC* RefbufY, const PixelC* ppxlcRefU, const PixelC* RefbufU, const PixelC* ppxlcRefV, const PixelC* RefbufV, Int iMBX, Int iMBY, CRct rctRefFrameY, CRct rctRefFrameUV){ ChangeRefOfSliceYUV(ppxlcRefY, RefbufY, iMBX, iMBY,rctRefFrameY,'Y'); ChangeRefOfSliceYUV(ppxlcRefU, RefbufU, iMBX, iMBY,rctRefFrameUV,'U'); ChangeRefOfSliceYUV(ppxlcRefV, RefbufV, iMBX, iMBY,rctRefFrameUV,'V');}Bool CNewPred::CopyNPtoVM(Int iSlice_no, PixelC* RefpointY, PixelC* RefpointU, PixelC* RefpointV){ int ww, hh, st; int dist; int j; int cur_slice_no, next_slice_no; cur_slice_no = *(m_piSlicePoint + iSlice_no); next_slice_no = *(m_piSlicePoint + iSlice_no +1); if (next_slice_no == -1) next_slice_no = m_iNPNumMBX*m_iNPNumMBY; st = (cur_slice_no % m_iNPNumMBX) + EXPANDY_REF_FRAME/MB_SIZE; ww = next_slice_no - cur_slice_no; if (ww <= m_iNPNumMBX) hh = 1; else { hh = ww / m_iNPNumMBX; ww = m_iNPNumMBX; } for (Int i=0; i < (Who_Am_I() == NP_ENCODER?m_iNumBuffEnc:m_iNumBuffDec); i++) { if (m_pNewPredControl->ref[iSlice_no] == 0) { break; } if( (m_pNewPredControl->NPRefBuf[iSlice_no][i]->vop_id == m_pNewPredControl->ref[iSlice_no]) ) { for (j = 0; j < hh * MB_SIZE; j++) { dist = st*MB_SIZE + j* m_rctNPFrameY.width; memcpy(RefpointY+dist, m_pNewPredControl->NPRefBuf[iSlice_no][i]->pdata.pchY+dist, ww*MB_SIZE); } for (j = 0; j < hh * BLOCK_SIZE; j++) { dist = st*BLOCK_SIZE + j* m_rctNPFrameUV.width; memcpy(RefpointU+dist, m_pNewPredControl->NPRefBuf[iSlice_no][i]->pdata.pchU+dist, ww*BLOCK_SIZE); memcpy(RefpointV+dist, m_pNewPredControl->NPRefBuf[iSlice_no][i]->pdata.pchV+dist, ww*BLOCK_SIZE); } return TRUE; }#ifdef _DEBUG else { NPDebugMessage("Not find NP memory (%02d:%02d)\n", m_pNewPredControl->ref[iSlice_no], iSlice_no); }#endif } return FALSE;}Bool CNewPred::CopyNPtoPrev(Int iSlice_no, PixelC* RefpointY, PixelC* RefpointU, PixelC* RefpointV){ int ww, hh, st; int dist; int j; int cur_slice_no, next_slice_no; cur_slice_no = *(m_piSlicePoint + iSlice_no); next_slice_no = *(m_piSlicePoint + iSlice_no +1); if (next_slice_no == -1) next_slice_no = m_iNPNumMBX*m_iNPNumMBY; st = (cur_slice_no % m_iNPNumMBX) + EXPANDY_REF_FRAME/MB_SIZE; ww = next_slice_no - cur_slice_no; if (ww <= m_iNPNumMBX) hh = 1; else { hh = ww / m_iNPNumMBX; ww = m_iNPNumMBX; } if (Who_Am_I() == NP_ENCODER) { m_pNewPredControl->ref[iSlice_no] = m_pNewPredControl->NPRefBuf[iSlice_no][0]->vop_id; } else { if (m_pNewPredControl->NPRefBuf[iSlice_no][0]->vop_id != 1) { m_pNewPredControl->ref[iSlice_no] = m_pNewPredControl->NPRefBuf[iSlice_no][0]->vop_id - 1; } else { m_pNewPredControl->ref[iSlice_no] = m_maxVopID; } } for (Int i=0; i < (Who_Am_I() == NP_ENCODER?m_iNumBuffEnc:m_iNumBuffDec); i++) { if( (m_pNewPredControl->NPRefBuf[iSlice_no][i]->vop_id == m_pNewPredControl->ref[iSlice_no]) ) { for (j = 0; j < hh * MB_SIZE; j++) { dist = st*MB_SIZE + j* m_rctNPFrameY.width; memcpy(RefpointY+dist, m_pNewPredControl->NPRefBuf[iSlice_no][i]->pdata.pchY+dist, ww*MB_SIZE); } for (j = 0; j < hh * BLOCK_SIZE; j++) { dist = st*BLOCK_SIZE + j* m_rctNPFrameUV.width; memcpy(RefpointU+dist, m_pNewPredControl->NPRefBuf[iSlice_no][i]->pdata.pchU+dist, ww*BLOCK_SIZE); memcpy(RefpointV+dist, m_pNewPredControl->NPRefBuf[iSlice_no][i]->pdata.pchV+dist, ww*BLOCK_SIZE); } return TRUE; } } return FALSE;}#include <stdarg.h>// 1999.8.30 NTT#ifdef _DEBUGvoid cdecl CNewPred::NPDebugMessage( char* pszMsg, ... ){//#ifdef _DEBUG va_list arg_ptr; char szBuf[256]; va_start( arg_ptr, pszMsg ); vsprintf( szBuf, pszMsg, arg_ptr ); _RPT0(_CRT_WARN, szBuf);//#endif}#endifint CNewPred::SliceTailMBA(int iMBX, int iMBY){ int iNumMBX = m_iWidth / MB_SIZE; int iMBNum = iMBX + (iMBY * iNumMBX); int iresult; if(iMBNum > m_iWidth/MB_SIZE*m_iHeight/MB_SIZE-1) return(-1); for( int iLocal = 0; *(m_piSlicePoint + iLocal) >= 0; iLocal++ ) { if( *(m_piSlicePoint + iLocal) > iMBNum ) { if(*(m_piSlicePoint + iLocal) == -1){ iresult = m_iWidth/MB_SIZE*m_iHeight/MB_SIZE-1; } else{ iresult = *(m_piSlicePoint + iLocal)-1; } return(iresult); } } return(m_iWidth/MB_SIZE*m_iHeight/MB_SIZE-1);}void CNewPred::GetSlicePoint(char * pchSlicePointParam) { char* pchSlicePoint = pchSlicePointParam; int iLocal; int iScanValue = 0; char* pchWrok = pchSlicePoint; if (pchSlicePointParam[0]) { iLocal = 0; while (sscanf( pchWrok, "%d", &iScanValue ) != EOF) { iLocal++; pchWrok = strchr( pchWrok, ',' ); if (pchWrok == NULL) break; ++pchWrok; } if (m_bNewPredSegmentType == 1) // VOP segment iLocal = 1; m_piSlicePoint = new int[iLocal+1]; // generate slice point if (m_bNewPredSegmentType == 1) { // VOP segment m_iNumSlice = 1; iLocal = 0; *(m_piSlicePoint + iLocal) = 0; iLocal++; *(m_piSlicePoint + iLocal) = -1; } else { m_iNumSlice = iLocal; iLocal = 0; while (sscanf(pchSlicePoint, "%d", &iScanValue ) != EOF) { *(m_piSlicePoint + iLocal) = iScanValue; iLocal++; pchSlicePoint = strchr( pchSlicePoint, ',' ); if (pchSlicePoint == NULL) break; ++pchSlicePoint; } *(m_piSlicePoint + iLocal) = -1; if (*m_piSlicePoint != 0) { fprintf (stderr, "Wrong slice number\n"); exit (1); } int i, before_x, next_x, flag = 0; for (iLocal = 0; iLocal < m_iNumSlice; iLocal++) { if ((*(m_piSlicePoint + iLocal)) % m_iNPNumMBX) { flag = 0; before_x = ((*(m_piSlicePoint + iLocal)) / m_iNPNumMBX) * m_iNPNumMBX; next_x = (before_x == (m_iNPNumMBY-1)*m_iNPNumMBX) ? -1 : (before_x + m_iNPNumMBX); for (i = 0; i <= m_iNumSlice; i++) { if ((*(m_piSlicePoint + i)) == before_x) flag++; if ((*(m_piSlicePoint + i)) == next_x) flag++; } if (flag != 2) { fprintf (stderr, "Wrong slice number\n"); exit (1); } } } } }}void CNewPred::check_comment(char *buf){ while(*buf != '\0'){ if (*buf == '%') { *buf = '\0'; } buf++; }}short CNewPred::check_space(char *buf){ short i; i=0; if(*buf == (char)NULL) i=1; else if(strspn(buf," \t\n")==strlen(buf)) i=1; return(i);}int CNewPred::make_next_decbuf( NEWPREDcnt* newpredCnt, int vop_id, int slice_no){ int noStore_vop_id = 0; m_pShiftBufTmp = newpredCnt->NPRefBuf[slice_no]; shiftBuffer(vop_id, m_iNumBuffDec); return(noStore_vop_id);}void CNewPred::shiftBuffer( int vop_id, int max_refsel){ int i; int iMoveCnt = max_refsel-1; NEWPRED_buf *tmpbuf = NULL; if(m_pShiftBufTmp) { tmpbuf = m_pShiftBufTmp[iMoveCnt]; } for(i=iMoveCnt; i>0; i--) { if(m_pShiftBufTmp) { m_pShiftBufTmp[i] = m_pShiftBufTmp[i-1]; } } if(m_pShiftBufTmp) { m_pShiftBufTmp[0] = tmpbuf; SetNPRefBuf(m_pShiftBufTmp, vop_id, 0); } return;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -