Visual C++ Developer Center > Visual C++ Forums > Visual C++ General > how to render the video from the camera to a Picture Control?
Ask a questionAsk a question
 

Questionhow to render the video from the camera to a Picture Control?

  • Saturday, November 07, 2009 9:06 AMcutedevil Users MedalsUsers MedalsUsers MedalsUsers MedalsUsers Medals
     

    I don't know the whole procedure.

    void tabTwo::DoDataExchange(CDataExchange* pDX)
    {
     CDialog::DoDataExchange(pDX);
     DDX_Control(pDX, IDC_PICTURE, m_hWndCap);
    }


    void tabTwo::OnBnClickedStart()
    {
     DWORD fsize;
     capSetCallbackOnError(m_hWndCap,(FARPROC)ErrorCallbackProc);
     capSetCallbackOnStatus(m_hWndCap,(FARPROC)StatusCallbackProc);
     capSetCallbackOnVideoStream(m_hWndCap,(FARPROC)VideoCallbackProc);
     capDriverConnect(m_hWndCap,0);
     capDriverGetCaps(m_hWndCap,&m_caps,sizeof(CAPDRIVERCAPS));
     
     if ( m_caps.fHasOverlay )
      capOverlay(m_hWndCap,TRUE);
     capPreviewRate(m_hWndCap,1000/25);
     capPreview(m_hWndCap,bPreview);

     fsize = capGetVideoFormatSize(m_hWndCap);
     capGetVideoFormat(m_hWndCap,lpbiIn,fsize);

     

     CRect rect;
     m_hWndCap.GetWindowRect(&rect);
     HWND m_hCapWnd = capCreateCaptureWindow(_T(""),NULL,0,0,rect.Width(),rect.Height(),m_hWndCap.GetSafeHwnd(),0);
        ASSERT(m_hCapWnd);

     if ( capDriverConnect(m_hCapWnd,0) )
     {

     }
    }

All Replies

  • Monday, November 09, 2009 9:17 PMSheng Jiang 蒋晟MVPUsers MedalsUsers MedalsUsers MedalsUsers MedalsUsers Medals
     
    Modern cameras should support WIA. old cameras may have their own SDK. Contact the hardware producer for details.


    The following is signature, not part of post
    Please mark the post answered your question as the answer, and mark other helpful posts as helpful.
    Visual C++ MVP
  • Tuesday, November 10, 2009 2:53 PMcutedevil Users MedalsUsers MedalsUsers MedalsUsers MedalsUsers Medals
     Has Code

    My camera supports WIA. I just want to know the process.  Thank you.

    #include "stdafx.h"
    #include "FTP.h"
    #include "tabTwo.h"
    
    #pragma comment(lib,"vfw32.lib")
    
        unsigned char bufo[XDIM*YDIM*3+40];//???
    	HIC  hic1;
    	HIC  hic2;
    	LPBITMAPINFO lpbiIn;
    	LPBITMAPINFO lpbiTmp;
    	LPBITMAPINFO lpbiOut;
    	COMPVARS     pc;
    	BOOL         IsKeyFrame;
    	BOOL         bSaveAVI=FALSE;
    	long         FrameSize;
    	int          CurrentID;
    	BOOL         bPreview = FALSE;
    	int          nStreamLength;
    	int          nOstreamSize;
    	CFrameWnd    m_wndSource;
    	HWND         m_hWndCap;
    	CRect        disRect;
    	enum         VFW_STATE{PREVIEW,ENCDEC};
    	VFW_STATE    m_vfwSate = PREVIEW;
    	CAPDRIVERCAPS m_caps;
    
    LRESULT CALLBACK EXPORT ErrorCallbackProc(HWND hWnd, int nErrID, LPSTR lpErrorText)
    {
    	if ( nErrID == 0 )
    		return TRUE;
    	MessageBox(NULL,(LPCWSTR)lpErrorText,_T(""),MB_OK);
    	return TRUE;
    	
    }
    
    LRESULT FAR PASCAL StatusCallbackProc(HWND hWnd,int nID,LPSTR lpStatusText)
    {
    	if ( nID == IDS_CAP_END )
    	{
    		if ( ( CurrentID == IDS_CAP_STAT_VIDEOAUDIO) || (CurrentID==IDS_CAP_STAT_VIDEOONLY) )
    		{
    			return TRUE;
    		}
    	}
    	CurrentID = nID;
    	return  TRUE;
    }
    
    LRESULT FAR PASCAL VideoCallbackProc(HWND hWnd, LPVIDEOHDR lpVHdr)
    {
    	unsigned char *bufi, *buf;
    	bufi = new unsigned char[lpVHdr->dwBytesUsed+40];
    	buf = new unsigned char[lpVHdr->dwBytesUsed];
    	memcpy((void*)(bufi),lpVHdr->lpData,lpVHdr->dwBytesUsed); //???
    	unsigned char * buf1;
    	buf1 = buf;
    
    	if ( m_vfwSate == ENCDEC )
    	{
    		buf1 = (unsigned char*)ICSeqCompressFrame(&pc,0,bufi,&IsKeyFrame,&FrameSize);
    		
    		/*if ( bSaveAVI )
    		{
    			AVIStreamSetFormat(pMainFrame->ps,pMainFrame->m_Frame++,lpbiTmp,sizeof(BITMAPINFO));
    			AVIStreamWrite(pMainFrame->ps,pMainFrame->m_Frame,1,(LPBYTE)buf1,FrameSize,AVIIF_KEYFRAME,NULL,NULL);
    		}*/
    		ICDecompress(hic2,0,&lpbiTmp->bmiHeader,buf1,&lpbiOut->bmiHeader,&bufo[40]);
    	}
    	else
    	{
    		memcpy(&buf[40],bufi,lpVHdr->dwBytesUsed);
    	}
    
    	
    	delete bufi;
    	delete buf;
    	
    	return (LRESULT) TRUE;
    }