MP4_VLD.C
上传用户:tuheem
上传日期:2007-05-01
资源大小:21889k
文件大小:7k
源码类别:

多媒体编程

开发平台:

Visual C++

  1. #include <stdio.h>
  2. #include "mp4_vars.h"
  3. #include "getbits.h"
  4. #include "mp4_vld.h"
  5. /**
  6.  * 
  7. **/
  8. /***/
  9. event_t vld_intra_dct() 
  10. {
  11. event_t event;
  12. tab_type *tab = (tab_type *) NULL;
  13. int lmax, rmax;
  14. tab = vldTableB16(showbits(12));
  15. if (!tab) { 
  16. event.run   = 
  17. event.level = 
  18. event.last  = -1;
  19. return event;
  20. if (tab->val != ESCAPE) {
  21. event.run   = (tab->val >>  6) & 63;
  22. event.level =  tab->val        & 63;
  23. event.last  = (tab->val >> 12) &  1;
  24. event.level = getbits(1) ? -event.level : event.level;
  25. } else {
  26. switch (showbits(2)) {
  27. case 0x0 :  
  28. case 0x1 :  
  29. flushbits(1);
  30. tab = vldTableB16(showbits(12));  
  31. if (!tab) { 
  32. event.run   = 
  33. event.level = 
  34. event.last  = -1;
  35. return event;
  36. }
  37. event.run   = (tab->val >>  6) & 63;
  38. event.level =  tab->val        & 63;
  39. event.last  = (tab->val >> 12) &  1;
  40. lmax = vldTableB19(event.last, event.run);  
  41. event.level += lmax;
  42. event.level =  getbits(1) ? -event.level : event.level;
  43. break;
  44. case 0x2 :  
  45. flushbits(2);
  46. tab = vldTableB16(showbits(12));  
  47. if (!tab) { 
  48. event.run   = 
  49. event.level = 
  50. event.last  = -1;
  51. break;
  52. }
  53. event.run   = (tab->val >>  6) & 63;
  54. event.level =  tab->val        & 63;
  55. event.last  = (tab->val >> 12) &  1;
  56. rmax = vldTableB21(event.last, event.level);  
  57. event.run = event.run + rmax + 1;
  58. event.level = getbits(1) ? -event.level : event.level;
  59. break;
  60. case 0x3 :  
  61. flushbits(2);
  62. event.last  = getbits(1);
  63. event.run   = getbits(6);  
  64. getbits(1); 
  65. event.level = getbits(12); 
  66. event.level = (event.level & 0x800) ? (event.level | (-1 ^ 0xfff)) : event.level;
  67. getbits(1); 
  68. break;
  69. }
  70. }
  71. return event;
  72. }
  73. /***/
  74. event_t vld_inter_dct() 
  75. {
  76. event_t event;
  77. tab_type *tab = (tab_type *) NULL;
  78. int lmax, rmax;
  79. tab = vldTableB17(showbits(12));
  80. if (!tab) { 
  81. event.run   = 
  82. event.level = 
  83. event.last  = -1;
  84. return event;
  85. if (tab->val != ESCAPE) {
  86. event.run   = (tab->val >>  4) & 255;
  87. event.level =  tab->val        & 15;
  88. event.last  = (tab->val >> 12) &  1;
  89. event.level = getbits(1) ? -event.level : event.level;
  90. } else {
  91. int mode = showbits(2);
  92. switch (mode) {
  93. case 0x0 :  
  94. case 0x1 : 
  95. flushbits(1);
  96. tab = vldTableB17(showbits(12));  
  97. if (!tab) { 
  98. event.run   = 
  99. event.level = 
  100. event.last  = -1;
  101. return event;
  102. }
  103. event.run   = (tab->val >>  4) & 255;
  104. event.level =  tab->val        & 15;
  105. event.last  = (tab->val >> 12) &  1;
  106. lmax = vldTableB20(event.last, event.run);  
  107. event.level += lmax;
  108. event.level = getbits(1) ? -event.level : event.level;
  109. break;
  110. case 0x2 :  
  111. flushbits(2);
  112. tab = vldTableB17(showbits(12));  
  113. if (!tab) { 
  114. event.run   = 
  115. event.level = 
  116. event.last  = -1;
  117. break;
  118. }
  119. event.run   = (tab->val >>  4) & 255;
  120. event.level =  tab->val        & 15;
  121. event.last  = (tab->val >> 12) &  1;
  122. rmax = vldTableB22(event.last, event.level);  
  123. event.run = event.run + rmax + 1;
  124. event.level = getbits(1) ? -event.level : event.level;
  125. break;
  126. case 0x3 : 
  127. flushbits(2);
  128. event.last  = getbits(1);
  129. event.run   = getbits(6);   
  130. getbits(1); 
  131. event.level = getbits(12); 
  132. event.level = (event.level & 0x800) ? (event.level | (-1 ^ 0xfff)) : event.level;
  133. getbits(1); 
  134. break;
  135. }
  136. }
  137. return event;
  138. }
  139. /***/
  140. event_t vld_event(int intraFlag) 
  141. {
  142. if (intraFlag) {
  143. return vld_intra_dct();
  144. } else {
  145. return vld_inter_dct();
  146. }
  147. }
  148. /***/
  149. int vldTableB19(int last, int run) {
  150. if (!last){ 
  151. if        (run ==  0) {
  152. return 27;
  153. } else if (run ==  1) {
  154. return 10;
  155. } else if (run ==  2) {
  156. return  5;
  157. } else if (run ==  3) {
  158. return  4;
  159. } else if (run <=  7) {
  160. return  3;
  161. } else if (run <=  9) {
  162. return  2;
  163. } else if (run <= 14) {
  164. return  1;
  165. } else { 
  166. return  0; 
  167. }
  168. } else {    
  169. if        (run ==  0) {
  170. return  8;
  171. } else if (run ==  1) {
  172. return  3;
  173. } else if (run <=  6) {
  174. return  2;
  175. } else if (run <= 20) {
  176. return  1;
  177. } else { 
  178. return  0; 
  179. }
  180. }
  181. }
  182. /***/
  183. int vldTableB20(int last, int run) {
  184. if (!last){ 
  185. if        (run ==  0) {
  186. return 12;
  187. } else if (run ==  1) {
  188. return  6;
  189. } else if (run ==  2) {
  190. return  4;
  191. } else if (run <=  6) {
  192. return  3;
  193. } else if (run <= 10) {
  194. return  2;
  195. } else if (run <= 26) {
  196. return  1;
  197. } else {
  198. return  0; 
  199. }
  200. } else {   
  201. if        (run ==  0) {
  202. return  3;
  203. } else if (run ==  1) {
  204. return  2;
  205. } else if (run <= 40) {
  206. return  1;
  207. } else { 
  208. return  0; 
  209. }
  210. }
  211. }
  212. /***/
  213. int vldTableB21(int last, int level) {
  214. if (!last){ 
  215. if        (level ==  1) {
  216. return 14;
  217. } else if (level ==  2) {
  218. return  9;
  219. } else if (level ==  3) {
  220. return  7;
  221. } else if (level ==  4) {
  222. return  3;
  223. } else if (level ==  5) {
  224. return  2;
  225. } else if (level <= 10) {
  226. return  1;
  227. } else if (level <= 27) {
  228. return  0;
  229. } else { 
  230. return  0; 
  231. }
  232. } else {   
  233. if        (level ==  1) {
  234. return  20;
  235. } else if (level ==  2) {
  236. return  6;
  237. } else if (level ==  3) {
  238. return  1;
  239. } else if (level <=  8) {
  240. return  0;
  241. } else { 
  242. return  0; 
  243. }
  244. }
  245. }
  246. /***/
  247. int vldTableB22(int last, int level) {
  248. if (!last){ /* LAST == 0 */
  249. if        (level ==  1) {
  250. return 26;
  251. } else if (level ==  2) {
  252. return 10;
  253. } else if (level ==  3) {
  254. return  6;
  255. } else if (level ==  4) {
  256. return  2;
  257. } else if (level <=  6) {
  258. return  1;
  259. } else if (level <= 12) {
  260. return  0;
  261. } else { 
  262. return  0; 
  263. }
  264. } else {   
  265. if        (level ==  1) {
  266. return  40;
  267. } else if (level ==  2) {
  268. return  1;
  269. } else if (level ==  3) {
  270. return  0;
  271. } else { 
  272. return  0; 
  273. }
  274. }
  275. }
  276. /***/
  277. tab_type *vldTableB16(int code) {
  278. tab_type *tab;
  279. if (code >= 512) {
  280. tab = &(mp4_tables->tableB16_1[(code >> 5) - 16]);
  281. } else if (code >= 128) {
  282. tab = &(mp4_tables->tableB16_2[(code >> 2) - 32]);
  283. } else if (code >= 8) {
  284. tab = &(mp4_tables->tableB16_3[(code >> 0) - 8]);
  285. } else {
  286. return (tab_type *) NULL;
  287. }
  288. flushbits(tab->len);
  289. return tab;
  290. }
  291. /***/
  292. tab_type *vldTableB17(int code) {
  293. tab_type *tab;
  294. if (code >= 512) {
  295. tab = &(mp4_tables->tableB17_1[(code >> 5) - 16]);
  296. } else if (code >= 128) {
  297. tab = &(mp4_tables->tableB17_2[(code >> 2) - 32]);
  298. } else if (code >= 8) {
  299. tab = &(mp4_tables->tableB17_3[(code >> 0) - 8]);
  300. } else {
  301. return (tab_type *) NULL;
  302. }
  303. flushbits(tab->len);
  304. return tab;
  305. }
  306. /***/