📄 yuvac.cpp
字号:
if (m_puciBUV) m_puciBUV -> overlay (*vopc.getPlane (BUV_PLANE)); m_puciY -> overlay (*vopc.getPlane (Y_PLANE)); m_puciU -> overlay (*vopc.getPlane (U_PLANE)); m_puciV -> overlay (*vopc.getPlane (V_PLANE)); if (m_fAUsage == EIGHT_BIT) for(Int iAuxComp=0;iAuxComp<m_iAuxCompCount;iAuxComp++) // MAC (SB) 25-Nov-99 m_ppuciA[iAuxComp] -> overlay (*vopc.getPlaneA (iAuxComp));}Void CVOPU8YUVBA::overlay (const CVOPU8YUVBA& vopc, const CRct& rctY){ if (!vopc.valid ()) return; if (!rctY.valid ()) return; CRct rctUV = rctY.downSampleBy2 (); m_puciBY -> overlay (*vopc.getPlane (BY_PLANE), rctY); m_puciBUV -> overlay (*vopc.getPlane (BUV_PLANE), rctUV); m_puciY -> overlay (*vopc.getPlane (Y_PLANE), rctY); m_puciU -> overlay (*vopc.getPlane (U_PLANE), rctUV); m_puciV -> overlay (*vopc.getPlane (V_PLANE), rctUV); if (m_fAUsage == EIGHT_BIT) for(Int iAuxComp=0;iAuxComp<m_iAuxCompCount;iAuxComp++) // MAC (SB) 25-Nov-99 m_ppuciA[iAuxComp] -> overlay (*vopc.getPlaneA(iAuxComp), rctY);}own CVOPU8YUVBA* CVOPU8YUVBA::downsampleForSpatialScalability () const{ //only handle CIF->QCIF for RECTANGULAR VOP assert (m_fAUsage == RECTANGLE); /* CRct rctDown = */ whereY (); assert (whereY().left == 0 && whereY().top == 0); CVOPU8YUVBA* pvopfRet = new CVOPU8YUVBA (m_fAUsage); assert (pvopfRet != NULL); pvopfRet -> m_puciY = m_puciY->downsampleForSpatialScalability (); pvopfRet -> m_puciU = m_puciU->downsampleForSpatialScalability (); pvopfRet -> m_puciV = m_puciV->downsampleForSpatialScalability (); pvopfRet -> m_puciBY = new CU8Image (pvopfRet->whereY (), opaqueValue); pvopfRet -> m_puciBUV = new CU8Image (pvopfRet->whereUV (), opaqueValue); return pvopfRet;}//OBSS_SAIT_991015//wchen: maybe these upsampling functions should be in sys; do it laterown CVOPU8YUVBA* CVOPU8YUVBA::upsampleForSpatialScalability (Int iVerticalSamplingFactorM, Int iVerticalSamplingFactorN, Int iHorizontalSamplingFactorM, Int iHorizontalSamplingFactorN, Int iVerticalSamplingFactorMShape, Int iVerticalSamplingFactorNShape, Int iHorizontalSamplingFactorMShape, Int iHorizontalSamplingFactorNShape, Int iFrmWidth_SS, Int iFrmHeight_SS, Bool bShapeOnly, Int iExpandYRefFrame, Int iExpandUVRefFrame) const{ CVOPU8YUVBA* pvopfRet = new CVOPU8YUVBA (m_fAUsage); assert (pvopfRet != NULL); pvopfRet -> m_puciY = m_puciY->upsampleForSpatialScalability (iVerticalSamplingFactorM, iVerticalSamplingFactorN, iHorizontalSamplingFactorM, iHorizontalSamplingFactorN, iFrmWidth_SS, iFrmHeight_SS, 1, iExpandYRefFrame , bShapeOnly); pvopfRet -> m_puciU = m_puciU->upsampleForSpatialScalability (iVerticalSamplingFactorM, iVerticalSamplingFactorN, iHorizontalSamplingFactorM, iHorizontalSamplingFactorN, iFrmWidth_SS, iFrmHeight_SS, 2, iExpandYRefFrame , bShapeOnly); pvopfRet -> m_puciV = m_puciV->upsampleForSpatialScalability (iVerticalSamplingFactorM, iVerticalSamplingFactorN, iHorizontalSamplingFactorM, iHorizontalSamplingFactorN, iFrmWidth_SS, iFrmHeight_SS, 2, iExpandYRefFrame , bShapeOnly); if (m_fAUsage == ONE_BIT){ //for shape upsampling->repeatition pvopfRet -> m_puciBY = m_puciBY->upsampleSegForSpatialScalability (iVerticalSamplingFactorMShape, iVerticalSamplingFactorNShape, iHorizontalSamplingFactorMShape, iHorizontalSamplingFactorNShape, iFrmWidth_SS, iFrmHeight_SS, 1, iExpandYRefFrame); pvopfRet -> m_puciBUV = m_puciBUV->upsampleSegForSpatialScalability (iVerticalSamplingFactorMShape, iVerticalSamplingFactorNShape, iHorizontalSamplingFactorMShape, iHorizontalSamplingFactorNShape, iFrmWidth_SS, iFrmHeight_SS, 2, iExpandYRefFrame); pvopfRet->m_ppxlcBY = (PixelC *) pvopfRet->m_puciBY->pixels(); //for upsampled Y-shape retrun pvopfRet->m_ppxlcBUV = (PixelC *) pvopfRet->m_puciBUV->pixels(); //for upsampled UV-shape retrun pvopfRet->m_rctBY = pvopfRet->m_puciBY->where(); pvopfRet->m_rctBUV = pvopfRet->m_puciBUV->where(); pvopfRet->m_rctBoundBY.expand(-iExpandYRefFrame, -iExpandYRefFrame,-iExpandYRefFrame,-iExpandYRefFrame); pvopfRet->m_rctBoundBUV.expand(-iExpandUVRefFrame,-iExpandUVRefFrame,-iExpandUVRefFrame,-iExpandUVRefFrame); } else { pvopfRet -> m_puciBY = new CU8Image (pvopfRet->whereY (), opaqueValue); pvopfRet -> m_puciBUV = new CU8Image (pvopfRet->whereUV (), opaqueValue); } pvopfRet->m_ppxlcY = (PixelC *) pvopfRet->m_puciY->pixels(); pvopfRet->m_ppxlcU = (PixelC *) pvopfRet->m_puciU->pixels(); pvopfRet->m_ppxlcV = (PixelC *) pvopfRet->m_puciV->pixels(); pvopfRet->m_rctY = pvopfRet->m_puciY->where(); pvopfRet->m_rctUV = pvopfRet->m_puciU->where(); pvopfRet->m_rctBoundY.expand(-iExpandYRefFrame, -iExpandYRefFrame,-iExpandYRefFrame,-iExpandYRefFrame); pvopfRet->m_rctBoundUV.expand(-iExpandUVRefFrame,-iExpandUVRefFrame,-iExpandUVRefFrame,-iExpandUVRefFrame); pvopfRet->m_ppxlcBoundY=pvopfRet->m_ppxlcY+16+16*pvopfRet->m_rctY.width; pvopfRet->m_ppxlcBoundU=pvopfRet->m_ppxlcU +8 +8*pvopfRet->m_rctUV.width;// pvopfRet->m_ppxlcBoundY=pvopfRet->m_ppxlcV +8 +8*pvopfRet->m_rctUV.width; //Bug pvopfRet->m_ppxlcBoundV=pvopfRet->m_ppxlcV +8 +8*pvopfRet->m_rctUV.width; //Bug fix by SAIT if ( bShapeOnly ) { pvopfRet->m_rctY = pvopfRet->m_puciBY->where(); pvopfRet->m_rctUV = pvopfRet->m_puciBUV->where(); } return pvopfRet;}//~OBSS_SAIT_991015own Double* CVOPU8YUVBA::mse (const CVOPU8YUVBA& vopf) const{ assert (whereY () == vopf.whereY () && whereUV () == vopf.whereUV ()); Double* rgdblMeanSquareError = new Double [3+m_iAuxCompCount]; // mean square CU8Image* puciBOr = new CU8Image (*m_puciBY); puciBOr ->CU8Image_or (*vopf.getPlane (BY_PLANE)); CU8Image* puciExp0 = new CU8Image (*m_puciY, puciBOr -> where ()); CU8Image* puciExp1 = new CU8Image (*vopf.getPlane (Y_PLANE), puciBOr -> where ()); rgdblMeanSquareError [0] = puciExp1 -> mse (*puciExp0, *puciBOr); delete puciExp0; delete puciExp1; if (fAUsage () == EIGHT_BIT) { assert( m_iAuxCompCount==vopf.m_iAuxCompCount ); for(Int iAuxComp=0;iAuxComp<m_iAuxCompCount;iAuxComp++) { // MAC (SB) 26-Nov-99 puciExp0 = new CU8Image (*m_ppuciA[iAuxComp], puciBOr -> where ()); puciExp1 = new CU8Image (*vopf.getPlaneA (iAuxComp), puciBOr -> where ()); rgdblMeanSquareError [3+iAuxComp] = puciExp1 -> mse (*puciExp0, *puciBOr); delete puciExp0; delete puciExp1; } } delete puciBOr; puciBOr = new CU8Image (*m_puciBUV); puciBOr ->CU8Image_or (*vopf.getPlane (BUV_PLANE)); puciExp0 = new CU8Image (*m_puciU, puciBOr -> where ()); puciExp1 = new CU8Image (*vopf.getPlane (U_PLANE), puciBOr -> where ()); rgdblMeanSquareError [1] = puciExp1 -> mse (*puciExp0, *puciBOr); delete puciExp0; delete puciExp1; puciExp0 = new CU8Image (*m_puciV, puciBOr -> where ()); puciExp1 = new CU8Image (*vopf.getPlane (V_PLANE), puciBOr -> where ()); rgdblMeanSquareError [2] = puciExp1 -> mse (*puciExp0, *puciBOr); delete puciExp0; delete puciExp1; delete puciBOr; return rgdblMeanSquareError;}own Double* CVOPU8YUVBA::snr (const CVOPU8YUVBA& vopf) const{ assert (whereY () == vopf.whereY () && whereUV () == vopf.whereUV ()); Double* psnr = new Double [3+m_iAuxCompCount]; // mean square CU8Image* puciBOr = new CU8Image (*m_puciBY); puciBOr ->CU8Image_or (*vopf.getPlane (BY_PLANE)); CU8Image* puciExp0 = new CU8Image (*m_puciY, puciBOr -> where ()); CU8Image* puciExp1 = new CU8Image (*vopf.getPlane (Y_PLANE), puciBOr -> where ()); psnr [0] = puciExp1 -> snr (*puciExp0, *puciBOr); delete puciExp0; delete puciExp1; if (fAUsage () == EIGHT_BIT) { assert( m_iAuxCompCount==vopf.m_iAuxCompCount ); for(Int iAuxComp=0;iAuxComp<m_iAuxCompCount;iAuxComp++) { // MAC (SB) 26-Nov-99 puciExp0 = new CU8Image (*m_ppuciA[iAuxComp], puciBOr -> where ()); puciExp1 = new CU8Image (*vopf.getPlaneA (iAuxComp), puciBOr -> where ()); psnr [3+iAuxComp] = puciExp1 -> snr (*puciExp0, *puciBOr); delete puciExp0; delete puciExp1; } } delete puciBOr; puciBOr = new CU8Image (*m_puciBUV); puciBOr ->CU8Image_or (*vopf.getPlane (BUV_PLANE)); puciExp0 = new CU8Image (*m_puciU, puciBOr -> where ()); puciExp1 = new CU8Image (*vopf.getPlane (U_PLANE), puciBOr -> where ()); psnr [1] = puciExp1 -> snr (*puciExp0, *puciBOr); delete puciExp0; delete puciExp1; puciExp0 = new CU8Image (*m_puciV, puciBOr -> where ()); puciExp1 = new CU8Image (*vopf.getPlane (V_PLANE), puciBOr -> where ()); psnr [2] = puciExp1 -> snr (*puciExp0, *puciBOr); delete puciExp0; delete puciExp1; delete puciBOr; return psnr;}const CU8Image* CVOPU8YUVBA::getPlaneA (Int iAuxComp) const{ assert( iAuxComp<m_iAuxCompCount && iAuxComp>=0 ); return m_ppuciA[iAuxComp];}const CU8Image* CVOPU8YUVBA::getPlane (PlaneType plnType) const{ if (plnType==A_PLANE) { cerr << "For A-Planes please use CVOPIntYUVBA::getPlaneA()!\n"; assert( plnType!=A_PLANE ); } if (plnType == Y_PLANE) return m_puciY; else if (plnType == U_PLANE) return m_puciU; else if (plnType == V_PLANE) return m_puciV; else if (plnType == BY_PLANE) return m_puciBY; else if (plnType == BUV_PLANE) return m_puciBUV; else /*if (plnType == A_PLANE) return m_puciA; else */return NULL;}Void CVOPU8YUVBA::dump (FILE* pfFile) const{ fwrite (m_ppxlcY, m_rctY .area(), 1, pfFile); fwrite (m_ppxlcU, m_rctUV.area(), 1, pfFile); fwrite (m_ppxlcV, m_rctUV.area(), 1, pfFile);}Void CVOPU8YUVBA::dump (const Char* pchFileName) const{ FILE* pfOut = fopen (pchFileName, "wb"); dump (pfOut); fclose (pfOut);}Void CVOPU8YUVBA::vdlDump (const Char* pchFileName, const CRct& rct) const{ CRct rctROI = (!rct.valid ()) ? m_rctY : rct; assert (rctROI <= m_rctY); CVideoObjectPlane vop (rctROI, opaquePixel); Int offset = (rctROI == m_rctY)? 0 : m_rctY.width - rct.width; CU8Image* puciZoomedU = m_puciU -> zoomup (2, 2); CU8Image* puciZoomedV = m_puciV -> zoomup (2, 2); PixelC* ppxlucY = (PixelC*) m_puciY -> pixels (); PixelC* ppxlucU = (PixelC*) puciZoomedU -> pixels (); PixelC* ppxlucV = (PixelC*) puciZoomedV -> pixels (); PixelC* ppxlucA = NULL; if (m_fAUsage == EIGHT_BIT) ppxlucA = (PixelC*) m_ppuciA[0] -> pixels (); else if (m_fAUsage == ONE_BIT) ppxlucA = (PixelC*) m_puciBY -> pixels (); CPixel* ppxl = (CPixel*) vop.pixels (); for (CoordI y = rctROI.top; y < rctROI.bottom; y++) { for (CoordI x = rctROI.left; x < rctROI.right; x++, ppxlucY++, ppxlucU++, ppxlucV++, ppxlucA++) { Double var = 1.164 * (*ppxlucY - 16); Int r = (Int) ((Double) (var + 1.596 * (*ppxlucV - 128)) + .5); Int g = (Int) ((Double) (var - 0.813 * (*ppxlucV - 128) - 0.391 * (*ppxlucU - 128)) + .5); Int b = (Int) ((Double) (var + 2.018 * (*ppxlucU - 128)) + .5); Int a = (m_fAUsage == RECTANGLE)? opaqueValue : *ppxlucA; ppxl -> pxlU.rgb.r = (U8) checkrange (r, 0, 255); ppxl -> pxlU.rgb.g = (U8) checkrange (g, 0, 255); ppxl -> pxlU.rgb.b = (U8) checkrange (b, 0, 255); ppxl -> pxlU.rgb.a = (U8) checkrange (a, 0, 255); ppxl++; } ppxlucY += offset; ppxlucU += offset; ppxlucV += offset; ppxlucA += offset; } delete puciZoomedU; delete puciZoomedV; vop.vdlDump (pchFileName);}Void CVOPU8YUVBA::addBYPlain ( Int iAuxCompCount ){ m_iAuxCompCount = iAuxCompCount; m_puciBY = new CU8Image (m_rctY, 255); //initialize so that outside VOP is transp assert (m_puciBY != NULL); m_puciBUV = new CU8Image (m_rctUV, 255); //initialize so that outside VOP is transp assert (m_puciBUV != NULL); m_ppxlcBY = (PixelC*) m_puciBY->pixels (); m_ppxlcBUV = (PixelC*) m_puciBUV->pixels (); if (m_fAUsage == EIGHT_BIT) { m_ppuciA = new CU8Image* [m_iAuxCompCount]; assert(m_ppuciA != NULL); m_pppxlcA = new PixelC* [m_iAuxCompCount]; assert(m_pppxlcA != NULL); for(Int iAuxComp=0;iAuxComp<m_iAuxCompCount;iAuxComp++) { // MAC (SB) 25-Nov-99 m_ppuciA[iAuxComp] = new CU8Image (m_rctY, 255); //initialize so that outside VOP is transp assert (m_ppuciA[iAuxComp] != NULL); m_pppxlcA[iAuxComp] = (PixelC*) m_ppuciA[iAuxComp]->pixels (); } }}Void CVOPU8YUVBA::addBYPlain (const CRct& rct, const CRct& rctUV, Int iAuxCompCount){ m_iAuxCompCount = iAuxCompCount; CU8Image* puciTemp = new CU8Image ( rct, MPEG4_OPAQUE ); //m_puciBY = new CU8Image (m_rctY, 255); //initialize so that outside VOP is transp m_puciBY = new CU8Image (m_rctY, MPEG4_TRANSPARENT); //initialize so that outside VOP is transp m_puciBY->CU8Image_or( *puciTemp ); // for background composition, mask of whole image is generated here assert (m_puciBY != NULL); CU8Image* puciTempUV = new CU8Image ( rctUV, MPEG4_OPAQUE ); //m_puciBUV = new CU8Image (m_rctUV, 255); //initialize so that outside VOP is transp m_puciBUV = new CU8Image (m_rctUV, MPEG4_TRANSPARENT); //initialize so that outside VOP is transp m_puciBUV->CU8Image_or( *puciTempUV ); // for background composition, mask of whole image is generated here assert (m_puciBUV != NULL); m_ppxlcBY = (PixelC*) m_puciBY->pixels (); m_ppxlcBUV = (PixelC*) m_puciBUV->pixels (); if (m_fAUsage == EIGHT_BIT) { //m_puciA = new CU8Image (m_rctY, 255); //initialize so that outside VOP is transp m_ppuciA = new CU8Image* [m_iAuxCompCount]; assert(m_ppuciA != NULL); m_pppxlcA = new PixelC* [m_iAuxCompCount]; assert(m_pppxlcA != NULL); for(Int iAuxComp=0;iAuxComp<m_iAuxCompCount;iAuxComp++) { // MAC (SB) 25-Nov-99 m_ppuciA[iAuxComp] = new CU8Image (m_rctY, MPEG4_TRANSPARENT); //initialize so that outside VOP is transp m_ppuciA[iAuxComp]->CU8Image_or( *puciTemp ); assert (m_ppuciA[iAuxComp] != NULL); m_pppxlcA[iAuxComp] = (PixelC*) m_ppuciA[iAuxComp]->pixels (); } }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -