📄 testdlg.cpp
字号:
{
{
0, 1, 2, 3, 4, 5, 6, 8, 9, 10, 11, 12, 13, 15, 16, 17,
18, 19, 20, 22, 23, 24, 25, 26, 27, 29, 30, 31, 32, 33, 34, 36,
37, 38, 39, 40, 41, 43, 44, 45, 46, 47, 48, 50, 51, 52, 53, 54,
55, 57, 58, 59, 60, 61, 62, 64, 65, 66, 67, 68, 69, 71, 72, 73,
74, 75, 76, 78, 79, 80, 81, 82, 83, 85, 86, 87, 88, 89, 90, 91,
93, 94, 95, 96, 97, 98, 100, 101, 102, 103, 104, 105, 107, 108, 109, 110,
111, 112, 114, 115, 116, 117, 118, 119, 121, 122, 123, 124, 125, 126, 128, 129,
130, 131, 132, 133, 135, 136, 137, 138, 139, 140, 142, 143, 144, 145, 146, 147,
149, 150, 151, 152, 153, 154, 156, 157, 158, 159, 160, 161, 163, 164, 165, 166,
167, 168, 170, 171, 172, 173, 174, 175, 176, 178, 179, 180, 181, 182, 183, 185,
186, 187, 188, 189, 190, 192, 193, 194, 195, 196, 197, 199, 200, 201, 202, 203,
204, 206, 207, 208, 209, 210, 211, 213, 214, 215, 216, 217, 218, 220, 221, 222,
223, 224, 225, 227, 228, 229, 230, 231, 232, 234, 235, 236, 237, 238, 239, 241,
242, 243, 244, 245, 246, 248, 249, 250, 251, 252, 253, 255, 256, 257, 258, 259,
260, 261, 263, 264, 265, 266, 267, 268, 270, 271, 272, 273, 274, 275, 277, 278,
279, 280, 281, 282, 284, 285, 286, 287, 288, 289, 291, 292, 293, 294, 295, 296
},
{
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
},
{
0, 1, 3, 4, 6, 7, 9, 11, 12, 14, 15, 17, 19, 20, 22, 23,
25, 27, 28, 30, 31, 33, 35, 36, 38, 39, 41, 43, 44, 46, 47, 49,
51, 52, 54, 55, 57, 59, 60, 62, 63, 65, 67, 68, 70, 71, 73, 74,
76, 78, 79, 81, 82, 84, 86, 87, 89, 90, 92, 94, 95, 97, 98, 100,
102, 103, 105, 106, 108, 110, 111, 113, 114, 116, 118, 119, 121, 122, 124, 126,
127, 129, 130, 132, 134, 135, 137, 138, 140, 142, 143, 145, 146, 148, 149, 151,
153, 154, 156, 157, 159, 161, 162, 164, 165, 167, 169, 170, 172, 173, 175, 177,
178, 180, 181, 183, 185, 186, 188, 189, 191, 193, 194, 196, 197, 199, 201, 202,
204, 205, 207, 209, 210, 212, 213, 215, 217, 218, 220, 221, 223, 224, 226, 228,
229, 231, 232, 234, 236, 237, 239, 240, 242, 244, 245, 247, 248, 250, 252, 253,
255, 256, 258, 260, 261, 263, 264, 266, 268, 269, 271, 272, 274, 276, 277, 279,
280, 282, 284, 285, 287, 288, 290, 292, 293, 295, 296, 298, 299, 301, 303, 304,
306, 307, 309, 311, 312, 314, 315, 317, 319, 320, 322, 323, 325, 327, 328, 330,
331, 333, 335, 336, 338, 339, 341, 343, 344, 346, 347, 349, 351, 352, 354, 355,
357, 359, 360, 362, 363, 365, 367, 368, 370, 371, 373, 374, 376, 378, 379, 381,
382, 384, 386, 387, 389, 390, 392, 394, 395, 397, 398, 400, 402, 403, 405, 406
}
}
};
int GG_int = -135,BB_int = 277, RR_int = 222;
char clip[1536],*clp;
void init_clp(void)
{
int i;
clp = clip + 512;
for (i=-512;i<1024;i++)
clp[i] = (i<0) ? 0 : ((i>255) ? 255 : i);
}
void yuv2rgb420(unsigned char *_bmBits,unsigned char *_Y, unsigned char* _U, unsigned char* _V,
int _Width,int _Height,int _Format)
{
unsigned char *Y0,*Y1,*U,*V,*p0,*p1;
int wLuma = _Width;
int hLuma = _Height;
int x,y,size;
int BytesPerLine = ( _Width * 24 + 31 ) / 32 * 4;
int Bcc,Gcc,Rcc;
size = 2*BytesPerLine - 3*_Width;
//Y0 = _YUV[0];
//Y1 = _YUV[0]+wLuma;
Y0 = _Y;
Y1 = _Y+wLuma;
//U = _YUV[1];
//V = _YUV[2];
U = _U;
V = _V;
p0 = _bmBits;
p1 = _bmBits + BytesPerLine;
for (y=0;y<_Height/2;y++)
{
for(x=0;x<_Width/2;x++)
{
Bcc = c_int[1][1][*U] + c_int[1][2][*V] - BB_int;
Gcc = c_int[0][1][*U] + c_int[0][2][*V] - GG_int;
Rcc = c_int[2][1][*U] + c_int[2][2][*V] - RR_int;
*p0++ = clp[c_int[1][0][*Y0] + Bcc];
*p0++ = clp[c_int[0][0][*Y0] + Gcc];
*p0++ = clp[c_int[2][0][*Y0] + Rcc];
Y0++;
*p0++ = clp[c_int[1][0][*Y0] + Bcc];
*p0++ = clp[c_int[0][0][*Y0] + Gcc];
*p0++ = clp[c_int[2][0][*Y0] + Rcc];
Y0++;
*p1++ = clp[c_int[1][0][*Y1] + Bcc];
*p1++ = clp[c_int[0][0][*Y1] + Gcc];
*p1++ = clp[c_int[2][0][*Y1] + Rcc];
Y1++;
*p1++ = clp[c_int[1][0][*Y1] + Bcc];
*p1++ = clp[c_int[0][0][*Y1] + Gcc];
*p1++ = clp[c_int[2][0][*Y1] + Rcc];
Y1++;
U++;
V++;
}
p0 += size;
p1 += size;
Y0 += _Width;
Y1 += _Width;
}
}
void ShowYuvImage(unsigned char* pBmp, unsigned char* pY, unsigned char* pU, unsigned char* pV,
DWORD dwWidth, DWORD dwHeight, CDC* pDC, DWORD dwDCWidth, DWORD dwDCHeight)
{
//////////////////////////////////////////////////////////////////////////
if(pY==NULL || pU==NULL || pV==NULL)
return;
yuv2rgb420(pBmp, pY, pU, pV, dwWidth, dwHeight, 1);
BITMAPINFO m_BmpInfo;
m_BmpInfo.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
m_BmpInfo.bmiHeader.biWidth = dwWidth;
m_BmpInfo.bmiHeader.biHeight = -dwHeight;
m_BmpInfo.bmiHeader.biCompression = BI_RGB;
m_BmpInfo.bmiHeader.biPlanes = 1;
m_BmpInfo.bmiHeader.biBitCount = 24;
m_BmpInfo.bmiHeader.biSizeImage = dwHeight*dwWidth*3;
//CDC* pDC = GetDlgItem(IDC_ORG)->GetDC();
HBITMAP hBmp;
CDC MemDC;
hBmp = CreateDIBitmap(
pDC->m_hDC, // handle to device context
(BITMAPINFOHEADER*)(&m_BmpInfo), // pointer to bitmap size and format data
CBM_INIT, // initialization flag
pBmp, // pointer to initialization data
&m_BmpInfo, // pointer to bitmap color-format data
DIB_RGB_COLORS // color-data usage
);
if(hBmp == NULL)
{
pDC->DeleteDC();
return;
}
MemDC.CreateCompatibleDC(pDC);
SelectObject(MemDC.m_hDC,hBmp);
BOOL ret = pDC->BitBlt(0, 0,dwDCWidth,dwDCHeight,&MemDC, 0, 0,SRCCOPY);
DeleteObject(hBmp);
//ReleaseDC(pDC);
MemDC.DeleteDC();
//////////////////////////////////////////////////////////////////////////
}
void CTestDlg::OnOpen()
{
char szFileFilter[]="avs(*.avs)|*.avs|"
"All File(*.*)|*.*|";
"||";
CFileDialog dlg(TRUE,
NULL,
"*.avs",
OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,
szFileFilter,
NULL);
if(dlg.DoModal()==IDOK)
{
m_strFilePath = dlg.GetPathName();
if(m_file.m_hFile != -1)
{
m_file.Close();
}
if(!m_file.Open(m_strFilePath, CFile::modeRead | CFile::typeBinary | CFile::shareDenyRead, NULL))
{
MessageBox("Can not open the input file", "Open file erro", MB_OK);
return;
}
}
}
#define SEQENCE_END_CODE 0XB1010000
#define BUFLEN 1024*1024*3
void CTestDlg::OnPlay()
{
BYTE* pbBuf = new BYTE [BUFLEN];
BYTE* pbRGB = new BYTE [BUFLEN];
BYTE* pbData ;
DWORD dwReadLen = 0;
DWORD dwLeft = 0;
DWORD dwDataLen = 0;
DWORD dwFrameLen = 0;
DWORD dwNouseDataLen = 0;
BYTE* pY, *pU, *pV;
SEQ_INFO Info;
//图像显示相关的变量
CDC* pDCShow = GetDlgItem(IDC_SHOW)->GetDC();
CRect rectShow;
GetDlgItem(IDC_SHOW)->GetClientRect(&rectShow);
init_clp(); //yuv2rgb
m_file.Seek(0, CFile::begin);
dwReadLen = m_file.Read(pbBuf, 20);
pbData = pbBuf;
dwDataLen = dwReadLen;
dwLeft = dwDataLen;
// 初始化
OpenAVSDec(pbData, 20, &Info);
do
{
if(GetOneFrameBitsFromBuffer(pbData, (int)dwLeft, (int*)&dwFrameLen, (int*)&dwNouseDataLen) != 1)
{
memcpy(pbBuf, pbBuf+(dwDataLen-dwLeft), dwLeft);
dwDataLen = dwLeft;
if((dwReadLen = m_file.Read(pbBuf+dwLeft, BUFLEN-dwLeft))<=0)
break;
dwDataLen = dwLeft+dwReadLen;
dwLeft = dwDataLen;
pbData = pbBuf;
continue;
}
// 解码
DecOneFrameFromBuffer(pbData+dwNouseDataLen, dwFrameLen, &pY, &pU, &pV);
// 显示
ShowYuvImage(pbRGB, pY, pU, pV,
Info.image_width, Info.image_height, pDCShow, rectShow.Width(), rectShow.Height());
pbData += dwFrameLen;
dwLeft -= dwFrameLen;
} while((*(DWORD*)pbData) != SEQENCE_END_CODE);
delete pbBuf;
// 结束
CloseAVSDec();
}
void CTestDlg::OnClose()
{
CDialog::OnClose();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -