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

📄 avslibtestdlg.cpp

📁 国产的视频编解码标准avs,号称拥有完全自主知识产权.免专利费.开源C代码与大家分享
💻 CPP
📖 第 1 页 / 共 2 页
字号:
class CAboutDlg : public CDialog
{
public:
	CAboutDlg();

// Dialog Data
	//{{AFX_DATA(CAboutDlg)
	enum { IDD = IDD_ABOUTBOX };
	//}}AFX_DATA

	// ClassWizard generated virtual function overrides
	//{{AFX_VIRTUAL(CAboutDlg)
	protected:
	virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support
	//}}AFX_VIRTUAL

// Implementation
protected:
	//{{AFX_MSG(CAboutDlg)
	//}}AFX_MSG
	DECLARE_MESSAGE_MAP()
};

CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
{
	//{{AFX_DATA_INIT(CAboutDlg)
	//}}AFX_DATA_INIT
}

void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CAboutDlg)
	//}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
	//{{AFX_MSG_MAP(CAboutDlg)
		// No message handlers
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CAVSLibTestDlg dialog

CAVSLibTestDlg::CAVSLibTestDlg(CWnd* pParent /*=NULL*/)
	: CDialog(CAVSLibTestDlg::IDD, pParent)
{
	//{{AFX_DATA_INIT(CAVSLibTestDlg)
	m_nSaveAsFrameNo = 0;
	m_strSaveAsFilePath = _T("");
	m_bShowImage = FALSE;
	//}}AFX_DATA_INIT
	// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}

void CAVSLibTestDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CAVSLibTestDlg)
	//}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(CAVSLibTestDlg, CDialog)
	//{{AFX_MSG_MAP(CAVSLibTestDlg)
	ON_WM_SYSCOMMAND()
	ON_WM_PAINT()
	ON_WM_QUERYDRAGICON()
	ON_BN_CLICKED(IDC_OPEN, OnOpen)
	ON_BN_CLICKED(IDC_PLAY, OnPlay)
	ON_BN_CLICKED(IDC_STOP, OnStop)
	ON_WM_TIMER()
	ON_WM_CLOSE()
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CAVSLibTestDlg message handlers

BOOL CAVSLibTestDlg::OnInitDialog()
{
	CDialog::OnInitDialog();

	// Add "About..." menu item to system menu.

	// IDM_ABOUTBOX must be in the system command range.
	ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
	ASSERT(IDM_ABOUTBOX < 0xF000);

	CMenu* pSysMenu = GetSystemMenu(FALSE);
	if (pSysMenu != NULL)
	{
		CString strAboutMenu;
		strAboutMenu.LoadString(IDS_ABOUTBOX);
		if (!strAboutMenu.IsEmpty())
		{
			pSysMenu->AppendMenu(MF_SEPARATOR);
			pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
		}
	}

	// Set the icon for this dialog.  The framework does this automatically
	//  when the application's main window is not a dialog
	SetIcon(m_hIcon, TRUE);			// Set big icon
	SetIcon(m_hIcon, FALSE);		// Set small icon
	
	// TODO: Add extra initialization here

  init_clp();
  g_nBufLen = 2000*2000;
  g_pbBuf = new unsigned char [g_nBufLen];
  g_pbBmpBuf = new unsigned char [g_nBufLen*3];
  g_pDCShow = GetDlgItem(IDC_SHOW)->GetDC();
  GetDlgItem(IDC_SHOW)->GetClientRect(&g_rectShow);
  g_nLeft = 0;
	g_pFrame = &g_Frame;
  g_nFrameNo = 0;


  m_bShowImage = TRUE;

  g_psCurrent = Stopped;
  UpdateData(FALSE);
	return TRUE;  // return TRUE  unless you set the focus to a control
}

void CAVSLibTestDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
	if ((nID & 0xFFF0) == IDM_ABOUTBOX)
	{
		CAboutDlg dlgAbout;
		dlgAbout.DoModal();
	}
	else
	{
		CDialog::OnSysCommand(nID, lParam);
	}
}

// If you add a minimize button to your dialog, you will need the code below
//  to draw the icon.  For MFC applications using the document/view model,
//  this is automatically done for you by the framework.

void CAVSLibTestDlg::OnPaint() 
{
	if (IsIconic())
	{
		CPaintDC dc(this); // device context for painting

		SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);

		// Center icon in client rectangle
		int cxIcon = GetSystemMetrics(SM_CXICON);
		int cyIcon = GetSystemMetrics(SM_CYICON);
		CRect rect;
		GetClientRect(&rect);
		int x = (rect.Width() - cxIcon + 1) / 2;
		int y = (rect.Height() - cyIcon + 1) / 2;

		// Draw the icon
		dc.DrawIcon(x, y, m_hIcon);
	}
	else
	{
		CDialog::OnPaint();
	}
}

// The system calls this to obtain the cursor to display while the user drags
//  the minimized window.
HCURSOR CAVSLibTestDlg::OnQueryDragIcon()
{
	return (HCURSOR) m_hIcon;
}

void CAVSLibTestDlg::OnOpen() 
{
  char szFileFilter[]="video(*.video)|*.video|"
    "avs(*.avs)|*.avs|"  
    "clip(*.clip)|*.clip|" 
    "All File(*.*)|*.*|";
  "||";
  
  CFileDialog dlg(TRUE,
    NULL,
    "*.video",
    OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,
    szFileFilter,
    NULL);
  
  if(dlg.DoModal()==IDOK)
  {
    g_strFilePath = dlg.GetPathName();
    m_strSaveAsFilePath = g_strFilePath+".clip";
    if(!g_file.Open(g_strFilePath, CFile::modeRead | CFile::typeBinary | CFile::shareDenyRead, NULL))
    {
      MessageBox("Can not open the input file", "Open file erro", MB_OK);
      return;
    }  
 	}


  //打开编码器
  OpenAVSDec(NULL, NULL);
}

void CAVSLibTestDlg::OnPlay() 
{
  if(g_file.m_hFile == -1)
    return;
  
  if(g_psCurrent != Running)
  {
    g_psCurrent = Running;
    GetDlgItem(IDC_PLAY)->SetWindowText("pause");
    if(g_pThreadObj != NULL)
    {
      g_pThreadObj->m_bAutoDelete = true;
      g_pThreadObj->ResumeThread();
    }
    else{
      g_pThreadObj = AfxBeginThread((AFX_THREADPROC) CThreadProc,
        this,
        THREAD_PRIORITY_NORMAL, NULL, 0, NULL);
    }
  }
  else if(g_psCurrent==Running)
  {
    g_psCurrent = Paused;
    GetDlgItem(IDC_PLAY)->SetWindowText("play");
    if(g_pThreadObj != NULL)
    {
      g_pThreadObj->m_bAutoDelete = true;
      g_pThreadObj->SuspendThread();  
      Sleep(1000);
    }
  }
}


void CAVSLibTestDlg::OnStop() 
{
  if(g_psCurrent==Stopped)
    return;
  g_psCurrent = Stopped;
  g_pThreadObj = NULL;
  g_file.Seek(0, CFile::begin);
  GetDlgItem(IDC_PLAY)->SetWindowText("play");
  Sleep(10);
}

//----------------------------------------------------------------------
// 找视频序列头
//
//----------------------------------------------------------------------
BOOL FindSequcenceHeader(BYTE* pbData, int dataLen, int* nouseDataLen)
{
  BYTE* pCurr = pbData;
  int left = dataLen;
  *nouseDataLen = 0;
  while(pCurr[0] != 0x00 || pCurr[1] != 0x00 || pCurr[2] != 0x01 || pCurr[3] != 0xB0)
  {
    pCurr ++;
    (*nouseDataLen) ++;
    left --;
    if(left <= 20)
      return FALSE;
  }

  return TRUE;
}

void CThreadProc(LPVOID pParam)
{

  HWND hDlgWnd = ((CFrameWnd*)(AfxGetApp()->m_pMainWnd))->GetSafeHwnd();
  
  int frameLen=0, nouseDataLen=0;
  BOOL bInitedFlag = FALSE;
  while(1)
  {  
    if(g_psCurrent==Stopped)
    {
      g_nFrameNo = 0;
      g_nLeft = 0;
      break;
    }
    int t0 = timeGetTime();

    int readLen = g_file.Read(g_pbBuf+g_nLeft, g_nBufLen-g_nLeft);
    if(readLen != g_nBufLen-g_nLeft)
    {
      g_psCurrent = Stopped;
      break;
    }
    int dataLen = g_nLeft + readLen;

    //第一次解码需要从序列头开始
    if(!bInitedFlag)
    {
      if(FindSequcenceHeader(g_pbBuf, dataLen, &nouseDataLen))
      {
        g_nLeft = dataLen - nouseDataLen;
        memcpy(g_pbBuf, g_pbBuf+nouseDataLen, g_nLeft);
        bInitedFlag = TRUE;
        continue;
      }
      else
      {
        g_nLeft = dataLen-nouseDataLen;
        memcpy(g_pbBuf, g_pbBuf+dataLen-g_nLeft, g_nLeft);
        continue;
      }
    }
    else
    {
      //得到一帧数据, frmeLen表示帧长,nouseDataLen为无用数据长度,
      //序列头,用户数据等同其后的I帧为一帧,frameLen包含了他们的长度, nouseDataLen为I帧头前面的数据长度
      if(GetOneFrameBitsFromBuffer(g_pbBuf, g_nBufLen, &frameLen, &nouseDataLen))
      {
        //解码
        DecOneFrameFromBuffer(g_pbBuf+nouseDataLen, frameLen, g_pFrame);
        //显示
        ShowYuvImage(g_pbBmpBuf, g_pFrame->pY, g_pFrame->pU, g_pFrame->pV,
          g_pFrame->width, g_pFrame->height, g_pDCShow, g_rectShow.Width(), g_rectShow.Height());
        g_nLeft = dataLen - frameLen;
        memcpy(g_pbBuf, g_pbBuf+frameLen, g_nLeft);
      }
      else
      {
        AfxMessageBox("Warning, not enough data!");
      }
    }


    g_decTime += timeGetTime()-t0;
 
    g_nFrameNo ++;
  }
}



void CAVSLibTestDlg::OnClose() 
{
  //关闭编码器
  CloseAVSDec();	

  delete g_pbBuf;
  delete g_pbBmpBuf;
  g_file.Close();
	CDialog::OnClose();
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -