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

DirextX编程

开发平台:

Visual C++

  1. /* Copyright (C) 1996, MPEG Software Simulation Group. All Rights Reserved. */
  2. /*
  3.  * Disclaimer of Warranty
  4.  *
  5.  * These software programs are available to the user without any license fee or
  6.  * royalty on an "as is" basis.  The MPEG Software Simulation Group disclaims
  7.  * any and all warranties, whether express, implied, or statuary, including any
  8.  * implied warranties or merchantability or of fitness for a particular
  9.  * purpose.  In no event shall the copyright-holder be liable for any
  10.  * incidental, punitive, or consequential damages of any kind whatsoever
  11.  * arising from the use of these programs.
  12.  *
  13.  * This disclaimer of warranty extends to the user of these programs and user's
  14.  * customers, employees, agents, transferees, successors, and assigns.
  15.  *
  16.  * The MPEG Software Simulation Group does not represent or warrant that the
  17.  * programs furnished hereunder are free of infringement of any third-party
  18.  * patents.
  19.  *
  20.  * Commercial implementations of MPEG-1 and MPEG-2 video, including shareware,
  21.  * are subject to royalty fees to patent holders.  Many of these patents are
  22.  * general enough such that they are unavoidable regardless of implementation
  23.  * design.
  24.  *
  25.  */
  26. /*
  27.  * All modifications (mpeg2decode -> DVD2AVI) are Copyright (C) Chia-chen Kuo - Jan 2001
  28.  */
  29. #include "global.h"
  30. #include "getbit.h"
  31. __forceinline static unsigned int Get_Short(void);
  32. void Initialize_Buffer()
  33. {
  34. Rdptr = Rdbfr + BUFFER_SIZE;
  35. Rdmax = Rdptr;
  36. if (SystemStream_Flag)
  37. {
  38. if (Rdptr >= Rdmax)
  39. Next_Packet();
  40. CurrentBfr = *Rdptr++ << 24;
  41. if (Rdptr >= Rdmax)
  42. Next_Packet();
  43. CurrentBfr += *Rdptr++ << 16;
  44. if (Rdptr >= Rdmax)
  45. Next_Packet();
  46. CurrentBfr += *Rdptr++ << 8;
  47. if (Rdptr >= Rdmax)
  48. Next_Packet();
  49. CurrentBfr += *Rdptr++;
  50. Fill_Next();
  51. }
  52. else
  53. {
  54. Fill_Buffer();
  55. CurrentBfr = (*Rdptr << 24) + (*(Rdptr+1) << 16) + (*(Rdptr+2) << 8) + *(Rdptr+3);
  56. Rdptr += 4;
  57. Fill_Next();
  58. }
  59. BitsLeft = 32;
  60. }
  61. void Next_Packet(void)
  62. {
  63. static short volume;
  64. static int i, j, Packet_Length, Packet_Header_Length, size;
  65. static unsigned int code, AUDIO_ID, VOBCELL_Count, AC3_Track, MPA_Track;
  66. for (; Fault_Flag == 0;)
  67. {
  68. code = Get_Short();
  69. code = (code<<16) + Get_Short();
  70. // remove system layer byte stuffing
  71. while (!Fault_Flag && (code & 0xffffff00) != 0x00000100)
  72. code = (code<<8) + Get_Byte();
  73. if (Fault_Flag)
  74. {
  75. return;
  76. }
  77. switch (code)
  78. {
  79. case PACK_START_CODE:
  80. Rdptr += 8;
  81. VOBCELL_Count = 0;
  82. break;
  83. case PRIVATE_STREAM_2:
  84. Packet_Length = Get_Short();
  85. if (++VOBCELL_Count==2)
  86. {
  87. Rdptr += 25;
  88. VOB_ID = Get_Short();
  89. CELL_ID = Get_Short();
  90. Rdptr += Packet_Length - 29;
  91. }
  92. else
  93. Rdptr += Packet_Length;
  94. break;
  95. case VIDEO_ELEMENTARY_STREAM:
  96. Packet_Length = Get_Short();
  97. Rdmax = Rdptr + Packet_Length;
  98. code = Get_Byte();
  99. if ((code & 0xc0)==0x80)
  100. {
  101. code = Get_Byte();
  102. Packet_Header_Length = Get_Byte();
  103. if (code>=0x80 && !Rip_Flag)
  104. {
  105. code = Get_Byte();
  106. VideoPTS = (code & 0x0e) << 29;
  107. VideoPTS |= (Get_Short() & 0xfffe) << 14;
  108. VideoPTS |= (Get_Short()>>1) & 0x7fff;
  109. VideoPTS /= 90;
  110. Rdptr += Packet_Header_Length-5;
  111. }
  112. else
  113. Rdptr += Packet_Header_Length;
  114. Bitrate_Meter += Rdmax-Rdptr;
  115. return;
  116. }
  117. else
  118. Rdptr += Packet_Length-1;
  119. break;
  120. default:
  121. if (code>=SYSTEM_START_CODE)
  122. {
  123. Packet_Length = Get_Short();
  124. Rdptr += Packet_Length;
  125. }
  126. break;
  127. }
  128. }
  129. }
  130. unsigned int Get_Bits_All(unsigned int N)
  131. {
  132. N -= BitsLeft;
  133. Val = (CurrentBfr << (32 - BitsLeft)) >> (32 - BitsLeft);
  134. if (N)
  135. Val = (Val << N) + (NextBfr >> (32 - N));
  136. CurrentBfr = NextBfr;
  137. BitsLeft = 32 - N;
  138. Fill_Next();
  139. return Val;
  140. }
  141. void Flush_Buffer_All(unsigned int N)
  142. {
  143. CurrentBfr = NextBfr;
  144. BitsLeft = BitsLeft + 32 - N;
  145. Fill_Next();
  146. }
  147. void Fill_Buffer()
  148. {
  149. int readsize = BUFFER_SIZE;
  150. if (gIsEOS)
  151. {
  152. int available = GetAvailableInSmartCache();
  153. if (available == 0)
  154. {
  155. // Force to exit from decoding cycle
  156. Fault_Flag = ERROR_FLUSH;
  157. }
  158. if (available < BUFFER_SIZE)
  159. {
  160. readsize = available;
  161. }
  162. }
  163. Read = FetchDataFromSmartCache(Rdbfr, readsize);
  164. Rdptr = Rdbfr;
  165. Rdmax = Rdbfr + Read;
  166. Bitrate_Meter += Read;
  167. }
  168. static unsigned int Get_Short()
  169. {
  170. unsigned int i = Get_Byte();
  171. return (i<<8) | Get_Byte();
  172. }