AviPlayer.cpp
上传用户:sesekoo
上传日期:2020-07-18
资源大小:21543k
文件大小:4k
源码类别:

界面编程

开发平台:

Visual C++

  1. // AviPlayer.cpp: implementation of the CAviPlayer class.
  2. //
  3. //////////////////////////////////////////////////////////////////////
  4. #include "stdafx.h"
  5. #include "aviframes.h"
  6. #include "AviPlayer.h"
  7. #ifdef _DEBUG
  8. #undef THIS_FILE
  9. static char THIS_FILE[]=__FILE__;
  10. #define new DEBUG_NEW
  11. #endif
  12. //////////////////////////////////////////////////////////////////////
  13. // Construction/Destruction
  14. //////////////////////////////////////////////////////////////////////
  15. IMPLEMENT_DYNCREATE( CAviPlayer, CObject );
  16. //////////////////////////////////////////////////////////////////////////
  17. CAviPlayer::CAviPlayer(CWnd *pWndParent)
  18. : m_pAviStream( NULL )
  19. , m_pGetFrame( NULL )
  20. , m_nAviWidth( 0 )
  21. , m_nAviHeight( 0 )
  22. , m_nRenderWidth( 0 )
  23. , m_nRenderHeight( 0 )
  24. , m_hDrawDib( NULL )
  25. , m_nFrameNumber( 0 )
  26. , m_nFrameCount( 0 )
  27. , m_nFrameSkiped(0)
  28. , m_pAviPlayerWnd(NULL)
  29. , m_bIsPlaying( FALSE )
  30. , m_bTempPause( FALSE )
  31. {
  32. AVIFileInit();
  33. m_pAviPlayerWnd = new CAviPlayerWnd(this);
  34. m_pAviPlayerWnd->Create( pWndParent );
  35. }
  36. //////////////////////////////////////////////////////////////////////////
  37. CAviPlayer::~CAviPlayer()
  38. {
  39. if( m_pAviPlayerWnd ){
  40. m_pAviPlayerWnd->DestroyWindow();
  41. delete m_pAviPlayerWnd;
  42. m_pAviPlayerWnd = NULL;
  43. }
  44. Clean();
  45. AVIFileExit();
  46. }
  47. //////////////////////////////////////////////////////////////////////////
  48. void CAviPlayer::Clean()
  49. {
  50. if( m_hDrawDib != NULL ){
  51. ::DrawDibClose( m_hDrawDib );
  52. m_hDrawDib = NULL;
  53. }
  54. if( m_pGetFrame != NULL ){
  55. ::AVIStreamGetFrameClose( m_pGetFrame );
  56. m_pGetFrame = NULL; 
  57. }
  58. if( m_pAviStream != NULL ){
  59. ::AVIStreamRelease( m_pAviStream );
  60. m_pAviStream = NULL;
  61. }
  62. ::DrawDibEnd(m_hDrawDib);
  63. ::DrawDibClose(m_hDrawDib);
  64. m_hDrawDib = NULL;
  65. }
  66. //////////////////////////////////////////////////////////////////////////
  67. BOOL CAviPlayer::Prepare()
  68. {
  69. ASSERT(m_pAviPlayerWnd);
  70. m_pAviPlayerWnd->ShowWindow( SW_HIDE );
  71. AVIStreamInfo(
  72. m_pAviStream,
  73. &m_AviInfo,
  74. sizeof(m_AviInfo)
  75. );
  76. m_nRenderWidth = m_nAviWidth = m_AviInfo.rcFrame.right - m_AviInfo.rcFrame.left;
  77. m_nRenderHeight = m_nAviHeight = m_AviInfo.rcFrame.bottom - m_AviInfo.rcFrame.top;
  78. SetPlayerWindowPos( 0, 0, m_nRenderWidth, m_nRenderHeight );
  79. //get start position and count of frames
  80. m_nFrameNumber = AVIStreamStart( m_pAviStream );
  81. m_nFrameCount  = AVIStreamLength( m_pAviStream );
  82. m_pGetFrame =
  83. ::AVIStreamGetFrameOpen(
  84. m_pAviStream,
  85. NULL
  86. );
  87. if( m_pGetFrame == NULL )
  88. {
  89. // ASSERT( FALSE );
  90. AfxMessageBox( _T("AVI frame initialization failed"), MB_OK|MB_ICONERROR );
  91. return FALSE;
  92. }
  93. m_hDrawDib = ::DrawDibOpen();
  94. if( m_hDrawDib == NULL )
  95. {
  96. // ASSERT( FALSE );
  97. AfxMessageBox( _T("DrawDibOpen() failed"), MB_OK|MB_ICONERROR );
  98. return FALSE;
  99. }
  100. m_pAviPlayerWnd->ShowWindow( SW_SHOWNOACTIVATE );
  101. return TRUE;
  102. }
  103. //////////////////////////////////////////////////////////////////////////
  104. BOOL CAviPlayer::OpenFromFile( LPCTSTR sAviFilePath )
  105. {
  106. Clean();
  107. if( ::AVIStreamOpenFromFile(
  108. &m_pAviStream,
  109. sAviFilePath,
  110. streamtypeVIDEO,
  111. 0,
  112. OF_READ,
  113. NULL
  114. ) != 0
  115. )
  116. {
  117. Clean();
  118. ASSERT( FALSE );
  119. AfxMessageBox( _T("AVI stream initialization failed"), MB_OK|MB_ICONERROR );
  120. return FALSE;
  121. }
  122. BOOL bRet = Prepare();
  123. return bRet;
  124. }
  125. //////////////////////////////////////////////////////////////////////////
  126. BOOL CAviPlayer::DrawFrame(
  127. HDC hDC,
  128. int nFrameNumber
  129. )
  130. {
  131. LPBITMAPINFOHEADER lpbi;
  132. lpbi = (LPBITMAPINFOHEADER)
  133. ::AVIStreamGetFrame(
  134. m_pGetFrame,
  135. nFrameNumber
  136. );
  137. if(!lpbi)
  138. return FALSE;
  139. unsigned char * pAviFrameRawData = (unsigned char *)
  140. lpbi
  141. + lpbi->biSize
  142. + lpbi->biClrUsed * sizeof(RGBQUAD);
  143. unsigned char * pDibRawData = NULL;
  144. HBITMAP hBitmap =
  145. ::CreateDIBSection(
  146. hDC,
  147. (BITMAPINFO*)(lpbi),
  148. DIB_RGB_COLORS,
  149. (void**)(&pDibRawData),
  150. NULL,
  151. NULL
  152. );
  153. if( hBitmap == NULL )
  154. {
  155. ASSERT( FALSE );
  156. AfxMessageBox( _T("Failed to create DIB section"), MB_OK|MB_ICONERROR );
  157. return FALSE;
  158. }
  159. ASSERT( pDibRawData != NULL );
  160. ::DrawDibDraw(
  161. m_hDrawDib,
  162. hDC,
  163. 0, 0, m_nRenderWidth, m_nRenderHeight,
  164. lpbi,
  165. pAviFrameRawData,
  166. 0, 0, m_nAviWidth, m_nAviHeight,
  167. 0
  168. );
  169. DeleteObject(hBitmap);
  170. return TRUE;
  171. }
  172. //////////////////////////////////////////////////////////////////////////