📄 main.cpp
字号:
// Measure statistics
sprintf(pTextBuffer, "rate(Y,U,V) (bpp) = %.2f, %.2f, %.2f, PSNR(Y,U,V) (dB) = %.2f, %.2f, %.2f \n", pIntraRateY[codingOption.nCurrFrame], pIntraRateU[codingOption.nCurrFrame], pIntraRateV[codingOption.nCurrFrame], pIntraPSNRY[codingOption.nCurrFrame], pIntraPSNRU[codingOption.nCurrFrame], pIntraPSNRV[codingOption.nCurrFrame]); SCREEN_AND_LOG(pTextBuffer, codingOption.pLogFile);
for (int nRepeat = 0; nRepeat < nRepeatPrints; nRepeat++) {
// 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[codingOption.nCurrFrame], pIntraRateU[codingOption.nCurrFrame], pIntraRateV[codingOption.nCurrFrame], pIntraPSNRY[codingOption.nCurrFrame], pIntraPSNRU[codingOption.nCurrFrame], pIntraPSNRV[codingOption.nCurrFrame]); fflush(codingOption.pLogFileRD);
}
// Update RD file
fprintf(codingOption.pLogFileRD, "\n"); fflush(codingOption.pLogFileRD);
// Store Y-component for feature reference
pVideoLearningY[codingOption.nCurrFrame] = new short[PIXELS];
pVideoOracleY[codingOption.nCurrFrame] = new short[PIXELS];
pVideoNoCompY[codingOption.nCurrFrame] = new short[PIXELS];
SAFE_FUNC( ChenImage_copyImage(WIDTH, HEIGHT, pVideoIntraY[codingOption.nCurrFrame], pVideoLearningY[codingOption.nCurrFrame]) );
SAFE_FUNC( ChenImage_copyImage(WIDTH, HEIGHT, pVideoIntraY[codingOption.nCurrFrame], pVideoOracleY[codingOption.nCurrFrame]) );
SAFE_FUNC( ChenImage_copyImage(WIDTH, HEIGHT, pVideoIntraY[codingOption.nCurrFrame], pVideoNoCompY[codingOption.nCurrFrame]) );
// Store U-component for feature reference
pVideoLearningU[codingOption.nCurrFrame] = new short[PIXELS_QUAD];
pVideoOracleU[codingOption.nCurrFrame] = new short[PIXELS_QUAD];
pVideoNoCompU[codingOption.nCurrFrame] = new short[PIXELS_QUAD];
SAFE_FUNC( ChenImage_copyImage(WIDTH_QUAD, HEIGHT_QUAD, pVideoIntraU[codingOption.nCurrFrame], pVideoLearningU[codingOption.nCurrFrame]) );
SAFE_FUNC( ChenImage_copyImage(WIDTH_QUAD, HEIGHT_QUAD, pVideoIntraU[codingOption.nCurrFrame], pVideoOracleU[codingOption.nCurrFrame]) );
SAFE_FUNC( ChenImage_copyImage(WIDTH_QUAD, HEIGHT_QUAD, pVideoIntraU[codingOption.nCurrFrame], pVideoNoCompU[codingOption.nCurrFrame]) );
// Store V-component for feature reference
pVideoLearningV[codingOption.nCurrFrame] = new short[PIXELS_QUAD];
pVideoOracleV[codingOption.nCurrFrame] = new short[PIXELS_QUAD];
pVideoNoCompV[codingOption.nCurrFrame] = new short[PIXELS_QUAD];
SAFE_FUNC( ChenImage_copyImage(WIDTH_QUAD, HEIGHT_QUAD, pVideoIntraV[codingOption.nCurrFrame], pVideoLearningV[codingOption.nCurrFrame]) );
SAFE_FUNC( ChenImage_copyImage(WIDTH_QUAD, HEIGHT_QUAD, pVideoIntraV[codingOption.nCurrFrame], pVideoOracleV[codingOption.nCurrFrame]) );
SAFE_FUNC( ChenImage_copyImage(WIDTH_QUAD, HEIGHT_QUAD, pVideoIntraV[codingOption.nCurrFrame], pVideoNoCompV[codingOption.nCurrFrame]) );
continue;
}
// Intra-code and inter-decode remaining frames as Wyner-Ziv frames
else {
nWZFrame = codingOption.nCurrFrame;
nSIFrame = codingOption.nCurrFrame-1;
sprintf(pTextBuffer, "Wyner-Ziv frame = %d, side-info frame = %d \n", nWZFrame, nSIFrame); SCREEN_AND_LOG(pTextBuffer, codingOption.pLogFile);
}
}
else if (codingOption.nCodingStructure == CODING_IPIPIPIP) {
// Intra-code and intra-decode every other frame as key frame
if ((codingOption.nCurrFrame % 2) == 0) {
sprintf(pTextBuffer, "Intra-coded frame = %d \n", codingOption.nCurrFrame); SCREEN_AND_LOG(pTextBuffer, codingOption.pLogFile);
// Measure statistics
sprintf(pTextBuffer, "rate(Y,U,V) (bpp) = %.2f, %.2f, %.2f, PSNR(Y,U,V) (dB) = %.2f, %.2f, %.2f \n", pIntraRateY[codingOption.nCurrFrame], pIntraRateU[codingOption.nCurrFrame], pIntraRateV[codingOption.nCurrFrame], pIntraPSNRY[codingOption.nCurrFrame], pIntraPSNRU[codingOption.nCurrFrame], pIntraPSNRV[codingOption.nCurrFrame]); SCREEN_AND_LOG(pTextBuffer, codingOption.pLogFile);
for (int nRepeat = 0; nRepeat < nRepeatPrints; nRepeat++) {
// 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[codingOption.nCurrFrame], pIntraRateU[codingOption.nCurrFrame], pIntraRateV[codingOption.nCurrFrame], pIntraPSNRY[codingOption.nCurrFrame], pIntraPSNRU[codingOption.nCurrFrame], pIntraPSNRV[codingOption.nCurrFrame]); fflush(codingOption.pLogFileRD);
}
// Update RD file
fprintf(codingOption.pLogFileRD, "\n"); fflush(codingOption.pLogFileRD);
// Store Y-component for feature reference
pVideoLearningY[codingOption.nCurrFrame] = new short[PIXELS];
pVideoOracleY[codingOption.nCurrFrame] = new short[PIXELS];
pVideoNoCompY[codingOption.nCurrFrame] = new short[PIXELS];
SAFE_FUNC( ChenImage_copyImage(WIDTH, HEIGHT, pVideoIntraY[codingOption.nCurrFrame], pVideoLearningY[codingOption.nCurrFrame]) );
SAFE_FUNC( ChenImage_copyImage(WIDTH, HEIGHT, pVideoIntraY[codingOption.nCurrFrame], pVideoOracleY[codingOption.nCurrFrame]) );
SAFE_FUNC( ChenImage_copyImage(WIDTH, HEIGHT, pVideoIntraY[codingOption.nCurrFrame], pVideoNoCompY[codingOption.nCurrFrame]) );
// Store U-component for feature reference
pVideoLearningU[codingOption.nCurrFrame] = new short[PIXELS_QUAD];
pVideoOracleU[codingOption.nCurrFrame] = new short[PIXELS_QUAD];
pVideoNoCompU[codingOption.nCurrFrame] = new short[PIXELS_QUAD];
SAFE_FUNC( ChenImage_copyImage(WIDTH_QUAD, HEIGHT_QUAD, pVideoIntraU[codingOption.nCurrFrame], pVideoLearningU[codingOption.nCurrFrame]) );
SAFE_FUNC( ChenImage_copyImage(WIDTH_QUAD, HEIGHT_QUAD, pVideoIntraU[codingOption.nCurrFrame], pVideoOracleU[codingOption.nCurrFrame]) );
SAFE_FUNC( ChenImage_copyImage(WIDTH_QUAD, HEIGHT_QUAD, pVideoIntraU[codingOption.nCurrFrame], pVideoNoCompU[codingOption.nCurrFrame]) );
// Store V-component for feature reference
pVideoLearningV[codingOption.nCurrFrame] = new short[PIXELS_QUAD];
pVideoOracleV[codingOption.nCurrFrame] = new short[PIXELS_QUAD];
pVideoNoCompV[codingOption.nCurrFrame] = new short[PIXELS_QUAD];
SAFE_FUNC( ChenImage_copyImage(WIDTH_QUAD, HEIGHT_QUAD, pVideoIntraV[codingOption.nCurrFrame], pVideoLearningV[codingOption.nCurrFrame]) );
SAFE_FUNC( ChenImage_copyImage(WIDTH_QUAD, HEIGHT_QUAD, pVideoIntraV[codingOption.nCurrFrame], pVideoOracleV[codingOption.nCurrFrame]) );
SAFE_FUNC( ChenImage_copyImage(WIDTH_QUAD, HEIGHT_QUAD, pVideoIntraV[codingOption.nCurrFrame], pVideoNoCompV[codingOption.nCurrFrame]) );
continue;
}
// Intra-code and inter-decode remaining frames as Wyner-Ziv frames
else {
nWZFrame = codingOption.nCurrFrame;
nSIFrame = codingOption.nCurrFrame-1;
sprintf(pTextBuffer, "Wyner-Ziv frame = %d, side-info frame = %d \n", nWZFrame, nSIFrame); SCREEN_AND_LOG(pTextBuffer, codingOption.pLogFile);
}
}
else if (codingOption.nCodingStructure == CODING_SINGLE_I) {
// Intra-code and intra-decode first frame as key frame
if (codingOption.nCurrFrame == codingOption.nStartFrame) {
sprintf(pTextBuffer, "Intra-coded frame = %d \n", codingOption.nCurrFrame); SCREEN_AND_LOG(pTextBuffer, codingOption.pLogFile);
// Measure statistics
sprintf(pTextBuffer, "rate(Y,U,V) (bpp) = %.2f, %.2f, %.2f, PSNR(Y,U,V) (dB) = %.2f, %.2f, %.2f \n", pIntraRateY[codingOption.nCurrFrame], pIntraRateU[codingOption.nCurrFrame], pIntraRateV[codingOption.nCurrFrame], pIntraPSNRY[codingOption.nCurrFrame], pIntraPSNRU[codingOption.nCurrFrame], pIntraPSNRV[codingOption.nCurrFrame]); SCREEN_AND_LOG(pTextBuffer, codingOption.pLogFile);
for (int nRepeat = 0; nRepeat < nRepeatPrints; nRepeat++) {
// 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[codingOption.nCurrFrame], pIntraRateU[codingOption.nCurrFrame], pIntraRateV[codingOption.nCurrFrame], pIntraPSNRY[codingOption.nCurrFrame], pIntraPSNRU[codingOption.nCurrFrame], pIntraPSNRV[codingOption.nCurrFrame]); fflush(codingOption.pLogFileRD);
}
// Update RD file
fprintf(codingOption.pLogFileRD, "\n"); fflush(codingOption.pLogFileRD);
// Store Y-component for feature reference
pVideoLearningY[codingOption.nCurrFrame] = new short[PIXELS];
pVideoOracleY[codingOption.nCurrFrame] = new short[PIXELS];
pVideoNoCompY[codingOption.nCurrFrame] = new short[PIXELS];
SAFE_FUNC( ChenImage_copyImage(WIDTH, HEIGHT, pVideoIntraY[codingOption.nCurrFrame], pVideoLearningY[codingOption.nCurrFrame]) );
SAFE_FUNC( ChenImage_copyImage(WIDTH, HEIGHT, pVideoIntraY[codingOption.nCurrFrame], pVideoOracleY[codingOption.nCurrFrame]) );
SAFE_FUNC( ChenImage_copyImage(WIDTH, HEIGHT, pVideoIntraY[codingOption.nCurrFrame], pVideoNoCompY[codingOption.nCurrFrame]) );
// Store U-component for feature reference
pVideoLearningU[codingOption.nCurrFrame] = new short[PIXELS_QUAD];
pVideoOracleU[codingOption.nCurrFrame] = new short[PIXELS_QUAD];
pVideoNoCompU[codingOption.nCurrFrame] = new short[PIXELS_QUAD];
SAFE_FUNC( ChenImage_copyImage(WIDTH_QUAD, HEIGHT_QUAD, pVideoIntraU[codingOption.nCurrFrame], pVideoLearningU[codingOption.nCurrFrame]) );
SAFE_FUNC( ChenImage_copyImage(WIDTH_QUAD, HEIGHT_QUAD, pVideoIntraU[codingOption.nCurrFrame], pVideoOracleU[codingOption.nCurrFrame]) );
SAFE_FUNC( ChenImage_copyImage(WIDTH_QUAD, HEIGHT_QUAD, pVideoIntraU[codingOption.nCurrFrame], pVideoNoCompU[codingOption.nCurrFrame]) );
// Store V-component for feature reference
pVideoLearningV[codingOption.nCurrFrame] = new short[PIXELS_QUAD];
pVideoOracleV[codingOption.nCurrFrame] = new short[PIXELS_QUAD];
pVideoNoCompV[codingOption.nCurrFrame] = new short[PIXELS_QUAD];
SAFE_FUNC( ChenImage_copyImage(WIDTH_QUAD, HEIGHT_QUAD, pVideoIntraV[codingOption.nCurrFrame], pVideoLearningV[codingOption.nCurrFrame]) );
SAFE_FUNC( ChenImage_copyImage(WIDTH_QUAD, HEIGHT_QUAD, pVideoIntraV[codingOption.nCurrFrame], pVideoOracleV[codingOption.nCurrFrame]) );
SAFE_FUNC( ChenImage_copyImage(WIDTH_QUAD, HEIGHT_QUAD, pVideoIntraV[codingOption.nCurrFrame], pVideoNoCompV[codingOption.nCurrFrame]) );
continue;
}
// Intra-code and inter-decode remaining frames as Wyner-Ziv frames
else {
nWZFrame = codingOption.nCurrFrame;
nSIFrame = codingOption.nCurrFrame-1;
sprintf(pTextBuffer, "Wyner-Ziv frame = %d, side-info frame = %d \n", nWZFrame, nSIFrame); SCREEN_AND_LOG(pTextBuffer, codingOption.pLogFile);
}
}
else break;
//------------------------------------------------------------
// Wyner-Ziv encode
//------------------------------------------------------------
sprintf(pTextBuffer, "Wyner-Ziv encode"); SCREEN_AND_LOG_TITLE(pTextBuffer, codingOption.pLogFile);
// Encode
short* pWZFrame[3] = {pVideoY[nWZFrame], pVideoU[nWZFrame], pVideoV[nWZFrame]};
short* pSIFrame[3] = {pVideoY[nSIFrame], pVideoU[nSIFrame], pVideoV[nSIFrame]};
uchar* pAccumSyndQuad[6];
for (int nQuad = 0; nQuad < 6; nQuad++) {
pAccumSyndQuad[nQuad] = new uchar[BITS_QUAD];
}
SAFE_FUNC( pixelQuads_encodeFrameYUV((const short**)pWZFrame, codingOption.pLadderFileName, pScaledQArray, pAccumSyndQuad) );
// Probe channel statistics
float* pLambdaQuad[6];
short *pOracleShiftsXQuad[6], *pOracleShiftsYQuad[6];
for (int nQuad = 0; nQuad < 6; nQuad++) {
pLambdaQuad[nQuad] = new float[NUM_COEFFS];
pOracleShiftsXQuad[nQuad] = new short[BLOCKS];
pOracleShiftsYQuad[nQuad] = new short[BLOCKS];
}
float pEntropyQuad[6];
SAFE_FUNC( pixelQuads_modelChannelFrameYUV((const short**)pWZFrame, (const short**)pSIFrame, pScaledQArray, pLambdaQuad, pEntropyQuad, pOracleShiftsXQuad, pOracleShiftsYQuad) );
for (int nQuad = 0; nQuad < 6; nQuad++) {
sprintf(pTextBuffer, "quad %d conditional entropy (bpp): %.2f \n", nQuad, pEntropyQuad[nQuad]*BITPLANES);
printf(pTextBuffer); fprintf(codingOption.pLogFile, pTextBuffer); fflush(codingOption.pLogFile);
}
short* pDecodedFrame[3];
short* pDecodedShiftsX[6];
short* pDecodedShiftsY[6];
float* pDecodedShiftProb[6];
for (int nQuad = 0; nQuad < 6; nQuad++) {
pDecodedShiftsX[nQuad] = new short[BLOCKS_QUAD];
pDecodedShiftsY[nQuad] = new short[BLOCKS_QUAD];
pDecodedShiftProb[nQuad] = new float[BLOCKS_QUAD];
}
float pRateQuadOracle[6];
float pRateQuadLearning[6];
float pRateQuadNoComp[6];
float pRatePredict[6];
float fRateY = 0;
float fPSNRY = 0, fPSNRU = 0, fPSNRV = 0;
//------------------------------------------------------------
// Decode with motion oracle
//------------------------------------------------------------
sprintf(pTextBuffer, "Decode with motion oracle"); SCREEN_AND_LOG_TITLE(pTextBuffer, codingOption.pLogFile);
if (codingOption.bTestMotionOracle) {
// 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 conditional entropy as lower bound
pRatePredict[nQuad] = pEntropyQuad[nQuad];
}
// Turn off motion learning
codingOption.bMotionEstimate = false;
// Turn on motion oracle
codingOption.bMotionOracle = true;
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, pRateQuadOracle, pDecodedShiftsX, pDecodedShiftsY, pDecodedShiftProb) );
// Measure statistics
fRateY = 0.0;
for (int nQuad = 0; nQuad < 6; nQuad++) {
if (nQuad < 4) fRateY += (float)(0.25 * pRateQuadOracle[nQuad]);
sprintf(pTextBuffer, "quad %d rate (bpp): %.2f \n", nQuad, pRateQuadOracle[nQuad]*BITPLANES);
printf(pTextBuffer); fprintf(codingOption.pLogFile, pTextBuffer); fflush(codingOption.pLogFile);
}
SAFE_FUNC( ChenImage_imagePSNR(WIDTH, HEIGHT, pWZFrame[0], pDecodedFrame[0], &fPSNRY) );
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -