📄 imageproc.cpp
字号:
/***********************************************************/
//vertion: Sam_2V1.1
//codemen : Adam
//Instruction: In this vertion ,we change the two dlls
// into several head files;
/***********************************************************/
#include "ImageProc.h"
#include "spdec.h"
#include "RS.h"
/***************************************************/
// Construction/Destruction
/***************************************************/
BITMAPINFO *ImageProc::m_pBmp = NULL;//for Display
ImageProc::ImageProc()
{
m_hWnd = NULL;
//初始化窗口位置
m_WinPar.StarX = 0;
m_WinPar.EndX = 409;
m_WinPar.StarY = 0;
m_WinPar.EndY = 307;
//创建初始化窗口线程
DWORD dwThrID;
CreateThread(NULL, 0, &ImageProc::InitShowWnd, this, 0, &dwThrID);
//初始化显示位图头
memset(&m_vdw, 0, sizeof(m_vdw));
m_vdw.pBmp = NULL;
m_vdw.pBmp = (BITMAPINFO *)(new char[sizeof(BITMAPINFO)+sizeof(RGBQUAD)*256]);
m_vdw.pBmp->bmiHeader.biSize = sizeof(BITMAPINFOHEADER); //文件信息头大小
m_vdw.pBmp->bmiHeader.biWidth = IMG_WIDTH; //图像宽度
m_vdw.pBmp->bmiHeader.biHeight = -1 * IMG_HEIGHT; //图像高度
m_vdw.pBmp->bmiHeader.biPlanes = 1;
m_vdw.pBmp->bmiHeader.biBitCount = 8; //图像像素精度
m_vdw.pBmp->bmiHeader.biCompression = BI_RGB; //是否压缩
m_vdw.pBmp->bmiHeader.biSizeImage = 0;
m_vdw.pBmp->bmiHeader.biYPelsPerMeter = 0; //图像数据大小
m_vdw.pBmp->bmiHeader.biXPelsPerMeter = 0;
m_vdw.pBmp->bmiHeader.biClrUsed = 256;
m_vdw.pBmp->bmiHeader.biClrImportant = 0;
//创建颜色表
RGBQUAD clr[256];
for (int i=0; i<256; i++)
{
clr[i].rgbBlue = i;
clr[i].rgbGreen = i;
clr[i].rgbRed = i;
clr[i].rgbReserved = 0;
m_vdw.pBmp->bmiColors[i] = clr[i];
}
m_vdw.pBuf=PCHAR(m_abyImgBuf)+BmpHeaderLen;
// m_vdw.pTitle=NULL;
m_vdw.pWinPar=&(m_WinPar);
ImageProc::m_pBmp = m_vdw.pBmp;//for Display
// m_vdw.pBuf = PCHAR(RecImg);
}
ImageProc::~ImageProc()
{
::SendMessage(m_hWnd, WM_DESTROY, 0, 0);
for(int i=0;i<3;i++)
{
if(UnregisterClass(_T("CGIIRecImg"), m_hinst)==0)
// The UnregisterClass function unregisters a window class, freeing the memory required for the class.
{
Sleep(1);
}
else{
break;
}
}
}
/***************************************************/
//Description
/***************************************************/
DWORD WINAPI ImageProc::ImageProcThread(LPVOID lpvoid)
{
ImageProc *pThis = (ImageProc *)lpvoid;
CFile sourcefile;
WIN32_FIND_DATA FindFileData;
HANDLE hFind;
int nSavedImgFileNum;
CString szName;//存储图像文件名
int nSavedInfoFileNum;
CString szInfo;//存储辅助信息文件名
CString szSubframeRaw;//for test;
FILE *fSubframeRaw;
//
// CString szTest; //test,with nothing done! just separate the whole stream into 21 subframes;
// FILE *fTest;
int test;
//add error report
CString szErrorReport;
FILE *fErrorReport;
FILE *fInfo;
unsigned char *pCurStream;
unsigned char *pStrAfterRSDec;
unsigned char *pSubFrameAStart;
unsigned char *pSubFrameBStart;
unsigned char *pSubFrameAToSpDec;
unsigned char *pSubFrameBToSpDec;
unsigned char *pRecSubImgA;
unsigned char *pRecSubImgB;
unsigned char *pRecImg;
char chFrameFlag;
int nFileLength;
int pnPakDeced;
int pnPakProed;
int nBlockNum;//Block=10*packets+1*frame+3*packets
int nBlockCont=0;
int nLastPackOfNoErrStream;
int nSpihtStrlen;
int nFrameNum;
int nSubFrameNum;
int nPacketNum;
int arrPackNumA[PACKET_OF_SUBFRAME_A];
int arrPackNumB[PACKET_OF_SUBFRAME_B];
int arrPackNumcout;
int nSubFramecont;
// BOOL bPackErrFlag;有包计数数组,就行了
//
BOOL bSubFrameErrFlag;//用于跳出循环
BOOL bFrameErrFlag;
//for debug vertion,delete the last 8 bytes in each line,change 4016 to 4008;
int nDebugline;
int nDebugpixel;
char szDirPath[100];
// The function can be used to set a directory that receive from interface;
// CreateDirectory("f:\\adam",NULL);
strcpy(szDirPath,pThis->m_sourcefile);
hFind = FindFirstFile (szDirPath, &FindFileData);
pThis->m_sourcefile.Replace(FindFileData.cFileName,"*.dat");
strcpy(szDirPath,pThis->m_sourcefile);
TRACE("Target file is %s.\n", szDirPath);
hFind = FindFirstFile (szDirPath, &FindFileData);
if (hFind == INVALID_HANDLE_VALUE)
TRACE("Invalid File Handle. Get Last Error reports %d\n", GetLastError ());
else
TRACE("The first file found is %s\n", FindFileData.cFileName);
sourcefile.Open(FindFileData.cFileName,CFile::modeRead);
//add error report
szErrorReport.Format(_T("e:\\Decompressed stream\\%s_error_report.txt"),FindFileData.cFileName);
fErrorReport = fopen(szErrorReport,"w+");
fprintf(fErrorReport," count from 0\n");
nFileLength=sourcefile.GetLength();
nBlockNum=nFileLength/BLOCK_LENGTH;
if (nBlockNum==0)
{
nBlockNum=1;
}
TRACE("nBlockNum==%d.\n",nBlockNum);
RS_init();
//Display the image to the screen
pRecImg = pThis->RecImg;//To point the pointer;
memcpy(pThis->m_vdw.pBuf,pRecImg,IMAGE_RECOVERED_LENGTH);
pThis->m_vdw.pBuf = (PCHAR)pRecImg;
TRACE("Displaying");
::ShowWindow (pThis->m_hWnd, SW_SHOW);
while (nBlockCont<nBlockNum)//块循环,即帧循环
{
pThis->m_vdw.pTitle = (PCHAR)FindFileData.cFileName;
pRecImg = pThis->RecImg;//To point the pointer;
memset(pRecImg,0,IMAGE_RECOVERED_LENGTH);
pCurStream = pThis->CurStream;
memset(pCurStream,0,BLOCK_LENGTH);//清零
sourcefile.Read(pCurStream,BLOCK_LENGTH);//the position of the pointer is not changed;
//for test
pCurStream = pCurStream + 1024*10;
for (test = 0; test<20; test++)
{
szSubframeRaw.Format(_T("e:\\Decompressed stream\\%s_RS%d.dat"),FindFileData.cFileName,test);
fSubframeRaw = fopen(szSubframeRaw,"wb+");
fwrite(pCurStream,1,SUBFRAME_A_LENGTH,fSubframeRaw);
fclose(fSubframeRaw);
pCurStream = pCurStream + SUBFRAME_A_LENGTH;
}
szSubframeRaw.Format(_T("e:\\Decompressed stream\\%s_RS%d.dat"),FindFileData.cFileName,20);
fSubframeRaw = fopen(szSubframeRaw,"wb+");
fwrite(pCurStream,1,SUBFRAME_B_LENGTH,fSubframeRaw);
fclose(fSubframeRaw);
pCurStream = pThis->CurStream;
pStrAfterRSDec = pThis->StrAfterRSDec;
memset(pStrAfterRSDec,0,BLOCK_LENGTH_AFTER_RSDEC);
fnRSDecDllEx(fErrorReport,pCurStream, PACKET_NUM_OF_BLOCK ,&pnPakDeced, &pnPakProed, pStrAfterRSDec);
//After RSDec,pStrAfterRSDec is at the start of the data block;
TRACE(" %d packets(1024) are received",pnPakProed);
TRACE(" %d packets(1024) are RsDeced",pnPakDeced);
//add error report
fprintf(fErrorReport," %d packets(1024) are received\n",pnPakProed);
fprintf(fErrorReport," %d packets(1024) are RsDeced\n",pnPakDeced);
chFrameFlag=pStrAfterRSDec[FRAME_TYPE_OFFSET];//useless
//To jump the 55 packets,find the packet of image frame
while(!(pStrAfterRSDec[PACKET_TYPE_OFFSET]==PACKET_OF_IMAGE))
{
pStrAfterRSDec=pStrAfterRSDec+PACKET_LENGTH;
}
//Whether the frame is complete or not,the dealing is the same.
nFrameNum=*(pStrAfterRSDec+FRAME_NUM_LOW_OFFSET)+(*(pStrAfterRSDec+FRAME_NUM_HIGH_OFFSET))*16;
bFrameErrFlag=0;
nSubFramecont=0;
while(nSubFramecont<SUBFRAME_NUM_OF_FRAME&&!bFrameErrFlag)//子帧循环,从 1 开始计数
{
//Refresh;
::SendMessage(pThis->m_hWnd, MSG_SHOWIMG, 0, (LPARAM)&pThis->m_vdw);//Display .bmp;
nSubFrameNum=*(pStrAfterRSDec+SUBFRAME_NUM_OFFSET);
nSubFramecont=nSubFrameNum;//重新计数
TRACE("Processing subframe %d",nSubFramecont);
bSubFrameErrFlag=0;
// //Stop subframe circle while the packet flag changed;
// if (chPacketFlag!=*(pStrAfterRSDec+PACKET_FLAG_OFFSET))
// {
// break;
// }
if (nSubFramecont==SUBFRAME_B_POS_OF_FRAME)// SubFrame type B;
{
for (arrPackNumcout=0;arrPackNumcout < PACKET_OF_SUBFRAME_B;arrPackNumcout++)//包计数数组复位
{
arrPackNumB[arrPackNumcout]=0;
}
pSubFrameBStart = pThis->SubFrameBStart;
memset(pSubFrameBStart,0,SUBFRAME_B_LENGTH_AFTER_RSDEC);
memcpy(pSubFrameBStart,pStrAfterRSDec,SUBFRAME_B_LENGTH_AFTER_RSDEC);
nPacketNum=(*(pStrAfterRSDec+PACKET_NUM_LOW_OFFSET)+(*(pStrAfterRSDec+PACKET_NUM_HIGH_OFFSET))*256)/4;
arrPackNumcout=0;//清零
while (nPacketNum < PACKET_OF_SUBFRAME_B && !bSubFrameErrFlag&&!bFrameErrFlag)//包循环,从 1 开始计数
{
if (!bSubFrameErrFlag&&!bFrameErrFlag)
{
arrPackNumB[arrPackNumcout]=nPacketNum; //记录包计数
arrPackNumcout++;
pStrAfterRSDec=pStrAfterRSDec+PACKET_AFTER_RSDEC_LENGTH;
nPacketNum=(*(pStrAfterRSDec+PACKET_NUM_LOW_OFFSET)+(*(pStrAfterRSDec+PACKET_NUM_HIGH_OFFSET))*256)/4;
}
//如果帧计数出错,跳出
if (nFrameNum!=*(pStrAfterRSDec+FRAME_NUM_LOW_OFFSET)+(*(pStrAfterRSDec+FRAME_NUM_HIGH_OFFSET))*16)
{
bFrameErrFlag=1;
}
//如果子帧计数出错,跳出
if (nSubFramecont!=*(pStrAfterRSDec+SUBFRAME_NUM_OFFSET))
{
bSubFrameErrFlag=1;
}
}
if (!bFrameErrFlag)
{
nLastPackOfNoErrStream=pThis->TreatPackNumErrB(arrPackNumB);
if (nLastPackOfNoErrStream < PACKET_OF_SUBFRAME_B -1)//Packet Lost;
{
TRACE("%d packets of Subframe%d lost\n",PACKET_OF_SUBFRAME_B - 2 - nLastPackOfNoErrStream,nSubFramecont);
//add error report
fprintf(fErrorReport,"%d packets of Subframe%d lost\n",PACKET_OF_SUBFRAME_B - 2 - nLastPackOfNoErrStream,nSubFramecont);
}
pSubFrameBToSpDec = pThis->SubFrameBToSpDec;
memset(pSubFrameBToSpDec,0,SUBFRAME_B_TO_SPDEC_LENGTH);
nSpihtStrlen=pThis->FormSpDecStreamB(nLastPackOfNoErrStream,pSubFrameBStart,pSubFrameBToSpDec);
pRecSubImgB = pThis->RecSubImgB;
memset(pRecSubImgB,0,SUBFRAME_B_RECOVERED_LENGTH);
fnSpDecDll(pSubFrameBToSpDec,pRecSubImgB,nSpihtStrlen);//here is wrong, "00"//the first byte of the block SubFrameBToSpDec is the hold
//for debug vertion,delete the last 8 bytes in each line,change 4016 to 4008;
for (nDebugline=1; nDebugline<216; nDebugline++)
{
for (nDebugpixel=0; nDebugpixel<4008; nDebugpixel++)
{
pRecSubImgB[4008*nDebugline + nDebugpixel] = pRecSubImgB[4016*nDebugline + nDebugpixel];
}
}
//for test, save the subframe before decompressed;
szSubframeRaw.Format(_T("e:\\Decompressed stream\\%s_%d.dat"),FindFileData.cFileName,nSubFramecont);
fSubframeRaw = fopen(szSubframeRaw,"wb+");
fwrite(pSubFrameBToSpDec,1,SUBFRAME_B_TO_SPDEC_LENGTH,fSubframeRaw);
fclose(fSubframeRaw);
//for test, save the subframe after decompressed;
szSubframeRaw.Format(_T("e:\\Decompressed stream\\%s_%d.raw"),FindFileData.cFileName,nSubFramecont);
fSubframeRaw = fopen(szSubframeRaw,"wb+");
fwrite(pRecSubImgB,1,SUBFRAME_B_RECOVERED_LENGTH,fSubframeRaw);
fclose(fSubframeRaw);
memcpy(pRecImg,pRecSubImgB,SUBFRAME_B_RECOVERED_LENGTH);
// pRecImg = pRecImg + SUBFRAME_B_RECOVERED_LENGTH;
//no
}
}
if(nSubFramecont < (SUBFRAME_NUM_OF_FRAME - 1))//SubFrame type A;
{
for (arrPackNumcout=0;arrPackNumcout < PACKET_OF_SUBFRAME_A;arrPackNumcout++)
{
arrPackNumA[arrPackNumcout]=0;
}
pSubFrameAStart = pThis->SubFrameAStart;
memset(pSubFrameAStart,0,SUBFRAME_A_LENGTH_AFTER_RSDEC);
memcpy(pSubFrameAStart,pStrAfterRSDec,SUBFRAME_A_LENGTH_AFTER_RSDEC);
//After memcpy,pSubFrameAStart is at the start of the data block;
//the position of pStrAfterRSDec dose not change.
//11.21 modified here;
nPacketNum=(*(pStrAfterRSDec+PACKET_NUM_LOW_OFFSET)+(*(pStrAfterRSDec+PACKET_NUM_HIGH_OFFSET))*256)/4;
arrPackNumcout=0;//清零
//take care -1
while (nPacketNum < PACKET_OF_SUBFRAME_A && !bSubFrameErrFlag&&!bFrameErrFlag)//包循环,从 1 开始计数
{
if (!bSubFrameErrFlag&&!bFrameErrFlag)
{
arrPackNumA[arrPackNumcout]=nPacketNum; //记录包计数
arrPackNumcout++;
pStrAfterRSDec=pStrAfterRSDec+PACKET_AFTER_RSDEC_LENGTH;
nPacketNum=(*(pStrAfterRSDec+PACKET_NUM_LOW_OFFSET)+(*(pStrAfterRSDec+PACKET_NUM_HIGH_OFFSET))*256)/4;
}
//如果帧计数出错,跳出
if (nFrameNum!=*(pStrAfterRSDec+FRAME_NUM_LOW_OFFSET)+(*(pStrAfterRSDec+FRAME_NUM_HIGH_OFFSET))*16)
{
bFrameErrFlag=1;
}
//如果子帧计数出错,跳出
if (nSubFramecont!=*(pStrAfterRSDec+SUBFRAME_NUM_OFFSET))
{
bSubFrameErrFlag=1;
}
}
if (!bFrameErrFlag)
{
nLastPackOfNoErrStream=pThis->TreatPackNumErrA(arrPackNumA);
if (nLastPackOfNoErrStream < PACKET_OF_SUBFRAME_A - 1)//Packet Lost;
{
//add error report
fprintf(fErrorReport,"%d packets of Subframe%d lost\n",PACKET_OF_SUBFRAME_A - 2 - nLastPackOfNoErrStream,nSubFramecont);
TRACE("%d packets of Subframe%d lost\n",PACKET_OF_SUBFRAME_A -2 - nLastPackOfNoErrStream,nSubFramecont);
}
pSubFrameAToSpDec = pThis->SubFrameAToSpDec;//To point the pointer;
memset(pSubFrameAToSpDec,0,SUBFRAME_A_TO_SPDEC_LENGTH);
nSpihtStrlen=pThis->FormSpDecStreamA(nLastPackOfNoErrStream,pSubFrameAStart,pSubFrameAToSpDec);
pRecSubImgA = pThis->RecSubImgA;//To point the pointer;
memset(pRecSubImgA,0,SUBFRAME_A_RECOVERED_LENGTH);
fnSpDecDll(pSubFrameAToSpDec,pRecSubImgA,nSpihtStrlen);//the start of the block SubFrameBToSpDec is the hold"0d".
//for debug vertion,delete the last 8 bytes in each line,change 4016 to 4008;
for (nDebugline=1; nDebugline<256; nDebugline++)
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -