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

DirextX编程

开发平台:

Visual C++

  1. //
  2. // CMpegController.cpp
  3. //
  4. #define GLOBAL
  5. extern "C"
  6. {
  7. #include "global.h"
  8. #include "getbit.h"
  9. #include "smartcache.h"
  10. }
  11. extern "C" void InitSystem(void);
  12. extern "C" void UninitSystem(void);
  13. extern "C" void ResetSystem(void);
  14. extern "C" void CheckSequenceHeader(void);
  15. #include "CMpegController.h"
  16. ////////////////////////////////////////////////////////////////////////////
  17. CMpegController::CMpegController()
  18. {
  19. }
  20. CMpegController::~CMpegController()
  21. {
  22. }
  23. bool CMpegController::Initialize(void)
  24. {
  25. InitSmartCache();   // Initialize smart cache
  26. InitSystem();       // Init decoder system
  27. return true;
  28. }
  29. void CMpegController::Uninitialize(void)
  30. {
  31. UninitSystem();      // Release decoder buffer
  32. ReleaseSmartCache(); // Release smart cache
  33. }
  34. // RGB24: 1
  35. // YUY2:  2
  36. void CMpegController::SetOutputType(int inType)
  37. {
  38. Store_Flag = inType;
  39. }
  40. void CMpegController::SetOutputImageSize(long inImageSize)
  41. {
  42. mOutputImageSize = inImageSize;
  43. }
  44. void CMpegController::BeginFlush(void)
  45. {
  46. Fault_Flag = ERROR_FLUSH;   // Give a chance to exit decoding cycle
  47. BeginFlushSmartCache();
  48. Sleep(10);
  49. }
  50. void CMpegController::EndFlush(void)
  51. {
  52. // Confirm currently NOT in decoding cycle
  53. /* int waitingCounter = 0;
  54. while (gIsPictureDecoding && waitingCounter < 10) 
  55. {
  56. waitingCounter++;
  57. Sleep(1);
  58. }*/
  59. Fault_Flag = 0;
  60. EndFlushSmartCache();
  61. // ResetSystem();
  62. }
  63. void CMpegController::BeginEndOfStream(void)
  64. {
  65. gIsEOS = TRUE;
  66. if (CheckOutputWaiting())
  67. {
  68. Fault_Flag = ERROR_FLUSH;
  69. BeginFlushSmartCache();
  70. // Confirm currently NOT in decoding cycle
  71. /* int waitingCounter = 0;
  72. while (gIsPictureDecoding && waitingCounter < 20) 
  73. {
  74. waitingCounter++;
  75. Sleep(1);
  76. }*/
  77. Sleep(10);
  78. EndFlushSmartCache();
  79. }
  80. }
  81. void CMpegController::EndEndOfStream(void)
  82. {
  83. // Fault_Flag = ERROR_FLUSH;
  84. // BeginFlushSmartCache();
  85. // while (gIsPictureDecoding); // Confirm currently NOT in decoding cycle
  86. // EndFlushSmartCache();
  87. gIsEOS = FALSE;
  88. }
  89. // Just make sure that filter's receiving NOT block
  90. void CMpegController::FlushAllPending(void)
  91. {
  92. Fault_Flag = ERROR_FLUSH;
  93. BeginFlushSmartCache();
  94. Sleep(10);
  95. EndFlushSmartCache();
  96. Fault_Flag = 0;
  97. }
  98. bool CMpegController::ReceiveMpeg(unsigned char * inData, long inLength)
  99. {
  100. long pass = ReceiveToSmartCache(inData, inLength);
  101. return pass > 0 ? true : false;
  102. }
  103. void CMpegController::GetDecoded(unsigned char * outPicture)
  104. {
  105. // FinalDecodedOut(outPicture);
  106. if (Store_Flag == STORE_YUY2)
  107. {
  108. memcpy(outPicture, yuy2, mOutputImageSize);
  109. }
  110. else
  111. {
  112. memcpy(outPicture, rgb24, mOutputImageSize);
  113. }
  114. }
  115. BOOL CMpegController::IsCacheInputWaiting(void)
  116. {
  117. return CheckInputWaiting();
  118. }
  119. BOOL CMpegController::IsCacheOutputWaiting(void)
  120. {
  121. return CheckOutputWaiting();
  122. }
  123. BOOL CMpegController::IsCacheEmpty(void)
  124. {
  125. return GetAvailableInSmartCache() > 0 ? FALSE : TRUE;
  126. }
  127. void CMpegController::SequenceHeaderChecking(void)
  128. {
  129. CheckSequenceHeader();
  130. }
  131. BOOL CMpegController::LocatePictureHeader(void)
  132. {
  133. if (Frame_Number == 0)
  134. {
  135. while (Get_Hdr() && picture_coding_type!=I_TYPE);
  136. if (picture_coding_type == I_TYPE)
  137. {
  138. return TRUE;
  139. }
  140. }
  141. else if (Frame_Number == 1)
  142. {
  143. while (Get_Hdr() && picture_coding_type==B_TYPE);
  144. if (picture_coding_type != B_TYPE)
  145. {
  146. return TRUE;
  147. }
  148. }
  149. else
  150. {
  151. if (Get_Hdr())
  152. {
  153. return TRUE;
  154. }
  155. }
  156. return FALSE;
  157. }
  158. BOOL CMpegController::DecodeOnePicture(void)
  159. {
  160. if (Decode_Picture())
  161. {
  162. return TRUE;
  163. }
  164. return FALSE;
  165. }