//======================================================================================= // // encoder of still images // // vika1enc.c // // developer: Henry Guennadi Levkin // // uncompress file - png file // compress file - vik file // // encoding : // vika1enc file.ppm [QPL] [QPC] // // result: file.vic in dir where is vika1enc // //======================================================================================= #include "vika1enc.h" #define MAX_BLK_DIM 32 //======================================================================================= // global variables FILE* gFp; // logging file int gnResultSize; // size of compressed file int gW; // RGB image width int gH; // RGB image height byte* gpInp; // input RGB image (from file) byte* gpRed; byte* gpGreen; byte* gpBlue; // luma croma parameters int gQPLu; // luma quantization parameter int gNBLu; // luma macroblock size int gNTLu; // luma block transform dim int gLuW; // width of Luma frame int gLuH; // height of Luma frame int gQPCb; // chromaB quantization param int gNBCb; // ChromaB macroblock size int gNTCb; // ChromaB block transform dim int gCbW; // width of ChromaB frame int gCbH; // height of ChromaB frame int gQPCr; // ChromaR quantization parameter int gNBCr; // ChromaR macroblock size int gNTCr; // ChromaR block transform dim int gCrW; // width of ChromaR frame int gCrH; // height of ChromaR frame // matrices byte* gpLu; // luma frame byte* gpCb; // chroma Cb frame byte* gpCr; // chroma Cr frame short* gpResidLu; // residual frame between initial and predicted Luma frames short* gpResidCb; // residual frame between initial and predicted ChromaB frames short* gpResidCr; // residual frame between initial and predicted ChromaR frames byte* gpPredTypeLu; // best prediction mode for every block in Luma frame byte* gpPredTypeCb; // best prediction mode for every block in ChromaB frame byte* gpPredTypeCr; // best prediction mode for every block in ChromaR frame byte* gpPredLu; // prediction frame for Luma byte* gpPredCb; // prediction frame for ChromaB byte* gpPredCr; // prediction frame for ChromaR short* gpTQLu; // transformed quantized residual Luma matrix short* gpTQCb; // transformed quantized residual ChromaB matrix short* gpTQCr; // transformed quantized residual ChromaR matrix short* gpReordLu; // reordering transformed quantized residual Luma vector short* gpReordCb; // reordering transformed quantized residual ChromaB vector short* gpReordCr; // reordering transformed quantized residual ChromaR vector byte* gpReconLu; // reconstructed Luma frame byte* gpReconCb; // reconstructed ChromaB frame byte* gpReconCr; // reconstructed ChromaR frame // for debug and reseach int* gpSADLu; // SAD for every luma block matrix int* gpSADCb; // SAD for every ChromaB block matrix int* gpSADCr; // SAD for every ChromaR block matrix // histograms int gRunsHist[MAX_BLK_DIM*MAX_BLK_DIM]; int gFreqHist[1024]; //======================================================================================= void Test() { int qp=4; short a = (((1<0) fprintf(gFp,"%d %d\n", i, gRunsHist[i]); } size = fEnt*nCount; printf("nRuns=%d\n", nCount); fprintf(gFp,"cos amplitudes:\n"); fEnt = EntropyCalculation(900, gFreqHist); printf("CoeffsEntropy=%f\n",fEnt); nCount=0; for(i=300;i<700; i++) { nCount+=gFreqHist[i]; if(gFreqHist[i]>0) fprintf(gFp, "%d %d\n", i-512, gFreqHist[i]); } printf("nCoefs=%d\n", nCount); size = size + fEnt*nCount; size = size/8; printf("size=%d\n",size); gnResultSize += size; } //======================================================================================= // input: // pVec - reordered vector // output: // nResSize - size of encoded result // pRes - vector with encoding result void ArithmeticEncoding(short* pMat, int nWidth, int nHeight, int* nResSize, char* pRes) { } //======================================================================================= // // vik-file structure: // //VIKA1_ //V0.1 //#comments... // 4 bytes - luma frame width // 4 bytes - luma frame height // 1 byte - luma quantization parameter // 1 byte - luma macroblock size // 1 byte - luma block transform dim // 1 byte - Id of transform matrix for luma // 1 byte - luma type of reordering transform // 1 byte - luma quantization type // 4 bytes - chromaB frame width // 4 bytes - chromaB frame height // 1 byte - chromaB quantization parameter // 1 byte - chromaB macroblock size // 1 byte - chromaB block transform dim // 1 byte - Id of transform matrix for chromaB // 1 byte - chromaB type of reordering transform // 1 byte - chromaB quantization type // 4 bytes - chromaR frame width // 4 bytes - chromaR frame height // 1 byte - chromaR quantization parameter // 1 byte - chromaR macroblock size // 1 byte - chromaR block transform dim // 1 byte - Id of transform matrix for chromaR // 1 byte - chromaR type of reordering transform // 1 byte - chromaR quantization type // // // coding tables for luma // // coded matrix of prediction modes for luma // // coded luma frame // // coding tables for chromaB // // coded matrix of prediction modes for chromaB // // coded chromaB frame // // coding tables for chromaR // // coded matrix of prediction modes for chromaR // // coded chromaR frame //======================================================================================= // vik-file open and write header void VikFileOpen(char* filename, FILE** pFp) { } //======================================================================================= void VikFileSaving(fp, gLuW, gLuH, gNBLu, gpPredTypeLu, nResSize, pArray) { } //======================================================================================= // types of prediction modes: // 0 - mean value of borders // 1 - left // 2 - up // 3 - diagonal down right // 4 - diagonal down left // // input: // blk - block with part of frame // blkSize - // nBx, nBy - // pRefImg - // // return: // blk - predicted block // *pPredictType // SAD int BestPrediction(byte* blk, byte blkDim, int nBx, int nBy, byte* pRefImg, int nWidth, byte* pPredictType) { int i,j; int mean; int nBlkWidth = nWidth / blkDim; int minSAD = 2000000000; byte bestMode; byte predBlk[MAX_BLK_DIM*MAX_BLK_DIM]; byte predBlkBest[MAX_BLK_DIM*MAX_BLK_DIM]; byte bordL[MAX_BLK_DIM]; // left border byte bordU[MAX_BLK_DIM]; // up border byte bordUR[MAX_BLK_DIM]; // up right border int xCoord = nBx*blkDim; int yCoord = nBy*blkDim; int blkSize= blkDim*blkDim; int nSAD = 0; // interior of frame if(nBx>0 && nBy>0) { // get left border GetBlockByte(pRefImg, gLuW, gLuH, xCoord-blkDim, yCoord, predBlk, blkDim, blkDim); for(i=0; i0 && nBy==0) { // get left border GetBlockByte(pRefImg, gLuW, gLuH, xCoord-blkDim, yCoord, predBlk, blkDim, blkDim); for(i=0; i0) { // get upper border GetBlockByte(pRefImg, gLuW, gLuH, xCoord, yCoord-blkDim, predBlk, blkDim, blkDim); for(i=0; i64) return 1; for(i=0; i=0) blk[i] = r; else blk[i] = -r; } return nZero; } //======================================================================================= // dequantize int Dequantizer( byte QP, short* blk, int blkDim) { int nn = blkDim * blkDim; int nZero=0; int i; int numer = gnQuantNumer[QP]; int denom = gnQuantDenom[QP]; int a = ((denom+1)/2) - 1; for(i=0; i