MemFilter.h
上传用户:hhs829
上传日期:2022-06-17
资源大小:586k
文件大小:4k
源码类别:

DirextX编程

开发平台:

Visual C++

  1. //
  2. // MemFilter.h
  3. //
  4. #ifndef  __MemFilter_h__
  5. #define  __MemFilter_h__
  6. #include <streams.h>
  7. #include <stdio.h>
  8. #include "asyncio.h"
  9. #include "asyncrdr.h"
  10. #include "CMediaSocketClient.h"
  11. #include "CDataAdmin.h"
  12. #include "MyDef.h"
  13. //////////////////////////////////////////////////////////////////////
  14. //  Define an internal filter that wraps the base CBaseReader stuff //
  15. //////////////////////////////////////////////////////////////////////
  16. class CMemStream : public CAsyncStream
  17. {
  18. private:
  19.     CCritSec       m_csLock;
  20. CDataAdmin *   m_pDataList;
  21.     ULONG          m_ulPositionInPack;
  22.     // Total length available
  23. LONGLONG       m_llLength;
  24. // Bytes totally read
  25.     DWORD          m_dwTimeStart;
  26. public:
  27.     CMemStream(CDataAdmin* inBuffer)
  28.     {
  29. m_pDataList         = inBuffer;
  30. m_ulPositionInPack  = 0;
  31. m_llLength          = 0;   
  32.     }
  33.     HRESULT SetPointer(LONGLONG llPos)
  34.     {
  35. return S_OK;
  36.     }
  37.     HRESULT Read(PBYTE pbBuffer,
  38.                  DWORD dwBytesToRead,
  39.                  BOOL bAlign,
  40.                  LPDWORD pdwBytesRead)
  41.     {
  42. if (m_pDataList == NULL)
  43. return S_FALSE;
  44. CAutoLock     lck(&m_csLock);
  45. DWORD         dwHaveRead = 0;
  46. PMPEG1_PACK   pPack  = NULL;
  47. while (dwHaveRead < dwBytesToRead)
  48. {
  49. if (dwBytesToRead - dwHaveRead >= MPEG1_PACK_SIZE - m_ulPositionInPack)
  50. {
  51. // Just copy the whole pack data
  52. pPack = m_pDataList->GetDataBuffer();
  53. if (pPack != NULL)
  54. {
  55. CopyMemory((PVOID)(pbBuffer + dwHaveRead), 
  56. (PVOID)((PBYTE)(pPack) + m_ulPositionInPack), (SIZE_T)MPEG1_PACK_SIZE - m_ulPositionInPack);
  57. m_pDataList->ReleaseDataBuffer(pPack);
  58. dwHaveRead += MPEG1_PACK_SIZE - m_ulPositionInPack;
  59. m_ulPositionInPack = 0;
  60. }
  61. else if (m_pDataList->IsFlushing())
  62. {
  63. // FILE * fp = fopen("c:\log.txt","a+");
  64. // fprintf(fp,"failed!n");
  65. // fclose(fp); 
  66. return E_FAIL;
  67. }
  68. else 
  69. {
  70. // FILE * fp = fopen("c:\log.txt","a+");
  71. // fprintf(fp,"SLEEP!n");
  72. // fclose(fp); 
  73. Sleep(10);
  74. }
  75. }
  76. else
  77. {
  78. // Copy part of the pack data
  79. pPack = m_pDataList->PointToDataHead();
  80. if (pPack != NULL)
  81. {
  82. m_ulPositionInPack = dwBytesToRead - dwHaveRead;
  83. CopyMemory((PVOID)(pbBuffer + dwHaveRead), 
  84. (PVOID)(pPack), (SIZE_T)m_ulPositionInPack);
  85. dwHaveRead += m_ulPositionInPack;
  86. }
  87. else if (m_pDataList->IsFlushing())
  88. {
  89. // FILE * fp = fopen("c:\log.txt","a+");
  90. // fprintf(fp,"failed!n");
  91. // fclose(fp); 
  92. return E_FAIL;
  93. }
  94. else 
  95. {
  96. // FILE * fp = fopen("c:\log.txt","a+");
  97. // fprintf(fp,"SLEEP!n");
  98. // fclose(fp);
  99. Sleep(10);
  100. }
  101. }
  102. }
  103. *pdwBytesRead = dwBytesToRead;
  104. return S_OK;
  105.     }
  106.     LONGLONG Size(LONGLONG *pSizeAvailable)
  107.     {
  108.         *pSizeAvailable = m_llLength;
  109.         return 0x7fffffffff;
  110.     }
  111.     DWORD Alignment()
  112.     {
  113.         return 1;
  114.     }
  115.     void Lock()
  116.     {
  117.         m_csLock.Lock();
  118.     }
  119.     void Unlock()
  120.     {
  121.         m_csLock.Unlock();
  122.     }
  123. void AddAvailableLength(LONGLONG inLength)
  124. {
  125. m_llLength += inLength;
  126. }
  127. };
  128. class CMemReader : public CAsyncReader
  129. {
  130. public:
  131.     //  We're not going to be CoCreate'd so we don't need registration
  132.     //  stuff etc
  133.     STDMETHODIMP Register()
  134.     {
  135.         return S_OK;
  136.     }
  137.     STDMETHODIMP Unregister()
  138.     {
  139.         return S_OK;
  140.     }
  141.     CMemReader(CMemStream *pStream, CMediaType *pmt, HRESULT *phr) :
  142.         CAsyncReader(NAME("Mem Reader"), NULL, pStream, phr)
  143.     {
  144.         m_mt = *pmt;
  145.     }
  146. };
  147. #endif  // __MemFilter_h__