⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.cpp

📁 LDPC码的实现,包括编码器和解码器,使用了DCT.
💻 CPP
📖 第 1 页 / 共 3 页
字号:
				// 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 + -