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

📄 testdlg.cpp

📁 AVS是中国自己推出的视频图像音频编解码标准。包中是AVS 源代码
💻 CPP
📖 第 1 页 / 共 2 页
字号:

{
{
	 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 + -