📄 main.cpp
字号:
SAFE_FUNC( ChenImage_imagePSNR(WIDTH, HEIGHT, pWZFrame[1], pDecodedFrame[1], &fPSNRU) );
SAFE_FUNC( ChenImage_imagePSNR(WIDTH, HEIGHT, pWZFrame[2], pDecodedFrame[2], &fPSNRV) );
sprintf(pTextBuffer, "rate(Y,U,V) (bpp) = %.2f, %.2f, %.2f, PSNR(Y,U,V) (dB) = %.2f, %.2f, %.2f \n", fRateY*BITPLANES, pRateQuadOracle[4]*BITPLANES, pRateQuadOracle[5]*BITPLANES, fPSNRY, fPSNRU, fPSNRV); SCREEN_AND_LOG(pTextBuffer, codingOption.pLogFile);
// Update RD file
fprintf(codingOption.pLogFileRD, "%.4f\t\t%.4f\t\t%.4f\t\t%.4f\t\t%.4f\t\t%.4f\t\t", fRateY*BITPLANES, pRateQuadOracle[4]*BITPLANES, pRateQuadOracle[5]*BITPLANES, fPSNRY, fPSNRU, fPSNRV); fflush(codingOption.pLogFileRD);
// Save decoded frame and motion field
if (codingOption.bSaveDecodedFrame) {
SAFE_FUNC( saveDecodedFrame(&codingOption, "oracle", (const short**)pDecodedFrame) );
}
if (codingOption.bSaveMotionField) {
SAFE_FUNC( saveDecodedMotion(&codingOption, "oracle", (const short**)pOracleShiftsXQuad, (const short**)pOracleShiftsYQuad, NULL) );
}
// Store for future reference
pVideoOracleY[nWZFrame] = pDecodedFrame[0];
pVideoOracleU[nWZFrame] = pDecodedFrame[1];
pVideoOracleV[nWZFrame] = pDecodedFrame[2];
}
//------------------------------------------------------------
// Decode with motion learning
//------------------------------------------------------------
sprintf(pTextBuffer, "Decode with motion learning"); SCREEN_AND_LOG_TITLE(pTextBuffer, codingOption.pLogFile);
if (codingOption.bTestMotionLearning) {
// Decode
pWZFrame[0] = pVideoY[nWZFrame];
pWZFrame[1] = pVideoU[nWZFrame];
pWZFrame[2] = pVideoV[nWZFrame];
pSIFrame[0] = pVideoLearningY[nSIFrame];
pSIFrame[1] = pVideoLearningU[nSIFrame];
pSIFrame[2] = pVideoLearningV[nSIFrame];
for (int nChannel = 0; nChannel < 3; nChannel++) {
pDecodedFrame[nChannel] = new short[PIXELS];
}
for (int nQuad = 0; nQuad < 6; nQuad++) {
// Use motion oracle rate as lower bound
if (codingOption.bTestMotionOracle) {
pRatePredict[nQuad] = pRateQuadOracle[nQuad] - (float)(0.5/132.0);
}
// Use conditional entropy as lower bound
else {
pRatePredict[nQuad] = pEntropyQuad[nQuad];
}
}
// Turn on motion learning
codingOption.bMotionEstimate = true;
// Turn off motion oracle
codingOption.bMotionOracle = false;
SAFE_FUNC( pixelQuads_decodeFrameYUV(&codingOption, (const short**)pSIFrame, (const uchar**)pAccumSyndQuad, pScaledQArray, pRatePredict, (const float**)pLambdaQuad, codingOption.pLadderFileName, (const short**)pOracleShiftsXQuad, (const short**)pOracleShiftsYQuad, pDecodedFrame, pRateQuadLearning, pDecodedShiftsX, pDecodedShiftsY, pDecodedShiftProb) );
// Measure statistics
fRateY = 0.0;
for (int nQuad = 0; nQuad < 6; nQuad++) {
if (nQuad < 4) fRateY += (float)(0.25 * pRateQuadLearning[nQuad]);
sprintf(pTextBuffer, "quad %d rate (bpp): %.2f \n", nQuad, pRateQuadLearning[nQuad]*BITPLANES);
printf(pTextBuffer); fprintf(codingOption.pLogFile, pTextBuffer); fflush(codingOption.pLogFile);
}
SAFE_FUNC( ChenImage_imagePSNR(WIDTH, HEIGHT, pWZFrame[0], pDecodedFrame[0], &fPSNRY) );
SAFE_FUNC( ChenImage_imagePSNR(WIDTH, HEIGHT, pWZFrame[1], pDecodedFrame[1], &fPSNRU) );
SAFE_FUNC( ChenImage_imagePSNR(WIDTH, HEIGHT, pWZFrame[2], pDecodedFrame[2], &fPSNRV) );
sprintf(pTextBuffer, "rate(Y,U,V) (bpp) = %.2f, %.2f, %.2f, PSNR(Y,U,V) (dB) = %.2f, %.2f, %.2f \n", fRateY*BITPLANES, pRateQuadLearning[4]*BITPLANES, pRateQuadLearning[5]*BITPLANES, fPSNRY, fPSNRU, fPSNRV); SCREEN_AND_LOG(pTextBuffer, codingOption.pLogFile);
// Update RD file
fprintf(codingOption.pLogFileRD, "%.4f\t\t%.4f\t\t%.4f\t\t%.4f\t\t%.4f\t\t%.4f\t\t", fRateY*BITPLANES, pRateQuadLearning[4]*BITPLANES, pRateQuadLearning[5]*BITPLANES, fPSNRY, fPSNRU, fPSNRV); fflush(codingOption.pLogFileRD);
// Save decoded frame and motion field
if (codingOption.bSaveDecodedFrame) {
SAFE_FUNC( saveDecodedFrame(&codingOption, "learning", (const short**)pDecodedFrame) );
}
if (codingOption.bSaveMotionField) {
SAFE_FUNC( saveDecodedMotion(&codingOption, "learning", (const short**)pDecodedShiftsX, (const short**)pDecodedShiftsY, (const float**)pDecodedShiftProb) );
}
// Store for future reference
pVideoLearningY[nWZFrame] = pDecodedFrame[0];
pVideoLearningU[nWZFrame] = pDecodedFrame[1];
pVideoLearningV[nWZFrame] = pDecodedFrame[2];
}
//------------------------------------------------------------
// Decode with no compensation
//------------------------------------------------------------
sprintf(pTextBuffer, "Decode with no compensation"); SCREEN_AND_LOG_TITLE(pTextBuffer, codingOption.pLogFile);
if (codingOption.bTestZeroMotion) {
// Decode
pWZFrame[0] = pVideoY[nWZFrame];
pWZFrame[1] = pVideoU[nWZFrame];
pWZFrame[2] = pVideoV[nWZFrame];
pSIFrame[0] = pVideoOracleY[nSIFrame];
pSIFrame[1] = pVideoOracleU[nSIFrame];
pSIFrame[2] = pVideoOracleV[nSIFrame];
for (int nChannel = 0; nChannel < 3; nChannel++) {
pDecodedFrame[nChannel] = new short[PIXELS];
}
for (int nQuad = 0; nQuad < 6; nQuad++) {
// Use motion oracle rate as lower bound
if (codingOption.bTestMotionOracle) {
pRatePredict[nQuad] = pRateQuadOracle[nQuad] - (float)(0.5/132.0);
}
// Use conditional entropy as lower bound
else {
pRatePredict[nQuad] = pEntropyQuad[nQuad];
}
}
// Turn off motion learning
codingOption.bMotionEstimate = false;
// Turn off motion oracle
codingOption.bMotionOracle = false;
SAFE_FUNC( pixelQuads_decodeFrameYUV(&codingOption, (const short**)pSIFrame, (const uchar**)pAccumSyndQuad, pScaledQArray, pRatePredict, (const float**)pLambdaQuad, codingOption.pLadderFileName, (const short**)pOracleShiftsXQuad, (const short**)pOracleShiftsYQuad, pDecodedFrame, pRateQuadNoComp, pDecodedShiftsX, pDecodedShiftsY, pDecodedShiftProb) );
// Measure statistics
fRateY = 0.0;
for (int nQuad = 0; nQuad < 6; nQuad++) {
if (nQuad < 4) fRateY += (float)(0.25 * pRateQuadNoComp[nQuad]);
sprintf(pTextBuffer, "quad %d rate (bpp): %.2f \n", nQuad, pRateQuadNoComp[nQuad]*BITPLANES);
printf(pTextBuffer); fprintf(codingOption.pLogFile, pTextBuffer); fflush(codingOption.pLogFile);
}
SAFE_FUNC( ChenImage_imagePSNR(WIDTH, HEIGHT, pWZFrame[0], pDecodedFrame[0], &fPSNRY) );
SAFE_FUNC( ChenImage_imagePSNR(WIDTH, HEIGHT, pWZFrame[1], pDecodedFrame[1], &fPSNRU) );
SAFE_FUNC( ChenImage_imagePSNR(WIDTH, HEIGHT, pWZFrame[2], pDecodedFrame[2], &fPSNRV) );
sprintf(pTextBuffer, "rate(Y,U,V) (bpp) = %.2f, %.2f, %.2f, PSNR(Y,U,V) (dB) = %.2f, %.2f, %.2f \n", fRateY*BITPLANES, pRateQuadNoComp[4]*BITPLANES, pRateQuadNoComp[5]*BITPLANES, fPSNRY, fPSNRU, fPSNRV); SCREEN_AND_LOG(pTextBuffer, codingOption.pLogFile);
// Update RD file
fprintf(codingOption.pLogFileRD, "%.4f\t\t%.4f\t\t%.4f\t\t%.4f\t\t%.4f\t\t%.4f\t\t", fRateY*BITPLANES, pRateQuadNoComp[4]*BITPLANES, pRateQuadNoComp[5]*BITPLANES, fPSNRY, fPSNRU, fPSNRV); fflush(codingOption.pLogFileRD);
// Save decoded frame
if (codingOption.bSaveDecodedFrame) {
SAFE_FUNC( saveDecodedFrame(&codingOption, "noComp", (const short**)pDecodedFrame) );
}
// Store for future reference
pVideoOracleY[nWZFrame] = pDecodedFrame[0];
pVideoOracleU[nWZFrame] = pDecodedFrame[1];
pVideoOracleV[nWZFrame] = pDecodedFrame[2];
}
//------------------------------------------------------------
// Decode with intra
//------------------------------------------------------------
sprintf(pTextBuffer, "Decode with intra"); SCREEN_AND_LOG_TITLE(pTextBuffer, codingOption.pLogFile);
if (codingOption.bTestIntra) {
sprintf(pTextBuffer, "rate(Y,U,V) (bpp) = %.2f, %.2f, %.2f, PSNR(Y,U,V) (dB) = %.2f, %.2f, %.2f \n", pIntraRateY[nWZFrame], pIntraRateU[nWZFrame], pIntraRateV[nWZFrame], pIntraPSNRY[nWZFrame], pIntraPSNRU[nWZFrame], pIntraPSNRV[nWZFrame]); SCREEN_AND_LOG(pTextBuffer, codingOption.pLogFile);
// Update RD file
fprintf(codingOption.pLogFileRD, "%.4f\t\t%.4f\t\t%.4f\t\t%.4f\t\t%.4f\t\t%.4f\t\t", pIntraRateY[nWZFrame], pIntraRateU[nWZFrame], pIntraRateV[nWZFrame], pIntraPSNRY[nWZFrame], pIntraPSNRU[nWZFrame], pIntraPSNRV[nWZFrame]); fflush(codingOption.pLogFileRD);
}
//------------------------------------------------------------
// Clean up frame memory
//------------------------------------------------------------
for (int nQuad = 0; nQuad < 6; nQuad++) {
delete [] pAccumSyndQuad[nQuad];
delete [] pLambdaQuad[nQuad];
delete [] pOracleShiftsXQuad[nQuad];
delete [] pOracleShiftsYQuad[nQuad];
delete [] pDecodedShiftsX[nQuad];
delete [] pDecodedShiftsY[nQuad];
delete [] pDecodedShiftProb[nQuad];
}
// Update RD file
fprintf(codingOption.pLogFileRD, "\n"); fflush(codingOption.pLogFileRD);
} // end codingOption.nCurrFrame
//------------------------------------------------------------
// Report overall simulation time
//------------------------------------------------------------
sprintf(pTextBuffer, "Report overall simulation time"); SCREEN_AND_LOG_TITLE(pTextBuffer, codingOption.pLogFile);
time(&nEndTime);
int nTimeElapsed = (int)(nEndTime - nStartTime);
sprintf(pTextBuffer, "encode/decode time (sec) = %d \n", nTimeElapsed); SCREEN_AND_LOG(pTextBuffer, codingOption.pLogFile);
//------------------------------------------------------------
// Clean up memory
//------------------------------------------------------------
if (pScaledQArray != NULL) delete [] pScaledQArray;
if (pIntraRateY != NULL) delete [] pIntraRateY;
if (pIntraRateU != NULL) delete [] pIntraRateU;
if (pIntraRateV != NULL) delete [] pIntraRateV;
if (pIntraPSNRY != NULL) delete [] pIntraPSNRY;
if (pIntraPSNRU != NULL) delete [] pIntraPSNRU;
if (pIntraPSNRV != NULL) delete [] pIntraPSNRV;
for (int nFrame = 0; nFrame < nFrames; nFrame++) {
if (pVideoIntraY[nFrame] != NULL) delete [] pVideoIntraY[nFrame];
if (pVideoIntraU[nFrame] != NULL) delete [] pVideoIntraU[nFrame];
if (pVideoIntraV[nFrame] != NULL) delete [] pVideoIntraV[nFrame];
if (pVideoY[nFrame] != NULL) delete [] pVideoY[nFrame];
if (pVideoU[nFrame] != NULL) delete [] pVideoU[nFrame];
if (pVideoV[nFrame] != NULL) delete [] pVideoV[nFrame];
if (pVideoLearningY[nFrame] != NULL) delete [] pVideoLearningY[nFrame];
if (pVideoLearningU[nFrame] != NULL) delete [] pVideoLearningU[nFrame];
if (pVideoLearningV[nFrame] != NULL) delete [] pVideoLearningV[nFrame];
if (pVideoOracleY[nFrame] != NULL) delete [] pVideoOracleY[nFrame];
if (pVideoOracleU[nFrame] != NULL) delete [] pVideoOracleU[nFrame];
if (pVideoOracleV[nFrame] != NULL) delete [] pVideoOracleV[nFrame];
if (pVideoNoCompY[nFrame] != NULL) delete [] pVideoNoCompY[nFrame];
if (pVideoNoCompU[nFrame] != NULL) delete [] pVideoNoCompU[nFrame];
if (pVideoNoCompV[nFrame] != NULL) delete [] pVideoNoCompV[nFrame];
}
if (pVideoIntraY != NULL) delete [] pVideoIntraY;
if (pVideoIntraU != NULL) delete [] pVideoIntraU;
if (pVideoIntraV != NULL) delete [] pVideoIntraV;
if (pVideoY != NULL) delete [] pVideoY;
if (pVideoU != NULL) delete [] pVideoU;
if (pVideoV != NULL) delete [] pVideoV;
if (pVideoLearningY != NULL) delete [] pVideoLearningY;
if (pVideoLearningU != NULL) delete [] pVideoLearningU;
if (pVideoLearningV != NULL) delete [] pVideoLearningV;
if (pVideoOracleY != NULL) delete [] pVideoOracleY;
if (pVideoOracleU != NULL) delete [] pVideoOracleU;
if (pVideoOracleV != NULL) delete [] pVideoOracleV;
if (pVideoNoCompY != NULL) delete [] pVideoNoCompY;
if (pVideoNoCompU != NULL) delete [] pVideoNoCompU;
if (pVideoNoCompV != NULL) delete [] pVideoNoCompV;
// Close Matlab engine and log files
SAFE_FUNC( ChenImageMatlab_closeEngine() );
fclose(codingOption.pLogFile);
fclose(codingOption.pLogFileRD);
return GOOD_RETURN;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -