MPEG2Dec.cpp
上传用户:xjjlds
上传日期:2015-12-05
资源大小:22823k
文件大小:105k
源码类别:

多媒体编程

开发平台:

Visual C++

  1. #include "stdafx.h"
  2. #include "MPEG2Dec.h"
  3. int testint;
  4. struct CPU {
  5. BOOL mmx;
  6. BOOL _3dnow;
  7. BOOL ssemmx;
  8. BOOL ssefpu;
  9. } cpu;
  10. void CheckCPU()
  11. {
  12. __asm
  13. {
  14. mov eax, 1
  15. cpuid
  16. test edx, 0x00800000 // STD MMX
  17. jz TEST_SSE
  18. mov [cpu.mmx], 1
  19. TEST_SSE:
  20. test edx, 0x02000000 // STD SSE
  21. jz TEST_3DNOW
  22. mov [cpu.ssemmx], 1
  23. mov [cpu.ssefpu], 1
  24. TEST_3DNOW:
  25. mov eax, 0x80000001
  26. cpuid
  27. test edx, 0x80000000 // 3D NOW
  28. jz TEST_SSEMMX
  29. mov [cpu._3dnow], 1
  30. TEST_SSEMMX:
  31. test edx, 0x00400000 // SSE MMX
  32. jz TEST_END
  33. mov [cpu.ssemmx], 1
  34. TEST_END:
  35. }
  36. }
  37. // idct
  38. extern "C" void __fastcall MMX_IDCT(short *block);
  39. extern "C" void __fastcall SSEMMX_IDCT(short *block);
  40. extern void Initialize_FPU_IDCT(void);
  41. extern void FPU_IDCT(short *block);
  42. extern void Initialize_REF_IDCT(void);
  43. extern void REF_IDCT(short *block);
  44. /* default intra quantization matrix */
  45. static unsigned char default_intra_quantizer_matrix[64] =
  46. {
  47. 8, 16, 19, 22, 26, 27, 29, 34,
  48. 16, 16, 22, 24, 27, 29, 34, 37,
  49. 19, 22, 26, 27, 29, 34, 34, 38,
  50. 22, 22, 26, 27, 29, 34, 37, 40,
  51. 22, 26, 27, 29, 32, 35, 40, 48,
  52. 26, 27, 29, 32, 35, 40, 48, 58,
  53. 26, 27, 29, 34, 38, 46, 56, 69,
  54. 27, 29, 35, 38, 46, 56, 69, 83
  55. };
  56. /* zig-zag and alternate scan patterns */
  57. static unsigned char scan[2][64] =
  58. {
  59. { /* Zig-Zag scan pattern  */
  60. 0,  1,  8, 16,  9,  2,  3, 10,
  61.    17, 24, 32, 25, 18, 11,  4,  5,
  62.    12, 19, 26, 33, 40, 48, 41, 34,
  63.    27, 20, 13,  6,  7, 14, 21, 28,
  64.    35, 42, 49, 56, 57, 50, 43, 36,
  65.    29, 22, 15, 23, 30, 37, 44, 51,
  66.    58, 59, 52, 45, 38, 31, 39, 46,
  67.    53, 60, 61, 54, 47, 55, 62, 63
  68. }
  69. ,
  70. { /* Alternate scan pattern */
  71. 0,  8, 16, 24,  1,  9,  2, 10,
  72.    17, 25, 32, 40, 48, 56, 57, 49,
  73.    41, 33, 26, 18,  3, 11, 4,  12,
  74.    19, 27, 34, 42, 50, 58, 35, 43,
  75.    51, 59, 20, 28,  5, 13,  6, 14,
  76.    21, 29, 36, 44, 52, 60, 37, 45,
  77.    53, 61, 22, 30,  7, 15, 23, 31,
  78.    38, 46, 54, 62, 39, 47, 55, 63
  79. }
  80. };
  81. /* non-linear quantization coefficient table */
  82. static unsigned char Non_Linear_quantizer_scale[32] =
  83. {
  84. 0, 1, 2, 3, 4, 5, 6, 7,
  85. 8, 10, 12, 14, 16, 18, 20, 22,
  86. 24, 28, 32, 36, 40, 44, 48, 52,
  87. 56, 64, 72, 80, 88, 96, 104, 112
  88. };
  89. #define ERROR_VALUE (-1)
  90. typedef struct {
  91. char run, level, len;
  92. } DCTtab;
  93. typedef struct {
  94. char val, len;
  95. } VLCtab;
  96. /* Table B-10, motion_code, codes 0001 ... 01xx */
  97. static VLCtab MVtab0[8] =
  98. {
  99. {ERROR_VALUE,0}, {3,3}, {2,2}, {2,2}, {1,1}, {1,1}, {1,1}, {1,1}
  100. };
  101. /* Table B-10, motion_code, codes 0000011 ... 000011x */
  102. static VLCtab MVtab1[8] =
  103. {
  104. {ERROR_VALUE,0}, {ERROR_VALUE,0}, {ERROR_VALUE,0}, {7,6}, {6,6}, {5,6}, {4,5}, {4,5}
  105. };
  106. /* Table B-10, motion_code, codes 0000001100 ... 000001011x */
  107. static VLCtab MVtab2[12] =
  108. {
  109. {16,9}, {15,9}, {14,9}, {13,9},
  110. {12,9}, {11,9}, {10,8}, {10,8},
  111. {9,8},  {9,8},  {8,8},  {8,8}
  112. };
  113. /* Table B-9, coded_block_pattern, codes 01000 ... 111xx */
  114. static VLCtab CBPtab0[32] =
  115. {
  116. {ERROR_VALUE,0}, {ERROR_VALUE,0}, {ERROR_VALUE,0}, {ERROR_VALUE,0},
  117. {ERROR_VALUE,0}, {ERROR_VALUE,0}, {ERROR_VALUE,0}, {ERROR_VALUE,0},
  118. {62,5}, {2,5},  {61,5}, {1,5},  {56,5}, {52,5}, {44,5}, {28,5},
  119. {40,5}, {20,5}, {48,5}, {12,5}, {32,4}, {32,4}, {16,4}, {16,4},
  120. {8,4},  {8,4},  {4,4},  {4,4},  {60,3}, {60,3}, {60,3}, {60,3}
  121. };
  122. /* Table B-9, coded_block_pattern, codes 00000100 ... 001111xx */
  123. static VLCtab CBPtab1[64] =
  124. {
  125. {ERROR_VALUE,0}, {ERROR_VALUE,0}, {ERROR_VALUE,0}, {ERROR_VALUE,0},
  126. {58,8}, {54,8}, {46,8}, {30,8},
  127. {57,8}, {53,8}, {45,8}, {29,8}, {38,8}, {26,8}, {37,8}, {25,8},
  128. {43,8}, {23,8}, {51,8}, {15,8}, {42,8}, {22,8}, {50,8}, {14,8},
  129. {41,8}, {21,8}, {49,8}, {13,8}, {35,8}, {19,8}, {11,8}, {7,8},
  130. {34,7}, {34,7}, {18,7}, {18,7}, {10,7}, {10,7}, {6,7},  {6,7},
  131. {33,7}, {33,7}, {17,7}, {17,7}, {9,7},  {9,7},  {5,7},  {5,7},
  132. {63,6}, {63,6}, {63,6}, {63,6}, {3,6},  {3,6},  {3,6},  {3,6},
  133. {36,6}, {36,6}, {36,6}, {36,6}, {24,6}, {24,6}, {24,6}, {24,6}
  134. };
  135. /* Table B-9, coded_block_pattern, codes 000000001 ... 000000111 */
  136. static VLCtab CBPtab2[8] =
  137. {
  138. {ERROR_VALUE,0}, {0,9}, {39,9}, {27,9}, {59,9}, {55,9}, {47,9}, {31,9}
  139. };
  140. /* Table B-1, macroblock_address_increment, codes 00010 ... 011xx */
  141. static VLCtab MBAtab1[16] =
  142. {
  143. {ERROR_VALUE,0}, {ERROR_VALUE,0}, {7,5}, {6,5}, {5,4}, {5,4}, {4,4},
  144. {4,4}, {3,3}, {3,3}, {3,3}, {3,3}, {2,3}, {2,3}, {2,3}, {2,3}
  145. };
  146. /* Table B-1, macroblock_address_increment, codes 00000011000 ... 0000111xxxx */
  147. static VLCtab MBAtab2[104] =
  148. {
  149. {33,11}, {32,11}, {31,11}, {30,11}, {29,11}, {28,11}, {27,11}, {26,11},
  150. {25,11}, {24,11}, {23,11}, {22,11}, {21,10}, {21,10}, {20,10}, {20,10},
  151. {19,10}, {19,10}, {18,10}, {18,10}, {17,10}, {17,10}, {16,10}, {16,10},
  152. {15,8},  {15,8},  {15,8},  {15,8},  {15,8},  {15,8},  {15,8},  {15,8},
  153. {14,8},  {14,8},  {14,8},  {14,8},  {14,8},  {14,8},  {14,8},  {14,8},
  154. {13,8},  {13,8},  {13,8},  {13,8},  {13,8},  {13,8},  {13,8},  {13,8},
  155. {12,8},  {12,8},  {12,8},  {12,8},  {12,8},  {12,8},  {12,8},  {12,8},
  156. {11,8},  {11,8},  {11,8},  {11,8},  {11,8},  {11,8},  {11,8},  {11,8},
  157. {10,8},  {10,8},  {10,8},  {10,8},  {10,8},  {10,8},  {10,8},  {10,8},
  158. {9,7},   {9,7},   {9,7},   {9,7},   {9,7},   {9,7},   {9,7},   {9,7},
  159. {9,7},   {9,7},   {9,7},   {9,7},   {9,7},   {9,7},   {9,7},   {9,7},
  160. {8,7},   {8,7},   {8,7},   {8,7},   {8,7},   {8,7},   {8,7},   {8,7},
  161. {8,7},   {8,7},   {8,7},   {8,7},   {8,7},   {8,7},   {8,7},   {8,7}
  162. };
  163. /* Table B-12, dct_dc_size_luminance, codes 00xxx ... 11110 */
  164. static VLCtab DClumtab0[32] =
  165. {
  166. {1, 2}, {1, 2}, {1, 2}, {1, 2}, {1, 2}, {1, 2}, {1, 2}, {1, 2},
  167. {2, 2}, {2, 2}, {2, 2}, {2, 2}, {2, 2}, {2, 2}, {2, 2}, {2, 2},
  168. {0, 3}, {0, 3}, {0, 3}, {0, 3}, {3, 3}, {3, 3}, {3, 3}, {3, 3},
  169. {4, 3}, {4, 3}, {4, 3}, {4, 3}, {5, 4}, {5, 4}, {6, 5}, {ERROR_VALUE, 0}
  170. };
  171. /* Table B-12, dct_dc_size_luminance, codes 111110xxx ... 111111111 */
  172. static VLCtab DClumtab1[16] =
  173. {
  174. {7, 6}, {7, 6}, {7, 6}, {7, 6}, {7, 6}, {7, 6}, {7, 6}, {7, 6},
  175. {8, 7}, {8, 7}, {8, 7}, {8, 7}, {9, 8}, {9, 8}, {10,9}, {11,9}
  176. };
  177. /* Table B-13, dct_dc_size_chrominance, codes 00xxx ... 11110 */
  178. static VLCtab DCchromtab0[32] =
  179. {
  180. {0, 2}, {0, 2}, {0, 2}, {0, 2}, {0, 2}, {0, 2}, {0, 2}, {0, 2},
  181. {1, 2}, {1, 2}, {1, 2}, {1, 2}, {1, 2}, {1, 2}, {1, 2}, {1, 2},
  182. {2, 2}, {2, 2}, {2, 2}, {2, 2}, {2, 2}, {2, 2}, {2, 2}, {2, 2},
  183. {3, 3}, {3, 3}, {3, 3}, {3, 3}, {4, 4}, {4, 4}, {5, 5}, {ERROR_VALUE, 0}
  184. };
  185. /* Table B-13, dct_dc_size_chrominance, codes 111110xxxx ... 1111111111 */
  186. static VLCtab DCchromtab1[32] =
  187. {
  188. {6, 6}, {6, 6}, {6, 6}, {6, 6}, {6, 6}, {6, 6}, {6, 6}, {6, 6},
  189. {6, 6}, {6, 6}, {6, 6}, {6, 6}, {6, 6}, {6, 6}, {6, 6}, {6, 6},
  190. {7, 7}, {7, 7}, {7, 7}, {7, 7}, {7, 7}, {7, 7}, {7, 7}, {7, 7},
  191. {8, 8}, {8, 8}, {8, 8}, {8, 8}, {9, 9}, {9, 9}, {10,10}, {11,10}
  192. };
  193. /* Table B-14, DCT coefficients table zero,
  194.  * codes 0100 ... 1xxx (used for first (DC) coefficient)
  195.  */
  196. static DCTtab DCTtabfirst[12] =
  197. {
  198. {0,2,4}, {2,1,4}, {1,1,3}, {1,1,3},
  199. {0,1,1}, {0,1,1}, {0,1,1}, {0,1,1},
  200. {0,1,1}, {0,1,1}, {0,1,1}, {0,1,1}
  201. };
  202. /* Table B-14, DCT coefficients table zero,
  203.  * codes 0100 ... 1xxx (used for all other coefficients)
  204.  */
  205. static DCTtab DCTtabnext[12] =
  206. {
  207. {0,2,4},  {2,1,4},  {1,1,3},  {1,1,3},
  208. {64,0,2}, {64,0,2}, {64,0,2}, {64,0,2}, /* EOB */
  209. {0,1,2},  {0,1,2},  {0,1,2},  {0,1,2}
  210. };
  211. /* Table B-14, DCT coefficients table zero,
  212.  * codes 000001xx ... 00111xxx
  213.  */
  214. static DCTtab DCTtab0[60] =
  215. {
  216. {65,0,6}, {65,0,6}, {65,0,6}, {65,0,6}, /* Escape */
  217. {2,2,7}, {2,2,7}, {9,1,7}, {9,1,7},
  218. {0,4,7}, {0,4,7}, {8,1,7}, {8,1,7},
  219. {7,1,6}, {7,1,6}, {7,1,6}, {7,1,6},
  220. {6,1,6}, {6,1,6}, {6,1,6}, {6,1,6},
  221. {1,2,6}, {1,2,6}, {1,2,6}, {1,2,6},
  222. {5,1,6}, {5,1,6}, {5,1,6}, {5,1,6},
  223. {13,1,8}, {0,6,8}, {12,1,8}, {11,1,8},
  224. {3,2,8}, {1,3,8}, {0,5,8}, {10,1,8},
  225. {0,3,5}, {0,3,5}, {0,3,5}, {0,3,5},
  226. {0,3,5}, {0,3,5}, {0,3,5}, {0,3,5},
  227. {4,1,5}, {4,1,5}, {4,1,5}, {4,1,5},
  228. {4,1,5}, {4,1,5}, {4,1,5}, {4,1,5},
  229. {3,1,5}, {3,1,5}, {3,1,5}, {3,1,5},
  230. {3,1,5}, {3,1,5}, {3,1,5}, {3,1,5}
  231. };
  232. /* Table B-15, DCT coefficients table one,
  233.  * codes 000001xx ... 11111111
  234. */
  235. static DCTtab DCTtab0a[252] =
  236. {
  237. {65,0,6}, {65,0,6}, {65,0,6}, {65,0,6}, /* Escape */
  238. {7,1,7}, {7,1,7}, {8,1,7}, {8,1,7},
  239. {6,1,7}, {6,1,7}, {2,2,7}, {2,2,7},
  240. {0,7,6}, {0,7,6}, {0,7,6}, {0,7,6},
  241. {0,6,6}, {0,6,6}, {0,6,6}, {0,6,6},
  242. {4,1,6}, {4,1,6}, {4,1,6}, {4,1,6},
  243. {5,1,6}, {5,1,6}, {5,1,6}, {5,1,6},
  244. {1,5,8}, {11,1,8}, {0,11,8}, {0,10,8},
  245. {13,1,8}, {12,1,8}, {3,2,8}, {1,4,8},
  246. {2,1,5}, {2,1,5}, {2,1,5}, {2,1,5},
  247. {2,1,5}, {2,1,5}, {2,1,5}, {2,1,5},
  248. {1,2,5}, {1,2,5}, {1,2,5}, {1,2,5},
  249. {1,2,5}, {1,2,5}, {1,2,5}, {1,2,5},
  250. {3,1,5}, {3,1,5}, {3,1,5}, {3,1,5},
  251. {3,1,5}, {3,1,5}, {3,1,5}, {3,1,5},
  252. {1,1,3}, {1,1,3}, {1,1,3}, {1,1,3},
  253. {1,1,3}, {1,1,3}, {1,1,3}, {1,1,3},
  254. {1,1,3}, {1,1,3}, {1,1,3}, {1,1,3},
  255. {1,1,3}, {1,1,3}, {1,1,3}, {1,1,3},
  256. {1,1,3}, {1,1,3}, {1,1,3}, {1,1,3},
  257. {1,1,3}, {1,1,3}, {1,1,3}, {1,1,3},
  258. {1,1,3}, {1,1,3}, {1,1,3}, {1,1,3},
  259. {1,1,3}, {1,1,3}, {1,1,3}, {1,1,3},
  260. {64,0,4}, {64,0,4}, {64,0,4}, {64,0,4}, /* EOB */
  261. {64,0,4}, {64,0,4}, {64,0,4}, {64,0,4},
  262. {64,0,4}, {64,0,4}, {64,0,4}, {64,0,4},
  263. {64,0,4}, {64,0,4}, {64,0,4}, {64,0,4},
  264. {0,3,4}, {0,3,4}, {0,3,4}, {0,3,4},
  265. {0,3,4}, {0,3,4}, {0,3,4}, {0,3,4},
  266. {0,3,4}, {0,3,4}, {0,3,4}, {0,3,4},
  267. {0,3,4}, {0,3,4}, {0,3,4}, {0,3,4},
  268. {0,1,2}, {0,1,2}, {0,1,2}, {0,1,2},
  269. {0,1,2}, {0,1,2}, {0,1,2}, {0,1,2},
  270. {0,1,2}, {0,1,2}, {0,1,2}, {0,1,2},
  271. {0,1,2}, {0,1,2}, {0,1,2}, {0,1,2},
  272. {0,1,2}, {0,1,2}, {0,1,2}, {0,1,2},
  273. {0,1,2}, {0,1,2}, {0,1,2}, {0,1,2},
  274. {0,1,2}, {0,1,2}, {0,1,2}, {0,1,2},
  275. {0,1,2}, {0,1,2}, {0,1,2}, {0,1,2},
  276. {0,1,2}, {0,1,2}, {0,1,2}, {0,1,2},
  277. {0,1,2}, {0,1,2}, {0,1,2}, {0,1,2},
  278. {0,1,2}, {0,1,2}, {0,1,2}, {0,1,2},
  279. {0,1,2}, {0,1,2}, {0,1,2}, {0,1,2},
  280. {0,1,2}, {0,1,2}, {0,1,2}, {0,1,2},
  281. {0,1,2}, {0,1,2}, {0,1,2}, {0,1,2},
  282. {0,1,2}, {0,1,2}, {0,1,2}, {0,1,2},
  283. {0,1,2}, {0,1,2}, {0,1,2}, {0,1,2},
  284. {0,2,3}, {0,2,3}, {0,2,3}, {0,2,3},
  285. {0,2,3}, {0,2,3}, {0,2,3}, {0,2,3},
  286. {0,2,3}, {0,2,3}, {0,2,3}, {0,2,3},
  287. {0,2,3}, {0,2,3}, {0,2,3}, {0,2,3},
  288. {0,2,3}, {0,2,3}, {0,2,3}, {0,2,3},
  289. {0,2,3}, {0,2,3}, {0,2,3}, {0,2,3},
  290. {0,2,3}, {0,2,3}, {0,2,3}, {0,2,3},
  291. {0,2,3}, {0,2,3}, {0,2,3}, {0,2,3},
  292. {0,4,5}, {0,4,5}, {0,4,5}, {0,4,5},
  293. {0,4,5}, {0,4,5}, {0,4,5}, {0,4,5},
  294. {0,5,5}, {0,5,5}, {0,5,5}, {0,5,5},
  295. {0,5,5}, {0,5,5}, {0,5,5}, {0,5,5},
  296. {9,1,7}, {9,1,7}, {1,3,7}, {1,3,7},
  297. {10,1,7}, {10,1,7}, {0,8,7}, {0,8,7},
  298. {0,9,7}, {0,9,7}, {0,12,8}, {0,13,8},
  299. {2,3,8}, {4,2,8}, {0,14,8}, {0,15,8}
  300. };
  301. /* Table B-14, DCT coefficients table zero,
  302.  * codes 0000001000 ... 0000001111
  303.  */
  304. static DCTtab DCTtab1[8] =
  305. {
  306. {16,1,10}, {5,2,10}, {0,7,10}, {2,3,10},
  307. {1,4,10}, {15,1,10}, {14,1,10}, {4,2,10}
  308. };
  309. /* Table B-15, DCT coefficients table one,
  310.  * codes 000000100x ... 000000111x
  311.  */
  312. static DCTtab DCTtab1a[8] =
  313. {
  314. {5,2,9}, {5,2,9}, {14,1,9}, {14,1,9},
  315. {2,4,10}, {16,1,10}, {15,1,9}, {15,1,9}
  316. };
  317. /* Table B-14/15, DCT coefficients table zero / one,
  318.  * codes 000000010000 ... 000000011111
  319.  */
  320. static DCTtab DCTtab2[16] =
  321. {
  322. {0,11,12}, {8,2,12}, {4,3,12}, {0,10,12},
  323. {2,4,12}, {7,2,12}, {21,1,12}, {20,1,12},
  324. {0,9,12}, {19,1,12}, {18,1,12}, {1,5,12},
  325. {3,3,12}, {0,8,12}, {6,2,12}, {17,1,12}
  326. };
  327. /* Table B-14/15, DCT coefficients table zero / one,
  328.  * codes 0000000010000 ... 0000000011111
  329.  */
  330. static DCTtab DCTtab3[16] =
  331. {
  332. {10,2,13}, {9,2,13}, {5,3,13}, {3,4,13},
  333. {2,5,13}, {1,7,13}, {1,6,13}, {0,15,13},
  334. {0,14,13}, {0,13,13}, {0,12,13}, {26,1,13},
  335. {25,1,13}, {24,1,13}, {23,1,13}, {22,1,13}
  336. };
  337. /* Table B-14/15, DCT coefficients table zero / one,
  338.  * codes 00000000010000 ... 00000000011111
  339.  */
  340. static DCTtab DCTtab4[16] =
  341. {
  342. {0,31,14}, {0,30,14}, {0,29,14}, {0,28,14},
  343. {0,27,14}, {0,26,14}, {0,25,14}, {0,24,14},
  344. {0,23,14}, {0,22,14}, {0,21,14}, {0,20,14},
  345. {0,19,14}, {0,18,14}, {0,17,14}, {0,16,14}
  346. };
  347. /* Table B-14/15, DCT coefficients table zero / one,
  348.  * codes 000000000010000 ... 000000000011111
  349.  */
  350. static DCTtab DCTtab5[16] =
  351. {
  352. {0,40,15}, {0,39,15}, {0,38,15}, {0,37,15},
  353. {0,36,15}, {0,35,15}, {0,34,15}, {0,33,15},
  354. {0,32,15}, {1,14,15}, {1,13,15}, {1,12,15},
  355. {1,11,15}, {1,10,15}, {1,9,15}, {1,8,15}
  356. };
  357. /* Table B-14/15, DCT coefficients table zero / one,
  358.  * codes 0000000000010000 ... 0000000000011111
  359.  */
  360. static DCTtab DCTtab6[16] =
  361. {
  362. {1,18,16}, {1,17,16}, {1,16,16}, {1,15,16},
  363. {6,3,16}, {16,2,16}, {15,2,16}, {14,2,16},
  364. {13,2,16}, {12,2,16}, {11,2,16}, {31,1,16},
  365. {30,1,16}, {29,1,16}, {28,1,16}, {27,1,16}
  366. };
  367. /* Table B-3, macroblock_type in P-pictures, codes 001..1xx */
  368. static VLCtab PMBtab0[8] =
  369. {
  370. {ERROR_VALUE,0},
  371. {MACROBLOCK_MOTION_FORWARD,3},
  372. {MACROBLOCK_PATTERN,2}, {MACROBLOCK_PATTERN,2},
  373. {MACROBLOCK_MOTION_FORWARD|MACROBLOCK_PATTERN,1}, 
  374. {MACROBLOCK_MOTION_FORWARD|MACROBLOCK_PATTERN,1},
  375. {MACROBLOCK_MOTION_FORWARD|MACROBLOCK_PATTERN,1}, 
  376. {MACROBLOCK_MOTION_FORWARD|MACROBLOCK_PATTERN,1}
  377. };
  378. /* Table B-3, macroblock_type in P-pictures, codes 000001..00011x */
  379. static VLCtab PMBtab1[8] =
  380. {
  381. {ERROR_VALUE,0},
  382. {MACROBLOCK_QUANT|MACROBLOCK_INTRA,6},
  383. {MACROBLOCK_QUANT|MACROBLOCK_PATTERN,5}, {MACROBLOCK_QUANT|MACROBLOCK_PATTERN,5},
  384. {MACROBLOCK_QUANT|MACROBLOCK_MOTION_FORWARD|MACROBLOCK_PATTERN,5}, {MACROBLOCK_QUANT|MACROBLOCK_MOTION_FORWARD|MACROBLOCK_PATTERN,5},
  385. {MACROBLOCK_INTRA,5}, {MACROBLOCK_INTRA,5}
  386. };
  387. /* Table B-4, macroblock_type in B-pictures, codes 0010..11xx */
  388. static VLCtab BMBtab0[16] =
  389. {
  390. {ERROR_VALUE,0}, 
  391. {ERROR_VALUE,0},
  392. {MACROBLOCK_MOTION_FORWARD,4},
  393. {MACROBLOCK_MOTION_FORWARD|MACROBLOCK_PATTERN,4},
  394. {MACROBLOCK_MOTION_BACKWARD,3}, 
  395. {MACROBLOCK_MOTION_BACKWARD,3},
  396. {MACROBLOCK_MOTION_BACKWARD|MACROBLOCK_PATTERN,3}, 
  397. {MACROBLOCK_MOTION_BACKWARD|MACROBLOCK_PATTERN,3},
  398. {MACROBLOCK_MOTION_FORWARD|MACROBLOCK_MOTION_BACKWARD,2}, 
  399. {MACROBLOCK_MOTION_FORWARD|MACROBLOCK_MOTION_BACKWARD,2},
  400. {MACROBLOCK_MOTION_FORWARD|MACROBLOCK_MOTION_BACKWARD,2}, 
  401. {MACROBLOCK_MOTION_FORWARD|MACROBLOCK_MOTION_BACKWARD,2},
  402. {MACROBLOCK_MOTION_FORWARD|MACROBLOCK_MOTION_BACKWARD|MACROBLOCK_PATTERN,2},
  403. {MACROBLOCK_MOTION_FORWARD|MACROBLOCK_MOTION_BACKWARD|MACROBLOCK_PATTERN,2},
  404. {MACROBLOCK_MOTION_FORWARD|MACROBLOCK_MOTION_BACKWARD|MACROBLOCK_PATTERN,2},
  405. {MACROBLOCK_MOTION_FORWARD|MACROBLOCK_MOTION_BACKWARD|MACROBLOCK_PATTERN,2}
  406. };
  407. /* Table B-4, macroblock_type in B-pictures, codes 000001..00011x */
  408. static VLCtab BMBtab1[8] =
  409. {
  410. {ERROR_VALUE,0},
  411. {MACROBLOCK_QUANT|MACROBLOCK_INTRA,6},
  412. {MACROBLOCK_QUANT|MACROBLOCK_MOTION_BACKWARD|MACROBLOCK_PATTERN,6},
  413. {MACROBLOCK_QUANT|MACROBLOCK_MOTION_FORWARD|MACROBLOCK_PATTERN,6},
  414. {MACROBLOCK_QUANT|MACROBLOCK_MOTION_FORWARD|MACROBLOCK_MOTION_BACKWARD|MACROBLOCK_PATTERN,5},
  415. {MACROBLOCK_QUANT|MACROBLOCK_MOTION_FORWARD|MACROBLOCK_MOTION_BACKWARD|MACROBLOCK_PATTERN,5},
  416. {MACROBLOCK_INTRA,5}, 
  417. {MACROBLOCK_INTRA,5}
  418. };
  419. //
  420. // getbit
  421. //
  422. void CMPEG2Dec::Initialize_Buffer()
  423. {
  424. Rdptr = Rdbfr + BUFFER_SIZE;
  425. Rdmax = Rdptr;
  426. if (SystemStream_Flag)
  427. {
  428. if (Rdptr >= Rdmax)
  429. Next_Packet();
  430. CurrentBfr = *Rdptr++ << 24;
  431. if (Rdptr >= Rdmax)
  432. Next_Packet();
  433. CurrentBfr += *Rdptr++ << 16;
  434. if (Rdptr >= Rdmax)
  435. Next_Packet();
  436. CurrentBfr += *Rdptr++ << 8;
  437. if (Rdptr >= Rdmax)
  438. Next_Packet();
  439. CurrentBfr += *Rdptr++;
  440. Fill_Next();
  441. }
  442. else
  443. {
  444. Fill_Buffer();
  445. CurrentBfr = (*Rdptr << 24) + (*(Rdptr+1) << 16) + (*(Rdptr+2) << 8) + *(Rdptr+3);
  446. Rdptr += 4;
  447. Fill_Next();
  448. }
  449. BitsLeft = 32;
  450. }
  451. unsigned int CMPEG2Dec::Get_Bits_All(unsigned int N)
  452. {
  453. N -= BitsLeft;
  454. Val = (CurrentBfr << (32 - BitsLeft)) >> (32 - BitsLeft);
  455. if (N != 0)
  456. Val = (Val << N) + (NextBfr >> (32 - N));
  457. CurrentBfr = NextBfr;
  458. BitsLeft = 32 - N;
  459. Fill_Next();
  460. return Val;
  461. }
  462. void CMPEG2Dec::Flush_Buffer_All(unsigned int N)
  463. {
  464. CurrentBfr = NextBfr;
  465. BitsLeft = BitsLeft + 32 - N;
  466. Fill_Next();
  467. }
  468. void CMPEG2Dec::Next_Packet()
  469. {
  470. unsigned int code, Packet_Length, Packet_Header_Length;
  471. for (;;)
  472. {
  473. code = Get_Short();
  474. code = (code<<16) + Get_Short();
  475. // remove system layer byte stuffing
  476. while ((code & 0xffffff00) != 0x00000100)
  477. code = (code<<8) + Get_Byte();
  478. switch (code)
  479. {
  480. case PACK_START_CODE:
  481. Rdptr += 8;
  482. break;
  483. case VIDEO_ELEMENTARY_STREAM:   
  484. Packet_Length = Get_Short();
  485. Rdmax = Rdptr + Packet_Length;
  486. code = Get_Byte();
  487. if ((code & 0xc0)==0x80)
  488. {
  489. code = Get_Byte();
  490. Packet_Header_Length = Get_Byte();
  491. Rdptr += Packet_Header_Length;
  492. return;
  493. }
  494. else
  495. Rdptr += Packet_Length-1;
  496. break;
  497. default:
  498. if (code>=SYSTEM_START_CODE)
  499. {
  500. code = Get_Short();
  501. Rdptr += code;
  502. }
  503. break;
  504. }
  505. }
  506. }
  507. void CMPEG2Dec::Fill_Buffer()
  508. {
  509. Read = _read(Infile[File_Flag], Rdbfr, BUFFER_SIZE);
  510. if (Read < BUFFER_SIZE)
  511. Next_File();
  512. if (KeyOp_Flag && (Rdbfr[20] & 0x10))
  513. {
  514. BufferOp(Rdbfr, lfsr0, lfsr1);
  515. Rdbfr[20] &= ~0x10;
  516. }
  517. Rdptr = Rdbfr;
  518. if (SystemStream_Flag)
  519. Rdmax -= BUFFER_SIZE;
  520. }
  521. void CMPEG2Dec::Next_File()
  522. {
  523. if (File_Flag < File_Limit-1)
  524. File_Flag ++;
  525. _lseeki64(Infile[File_Flag], 0, SEEK_SET);
  526. _read(Infile[File_Flag], Rdbfr + Read, BUFFER_SIZE - Read);
  527. }
  528. unsigned int CMPEG2Dec::Show_Bits(unsigned int N)
  529. {
  530. if (N <= BitsLeft)
  531. return (CurrentBfr << (32 - BitsLeft)) >> (32 - N);
  532. else
  533. {
  534. N -= BitsLeft;
  535. return (((CurrentBfr << (32 - BitsLeft)) >> (32 - BitsLeft)) << N) + (NextBfr >> (32 - N));
  536. }
  537. }
  538. unsigned int CMPEG2Dec::Get_Bits(unsigned int N)
  539. {
  540. if (N < BitsLeft)
  541. {
  542. Val = (CurrentBfr << (32 - BitsLeft)) >> (32 - N);
  543. BitsLeft -= N;
  544. return Val;
  545. }
  546. else
  547. return Get_Bits_All(N);
  548. }
  549. void CMPEG2Dec::Flush_Buffer(unsigned int N)
  550. {
  551. if (N < BitsLeft)
  552. BitsLeft -= N;
  553. else
  554. Flush_Buffer_All(N);
  555. }
  556. void CMPEG2Dec::Fill_Next()
  557. {
  558. if (SystemStream_Flag && Rdptr>=Rdmax-4)
  559. {
  560. if (Rdptr >= Rdmax)
  561. Next_Packet();
  562. NextBfr = Get_Byte() << 24;
  563. if (Rdptr >= Rdmax)
  564. Next_Packet();
  565. NextBfr += Get_Byte() << 16;
  566. if (Rdptr >= Rdmax)
  567. Next_Packet();
  568. NextBfr += Get_Byte() << 8;
  569. if (Rdptr >= Rdmax)
  570. Next_Packet();
  571. NextBfr += Get_Byte();
  572. }
  573. else if (Rdptr < Rdbfr+BUFFER_SIZE-4)
  574. {
  575. NextBfr = (*Rdptr << 24) + (*(Rdptr+1) << 16) + (*(Rdptr+2) << 8) + *(Rdptr+3);
  576. Rdptr += 4;
  577. }
  578. else
  579. {
  580. if (Rdptr >= Rdbfr+BUFFER_SIZE)
  581. Fill_Buffer();
  582. NextBfr = *Rdptr++ << 24;
  583. if (Rdptr >= Rdbfr+BUFFER_SIZE)
  584. Fill_Buffer();
  585. NextBfr += *Rdptr++ << 16;
  586. if (Rdptr >= Rdbfr+BUFFER_SIZE)
  587. Fill_Buffer();
  588. NextBfr += *Rdptr++ << 8;
  589. if (Rdptr >= Rdbfr+BUFFER_SIZE)
  590. Fill_Buffer();
  591. NextBfr += *Rdptr++;
  592. }
  593. }
  594. unsigned int CMPEG2Dec::Get_Byte()
  595. {
  596. while (Rdptr >= (Rdbfr + BUFFER_SIZE))
  597. {
  598. Read = _read(Infile[File_Flag], Rdbfr, BUFFER_SIZE);
  599. if (Read < BUFFER_SIZE)
  600. Next_File();
  601. if (KeyOp_Flag && (Rdbfr[20] & 0x10))
  602. {
  603. BufferOp(Rdbfr, lfsr0, lfsr1);
  604. Rdbfr[20] &= ~0x10;
  605. }
  606. Rdptr -= BUFFER_SIZE;
  607. Rdmax -= BUFFER_SIZE;
  608. }
  609. return *Rdptr++;
  610. }
  611. unsigned int CMPEG2Dec::Get_Short()
  612. {
  613. unsigned int i = Get_Byte();
  614. return (i<<8) + Get_Byte();
  615. }
  616. void CMPEG2Dec::next_start_code()
  617. {
  618. Flush_Buffer(BitsLeft & 7);
  619. while (Show_Bits(24) != 1)
  620. Flush_Buffer(8);
  621. }
  622. //
  623. // gethdr
  624. //
  625. int CMPEG2Dec::Get_Hdr()
  626. {
  627. for (;;)
  628. {
  629. /* look for next_start_code */
  630. next_start_code();
  631. switch (Get_Bits(32))
  632. {
  633. case SEQUENCE_HEADER_CODE:
  634. sequence_header();
  635. break;
  636. case GROUP_START_CODE:
  637. group_of_pictures_header();
  638. break;
  639. case PICTURE_START_CODE:
  640. picture_header();
  641. return 1;
  642. }
  643. }
  644. }
  645. /* decode group of pictures header */
  646. /* ISO/IEC 13818-2 section 6.2.2.6 */
  647. void CMPEG2Dec::group_of_pictures_header()
  648. {
  649. int gop_hour;
  650. int gop_minute;
  651. int gop_sec;
  652. int gop_frame;
  653. int drop_flag;
  654. int closed_gop;
  655. int broken_link;
  656. drop_flag   = Get_Bits(1);
  657. gop_hour    = Get_Bits(5);
  658. gop_minute  = Get_Bits(6);
  659. Flush_Buffer(1); // marker bit
  660. gop_sec     = Get_Bits(6);
  661. gop_frame = Get_Bits(6);
  662. closed_gop  = Get_Bits(1);
  663. broken_link = Get_Bits(1);
  664. extension_and_user_data();
  665. }
  666. /* decode picture header */
  667. /* ISO/IEC 13818-2 section 6.2.3 */
  668. void CMPEG2Dec::picture_header()
  669. {
  670. int vbv_delay;
  671. int full_pel_forward_vector;
  672. int forward_f_code;
  673. int full_pel_backward_vector;
  674. int backward_f_code;
  675. int Extra_Information_Byte_Count;
  676. temporal_reference  = Get_Bits(10);
  677. picture_coding_type = Get_Bits(3);
  678. vbv_delay           = Get_Bits(16);
  679. if (picture_coding_type==P_TYPE || picture_coding_type==B_TYPE)
  680. {
  681. full_pel_forward_vector = Get_Bits(1);
  682. forward_f_code = Get_Bits(3);
  683. }
  684. if (picture_coding_type==B_TYPE)
  685. {
  686. full_pel_backward_vector = Get_Bits(1);
  687. backward_f_code = Get_Bits(3);
  688. }
  689. Extra_Information_Byte_Count = extra_bit_information();
  690. extension_and_user_data();
  691. }
  692. /* decode sequence header */
  693. void CMPEG2Dec::sequence_header()
  694. {
  695. int frame_rate_code;
  696. int vbv_buffer_size;
  697. int aspect_ratio_information;
  698. int bit_rate_value;
  699. int constrained_parameters_flag;
  700. int i;
  701. horizontal_size             = Get_Bits(12);
  702. vertical_size               = Get_Bits(12);
  703. aspect_ratio_information    = Get_Bits(4);
  704. frame_rate_code             = Get_Bits(4);
  705. bit_rate_value              = Get_Bits(18);
  706. Flush_Buffer(1); // marker bit
  707. vbv_buffer_size             = Get_Bits(10);
  708. constrained_parameters_flag = Get_Bits(1);
  709. if (load_intra_quantizer_matrix = Get_Bits(1))
  710. {
  711. for (i=0; i<64; i++)
  712. intra_quantizer_matrix[scan[ZIG_ZAG][i]] = Get_Bits(8);
  713. }
  714. else
  715. {
  716. for (i=0; i<64; i++)
  717. intra_quantizer_matrix[i] = default_intra_quantizer_matrix[i];
  718. }
  719. if (load_non_intra_quantizer_matrix = Get_Bits(1))
  720. {
  721. for (i=0; i<64; i++)
  722. non_intra_quantizer_matrix[scan[ZIG_ZAG][i]] = Get_Bits(8);
  723. }
  724. else
  725. {
  726. for (i=0; i<64; i++)
  727. non_intra_quantizer_matrix[i] = 16;
  728. }
  729. /* copy luminance to chrominance matrices */
  730. for (i=0; i<64; i++)
  731. {
  732. chroma_intra_quantizer_matrix[i] = intra_quantizer_matrix[i];
  733. chroma_non_intra_quantizer_matrix[i] = non_intra_quantizer_matrix[i];
  734. }
  735. extension_and_user_data();
  736. }
  737. /* decode slice header */
  738. /* ISO/IEC 13818-2 section 6.2.4 */
  739. int CMPEG2Dec::slice_header()
  740. {
  741. int slice_vertical_position_extension;
  742. int quantizer_scale_code;
  743. int slice_picture_id_enable = 0;
  744. int slice_picture_id = 0;
  745. int extra_information_slice = 0;
  746. slice_vertical_position_extension = vertical_size>2800 ? Get_Bits(3) : 0;
  747. quantizer_scale_code = Get_Bits(5);
  748. quantizer_scale = q_scale_type ? Non_Linear_quantizer_scale[quantizer_scale_code] : quantizer_scale_code<<1;
  749. /* slice_id introduced in March 1995 as part of the video corridendum
  750.    (after the IS was drafted in November 1994) */
  751. if (Get_Bits(1))
  752. {
  753. Get_Bits(1); // intra slice
  754. slice_picture_id_enable = Get_Bits(1);
  755. slice_picture_id = Get_Bits(6);
  756. extra_information_slice = extra_bit_information();
  757. }
  758. return slice_vertical_position_extension;
  759. }
  760. /* decode extension and user data */
  761. /* ISO/IEC 13818-2 section 6.2.2.2 */
  762. void CMPEG2Dec::extension_and_user_data()
  763. {
  764. int code, ext_ID;
  765. next_start_code();
  766. while ((code = Show_Bits(32))==EXTENSION_START_CODE || code==USER_DATA_START_CODE)
  767. {
  768. if (code==EXTENSION_START_CODE)
  769. {
  770. Flush_Buffer(32);
  771. ext_ID = Get_Bits(4);
  772. switch (ext_ID)
  773. {
  774. case SEQUENCE_EXTENSION_ID:
  775. sequence_extension();
  776. break;
  777. case SEQUENCE_DISPLAY_EXTENSION_ID:
  778. sequence_display_extension();
  779. break;
  780. case QUANT_MATRIX_EXTENSION_ID:
  781. quant_matrix_extension();
  782. break;
  783. case PICTURE_DISPLAY_EXTENSION_ID:
  784. picture_display_extension();
  785. break;
  786. case PICTURE_CODING_EXTENSION_ID:
  787. picture_coding_extension();
  788. break;
  789. case COPYRIGHT_EXTENSION_ID:
  790. copyright_extension();
  791. break;
  792. }
  793. next_start_code();
  794. }
  795. else
  796. {
  797. Flush_Buffer(32);
  798. next_start_code();
  799. }
  800. }
  801. }
  802. /* decode sequence extension */
  803. /* ISO/IEC 13818-2 section 6.2.2.3 */
  804. void CMPEG2Dec::sequence_extension()
  805. {
  806. int profile_and_level_indication;
  807. int low_delay;
  808. int frame_rate_extension_n;
  809. int frame_rate_extension_d;
  810. int horizontal_size_extension;
  811. int vertical_size_extension;
  812. int bit_rate_extension;
  813. int vbv_buffer_size_extension;
  814. profile_and_level_indication = Get_Bits(8);
  815. progressive_sequence         = Get_Bits(1);
  816. chroma_format                = Get_Bits(2);
  817. horizontal_size_extension    = Get_Bits(2);
  818. vertical_size_extension      = Get_Bits(2);
  819. bit_rate_extension           = Get_Bits(12);
  820. Flush_Buffer(1); // marker bit
  821. vbv_buffer_size_extension    = Get_Bits(8);
  822. low_delay                    = Get_Bits(1);
  823.  
  824. frame_rate_extension_n       = Get_Bits(2);
  825. frame_rate_extension_d       = Get_Bits(5);
  826. horizontal_size = (horizontal_size_extension<<12) | (horizontal_size&0x0fff);
  827. vertical_size = (vertical_size_extension<<12) | (vertical_size&0x0fff);
  828. }
  829. /* decode sequence display extension */
  830. void CMPEG2Dec::sequence_display_extension()
  831. {
  832. int video_format;  
  833. int color_description;
  834. int color_primaries;
  835. int transfer_characteristics;
  836. int matrix_coefficients;
  837. int display_horizontal_size;
  838. int display_vertical_size;
  839. video_format      = Get_Bits(3);
  840. color_description = Get_Bits(1);
  841. if (color_description)
  842. {
  843. color_primaries          = Get_Bits(8);
  844. transfer_characteristics = Get_Bits(8);
  845. matrix_coefficients      = Get_Bits(8);
  846. }
  847. display_horizontal_size = Get_Bits(14);
  848. Flush_Buffer(1); // marker bit
  849. display_vertical_size   = Get_Bits(14);
  850. }
  851. /* decode quant matrix entension */
  852. /* ISO/IEC 13818-2 section 6.2.3.2 */
  853. void CMPEG2Dec::quant_matrix_extension()
  854. {
  855. int i;
  856. if (load_intra_quantizer_matrix = Get_Bits(1))
  857. for (i=0; i<64; i++)
  858. chroma_intra_quantizer_matrix[scan[ZIG_ZAG][i]]
  859. = intra_quantizer_matrix[scan[ZIG_ZAG][i]] = Get_Bits(8);
  860. if (load_non_intra_quantizer_matrix = Get_Bits(1))
  861. for (i=0; i<64; i++)
  862. chroma_non_intra_quantizer_matrix[scan[ZIG_ZAG][i]]
  863. = non_intra_quantizer_matrix[scan[ZIG_ZAG][i]] = Get_Bits(8);
  864. if (load_chroma_intra_quantizer_matrix = Get_Bits(1))
  865. for (i=0; i<64; i++)
  866. chroma_intra_quantizer_matrix[scan[ZIG_ZAG][i]] = Get_Bits(8);
  867. if (load_chroma_non_intra_quantizer_matrix = Get_Bits(1))
  868. for (i=0; i<64; i++)
  869. chroma_non_intra_quantizer_matrix[scan[ZIG_ZAG][i]] = Get_Bits(8);
  870. }
  871. /* decode picture display extension */
  872. /* ISO/IEC 13818-2 section 6.2.3.3. */
  873. void CMPEG2Dec::picture_display_extension()
  874. {
  875. int frame_center_horizontal_offset[3];
  876. int frame_center_vertical_offset[3];
  877. int i;
  878. int number_of_frame_center_offsets;
  879. /* based on ISO/IEC 13818-2 section 6.3.12 
  880.    (November 1994) Picture display extensions */
  881. /* derive number_of_frame_center_offsets */
  882. if (progressive_sequence)
  883. {
  884. if (repeat_first_field)
  885. {
  886. if (top_field_first)
  887. number_of_frame_center_offsets = 3;
  888. else
  889. number_of_frame_center_offsets = 2;
  890. }
  891. else
  892. number_of_frame_center_offsets = 1;
  893. }
  894. else
  895. {
  896. if (picture_structure!=FRAME_PICTURE)
  897. number_of_frame_center_offsets = 1;
  898. else
  899. {
  900. if (repeat_first_field)
  901. number_of_frame_center_offsets = 3;
  902. else
  903. number_of_frame_center_offsets = 2;
  904. }
  905. }
  906. /* now parse */
  907. for (i=0; i<number_of_frame_center_offsets; i++)
  908. {
  909. frame_center_horizontal_offset[i] = Get_Bits(16);
  910. Flush_Buffer(1); // marker bit
  911. frame_center_vertical_offset[i] = Get_Bits(16);
  912. Flush_Buffer(1); // marker bit
  913. }
  914. }
  915. /* decode picture coding extension */
  916. void CMPEG2Dec::picture_coding_extension()
  917. {
  918. int chroma_420_type;
  919. int composite_display_flag;
  920. int v_axis;
  921. int field_sequence;
  922. int sub_carrier;
  923. int burst_amplitude;
  924. int sub_carrier_phase;
  925. f_code[0][0] = Get_Bits(4);
  926. f_code[0][1] = Get_Bits(4);
  927. f_code[1][0] = Get_Bits(4);
  928. f_code[1][1] = Get_Bits(4);
  929. intra_dc_precision         = Get_Bits(2);
  930. picture_structure          = Get_Bits(2);
  931. top_field_first            = Get_Bits(1);
  932. frame_pred_frame_dct       = Get_Bits(1);
  933. concealment_motion_vectors = Get_Bits(1);
  934. q_scale_type    = Get_Bits(1);
  935. intra_vlc_format           = Get_Bits(1);
  936. alternate_scan    = Get_Bits(1);
  937. repeat_first_field         = Get_Bits(1);
  938. chroma_420_type            = Get_Bits(1);
  939. progressive_frame          = Get_Bits(1);
  940. composite_display_flag     = Get_Bits(1);
  941. pf_current = progressive_frame;
  942. if (composite_display_flag)
  943. {
  944. v_axis            = Get_Bits(1);
  945. field_sequence    = Get_Bits(3);
  946. sub_carrier       = Get_Bits(1);
  947. burst_amplitude   = Get_Bits(7);
  948. sub_carrier_phase = Get_Bits(8);
  949. }
  950. }
  951. /* decode extra bit information */
  952. /* ISO/IEC 13818-2 section 6.2.3.4. */
  953. int CMPEG2Dec::extra_bit_information()
  954. {
  955. int Byte_Count = 0;
  956. while (Get_Bits(1))
  957. {
  958. Flush_Buffer(8);
  959. Byte_Count ++;
  960. }
  961. return(Byte_Count);
  962. }
  963. /* Copyright extension */
  964. /* ISO/IEC 13818-2 section 6.2.3.6. */
  965. /* (header added in November, 1994 to the IS document) */
  966. void CMPEG2Dec::copyright_extension()
  967. {
  968. int copyright_flag;
  969. int copyright_identifier;
  970. int original_or_copy;
  971. int copyright_number_1;
  972. int copyright_number_2;
  973. int copyright_number_3;
  974. int reserved_data;
  975. copyright_flag =       Get_Bits(1); 
  976. copyright_identifier = Get_Bits(8);
  977. original_or_copy =     Get_Bits(1);
  978.   
  979. /* reserved */
  980. reserved_data = Get_Bits(7);
  981. Flush_Buffer(1); // marker bit
  982. copyright_number_1 =   Get_Bits(20);
  983. Flush_Buffer(1); // marker bit
  984. copyright_number_2 =   Get_Bits(22);
  985. Flush_Buffer(1); // marker bit
  986. copyright_number_3 =   Get_Bits(22);
  987. }
  988. //
  989. // getpic
  990. //
  991. static const unsigned char cc_table[12] = {
  992. 0, 0, 0, 0, 1, 2, 1, 2, 1, 2, 1, 2
  993. };
  994. void CMPEG2Dec::Decode_Picture(int ref, unsigned char *dst, int pitch)
  995. {
  996. if (picture_structure==FRAME_PICTURE && Second_Field)
  997. Second_Field = 0;
  998. if (picture_coding_type!=B_TYPE)
  999. {
  1000. pf_forward = pf_backward;
  1001. pf_backward = pf_current;
  1002. }
  1003. Update_Picture_Buffers();
  1004. picture_data();
  1005. if (ref && (picture_structure==FRAME_PICTURE || Second_Field))
  1006. {
  1007. if (picture_coding_type==B_TYPE)
  1008. assembleFrame(auxframe, pf_current, dst, pitch);
  1009. else
  1010. assembleFrame(forward_reference_frame, pf_forward, dst, pitch);
  1011. }
  1012. if (picture_structure!=FRAME_PICTURE)
  1013. Second_Field = !Second_Field;
  1014. }
  1015. /* reuse old picture buffers as soon as they are no longer needed */
  1016. void CMPEG2Dec::Update_Picture_Buffers()
  1017. {                           
  1018. int cc;              /* color component index */
  1019. unsigned char *tmp;  /* temporary swap pointer */
  1020. for (cc=0; cc<3; cc++)
  1021. {
  1022. /* B pictures  do not need to be save for future reference */
  1023. if (picture_coding_type==B_TYPE)
  1024. current_frame[cc] = auxframe[cc];
  1025. else
  1026. {
  1027. if (!Second_Field)
  1028. {
  1029. /* only update at the beginning of the coded frame */
  1030. tmp = forward_reference_frame[cc];
  1031. /* the previously decoded reference frame is stored coincident with the 
  1032.    location where the backward reference frame is stored (backwards 
  1033.    prediction is not needed in P pictures) */
  1034. forward_reference_frame[cc] = backward_reference_frame[cc];
  1035. /* update pointer for potential future B pictures */
  1036. backward_reference_frame[cc] = tmp;
  1037. }
  1038. /* can erase over old backward reference frame since it is not used
  1039.    in a P picture, and since any subsequent B pictures will use the 
  1040.    previously decoded I or P frame as the backward_reference_frame */
  1041. current_frame[cc] = backward_reference_frame[cc];
  1042. }
  1043.     if (picture_structure==BOTTOM_FIELD)
  1044. current_frame[cc] += (cc==0) ? Coded_Picture_Width : Chroma_Width;
  1045. }
  1046. }
  1047. /* decode all macroblocks of the current picture */
  1048. /* stages described in ISO/IEC 13818-2 section 7 */
  1049. void CMPEG2Dec::picture_data()
  1050. {
  1051. int MBAmax;
  1052. /* number of macroblocks per picture */
  1053. MBAmax = mb_width*mb_height;
  1054. if (picture_structure!=FRAME_PICTURE)
  1055. MBAmax>>=1;
  1056. for (;;)
  1057. if (slice(MBAmax)<0)
  1058. return;
  1059. }
  1060. /* decode all macroblocks of the current picture */
  1061. /* ISO/IEC 13818-2 section 6.3.16 */
  1062. /* return 0 : go to next slice */
  1063. /* return -1: go to next picture */
  1064. int CMPEG2Dec::slice(int MBAmax)
  1065. {
  1066. int MBA = 0, MBAinc =0, macroblock_type, motion_type, dct_type, ret;
  1067. int dc_dct_pred[3], PMV[2][2][2], motion_vertical_field_select[2][2], dmvector[2];
  1068. if ((ret=start_of_slice(&MBA, &MBAinc, dc_dct_pred, PMV))!=1)
  1069. return ret;
  1070. for (;;)
  1071. {
  1072. /* this is how we properly exit out of picture */
  1073. if (MBA>=MBAmax) return -1; // all macroblocks decoded
  1074. if (MBAinc==0)
  1075. {
  1076. if (!Show_Bits(23) || Fault_Flag) // next_start_code or fault
  1077. {
  1078. resync:
  1079. Fault_Flag = 0;
  1080. return 0; // trigger: go to next slice
  1081. }
  1082. else /* neither next_start_code nor Fault_Flag */
  1083. {
  1084. /* decode macroblock address increment */
  1085. MBAinc = Get_macroblock_address_increment();
  1086. if (Fault_Flag) goto resync;
  1087. }
  1088. }
  1089. if (MBAinc==1) /* not skipped */
  1090. {
  1091. if (!decode_macroblock(&macroblock_type, &motion_type, &dct_type, PMV,
  1092. dc_dct_pred, motion_vertical_field_select, dmvector))
  1093. goto resync;
  1094. }
  1095. else /* MBAinc!=1: skipped macroblock */
  1096. /* ISO/IEC 13818-2 section 7.6.6 */
  1097. skipped_macroblock(dc_dct_pred, PMV, &motion_type, motion_vertical_field_select, &macroblock_type);
  1098. /* ISO/IEC 13818-2 section 7.6 */
  1099. motion_compensation(MBA, macroblock_type, motion_type, PMV,
  1100. motion_vertical_field_select, dmvector, dct_type);
  1101. /* advance to next macroblock */
  1102. MBA++; MBAinc--;
  1103. if (MBA>=MBAmax) return -1; // all macroblocks decoded
  1104. }
  1105. }
  1106. /* ISO/IEC 13818-2 section 6.3.17.1: Macroblock modes */
  1107. void CMPEG2Dec::macroblock_modes(int *pmacroblock_type, int *pmotion_type,
  1108.  int *pmotion_vector_count, int *pmv_format,
  1109.  int *pdmv, int *pmvscale, int *pdct_type)
  1110. {
  1111. int macroblock_type, motion_type = 0, motion_vector_count;
  1112. int mv_format, dmv, mvscale, dct_type;
  1113. /* get macroblock_type */
  1114. macroblock_type = Get_macroblock_type();
  1115. if (Fault_Flag) return;
  1116. /* get frame/field motion type */
  1117. if (macroblock_type & (MACROBLOCK_MOTION_FORWARD|MACROBLOCK_MOTION_BACKWARD))
  1118. {
  1119. if (picture_structure==FRAME_PICTURE)
  1120. motion_type = frame_pred_frame_dct ? MC_FRAME : Get_Bits(2);
  1121. else
  1122. motion_type = Get_Bits(2);
  1123.     }
  1124. else if ((macroblock_type & MACROBLOCK_INTRA) && concealment_motion_vectors)
  1125. motion_type = (picture_structure==FRAME_PICTURE) ? MC_FRAME : MC_FIELD;
  1126. /* derive motion_vector_count, mv_format and dmv, (table 6-17, 6-18) */
  1127. if (picture_structure==FRAME_PICTURE)
  1128. {
  1129. motion_vector_count = (motion_type==MC_FIELD) ? 2 : 1;
  1130. mv_format = (motion_type==MC_FRAME) ? MV_FRAME : MV_FIELD;
  1131. }
  1132. else
  1133. {
  1134. motion_vector_count = (motion_type==MC_16X8) ? 2 : 1;
  1135. mv_format = MV_FIELD;
  1136. }
  1137. dmv = (motion_type==MC_DMV); /* dual prime */
  1138. /*
  1139.    field mv predictions in frame pictures have to be scaled
  1140.    ISO/IEC 13818-2 section 7.6.3.1 Decoding the motion vectors
  1141. */
  1142. mvscale = (mv_format==MV_FIELD && picture_structure==FRAME_PICTURE);
  1143. /* get dct_type (frame DCT / field DCT) */
  1144. dct_type = (picture_structure==FRAME_PICTURE) && (!frame_pred_frame_dct)
  1145. && (macroblock_type & (MACROBLOCK_PATTERN|MACROBLOCK_INTRA)) ? Get_Bits(1) : 0;
  1146. /* return values */
  1147. *pmacroblock_type = macroblock_type;
  1148. *pmotion_type = motion_type;
  1149. *pmotion_vector_count = motion_vector_count;
  1150. *pmv_format = mv_format;
  1151. *pdmv = dmv;
  1152. *pmvscale = mvscale;
  1153. *pdct_type = dct_type;
  1154. }
  1155. /* move/add 8x8-Block from block[comp] to backward_reference_frame */
  1156. /* copy reconstructed 8x8 block from block[comp] to current_frame[]
  1157.    ISO/IEC 13818-2 section 7.6.8: Adding prediction and coefficient data
  1158.    This stage also embodies some of the operations implied by:
  1159.    - ISO/IEC 13818-2 section 7.6.7: Combining predictions
  1160.    - ISO/IEC 13818-2 section 6.1.3: Macroblock
  1161. */
  1162. void CMPEG2Dec::Add_Block(int count, int bx, int by, int dct_type, int addflag)
  1163. {
  1164. static const __int64 mmmask_128 = 0x0080008000800080;
  1165. int comp, cc, iincr, bxh, byh;
  1166. unsigned char *rfp;
  1167. short *Block_Ptr;
  1168. for (comp=0; comp<count; comp++)
  1169. {
  1170. Block_Ptr = block[comp];
  1171. cc = cc_table[comp];
  1172. bxh = bx; byh = by;
  1173. if (cc==0)
  1174. {
  1175. if (picture_structure==FRAME_PICTURE)
  1176. {
  1177. if (dct_type)
  1178. {
  1179. rfp = current_frame[0] + Coded_Picture_Width*(by+((comp&2)>>1)) + bx + ((comp&1)<<3);
  1180. iincr = Coded_Picture_Width<<1;
  1181. }
  1182. else
  1183. {
  1184. rfp = current_frame[0] + Coded_Picture_Width*(by+((comp&2)<<2)) + bx + ((comp&1)<<3);
  1185. iincr = Coded_Picture_Width;
  1186. }
  1187. }
  1188. else
  1189. {
  1190. rfp = current_frame[0] + (Coded_Picture_Width<<1)*(by+((comp&2)<<2)) + bx + ((comp&1)<<3);
  1191. iincr = Coded_Picture_Width<<1;
  1192. }
  1193. }
  1194. else
  1195. {
  1196. if (chroma_format!=CHROMA444)
  1197. bxh >>= 1;
  1198. if (chroma_format==CHROMA420)
  1199. byh >>= 1;
  1200. if (picture_structure==FRAME_PICTURE)
  1201. {
  1202. if (dct_type && chroma_format!=CHROMA420)
  1203. {
  1204. /* field DCT coding */
  1205. rfp = current_frame[cc] + Chroma_Width*(byh+((comp&2)>>1)) + bxh + (comp&8);
  1206. iincr = Chroma_Width<<1;
  1207. }
  1208. else
  1209. {
  1210. /* frame DCT coding */
  1211. rfp = current_frame[cc] + Chroma_Width*(byh+((comp&2)<<2)) + bxh + (comp&8);
  1212. iincr = Chroma_Width;
  1213. }
  1214. }
  1215. else
  1216. {
  1217. /* field picture */
  1218. rfp = current_frame[cc] + (Chroma_Width<<1)*(byh+((comp&2)<<2)) + bxh + (comp&8);
  1219. iincr = Chroma_Width<<1;
  1220. }
  1221. }
  1222. if (addflag)
  1223. {
  1224. __asm
  1225. {
  1226. pxor mm0, mm0
  1227. mov eax, [rfp]
  1228. mov ebx, [Block_Ptr]
  1229. mov edi, 8
  1230. addon:
  1231. movq mm2, [ebx+8]
  1232. movq mm3, [eax]
  1233. movq mm4, mm3
  1234. movq mm1, [ebx]
  1235. punpckhbw mm3, mm0
  1236. paddsw mm3, mm2
  1237. packuswb mm3, mm0
  1238. punpcklbw mm4, mm0
  1239. psllq mm3, 32
  1240. paddsw mm4, mm1
  1241. packuswb mm4, mm0
  1242. por mm3, mm4
  1243. add ebx, 16
  1244. dec edi
  1245. movq [eax], mm3
  1246. add eax, [iincr]
  1247. cmp edi, 0x00
  1248. jg addon
  1249. }
  1250. }
  1251. else
  1252. {
  1253. __asm
  1254. {
  1255. mov eax, [rfp]
  1256. mov ebx, [Block_Ptr]
  1257. mov edi, 8
  1258. pxor mm0, mm0
  1259. movq mm7, [mmmask_128]
  1260. addoff:
  1261. movq mm3, [ebx+8]
  1262. movq mm4, [ebx]
  1263. paddsw mm3, mm7
  1264. paddsw mm4, mm7
  1265. packuswb mm3, mm0
  1266. packuswb mm4, mm0
  1267. psllq mm3, 32
  1268. por mm3, mm4
  1269. add ebx, 16
  1270. dec edi
  1271. movq [eax], mm3
  1272. add eax, [iincr]
  1273. cmp edi, 0x00
  1274. jg addoff
  1275. }
  1276. }
  1277. }
  1278. }
  1279. /* set scratch pad macroblock to zero */
  1280. void CMPEG2Dec::Clear_Block(int count)
  1281. {
  1282. int comp;
  1283. short *Block_Ptr;
  1284. for (comp=0; comp<count; comp++)
  1285. {
  1286. Block_Ptr = block[comp];
  1287. __asm
  1288. {
  1289. mov eax, [Block_Ptr];
  1290. pxor mm0, mm0;
  1291. movq [eax+0 ], mm0;
  1292. movq [eax+8 ], mm0;
  1293. movq [eax+16], mm0;
  1294. movq [eax+24], mm0;
  1295. movq [eax+32], mm0;
  1296. movq [eax+40], mm0;
  1297. movq [eax+48], mm0;
  1298. movq [eax+56], mm0;
  1299. movq [eax+64], mm0;
  1300. movq [eax+72], mm0;
  1301. movq [eax+80], mm0;
  1302. movq [eax+88], mm0;
  1303. movq [eax+96], mm0;
  1304. movq [eax+104],mm0;
  1305. movq [eax+112],mm0;
  1306. movq [eax+120],mm0;
  1307. }
  1308. }
  1309. }
  1310. /* ISO/IEC 13818-2 section 7.6 */
  1311. void CMPEG2Dec::motion_compensation(int MBA, int macroblock_type, int motion_type, 
  1312. int PMV[2][2][2], int motion_vertical_field_select[2][2],
  1313. int dmvector[2], int dct_type)
  1314. {
  1315. int bx, by;
  1316. int comp;
  1317. /* derive current macroblock position within picture */
  1318. /* ISO/IEC 13818-2 section 6.3.1.6 and 6.3.1.7 */
  1319. bx = 16*(MBA%mb_width);
  1320. by = 16*(MBA/mb_width);
  1321. /* motion compensation */
  1322. if (!(macroblock_type & MACROBLOCK_INTRA))
  1323. form_predictions(bx, by, macroblock_type, motion_type, PMV, 
  1324. motion_vertical_field_select, dmvector);
  1325. switch (IDCT_Flag)
  1326. {
  1327. case IDCT_MMX:
  1328. for (comp=0; comp<block_count; comp++)
  1329. MMX_IDCT(block[comp]);
  1330. break;
  1331. case IDCT_SSEMMX:
  1332. for (comp=0; comp<block_count; comp++)
  1333. SSEMMX_IDCT(block[comp]);
  1334. break;
  1335. case IDCT_FPU:
  1336. __asm emms;
  1337. for (comp=0; comp<block_count; comp++)
  1338. FPU_IDCT(block[comp]);
  1339. break;
  1340. case IDCT_REF:
  1341. __asm emms;
  1342. for (comp=0; comp<block_count; comp++)
  1343. REF_IDCT(block[comp]);
  1344. break;
  1345. }
  1346. Add_Block(block_count, bx, by, dct_type, (macroblock_type & MACROBLOCK_INTRA)==0);
  1347. }
  1348. /* ISO/IEC 13818-2 section 7.6.6 */
  1349. void CMPEG2Dec::skipped_macroblock(int dc_dct_pred[3], int PMV[2][2][2], int *motion_type, 
  1350.    int motion_vertical_field_select[2][2], int *macroblock_type)
  1351. {
  1352. Clear_Block(block_count);
  1353. /* reset intra_dc predictors */
  1354. /* ISO/IEC 13818-2 section 7.2.1: DC coefficients in intra blocks */
  1355. dc_dct_pred[0]=dc_dct_pred[1]=dc_dct_pred[2]=0;
  1356. /* reset motion vector predictors */
  1357. /* ISO/IEC 13818-2 section 7.6.3.4: Resetting motion vector predictors */
  1358. if (picture_coding_type==P_TYPE)
  1359. PMV[0][0][0]=PMV[0][0][1]=PMV[1][0][0]=PMV[1][0][1]=0;
  1360. /* derive motion_type */
  1361. if (picture_structure==FRAME_PICTURE)
  1362. *motion_type = MC_FRAME;
  1363. else
  1364. {
  1365. *motion_type = MC_FIELD;
  1366. motion_vertical_field_select[0][0] = motion_vertical_field_select[0][1] = 
  1367. (picture_structure==BOTTOM_FIELD);
  1368. }
  1369. /* clear MACROBLOCK_INTRA */
  1370. *macroblock_type&= ~MACROBLOCK_INTRA;
  1371. }
  1372. /* return==-1 means go to next picture */
  1373. /* the expression "start of slice" is used throughout the normative
  1374.    body of the MPEG specification */
  1375. int CMPEG2Dec::start_of_slice(int *MBA, int *MBAinc,
  1376.   int dc_dct_pred[3], int PMV[2][2][2])
  1377. {
  1378. unsigned int code;
  1379. int slice_vert_pos_ext;
  1380. next_start_code();
  1381. code = Get_Bits(32);
  1382. if (code<SLICE_START_CODE_MIN || code>SLICE_START_CODE_MAX)
  1383. {
  1384. // only slice headers are allowed in picture_data
  1385. Fault_Flag = 10;
  1386. return -1;
  1387. }
  1388. /* decode slice header (may change quantizer_scale) */
  1389. slice_vert_pos_ext = slice_header();
  1390. /* decode macroblock address increment */
  1391. *MBAinc = Get_macroblock_address_increment();
  1392. if (Fault_Flag) return -1;
  1393. /* set current location */
  1394. /* NOTE: the arithmetic used to derive macroblock_address below is
  1395.    equivalent to ISO/IEC 13818-2 section 6.3.17: Macroblock */
  1396. *MBA = ((slice_vert_pos_ext<<7) + (code&255) - 1)*mb_width + *MBAinc - 1;
  1397. *MBAinc = 1; // first macroblock in slice: not skipped
  1398. /* reset all DC coefficient and motion vector predictors */
  1399. /* ISO/IEC 13818-2 section 7.2.1: DC coefficients in intra blocks */
  1400. dc_dct_pred[0]=dc_dct_pred[1]=dc_dct_pred[2]=0;
  1401.   
  1402. /* ISO/IEC 13818-2 section 7.6.3.4: Resetting motion vector predictors */
  1403. PMV[0][0][0]=PMV[0][0][1]=PMV[1][0][0]=PMV[1][0][1]=0;
  1404. PMV[0][1][0]=PMV[0][1][1]=PMV[1][1][0]=PMV[1][1][1]=0;
  1405. /* successfull: trigger decode macroblocks in slice */
  1406. return 1;
  1407. }
  1408. /* ISO/IEC 13818-2 sections 7.2 through 7.5 */
  1409. int CMPEG2Dec::decode_macroblock(int *macroblock_type, int *motion_type, int *dct_type,
  1410.  int PMV[2][2][2], int dc_dct_pred[3], 
  1411.  int motion_vertical_field_select[2][2], int dmvector[2])
  1412. {
  1413. int quantizer_scale_code, comp, motion_vector_count, mv_format; 
  1414. int dmv, mvscale, coded_block_pattern;
  1415. /* ISO/IEC 13818-2 section 6.3.17.1: Macroblock modes */
  1416. macroblock_modes(macroblock_type, motion_type, &motion_vector_count, &mv_format,
  1417.  &dmv, &mvscale, dct_type);
  1418. if (Fault_Flag) return 0; // trigger: go to next slice
  1419. if (*macroblock_type & MACROBLOCK_QUANT)
  1420. {
  1421. quantizer_scale_code = Get_Bits(5);
  1422. /* ISO/IEC 13818-2 section 7.4.2.2: Quantizer scale factor */
  1423. quantizer_scale = q_scale_type ?
  1424. Non_Linear_quantizer_scale[quantizer_scale_code] : (quantizer_scale_code << 1);
  1425. }
  1426. /* ISO/IEC 13818-2 section 6.3.17.2: Motion vectors */
  1427. /* decode forward motion vectors */
  1428. if ((*macroblock_type & MACROBLOCK_MOTION_FORWARD) 
  1429. || ((*macroblock_type & MACROBLOCK_INTRA) && concealment_motion_vectors))
  1430. motion_vectors(PMV, dmvector, motion_vertical_field_select, 0,
  1431. motion_vector_count, mv_format, f_code[0][0]-1, f_code[0][1]-1, dmv, mvscale);
  1432. if (Fault_Flag) return 0; // trigger: go to next slice
  1433. /* decode backward motion vectors */
  1434. if (*macroblock_type & MACROBLOCK_MOTION_BACKWARD)
  1435. motion_vectors(PMV, dmvector, motion_vertical_field_select, 1,
  1436. motion_vector_count,mv_format, f_code[1][0]-1, f_code[1][1]-1, 0, mvscale);
  1437. if (Fault_Flag) return 0;  // trigger: go to next slice
  1438. if ((*macroblock_type & MACROBLOCK_INTRA) && concealment_motion_vectors)
  1439. Flush_Buffer(1); // marker bit
  1440. /* macroblock_pattern */
  1441. /* ISO/IEC 13818-2 section 6.3.17.4: Coded block pattern */
  1442. if (*macroblock_type & MACROBLOCK_PATTERN)
  1443. {
  1444. coded_block_pattern = Get_coded_block_pattern();
  1445. if (chroma_format==CHROMA422)
  1446. coded_block_pattern = (coded_block_pattern<<2) | Get_Bits(2);
  1447. else if (chroma_format==CHROMA444)
  1448. coded_block_pattern = (coded_block_pattern<<6) | Get_Bits(6);
  1449. }
  1450. else
  1451.     coded_block_pattern = (*macroblock_type & MACROBLOCK_INTRA) ? (1<<block_count)-1 : 0;
  1452. if (Fault_Flag) return 0; // trigger: go to next slice
  1453. Clear_Block(block_count);
  1454. /* decode blocks */
  1455. for (comp=0; comp<block_count; comp++)
  1456. {
  1457. if (coded_block_pattern & (1<<(block_count-1-comp)))
  1458. {
  1459. if (*macroblock_type & MACROBLOCK_INTRA)
  1460. Decode_MPEG2_Intra_Block(comp, dc_dct_pred);
  1461. else
  1462. Decode_MPEG2_Non_Intra_Block(comp);
  1463. if (Fault_Flag) return 0; // trigger: go to next slice
  1464. }
  1465. }
  1466. /* reset intra_dc predictors */
  1467. /* ISO/IEC 13818-2 section 7.2.1: DC coefficients in intra blocks */
  1468. if (!(*macroblock_type & MACROBLOCK_INTRA))
  1469. dc_dct_pred[0]=dc_dct_pred[1]=dc_dct_pred[2]=0;
  1470. /* reset motion vector predictors */
  1471. if ((*macroblock_type & MACROBLOCK_INTRA) && !concealment_motion_vectors)
  1472. {
  1473. /* intra mb without concealment motion vectors */
  1474. /* ISO/IEC 13818-2 section 7.6.3.4: Resetting motion vector predictors */
  1475. PMV[0][0][0]=PMV[0][0][1]=PMV[1][0][0]=PMV[1][0][1]=0;
  1476. PMV[0][1][0]=PMV[0][1][1]=PMV[1][1][0]=PMV[1][1][1]=0;
  1477. }
  1478. /* special "No_MC" macroblock_type case */
  1479. /* ISO/IEC 13818-2 section 7.6.3.5: Prediction in P pictures */
  1480. if ((picture_coding_type==P_TYPE) 
  1481. && !(*macroblock_type & (MACROBLOCK_MOTION_FORWARD|MACROBLOCK_INTRA)))
  1482. {
  1483. /* non-intra mb without forward mv in a P picture */
  1484. /* ISO/IEC 13818-2 section 7.6.3.4: Resetting motion vector predictors */
  1485. PMV[0][0][0]=PMV[0][0][1]=PMV[1][0][0]=PMV[1][0][1]=0;
  1486. /* derive motion_type */
  1487. /* ISO/IEC 13818-2 section 6.3.17.1: Macroblock modes, frame_motion_type */
  1488. if (picture_structure==FRAME_PICTURE)
  1489. *motion_type = MC_FRAME;
  1490. else
  1491. {
  1492. *motion_type = MC_FIELD;
  1493. motion_vertical_field_select[0][0] = (picture_structure==BOTTOM_FIELD);
  1494. }
  1495. }
  1496. /* successfully decoded macroblock */
  1497. return 1 ;
  1498. }
  1499. /* decode one intra coded MPEG-2 block */
  1500. void CMPEG2Dec::Decode_MPEG2_Intra_Block(int comp, int dc_dct_pred[])
  1501. {
  1502. int val, i, j, sign, *qmat;
  1503. unsigned int code;
  1504. DCTtab *tab;
  1505. short *bp;
  1506. bp = block[comp];
  1507. qmat = (comp<4 || chroma_format==CHROMA420) 
  1508. ? intra_quantizer_matrix : chroma_intra_quantizer_matrix;
  1509. /* ISO/IEC 13818-2 section 7.2.1: decode DC coefficients */
  1510. switch (cc_table[comp])
  1511. {
  1512. case 0:
  1513. val = (dc_dct_pred[0]+= Get_Luma_DC_dct_diff());
  1514. break;
  1515. case 1:
  1516. val = (dc_dct_pred[1]+= Get_Chroma_DC_dct_diff());
  1517. break;
  1518. case 2:
  1519. val = (dc_dct_pred[2]+= Get_Chroma_DC_dct_diff());
  1520. break;
  1521. }
  1522. bp[0] = val << (3-intra_dc_precision);
  1523. /* decode AC coefficients */
  1524. for (i=1; ; i++)
  1525. {
  1526. code = Show_Bits(16);
  1527. if (code>=16384 && !intra_vlc_format)
  1528. tab = &DCTtabnext[(code>>12)-4];
  1529. else if (code>=1024)
  1530. {
  1531. if (intra_vlc_format)
  1532. tab = &DCTtab0a[(code>>8)-4];
  1533. else
  1534. tab = &DCTtab0[(code>>8)-4];
  1535. }
  1536. else if (code>=512)
  1537. {
  1538. if (intra_vlc_format)
  1539. tab = &DCTtab1a[(code>>6)-8];
  1540. else
  1541. tab = &DCTtab1[(code>>6)-8];
  1542. }
  1543. else if (code>=256)
  1544. tab = &DCTtab2[(code>>4)-16];
  1545. else if (code>=128)
  1546. tab = &DCTtab3[(code>>3)-16];
  1547. else if (code>=64)
  1548. tab = &DCTtab4[(code>>2)-16];
  1549. else if (code>=32)
  1550. tab = &DCTtab5[(code>>1)-16];
  1551. else if (code>=16)
  1552. tab = &DCTtab6[code-16];
  1553. else
  1554. {
  1555. Fault_Flag = 1;
  1556. return;
  1557. }
  1558. Flush_Buffer(tab->len);
  1559. if (tab->run<64)
  1560. {
  1561. i+= tab->run;
  1562. val = tab->level;
  1563. sign = Get_Bits(1);
  1564. }
  1565. else if (tab->run==64) /* end_of_block */
  1566. return;
  1567. else /* escape */
  1568. {
  1569. i+= Get_Bits(6);
  1570. val = Get_Bits(12);
  1571. if (sign = (val>=2048))
  1572. val = 4096 - val;
  1573. }
  1574. j = scan[alternate_scan][i];
  1575. val = (val * quantizer_scale * qmat[j]) >> 4;
  1576. bp[j] = sign ? -val : val;
  1577. }
  1578. }
  1579. /* decode one non-intra coded MPEG-2 block */
  1580. void CMPEG2Dec::Decode_MPEG2_Non_Intra_Block(int comp)
  1581. {
  1582. int val, i, j, sign, *qmat;
  1583. unsigned int code;
  1584. DCTtab *tab;
  1585. short *bp;
  1586. bp = block[comp];
  1587. qmat = (comp<4 || chroma_format==CHROMA420) 
  1588. ? non_intra_quantizer_matrix : chroma_non_intra_quantizer_matrix;
  1589. /* decode AC coefficients */
  1590. for (i=0; ; i++)
  1591. {
  1592. code = Show_Bits(16);
  1593. if (code>=16384)
  1594. {
  1595. if (i==0)
  1596. tab = &DCTtabfirst[(code>>12)-4];
  1597. else
  1598. tab = &DCTtabnext[(code>>12)-4];
  1599. }
  1600. else if (code>=1024)
  1601. tab = &DCTtab0[(code>>8)-4];
  1602. else if (code>=512)
  1603. tab = &DCTtab1[(code>>6)-8];
  1604. else if (code>=256)
  1605. tab = &DCTtab2[(code>>4)-16];
  1606. else if (code>=128)
  1607. tab = &DCTtab3[(code>>3)-16];
  1608. else if (code>=64)
  1609. tab = &DCTtab4[(code>>2)-16];
  1610. else if (code>=32)
  1611. tab = &DCTtab5[(code>>1)-16];
  1612. else if (code>=16)
  1613. tab = &DCTtab6[code-16];
  1614. else
  1615. {
  1616. Fault_Flag = 1;
  1617. return;
  1618. }
  1619. Flush_Buffer(tab->len);
  1620. if (tab->run<64)
  1621. {
  1622. i+= tab->run;
  1623. val = tab->level;
  1624. sign = Get_Bits(1);
  1625. }
  1626. else if (tab->run==64) /* end_of_block */
  1627. return;
  1628. else /* escape */
  1629. {
  1630. i+= Get_Bits(6);
  1631. val = Get_Bits(12);
  1632. if (sign = (val>=2048))
  1633. val = 4096 - val;
  1634. }
  1635. j = scan[alternate_scan][i];
  1636. val = (((val<<1)+1) * quantizer_scale * qmat[j]) >> 5;
  1637. bp[j] = sign ? -val : val;
  1638. }
  1639. }
  1640. int CMPEG2Dec::Get_macroblock_type()
  1641. {
  1642. int macroblock_type;
  1643. switch (picture_coding_type)
  1644. {
  1645. case I_TYPE:
  1646. macroblock_type = Get_I_macroblock_type();
  1647. break;
  1648. case P_TYPE:
  1649. macroblock_type = Get_P_macroblock_type();
  1650. break;
  1651. case B_TYPE:
  1652. macroblock_type = Get_B_macroblock_type();
  1653. break;
  1654. }
  1655. return macroblock_type;
  1656. }
  1657. int CMPEG2Dec::Get_I_macroblock_type()
  1658. {
  1659. if (Get_Bits(1))
  1660. return 1;
  1661. if (!Get_Bits(1))
  1662. Fault_Flag = 2;
  1663. return 17;
  1664. }
  1665. int CMPEG2Dec::Get_P_macroblock_type()
  1666. {
  1667. int code;
  1668. if ((code = Show_Bits(6))>=8)
  1669. {
  1670. code >>= 3;
  1671. Flush_Buffer(PMBtab0[code].len);
  1672. return PMBtab0[code].val;
  1673. }
  1674. if (code==0)
  1675. {
  1676. Fault_Flag = 2;
  1677. return 0;
  1678. }
  1679. Flush_Buffer(PMBtab1[code].len);
  1680. return PMBtab1[code].val;
  1681. }
  1682. int CMPEG2Dec::Get_B_macroblock_type()
  1683. {
  1684. int code;
  1685. if ((code = Show_Bits(6))>=8)
  1686. {
  1687. code >>= 2;
  1688. Flush_Buffer(BMBtab0[code].len);
  1689. return BMBtab0[code].val;
  1690. }
  1691. if (code==0)
  1692. {
  1693. Fault_Flag = 2;
  1694. return 0;
  1695. }
  1696. Flush_Buffer(BMBtab1[code].len);
  1697. return BMBtab1[code].val;
  1698. }
  1699. int CMPEG2Dec::Get_coded_block_pattern()
  1700. {
  1701. int code;
  1702. if ((code = Show_Bits(9))>=128)
  1703. {
  1704. code >>= 4;
  1705. Flush_Buffer(CBPtab0[code].len);
  1706. return CBPtab0[code].val;
  1707. }
  1708. if (code>=8)
  1709. {
  1710. code >>= 1;
  1711. Flush_Buffer(CBPtab1[code].len);
  1712. return CBPtab1[code].val;
  1713. }
  1714. if (code<1)
  1715. {
  1716. Fault_Flag = 3;
  1717. return 0;
  1718. }
  1719. Flush_Buffer(CBPtab2[code].len);
  1720. return CBPtab2[code].val;
  1721. }
  1722. int CMPEG2Dec::Get_macroblock_address_increment()
  1723. {
  1724. int code, val;
  1725. val = 0;
  1726. while ((code = Show_Bits(11))<24)
  1727. {
  1728. if (code!=15) /* if not macroblock_stuffing */
  1729. {
  1730. if (code==8) /* if macroblock_escape */
  1731. val+= 33;
  1732. else
  1733. {
  1734. Fault_Flag = 4;
  1735. return 1;
  1736. }
  1737. }
  1738. Flush_Buffer(11);
  1739. }
  1740. /* macroblock_address_increment == 1 */
  1741. /* ('1' is in the MSB position of the lookahead) */
  1742. if (code>=1024)
  1743. {
  1744. Flush_Buffer(1);
  1745. return val + 1;
  1746. }
  1747. /* codes 00010 ... 011xx */
  1748. if (code>=128)
  1749. {
  1750. /* remove leading zeros */
  1751. code >>= 6;
  1752. Flush_Buffer(MBAtab1[code].len);
  1753.     
  1754. return val + MBAtab1[code].val;
  1755. }
  1756.   
  1757. /* codes 00000011000 ... 0000111xxxx */
  1758. code-= 24; /* remove common base */
  1759. Flush_Buffer(MBAtab2[code].len);
  1760. return val + MBAtab2[code].val;
  1761. }
  1762. /*
  1763.    parse VLC and perform dct_diff arithmetic.
  1764.    MPEG-2:  ISO/IEC 13818-2 section 7.2.1 
  1765.    Note: the arithmetic here is presented more elegantly than
  1766.    the spec, yet the results, dct_diff, are the same.
  1767. */
  1768. int CMPEG2Dec::Get_Luma_DC_dct_diff()
  1769. {
  1770. int code, size, dct_diff;
  1771. /* decode length */
  1772. code = Show_Bits(5);
  1773. if (code<31)
  1774. {
  1775. size = DClumtab0[code].val;
  1776. Flush_Buffer(DClumtab0[code].len);
  1777. }
  1778. else
  1779. {
  1780. code = Show_Bits(9) - 0x1f0;
  1781. size = DClumtab1[code].val;
  1782. Flush_Buffer(DClumtab1[code].len);
  1783. }
  1784. if (size==0)
  1785. dct_diff = 0;
  1786. else
  1787. {
  1788. dct_diff = Get_Bits(size);
  1789. if ((dct_diff & (1<<(size-1)))==0)
  1790. dct_diff-= (1<<size) - 1;
  1791. }
  1792. return dct_diff;
  1793. }
  1794. int CMPEG2Dec::Get_Chroma_DC_dct_diff()
  1795. {
  1796. int code, size, dct_diff;
  1797. /* decode length */
  1798. code = Show_Bits(5);
  1799. if (code<31)
  1800. {
  1801. size = DCchromtab0[code].val;
  1802. Flush_Buffer(DCchromtab0[code].len);
  1803. }
  1804. else
  1805. {
  1806. code = Show_Bits(10) - 0x3e0;
  1807. size = DCchromtab1[code].val;
  1808. Flush_Buffer(DCchromtab1[code].len);
  1809. }
  1810. if (size==0)
  1811. dct_diff = 0;
  1812. else
  1813. {
  1814. dct_diff = Get_Bits(size);
  1815. if ((dct_diff & (1<<(size-1)))==0)
  1816. dct_diff-= (1<<size) - 1;
  1817. }
  1818. return dct_diff;
  1819. }
  1820. /*
  1821. static int currentfield;
  1822. static unsigned char **predframe;
  1823. static int DMV[2][2];
  1824. static int stw;
  1825. */
  1826. void CMPEG2Dec::form_predictions(int bx, int by, int macroblock_type, int motion_type,
  1827.   int PMV[2][2][2], int motion_vertical_field_select[2][2],
  1828.   int dmvector[2])
  1829. {
  1830. int currentfield;
  1831. unsigned char **predframe;
  1832. int DMV[2][2];
  1833. int stw;
  1834. stw = 0;
  1835. if ((macroblock_type & MACROBLOCK_MOTION_FORWARD) || (picture_coding_type==P_TYPE))
  1836. {
  1837. if (picture_structure==FRAME_PICTURE)
  1838. {
  1839. if ((motion_type==MC_FRAME) || !(macroblock_type & MACROBLOCK_MOTION_FORWARD))
  1840. {
  1841. /* frame-based prediction (broken into top and bottom halves
  1842.    for spatial scalability prediction purposes) */
  1843. form_prediction(forward_reference_frame, 0, current_frame, 0, Coded_Picture_Width, 
  1844. Coded_Picture_Width<<1, 16, 8, bx, by, PMV[0][0][0], PMV[0][0][1], stw);
  1845. form_prediction(forward_reference_frame, 1, current_frame, 1, Coded_Picture_Width, 
  1846. Coded_Picture_Width<<1, 16, 8, bx, by, PMV[0][0][0], PMV[0][0][1], stw);
  1847. }
  1848. else if (motion_type==MC_FIELD) /* field-based prediction */
  1849. {
  1850. /* top field prediction */
  1851. form_prediction(forward_reference_frame, motion_vertical_field_select[0][0], 
  1852. current_frame, 0, Coded_Picture_Width<<1, Coded_Picture_Width<<1, 16, 8,
  1853. bx, by>>1, PMV[0][0][0], PMV[0][0][1]>>1, stw);
  1854. /* bottom field prediction */
  1855. form_prediction(forward_reference_frame, motion_vertical_field_select[1][0], 
  1856. current_frame, 1, Coded_Picture_Width<<1, Coded_Picture_Width<<1, 16, 8,
  1857. bx, by>>1, PMV[1][0][0], PMV[1][0][1]>>1, stw);
  1858. }
  1859. else if (motion_type==MC_DMV) /* dual prime prediction */
  1860. {
  1861. /* calculate derived motion vectors */
  1862. Dual_Prime_Arithmetic(DMV, dmvector, PMV[0][0][0], PMV[0][0][1]>>1);
  1863. /* predict top field from top field */
  1864. form_prediction(forward_reference_frame, 0, current_frame, 0, 
  1865. Coded_Picture_Width<<1, Coded_Picture_Width<<1, 16, 8, bx, by>>1,
  1866. PMV[0][0][0], PMV[0][0][1]>>1, 0);
  1867. /* predict and add to top field from bottom field */
  1868. form_prediction(forward_reference_frame, 1, current_frame, 0,
  1869. Coded_Picture_Width<<1, Coded_Picture_Width<<1, 16, 8, bx, by>>1,
  1870. DMV[0][0], DMV[0][1], 1);
  1871. /* predict bottom field from bottom field */
  1872. form_prediction(forward_reference_frame, 1, current_frame, 1,
  1873. Coded_Picture_Width<<1, Coded_Picture_Width<<1, 16, 8, bx, by>>1,
  1874. PMV[0][0][0], PMV[0][0][1]>>1, 0);
  1875. /* predict and add to bottom field from top field */
  1876. form_prediction(forward_reference_frame, 0, current_frame, 1,
  1877. Coded_Picture_Width<<1, Coded_Picture_Width<<1, 16, 8, bx, by>>1,
  1878. DMV[1][0], DMV[1][1], 1);
  1879. }
  1880. else
  1881. Fault_Flag = 5;
  1882. }
  1883. else
  1884. {
  1885. /* field picture */
  1886. currentfield = (picture_structure==BOTTOM_FIELD);
  1887. /* determine which frame to use for prediction */
  1888. if (picture_coding_type==P_TYPE && Second_Field && currentfield!=motion_vertical_field_select[0][0])
  1889. predframe = backward_reference_frame;
  1890. else
  1891. predframe = forward_reference_frame;
  1892. if ((motion_type==MC_FIELD) || !(macroblock_type & MACROBLOCK_MOTION_FORWARD))
  1893. {
  1894. form_prediction(predframe, motion_vertical_field_select[0][0], current_frame, 0, 
  1895. Coded_Picture_Width<<1, Coded_Picture_Width<<1, 16, 16, bx, by,
  1896. PMV[0][0][0], PMV[0][0][1], stw);
  1897. }
  1898. else if (motion_type==MC_16X8)
  1899. {
  1900. form_prediction(predframe, motion_vertical_field_select[0][0], current_frame, 0, 
  1901. Coded_Picture_Width<<1, Coded_Picture_Width<<1, 16, 8, bx, by,
  1902. PMV[0][0][0], PMV[0][0][1], stw);
  1903. if (picture_coding_type==P_TYPE && Second_Field && currentfield!=motion_vertical_field_select[1][0])
  1904. predframe = backward_reference_frame;
  1905. else
  1906. predframe = forward_reference_frame;
  1907. form_prediction(predframe, motion_vertical_field_select[1][0], current_frame, 
  1908. 0, Coded_Picture_Width<<1, Coded_Picture_Width<<1, 16, 8, bx, by+8,
  1909. PMV[1][0][0], PMV[1][0][1], stw);
  1910. }
  1911. else if (motion_type==MC_DMV)
  1912. {
  1913. if (Second_Field)
  1914. predframe = backward_reference_frame;
  1915. else
  1916. predframe = forward_reference_frame;
  1917. /* calculate derived motion vectors */
  1918. Dual_Prime_Arithmetic(DMV, dmvector, PMV[0][0][0], PMV[0][0][1]);
  1919. /* predict from field of same parity */
  1920. form_prediction(forward_reference_frame, currentfield, current_frame, 0, 
  1921. Coded_Picture_Width<<1, Coded_Picture_Width<<1, 16, 16, bx, by,
  1922. PMV[0][0][0], PMV[0][0][1], 0);
  1923. /* predict from field of opposite parity */
  1924. form_prediction(predframe, !currentfield, current_frame, 0,
  1925. Coded_Picture_Width<<1, Coded_Picture_Width<<1, 16, 16, bx, by,
  1926. DMV[0][0], DMV[0][1], 1);
  1927. }
  1928. else
  1929. Fault_Flag = 5;
  1930. }
  1931. stw = 1;
  1932. }
  1933. if (macroblock_type & MACROBLOCK_MOTION_BACKWARD)
  1934. {
  1935. if (picture_structure==FRAME_PICTURE)
  1936. {
  1937. if (motion_type==MC_FRAME)
  1938. {
  1939. /* frame-based prediction */
  1940. form_prediction(backward_reference_frame, 0, current_frame, 0,
  1941. Coded_Picture_Width, Coded_Picture_Width<<1, 16, 8, bx, by,
  1942. PMV[0][1][0], PMV[0][1][1], stw);
  1943. form_prediction(backward_reference_frame, 1, current_frame, 1,
  1944. Coded_Picture_Width, Coded_Picture_Width<<1, 16, 8, bx, by,
  1945. PMV[0][1][0], PMV[0][1][1], stw);
  1946. }
  1947. else /* field-based prediction */
  1948. {
  1949. /* top field prediction */
  1950. form_prediction(backward_reference_frame, motion_vertical_field_select[0][1], 
  1951. current_frame, 0, Coded_Picture_Width<<1, Coded_Picture_Width<<1, 16, 8,
  1952. bx, by>>1, PMV[0][1][0], PMV[0][1][1]>>1, stw);
  1953. /* bottom field prediction */
  1954. form_prediction(backward_reference_frame, motion_vertical_field_select[1][1], 
  1955. current_frame, 1, Coded_Picture_Width<<1, Coded_Picture_Width<<1, 16, 8,
  1956. bx, by>>1, PMV[1][1][0], PMV[1][1][1]>>1, stw);
  1957. }
  1958. }
  1959. else
  1960. {
  1961. /* field picture */
  1962. if (motion_type==MC_FIELD)
  1963. {
  1964. /* field-based prediction */
  1965. form_prediction(backward_reference_frame, motion_vertical_field_select[0][1], 
  1966. current_frame, 0, Coded_Picture_Width<<1, Coded_Picture_Width<<1, 16, 16,
  1967. bx, by, PMV[0][1][0], PMV[0][1][1], stw);
  1968. }
  1969. else if (motion_type==MC_16X8)
  1970. {
  1971. form_prediction(backward_reference_frame, motion_vertical_field_select[0][1],
  1972. current_frame, 0, Coded_Picture_Width<<1, Coded_Picture_Width<<1, 16, 8,
  1973. bx, by, PMV[0][1][0], PMV[0][1][1], stw);
  1974. form_prediction(backward_reference_frame, motion_vertical_field_select[1][1],
  1975. current_frame, 0, Coded_Picture_Width<<1, Coded_Picture_Width<<1, 16, 8,
  1976. bx, by+8, PMV[1][1][0], PMV[1][1][1], stw);
  1977. }
  1978. else
  1979. Fault_Flag = 5;
  1980. }
  1981. }
  1982. }
  1983. void CMPEG2Dec::form_prediction(unsigned char *src[], int sfield, unsigned char *dst[],
  1984. int dfield, int lx, int lx2, int w, int h, int x, int y,
  1985. int dx, int dy, int average_flag)
  1986. {
  1987. form_component_prediction(src[0]+(sfield?lx2>>1:0), dst[0]+(dfield?lx2>>1:0),
  1988. lx, lx2, w, h, x, y, dx, dy, average_flag);
  1989. if (chroma_format!=CHROMA444)
  1990. {
  1991. lx>>=1; lx2>>=1; w>>=1; x>>=1; dx/=2;
  1992. }
  1993. if (chroma_format==CHROMA420)
  1994. {
  1995. h>>=1; y>>=1; dy/=2;
  1996. }
  1997. /* Cb */
  1998. form_component_prediction(src[1]+(sfield?lx2>>1:0), dst[1]+(dfield?lx2>>1:0),
  1999. lx, lx2, w, h, x, y, dx, dy, average_flag);
  2000. /* Cr */
  2001. form_component_prediction(src[2]+(sfield?lx2>>1:0), dst[2]+(dfield?lx2>>1:0),
  2002. lx, lx2, w, h, x, y, dx, dy, average_flag);
  2003. }
  2004. /* ISO/IEC 13818-2 section 7.6.4: Forming predictions */
  2005. void CMPEG2Dec::form_component_prediction(unsigned char *src, unsigned char *dst,
  2006.   int lx, int lx2, int w, int h, int x, int y,
  2007.   int dx, int dy, int average_flag)
  2008. {
  2009. static const __int64 mmmask_0001 = 0x0001000100010001;
  2010. static const __int64 mmmask_0002 = 0x0002000200020002;
  2011. static const __int64 mmmask_0003 = 0x0003000300030003;
  2012. static const __int64 mmmask_0006 = 0x0006000600060006;
  2013. unsigned char *s = src + lx * (y + (dy>>1)) + x + (dx>>1);
  2014. unsigned char *d = dst + lx * y + x;
  2015. int flag = (average_flag<<2) + ((dx & 1)<<1) + (dy & 1);
  2016. switch (flag)
  2017. {
  2018. case 0:
  2019. // d[i] = s[i];
  2020. __asm
  2021. {
  2022. mov eax, [s]
  2023. mov ebx, [d]
  2024. mov esi, 0x00
  2025. mov edi, [h]
  2026. mc0:
  2027. movq mm1, [eax+esi]
  2028. add esi, 0x08
  2029. cmp esi, [w]
  2030. movq [ebx+esi-8], mm1
  2031. jl mc0
  2032. add eax, [lx2]
  2033. add ebx, [lx2]
  2034. dec edi
  2035. mov esi, 0x00
  2036. cmp edi, 0x00
  2037. jg mc0
  2038. }
  2039. break;
  2040. case 1:
  2041. // d[i] = (s[i]+s[i+lx]+1)>>1;
  2042. __asm
  2043. {
  2044. pxor mm0, mm0
  2045. movq mm7, [mmmask_0001]
  2046. mov eax, [s]
  2047. mov ebx, [d]
  2048. mov ecx, eax
  2049. add ecx, [lx]
  2050. mov esi, 0x00
  2051. mov edi, [h]
  2052. mc1:
  2053. movq mm1, [eax+esi]
  2054. movq mm2, [ecx+esi]
  2055. movq mm3, mm1
  2056. movq mm4, mm2
  2057. punpcklbw mm1, mm0
  2058. punpckhbw mm3, mm0
  2059. punpcklbw mm2, mm0
  2060. punpckhbw mm4, mm0
  2061. paddsw mm1, mm2
  2062. paddsw mm3, mm4
  2063. paddsw mm1, mm7
  2064. paddsw mm3, mm7
  2065. psrlw mm1, 1
  2066. psrlw mm3, 1
  2067. packuswb mm1, mm0
  2068. packuswb mm3, mm0
  2069. psllq mm3, 32
  2070. por mm1, mm3
  2071. add esi, 0x08
  2072. cmp esi, [w]
  2073. movq [ebx+esi-8], mm1
  2074. jl mc1
  2075. add eax, [lx2]
  2076. add ebx, [lx2]
  2077. add ecx, [lx2]
  2078. dec edi
  2079. mov esi, 0x00
  2080. cmp edi, 0x00
  2081. jg mc1
  2082. }
  2083. break;
  2084. case 2:
  2085. // d[i] = (s[i]+s[i+1]+1)>>1;
  2086. __asm
  2087. {
  2088. pxor mm0, mm0
  2089. movq mm7, [mmmask_0001]
  2090. mov eax, [s]
  2091. mov ebx, [d]
  2092. mov esi, 0x00
  2093. mov edi, [h]
  2094. mc2:
  2095. movq mm1, [eax+esi]
  2096. movq mm2, [eax+esi+1]
  2097. movq mm3, mm1
  2098. movq mm4, mm2
  2099. punpcklbw mm1, mm0
  2100. punpckhbw mm3, mm0
  2101. punpcklbw mm2, mm0
  2102. punpckhbw mm4, mm0
  2103. paddsw mm1, mm2
  2104. paddsw mm3, mm4
  2105. paddsw mm1, mm7
  2106. paddsw mm3, mm7
  2107. psrlw mm1, 1
  2108. psrlw mm3, 1
  2109. packuswb mm1, mm0
  2110. packuswb mm3, mm0
  2111. psllq mm3, 32
  2112. por mm1, mm3
  2113. add esi, 0x08
  2114. cmp esi, [w]
  2115. movq [ebx+esi-8], mm1
  2116. jl mc2
  2117. add eax, [lx2]
  2118. add ebx, [lx2]
  2119. dec edi
  2120. mov esi, 0x00
  2121. cmp edi, 0x00
  2122. jg mc2
  2123. }
  2124. break;
  2125. case 3:
  2126. // d[i] = (s[i]+s[i+1]+s[i+lx]+s[i+lx+1]+2)>>2;
  2127. __asm
  2128. {
  2129. pxor mm0, mm0
  2130. movq mm7, [mmmask_0002]
  2131. mov eax, [s]
  2132. mov ebx, [d]
  2133. mov ecx, eax
  2134. add ecx, [lx]
  2135. mov esi, 0x00
  2136. mov edi, [h]
  2137. mc3:
  2138. movq mm1, [eax+esi]
  2139. movq mm2, [eax+esi+1]
  2140. movq mm3, mm1
  2141. movq mm4, mm2
  2142. punpcklbw mm1, mm0
  2143. punpckhbw mm3, mm0
  2144. punpcklbw mm2, mm0
  2145. punpckhbw mm4, mm0
  2146. paddsw mm1, mm2
  2147. paddsw mm3, mm4
  2148. movq mm5, [ecx+esi]
  2149. paddsw mm1, mm7
  2150. movq mm6, [ecx+esi+1]
  2151. paddsw mm3, mm7
  2152. movq mm2, mm5
  2153. movq mm4, mm6
  2154. punpcklbw mm2, mm0
  2155. punpckhbw mm5, mm0
  2156. punpcklbw mm4, mm0
  2157. punpckhbw mm6, mm0
  2158. paddsw mm2, mm4
  2159. paddsw mm5, mm6
  2160. paddsw mm1, mm2
  2161. paddsw mm3, mm5
  2162. psrlw mm1, 2
  2163. psrlw mm3, 2
  2164. packuswb mm1, mm0
  2165. packuswb mm3, mm0
  2166. psllq mm3, 32
  2167. por mm1, mm3
  2168. add esi, 0x08
  2169. cmp esi, [w]
  2170. movq [ebx+esi-8], mm1
  2171. jl mc3
  2172. add eax, [lx2]
  2173. add ebx, [lx2]
  2174. add ecx, [lx2]
  2175. dec edi
  2176. mov esi, 0x00
  2177. cmp edi, 0x00
  2178. jg mc3
  2179. }
  2180. break;
  2181. case 4:
  2182. // d[i] = (s[i]+d[i]+1)>>1;
  2183. __asm
  2184. {
  2185. pxor mm0, mm0
  2186. movq mm7, [mmmask_0001]
  2187. mov eax, [s]
  2188. mov ebx, [d]
  2189. mov esi, 0x00
  2190. mov edi, [h]
  2191. mc4:
  2192. movq mm1, [eax+esi]
  2193. movq mm2, [ebx+esi]
  2194. movq mm3, mm1
  2195. movq mm4, mm2
  2196. punpcklbw mm1, mm0
  2197. punpckhbw mm3, mm0
  2198. punpcklbw mm2, mm0
  2199. punpckhbw mm4, mm0
  2200. paddsw mm1, mm2
  2201. paddsw mm3, mm4
  2202. paddsw mm1, mm7
  2203. paddsw mm3, mm7
  2204. psrlw mm1, 1
  2205. psrlw mm3, 1
  2206. packuswb mm1, mm0
  2207. packuswb mm3, mm0
  2208. psllq mm3, 32
  2209. por mm1, mm3
  2210. add esi, 0x08
  2211. cmp esi, [w]
  2212. movq [ebx+esi-8], mm1
  2213. jl mc4
  2214. add eax, [lx2]
  2215. add ebx, [lx2]
  2216. dec edi
  2217. mov esi, 0x00
  2218. cmp edi, 0x00
  2219. jg mc4
  2220. }
  2221. break;
  2222. case 5:
  2223. // d[i] = ((d[i]<<1) + s[i]+s[i+lx] + 3)>>2;
  2224. __asm
  2225. {
  2226. pxor mm0, mm0
  2227. movq mm7, [mmmask_0003]
  2228. mov eax, [s]
  2229. mov ebx, [d]
  2230. mov ecx, eax
  2231. add ecx, [lx]
  2232. mov esi, 0x00
  2233. mov edi, [h]
  2234. mc5:
  2235. movq mm1, [eax+esi]
  2236. movq mm2, [ecx+esi]
  2237. movq mm3, mm1
  2238. movq mm4, mm2
  2239. punpcklbw mm1, mm0
  2240. punpckhbw mm3, mm0
  2241. punpcklbw mm2, mm0
  2242. punpckhbw mm4, mm0
  2243. paddsw mm1, mm2
  2244. paddsw mm3, mm4
  2245. movq mm5, [ebx+esi]
  2246. paddsw mm1, mm7
  2247. paddsw mm3, mm7
  2248. movq mm6, mm5
  2249. punpcklbw mm5, mm0
  2250. punpckhbw mm6, mm0
  2251. psllw mm5, 1
  2252. psllw mm6, 1
  2253. paddsw mm1, mm5
  2254. paddsw mm3, mm6
  2255. psrlw mm1, 2
  2256. psrlw mm3, 2
  2257. packuswb mm1, mm0
  2258. packuswb mm3, mm0
  2259. psllq mm3, 32
  2260. por mm1, mm3
  2261. add esi, 0x08
  2262. cmp esi, [w]
  2263. movq [ebx+esi-8], mm1
  2264. jl mc5
  2265. add eax, [lx2]
  2266. add ebx, [lx2]
  2267. add ecx, [lx2]
  2268. dec edi
  2269. mov esi, 0x00
  2270. cmp edi, 0x00
  2271. jg mc5
  2272. }
  2273. break;
  2274. case 6:
  2275. // d[i] = ((d[i]<<1) + s[i]+s[i+1] + 3) >> 2;
  2276. __asm
  2277. {
  2278. pxor mm0, mm0
  2279. movq mm7, [mmmask_0003]
  2280. mov eax, [s]
  2281. mov ebx, [d]
  2282. mov esi, 0x00
  2283. mov edi, [h]
  2284. mc6:
  2285. movq mm1, [eax+esi]
  2286. movq mm2, [eax+esi+1]
  2287. movq mm3, mm1
  2288. movq mm4, mm2
  2289. punpcklbw mm1, mm0
  2290. punpckhbw mm3, mm0
  2291. punpcklbw mm2, mm0
  2292. punpckhbw mm4, mm0
  2293. paddsw mm1, mm2
  2294. paddsw mm3, mm4
  2295. movq mm5, [ebx+esi]
  2296. paddsw mm1, mm7
  2297. paddsw mm3, mm7
  2298. movq mm6, mm5
  2299. punpcklbw mm5, mm0
  2300. punpckhbw mm6, mm0
  2301. psllw mm5, 1
  2302. psllw mm6, 1
  2303. paddsw mm1, mm5
  2304. paddsw mm3, mm6
  2305. psrlw mm1, 2
  2306. psrlw mm3, 2
  2307. packuswb mm1, mm0
  2308. packuswb mm3, mm0
  2309. psllq mm3, 32
  2310. por mm1, mm3
  2311. add esi, 0x08
  2312. cmp esi, [w]
  2313. movq [ebx+esi-8], mm1
  2314. jl mc6
  2315. add eax, [lx2]
  2316. add ebx, [lx2]
  2317. dec edi
  2318. mov esi, 0x00
  2319. cmp edi, 0x00
  2320. jg mc6
  2321. }
  2322. break;
  2323. case 7:
  2324. // d[i] = ((d[i]<<2) + s[i]+s[i+1]+s[i+lx]+s[i+lx+1] + 6)>>3;
  2325. __asm
  2326. {
  2327. pxor mm0, mm0
  2328. movq mm7, [mmmask_0006]
  2329. mov eax, [s]
  2330. mov ebx, [d]
  2331. mov ecx, eax
  2332. add ecx, [lx]
  2333. mov esi, 0x00
  2334. mov edi, [h]
  2335. mc7:
  2336. movq mm1, [eax+esi]
  2337. movq mm2, [eax+esi+1]
  2338. movq mm3, mm1
  2339. movq mm4, mm2
  2340. punpcklbw mm1, mm0
  2341. punpckhbw mm3, mm0
  2342. punpcklbw mm2, mm0
  2343. punpckhbw mm4, mm0
  2344. paddsw mm1, mm2
  2345. paddsw mm3, mm4
  2346. movq mm5, [ecx+esi]
  2347. paddsw mm1, mm7
  2348. movq mm6, [ecx+esi+1]
  2349. paddsw mm3, mm7
  2350. movq mm2, mm5
  2351. movq mm4, mm6
  2352. punpcklbw mm2, mm0
  2353. punpckhbw mm5, mm0
  2354. punpcklbw mm4, mm0
  2355. punpckhbw mm6, mm0
  2356. paddsw mm2, mm4
  2357. paddsw mm5, mm6
  2358. paddsw mm1, mm2
  2359. paddsw mm3, mm5
  2360. movq mm6, [ebx+esi]
  2361. movq mm4, mm6
  2362. punpcklbw mm4, mm0
  2363. punpckhbw mm6, mm0
  2364. psllw mm4, 2
  2365. psllw mm6, 2
  2366. paddsw mm1, mm4
  2367. paddsw mm3, mm6
  2368. psrlw mm1, 3
  2369. psrlw mm3, 3
  2370. packuswb mm1, mm0
  2371. packuswb mm3, mm0
  2372. psllq mm3, 32
  2373. por mm1, mm3
  2374. add esi, 0x08
  2375. cmp esi, [w]
  2376. movq [ebx+esi-8], mm1
  2377. jl mc7
  2378. add eax, [lx2]
  2379. add ebx, [lx2]
  2380. add ecx, [lx2]
  2381. dec edi
  2382. mov esi, 0x00
  2383. cmp edi, 0x00
  2384. jg mc7
  2385. }
  2386. break;
  2387. }
  2388. }
  2389. //
  2390. // motion
  2391. //
  2392. /* ISO/IEC 13818-2 sections 6.2.5.2, 6.3.17.2, and 7.6.3: Motion vectors */
  2393. void CMPEG2Dec::motion_vectors(int PMV[2][2][2],int dmvector[2],
  2394. int motion_vertical_field_select[2][2], int s,
  2395. int motion_vector_count, int mv_format, int h_r_size,
  2396. int v_r_size, int dmv, int mvscale)
  2397. {
  2398. if (motion_vector_count==1)
  2399. {
  2400. if (mv_format==MV_FIELD && !dmv)
  2401. motion_vertical_field_select[1][s] =
  2402. motion_vertical_field_select[0][s] = Get_Bits(1);
  2403. motion_vector(PMV[0][s],dmvector,h_r_size,v_r_size,dmv,mvscale,0);
  2404. /* update other motion vector predictors */
  2405. PMV[1][s][0] = PMV[0][s][0];
  2406. PMV[1][s][1] = PMV[0][s][1];
  2407. }
  2408. else
  2409. {
  2410. motion_vertical_field_select[0][s] = Get_Bits(1);
  2411. motion_vector(PMV[0][s],dmvector,h_r_size,v_r_size,dmv,mvscale,0);
  2412. motion_vertical_field_select[1][s] = Get_Bits(1);
  2413. motion_vector(PMV[1][s],dmvector,h_r_size,v_r_size,dmv,mvscale,0);
  2414. }
  2415. }
  2416. /* ISO/IEC 13818-2 section 7.6.3.6: Dual prime additional arithmetic */
  2417. void CMPEG2Dec::Dual_Prime_Arithmetic(int DMV[][2],int *dmvector, int mvx,int mvy)
  2418. {
  2419. if (picture_structure==FRAME_PICTURE)
  2420. {
  2421. if (top_field_first)
  2422. {
  2423. /* vector for prediction of top field from bottom field */
  2424. DMV[0][0] = ((mvx  +(mvx>0))>>1) + dmvector[0];
  2425. DMV[0][1] = ((mvy  +(mvy>0))>>1) + dmvector[1] - 1;
  2426. /* vector for prediction of bottom field from top field */
  2427. DMV[1][0] = ((3*mvx+(mvx>0))>>1) + dmvector[0];
  2428. DMV[1][1] = ((3*mvy+(mvy>0))>>1) + dmvector[1] + 1;
  2429. }
  2430. else
  2431. {
  2432. /* vector for prediction of top field from bottom field */
  2433. DMV[0][0] = ((3*mvx+(mvx>0))>>1) + dmvector[0];
  2434. DMV[0][1] = ((3*mvy+(mvy>0))>>1) + dmvector[1] - 1;
  2435. /* vector for prediction of bottom field from top field */
  2436. DMV[1][0] = ((mvx  +(mvx>0))>>1) + dmvector[0];
  2437. DMV[1][1] = ((mvy  +(mvy>0))>>1) + dmvector[1] + 1;
  2438. }
  2439. }
  2440. else
  2441. {
  2442. /* vector for prediction from field of opposite 'parity' */
  2443. DMV[0][0] = ((mvx+(mvx>0))>>1) + dmvector[0];
  2444. DMV[0][1] = ((mvy+(mvy>0))>>1) + dmvector[1];
  2445. /* correct for vertical field shift */
  2446. if (picture_structure==TOP_FIELD)
  2447. DMV[0][1]--;
  2448. else
  2449. DMV[0][1]++;
  2450. }
  2451. }
  2452. /* get and decode motion vector and differential motion vector for one prediction */
  2453. void CMPEG2Dec::motion_vector(int *PMV, int *dmvector, int h_r_size, int v_r_size,
  2454.    int dmv, int mvscale, int full_pel_vector)
  2455. {
  2456. int motion_code, motion_residual;
  2457. /* horizontal component */
  2458. /* ISO/IEC 13818-2 Table B-10 */
  2459. motion_code = Get_motion_code();
  2460. motion_residual = (h_r_size!=0 && motion_code!=0) ? Get_Bits(h_r_size) : 0;
  2461. decode_motion_vector(&PMV[0],h_r_size,motion_code,motion_residual,full_pel_vector);
  2462. if (dmv)
  2463. dmvector[0] = Get_dmvector();
  2464. /* vertical component */
  2465. motion_code     = Get_motion_code();
  2466. motion_residual = (v_r_size!=0 && motion_code!=0) ? Get_Bits(v_r_size) : 0;
  2467. if (mvscale)
  2468. PMV[1] >>= 1; /* DIV 2 */
  2469. decode_motion_vector(&PMV[1],v_r_size,motion_code,motion_residual,full_pel_vector);
  2470. if (mvscale)
  2471. PMV[1] <<= 1;
  2472. if (dmv)
  2473. dmvector[1] = Get_dmvector();
  2474. }
  2475. /* calculate motion vector component */
  2476. /* ISO/IEC 13818-2 section 7.6.3.1: Decoding the motion vectors */
  2477. /* Note: the arithmetic here is more elegant than that which is shown 
  2478.    in 7.6.3.1.  The end results (PMV[][][]) should, however, be the same.  */
  2479. void CMPEG2Dec::decode_motion_vector(int *pred, int r_size, int motion_code,
  2480.  int motion_residual, int full_pel_vector)
  2481. {
  2482. int lim, vec;
  2483. lim = 16<<r_size;
  2484. vec = full_pel_vector ? (*pred >> 1) : (*pred);
  2485. if (motion_code>0)
  2486. {
  2487. vec+= ((motion_code-1)<<r_size) + motion_residual + 1;
  2488. if (vec>=lim)
  2489. vec-= lim + lim;
  2490. }
  2491. else if (motion_code<0)
  2492. {
  2493. vec-= ((-motion_code-1)<<r_size) + motion_residual + 1;
  2494. if (vec<-lim)
  2495. vec+= lim + lim;
  2496. }
  2497. *pred = full_pel_vector ? (vec<<1) : vec;
  2498. }
  2499. int CMPEG2Dec::Get_motion_code()
  2500. {
  2501. int code;
  2502. if (Get_Bits(1))
  2503. return 0;
  2504. if ((code = Show_Bits(9))>=64)
  2505. {
  2506. code >>= 6;
  2507. Flush_Buffer(MVtab0[code].len);
  2508. return Get_Bits(1)?-MVtab0[code].val:MVtab0[code].val;
  2509. }
  2510. if (code>=24)
  2511. {
  2512. code >>= 3;
  2513. Flush_Buffer(MVtab1[code].len);
  2514. return Get_Bits(1)?-MVtab1[code].val:MVtab1[code].val;
  2515. }
  2516. if ((code-=12)<0)
  2517. {
  2518. Fault_Flag = 10;
  2519. return 0;
  2520. }
  2521. Flush_Buffer(MVtab2[code].len);
  2522. return Get_Bits(1) ? -MVtab2[code].val : MVtab2[code].val;
  2523. }
  2524. /* get differential motion vector (for dual prime prediction) */
  2525. int CMPEG2Dec::Get_dmvector()
  2526. {
  2527. if (Get_Bits(1))
  2528. return Get_Bits(1) ? -1 : 1;
  2529. else
  2530. return 0;
  2531. }
  2532. //
  2533. // store
  2534. //
  2535. static const __int64 mmmask_0001 = 0x0001000100010001;
  2536. static const __int64 mmmask_0002 = 0x0002000200020002;
  2537. static const __int64 mmmask_0003 = 0x0003000300030003;
  2538. static const __int64 mmmask_0004 = 0x0004000400040004;
  2539. static const __int64 mmmask_0005 = 0x0005000500050005;
  2540. static const __int64 mmmask_0007 = 0x0007000700070007;
  2541. static const __int64 mmmask_0016 = 0x0010001000100010;
  2542. static const __int64 mmmask_0040 = 0x0040004000400040;
  2543. static const __int64 mmmask_0128 = 0x0080008000800080;
  2544. void CMPEG2Dec::assembleFrame(unsigned char *src[], int pf, unsigned char *dst, int pitch)
  2545. {
  2546. unsigned char *y444;
  2547. if (Fault_Flag)
  2548. Fault_Flag = 0;
  2549. if (Luminance_Flag)
  2550. {
  2551. Luminance_Filter(src[0], lum);
  2552. y444 = lum;
  2553. }
  2554. else
  2555. y444 = src[0];
  2556. if (chroma_format==CHROMA420)
  2557. {
  2558. conv420to422(src[1], u422, pf);
  2559. conv420to422(src[2], v422, pf);
  2560. if (!dstYUY2())
  2561. {
  2562. conv422to444(u422, u444);
  2563. conv422to444(v422, v444);
  2564. }
  2565. }
  2566. else if (!dstYUY2())
  2567. {
  2568. conv422to444(src[1], u444);
  2569. conv422to444(src[2], v444);
  2570. }
  2571. if (dstYUY2())
  2572. conv422toYUY2(y444, u422, v422, dst, pitch);
  2573. else
  2574.   conv444toRGB24(y444, u444, v444, dst, pitch);
  2575. }
  2576. void CMPEG2Dec::Luminance_Filter(unsigned char *src, unsigned char *dst)
  2577. {
  2578. src += CLIP_AREA;
  2579. dst += CLIP_AREA;
  2580. __asm
  2581. {
  2582. mov edx, this
  2583. mov eax, [src]
  2584. mov ebx, [dst]
  2585. mov esi, 0x00
  2586. mov edi, [edx].LUM_AREA
  2587. pxor mm0, mm0
  2588. movq mm5, [edx].LumOffsetMask
  2589. movq mm6, [edx].LumGainMask
  2590. movq mm7, mmmask_0040
  2591. lumconv:
  2592. movq mm1, [eax+esi]
  2593. movq mm2, mm1
  2594. punpcklbw mm1, mm0
  2595. punpckhbw mm2, mm0
  2596. pmullw mm1, mm6
  2597. pmullw mm2, mm6
  2598. paddw mm1, mm7
  2599. paddw mm2, mm7
  2600. psrlw mm1, 7
  2601. psrlw mm2, 7
  2602. paddw mm1, mm5
  2603. paddw mm2, mm5
  2604. packuswb mm1, mm0
  2605. packuswb mm2, mm0
  2606. add esi, 0x08
  2607. cmp esi, edi
  2608. movq [ebx+esi-8], mm1
  2609. movq [ebx+esi-4], mm2
  2610. jl lumconv
  2611. }
  2612. }
  2613. void CMPEG2Dec::conv422to444(unsigned char *src, unsigned char *dst)
  2614. {
  2615. src += HALF_CLIP_AREA;
  2616. dst += CLIP_AREA;
  2617. __asm
  2618. {
  2619. mov edx, this
  2620. mov eax, [src]
  2621. mov ebx, [dst]
  2622. mov edi, [edx].Clip_Height
  2623. movq mm1, [mmmask_0001]
  2624. pxor mm0, mm0
  2625. convyuv444init:
  2626. movq mm7, [eax]
  2627. mov esi, 0x00
  2628. convyuv444:
  2629. movq mm2, mm7
  2630. movq mm7, [eax+esi+8]
  2631. movq mm3, mm2
  2632. movq mm4, mm7
  2633. psrlq mm3, 8
  2634. psllq mm4, 56
  2635. por mm3, mm4
  2636. movq mm4, mm2
  2637. movq mm5, mm3
  2638. punpcklbw mm4, mm0
  2639. punpcklbw mm5, mm0
  2640. movq mm6, mm4
  2641. paddusw mm4, mm1
  2642. paddusw mm4, mm5
  2643. psrlw mm4, 1
  2644. psllq mm4, 8
  2645. por mm4, mm6
  2646. punpckhbw mm2, mm0
  2647. punpckhbw mm3, mm0
  2648. movq mm6, mm2
  2649. paddusw mm2, mm1
  2650. paddusw mm2, mm3
  2651. movq [ebx+esi*2], mm4
  2652. psrlw mm2, 1
  2653. psllq mm2, 8
  2654. por mm2, mm6
  2655. add esi, 0x08
  2656. cmp esi, [edx].HALF_WIDTH_D8
  2657. movq [ebx+esi*2-8], mm2
  2658. jl convyuv444
  2659. movq mm2, mm7
  2660. punpcklbw mm2, mm0
  2661. movq mm3, mm2
  2662. psllq mm2, 8
  2663. por mm2, mm3
  2664. movq [ebx+esi*2], mm2
  2665. punpckhbw mm7, mm0
  2666. movq mm6, mm7
  2667. psllq mm6, 8
  2668. por mm6, mm7
  2669. movq [ebx+esi*2+8], mm6
  2670. add eax, [edx].HALF_WIDTH
  2671. add ebx, [edx].Coded_Picture_Width
  2672. dec edi
  2673. cmp edi, 0x00
  2674. jg convyuv444init
  2675. }
  2676. }
  2677. void CMPEG2Dec::conv420to422(unsigned char *src, unsigned char *dst, int frame_type)
  2678. {
  2679. if (frame_type)
  2680. {
  2681. __asm
  2682. {
  2683. push ebp
  2684. mov eax, [src]
  2685. mov ebx, [dst]
  2686. mov ebp, this
  2687. mov ecx, ebx
  2688. add ecx, ds:[ebp].HALF_WIDTH
  2689. mov esi, 0x00
  2690. movq mm3, [mmmask_0003]
  2691. pxor mm0, mm0
  2692. movq mm4, [mmmask_0002]
  2693. mov edx, eax
  2694. add edx, ds:[ebp].HALF_WIDTH
  2695. convyuv422topp:
  2696. movd mm1, [eax+esi]
  2697. movd mm2, [edx+esi]
  2698. movd [ebx+esi], mm1
  2699. punpcklbw mm1, mm0
  2700. pmullw mm1, mm3
  2701. paddusw mm1, mm4
  2702. punpcklbw mm2, mm0
  2703. paddusw mm2, mm1
  2704. psrlw mm2, 0x02
  2705. packuswb mm2, mm0
  2706. add esi, 0x04
  2707. cmp esi, ds:[ebp].HALF_WIDTH
  2708. movd [ecx+esi-4], mm2
  2709. jl convyuv422topp
  2710. add eax, ds:[ebp].HALF_WIDTH
  2711. add ebx, ds:[ebp].Coded_Picture_Width
  2712. add ecx, ds:[ebp].Coded_Picture_Width
  2713. mov esi, 0x00
  2714. mov edi, ds:[ebp].PROGRESSIVE_HEIGHT
  2715. convyuv422p:
  2716. movd mm1, [eax+esi]
  2717. punpcklbw mm1, mm0
  2718. mov edx, eax
  2719. pmullw mm1, mm3
  2720. sub edx, ds:[ebp].HALF_WIDTH
  2721. movd mm5, [edx+esi]
  2722. movd mm2, [edx+esi]
  2723. punpcklbw mm5, mm0
  2724. punpcklbw mm2, mm0
  2725. paddusw mm5, mm1
  2726. paddusw mm2, mm1
  2727. paddusw mm5, mm4
  2728. paddusw mm2, mm4
  2729. psrlw mm5, 0x02
  2730. psrlw mm2, 0x02
  2731. packuswb mm5, mm0
  2732. packuswb mm2, mm0
  2733. mov edx, eax
  2734. add edx, ds:[ebp].HALF_WIDTH
  2735. add esi, 0x04
  2736. cmp esi, ds:[ebp].HALF_WIDTH
  2737. movd [ebx+esi-4], mm5
  2738. movd [ecx+esi-4], mm2
  2739. jl convyuv422p
  2740. add eax, ds:[ebp].HALF_WIDTH
  2741. add ebx, ds:[ebp].Coded_Picture_Width
  2742. add ecx, ds:[ebp].Coded_Picture_Width
  2743. mov esi, 0x00
  2744. dec edi
  2745. cmp edi, 0x00
  2746. jg convyuv422p
  2747. mov edx, eax
  2748. sub edx, ds:[ebp].HALF_WIDTH
  2749. convyuv422bottomp:
  2750. movd mm1, [eax+esi]
  2751. movd mm5, [edx+esi]
  2752. punpcklbw mm5, mm0
  2753. movd [ecx+esi], mm1
  2754. punpcklbw mm1, mm0
  2755. pmullw mm1, mm3
  2756. paddusw mm5, mm1
  2757. paddusw mm5, mm4
  2758. psrlw mm5, 0x02
  2759. packuswb mm5, mm0
  2760. add esi, 0x04
  2761. cmp esi, ds:[ebp].HALF_WIDTH
  2762. movd [ebx+esi-4], mm5
  2763. jl convyuv422bottomp
  2764. pop ebp
  2765. }
  2766. }
  2767. else
  2768. {
  2769. __asm
  2770. {
  2771. push ebp
  2772. mov eax, [src]
  2773. mov ecx, [dst]
  2774. mov ebp, this
  2775. mov esi, 0x00
  2776. pxor mm0, mm0
  2777. movq mm3, [mmmask_0003]
  2778. movq mm4, [mmmask_0004]
  2779. movq mm5, [mmmask_0005]
  2780. convyuv422topi:
  2781. movd mm1, [eax+esi]
  2782. mov ebx, eax
  2783. add ebx, ds:[ebp].HALF_WIDTH
  2784. movd mm2, [ebx+esi]
  2785. movd [ecx+esi], mm1
  2786. punpcklbw mm1, mm0
  2787. movq mm6, mm1
  2788. pmullw mm1, mm3
  2789. punpcklbw mm2, mm0
  2790. movq mm7, mm2
  2791. pmullw mm2, mm5
  2792. paddusw mm2, mm1
  2793. paddusw mm2, mm4
  2794. psrlw mm2, 0x03
  2795. packuswb mm2, mm0
  2796. mov edx, ecx
  2797. add edx, ds:[ebp].HALF_WIDTH
  2798. pmullw mm6, mm5
  2799. movd [edx+esi], mm2
  2800. add ebx, ds:[ebp].HALF_WIDTH
  2801. movd mm2, [ebx+esi]
  2802. punpcklbw mm2, mm0
  2803. pmullw mm2, mm3
  2804. paddusw mm2, mm6
  2805. paddusw mm2, mm4
  2806. psrlw mm2, 0x03
  2807. packuswb mm2, mm0
  2808. add edx, ds:[ebp].HALF_WIDTH
  2809. add ebx, ds:[ebp].HALF_WIDTH
  2810. pmullw mm7, [mmmask_0007]
  2811. movd [edx+esi], mm2
  2812. movd mm2, [ebx+esi]
  2813. punpcklbw mm2, mm0
  2814. paddusw mm2, mm7
  2815. paddusw mm2, mm4
  2816. psrlw mm2, 0x03
  2817. packuswb mm2, mm0
  2818. add edx, ds:[ebp].HALF_WIDTH
  2819. add esi, 0x04
  2820. cmp esi, ds:[ebp].HALF_WIDTH
  2821. movd [edx+esi-4], mm2
  2822. jl convyuv422topi
  2823. add eax, ds:[ebp].Coded_Picture_Width
  2824. add ecx, ds:[ebp].DOUBLE_WIDTH
  2825. mov esi, 0x00
  2826. mov edi, ds:[ebp].INTERLACED_HEIGHT
  2827. convyuv422i:
  2828. movd mm1, [eax+esi]
  2829. punpcklbw mm1, mm0
  2830. movq mm6, mm1
  2831. mov ebx, eax
  2832. sub ebx, ds:[ebp].Coded_Picture_Width
  2833. movd mm3, [ebx+esi]
  2834. pmullw mm1, [mmmask_0007]
  2835. punpcklbw mm3, mm0
  2836. paddusw mm3, mm1
  2837. paddusw mm3, mm4
  2838. psrlw mm3, 0x03
  2839. packuswb mm3, mm0
  2840. add ebx, ds:[ebp].HALF_WIDTH
  2841. movq mm1, [ebx+esi]
  2842. add ebx, ds:[ebp].Coded_Picture_Width
  2843. movd [ecx+esi], mm3
  2844. movq mm3, [mmmask_0003]
  2845. movd mm2, [ebx+esi]
  2846. punpcklbw mm1, mm0
  2847. pmullw mm1, mm3
  2848. punpcklbw mm2, mm0
  2849. movq mm7, mm2
  2850. pmullw mm2, mm5
  2851. paddusw mm2, mm1
  2852. paddusw mm2, mm4
  2853. psrlw mm2, 0x03
  2854. packuswb mm2, mm0
  2855. pmullw mm6, mm5
  2856. mov edx, ecx
  2857. add edx, ds:[ebp].HALF_WIDTH
  2858. movd [edx+esi], mm2
  2859. add ebx, ds:[ebp].HALF_WIDTH
  2860. movd mm2, [ebx+esi]
  2861. punpcklbw mm2, mm0
  2862. pmullw mm2, mm3
  2863. paddusw mm2, mm6
  2864. paddusw mm2, mm4
  2865. psrlw mm2, 0x03
  2866. packuswb mm2, mm0
  2867. pmullw mm7, [mmmask_0007]
  2868. add edx, ds:[ebp].HALF_WIDTH
  2869. add ebx, ds:[ebp].HALF_WIDTH
  2870.   movd [edx+esi], mm2
  2871. movd mm2, [ebx+esi]
  2872. punpcklbw mm2, mm0
  2873. paddusw mm2, mm7
  2874. paddusw mm2, mm4
  2875. psrlw mm2, 0x03
  2876. packuswb mm2, mm0
  2877. add edx, ds:[ebp].HALF_WIDTH
  2878. add esi, 0x04
  2879. cmp esi, ds:[ebp].HALF_WIDTH
  2880. movd [edx+esi-4], mm2
  2881. jl convyuv422i
  2882. add eax, ds:[ebp].Coded_Picture_Width
  2883. add ecx, ds:[ebp].DOUBLE_WIDTH
  2884. mov esi, 0x00
  2885. dec edi
  2886. cmp edi, 0x00
  2887. jg convyuv422i
  2888. convyuv422bottomi:
  2889. movd mm1, [eax+esi]
  2890. movq mm6, mm1
  2891. punpcklbw mm1, mm0
  2892. mov ebx, eax
  2893. sub ebx, ds:[ebp].Coded_Picture_Width
  2894. movd mm3, [ebx+esi]
  2895. punpcklbw mm3, mm0
  2896. pmullw mm1, [mmmask_0007]
  2897. paddusw mm3, mm1
  2898. paddusw mm3, mm4
  2899. psrlw mm3, 0x03
  2900. packuswb mm3, mm0
  2901. add ebx, ds:[ebp].HALF_WIDTH
  2902. movq mm1, [ebx+esi]
  2903. punpcklbw mm1, mm0
  2904. movd [ecx+esi], mm3
  2905. pmullw mm1, [mmmask_0003]
  2906. add ebx, ds:[ebp].Coded_Picture_Width
  2907. movd mm2, [ebx+esi]
  2908. punpcklbw mm2, mm0
  2909. movq mm7, mm2
  2910. pmullw mm2, mm5
  2911. paddusw mm2, mm1
  2912. paddusw mm2, mm4
  2913. psrlw mm2, 0x03
  2914. packuswb mm2, mm0
  2915. mov edx, ecx
  2916. add edx, ds:[ebp].HALF_WIDTH
  2917. pmullw mm7, [mmmask_0007]
  2918. movd [edx+esi], mm2
  2919. add edx, ds:[ebp].HALF_WIDTH
  2920.   movd [edx+esi], mm6
  2921. punpcklbw mm6, mm0
  2922. paddusw mm6, mm7
  2923. paddusw mm6, mm4
  2924. psrlw mm6, 0x03
  2925. packuswb mm6, mm0
  2926. add edx, ds:[ebp].HALF_WIDTH
  2927. add esi, 0x04
  2928. cmp esi, ds:[ebp].HALF_WIDTH
  2929. movd [edx+esi-4], mm6
  2930. jl convyuv422bottomi
  2931. pop ebp
  2932. }
  2933. }
  2934. }
  2935. void CMPEG2Dec::conv444toRGB24(unsigned char *py, unsigned char *pu, unsigned char *pv, unsigned char *dst, int pitch)
  2936. {
  2937. int PWIDTH = pitch - DSTBYTES;
  2938. py += CLIP_STEP;
  2939. pu += CLIP_STEP;
  2940. pv += CLIP_STEP;
  2941. int Clip_Height = this->Clip_Height;
  2942. __int64 RGB_Offset = this->RGB_Offset;
  2943. __int64 RGB_Scale = this->RGB_Scale;
  2944. __int64 RGB_CBU = this->RGB_CBU;
  2945. __int64 RGB_CRV = this->RGB_CRV;
  2946. __int64 RGB_CGX = this->RGB_CGX;
  2947. int Clip_Width = this->Clip_Width;
  2948. int Coded_Picture_Width = this->Coded_Picture_Width;
  2949. __asm
  2950. {
  2951. mov eax, [py]
  2952. mov ebx, [pu]
  2953. mov ecx, [pv]
  2954. mov edx, [dst]
  2955. mov edi, Clip_Height
  2956. mov esi, 0x00
  2957. pxor mm0, mm0
  2958. convRGB24:
  2959. movd mm1, [eax+esi]
  2960. movd mm3, [ebx+esi]
  2961. punpcklbw mm1, mm0
  2962. punpcklbw mm3, mm0
  2963. movd mm5, [ecx+esi]
  2964. punpcklbw mm5, mm0
  2965. movq mm7, [mmmask_0128]
  2966. psubw mm3, mm7
  2967. psubw mm5, mm7
  2968. psubw mm1, RGB_Offset
  2969. movq mm2, mm1
  2970. movq mm7, [mmmask_0001]
  2971. punpcklwd mm1, mm7
  2972. punpckhwd mm2, mm7
  2973. movq mm7, RGB_Scale
  2974. pmaddwd mm1, mm7
  2975. pmaddwd mm2, mm7
  2976. movq mm4, mm3
  2977. punpcklwd mm3, mm0
  2978. punpckhwd mm4, mm0
  2979. movq mm7, RGB_CBU
  2980. pmaddwd mm3, mm7
  2981. pmaddwd mm4, mm7
  2982. paddd mm3, mm1
  2983. paddd mm4, mm2
  2984. psrld mm3, 13
  2985. psrld mm4, 13
  2986. packuswb mm3, mm0
  2987. packuswb mm4, mm0
  2988. movq mm6, mm5
  2989. punpcklwd mm5, mm0
  2990. punpckhwd mm6, mm0
  2991. movq mm7, RGB_CRV
  2992. pmaddwd mm5, mm7
  2993. pmaddwd mm6, mm7
  2994. paddd mm5, mm1
  2995. paddd mm6, mm2
  2996. psrld mm5, 13
  2997. psrld mm6, 13
  2998. packuswb mm5, mm0
  2999. packuswb mm6, mm0
  3000. punpcklbw mm3, mm5
  3001. punpcklbw mm4, mm6
  3002. movq mm5, mm3
  3003. movq mm6, mm4
  3004. psrlq mm5, 16
  3005. psrlq mm6, 16
  3006. por mm3, mm5
  3007. por mm4, mm6
  3008. movd mm5, [ebx+esi]
  3009. movd mm6, [ecx+esi]
  3010. punpcklbw mm5, mm0
  3011. punpcklbw mm6, mm0
  3012. movq mm7, [mmmask_0128]
  3013. psubw mm5, mm7
  3014. psubw mm6, mm7
  3015. movq mm7, mm6
  3016. punpcklwd mm6, mm5
  3017. punpckhwd mm7, mm5
  3018. movq mm5, RGB_CGX
  3019. pmaddwd mm6, mm5
  3020. pmaddwd mm7, mm5
  3021. paddd mm6, mm1
  3022. paddd mm7, mm2
  3023. psrld mm6, 13
  3024. psrld mm7, 13
  3025. packuswb mm6, mm0
  3026. packuswb mm7, mm0
  3027. punpcklbw mm3, mm6
  3028. punpcklbw mm4, mm7
  3029. movq mm1, mm3
  3030. movq mm5, mm4
  3031. movq mm6, mm4
  3032. psrlq mm1, 32
  3033. psllq mm1, 24
  3034. por mm1, mm3
  3035. psrlq mm3, 40
  3036. psllq mm6, 16
  3037. por mm3, mm6
  3038. movd [edx], mm1
  3039. psrld mm4, 16
  3040. psrlq mm5, 24
  3041. por mm5, mm4
  3042. movd [edx+4], mm3
  3043. add edx, 0x0c
  3044. add esi, 0x04
  3045. cmp esi, Clip_Width
  3046. movd [edx-4], mm5
  3047. jl convRGB24
  3048. add eax, Coded_Picture_Width
  3049. add ebx, Coded_Picture_Width
  3050. add ecx, Coded_Picture_Width
  3051. add edx, PWIDTH
  3052. mov esi, 0x00
  3053. dec edi
  3054. cmp edi, 0x00
  3055. jg convRGB24
  3056. emms
  3057. }
  3058. }
  3059. // YUV 4:2:2 Format:
  3060. // YUYV YUYV ...
  3061. void CMPEG2Dec::conv422toYUY2(unsigned char *py, unsigned char *pu, unsigned char *pv, unsigned char *dst, int pitch)
  3062. {
  3063. py += CLIP_STEP;
  3064. pu += CLIP_STEP;
  3065. pv += CLIP_STEP;
  3066. int y = this->Clip_Height;
  3067. int Clip_Width_2 = this->Clip_Width / 2;
  3068. int Coded_Picture_Width = this->Coded_Picture_Width;
  3069. int Coded_Picture_Width_2 = this->Coded_Picture_Width / 2;
  3070. __asm
  3071. {
  3072. emms
  3073. mov eax, [py]
  3074. mov ebx, [pu]
  3075. mov ecx, [pv]
  3076. mov edx, [dst]
  3077. mov edi, Clip_Width_2
  3078. yloop:
  3079. xor esi, esi
  3080. xloop:
  3081. movd mm1, [eax+esi*2] ;0000YYYY
  3082. movd mm2, [ebx+esi] ;0000UUUU
  3083. movd mm3, [ecx+esi] ;0000VVVV
  3084. ;interleave this to VYUYVYUY
  3085. punpcklbw mm2, mm3 ;VUVUVUVU
  3086. punpcklbw mm1, mm2 ;VYUYVYUY
  3087. movq [edx+esi*4], mm1
  3088. movd mm1, [eax+esi*2+4] ;0000YYYY
  3089. punpckhdq mm2, mm2 ;xxxxVUVU
  3090. punpcklbw mm1, mm2 ;VYUYVYUY
  3091. movq [edx+esi*4+8], mm1
  3092. add esi, 4
  3093. cmp esi, edi
  3094. jb xloop
  3095. add edx, pitch
  3096. add eax, Coded_Picture_Width
  3097. add ebx, Coded_Picture_Width_2
  3098. add ecx, Coded_Picture_Width_2
  3099. dec y
  3100. jnz yloop
  3101. emms
  3102. }
  3103. }
  3104. //
  3105. // codec
  3106. //
  3107. static const int ChromaFormat[4] = {
  3108. 0, 6, 8, 12
  3109. };
  3110. CMPEG2Dec::CMPEG2Dec()
  3111. {
  3112.   VF_File = 0;
  3113.   VF_FrameLimit = VF_FrameBound = VF_GOPLimit = VF_GOPNow = VF_GOPSize =
  3114. VF_OldFrame = VF_OldRef = 0;
  3115.   VF_FrameSize = VF_FrameRate = 0;
  3116.   memset(Rdbfr, 0, sizeof(Rdbfr));
  3117.   Rdptr = Rdmax = 0;
  3118.   CurrentBfr = NextBfr = BitsLeft = Val = Read = 0;
  3119.   Fault_Flag = File_Flag = File_Limit = FO_Flag = IDCT_Flag = SystemStream_Flag = 0;
  3120.   Luminance_Flag = Resize_Flag = KeyOp_Flag = lfsr0 = lfsr1 = 0;
  3121.   BufferOp = 0;
  3122.   memset(intra_quantizer_matrix, 0, sizeof(intra_quantizer_matrix));
  3123.   memset(non_intra_quantizer_matrix, 0, sizeof(non_intra_quantizer_matrix));
  3124.   memset(chroma_intra_quantizer_matrix, 0, sizeof(chroma_intra_quantizer_matrix));
  3125.   memset(chroma_non_intra_quantizer_matrix, 0, sizeof(chroma_non_intra_quantizer_matrix));
  3126.   load_intra_quantizer_matrix =
  3127.   load_non_intra_quantizer_matrix =
  3128.   load_chroma_intra_quantizer_matrix =
  3129.   load_chroma_non_intra_quantizer_matrix = 0;
  3130.   q_scale_type =
  3131.   alternate_scan =
  3132.   quantizer_scale = 0;
  3133. int i;
  3134. for (i=0; i<MAX_FILE_NUMBER; i++) Infilename[i] = NULL;
  3135. for (i=0; i<8; i++) p_block[i] = block[i] = NULL;
  3136. p_fTempArray = fTempArray = NULL;
  3137. for (i=0; i<3; i++) backward_reference_frame[i] = forward_reference_frame[i] =  auxframe[i] = NULL;
  3138. lum = NULL;
  3139. u422 = v422 = u444 = v444 = dstFrame = NULL;
  3140. hLibrary = NULL;
  3141.   CheckCPU();
  3142. }
  3143. static char* myfgets(char* buff, int len, FILE* file)
  3144. {
  3145. char* ret = buff;
  3146. ret[0] = 0;
  3147. while(ret = fgets(buff, len, file))
  3148. {
  3149. while(isspace(*ret)) ret++;
  3150. if(*ret) break;
  3151. }
  3152. return(ret);
  3153. }
  3154. int CMPEG2Dec::Open(const char *path, DstFormat dstFormat)
  3155. {
  3156. m_dstFormat = dstFormat;
  3157. char ID[19], PASS[19] = "DVD2AVIProjectFile";
  3158. DWORD i, j, size, code, type, tff, rff, film, ntsc, gop, top, bottom, mapping;
  3159. int repeat_on, repeat_off, repeat_init;
  3160. int Clip_Top, Clip_Bottom, Clip_Left, Clip_Right, Squeeze_Width, Squeeze_Height;
  3161. HKEY key; DWORD value = REG_SZ; DWORD length = 256;
  3162. char *ext, buffer[256];
  3163. CMPEG2Dec* out = this;
  3164. out->VF_File = fopen(path, "r");
  3165. if (out->VF_File==NULL)
  3166. return 0;
  3167. if (fgets(ID, 19, out->VF_File)==NULL)
  3168. return 0;
  3169. if (strcmp(ID, PASS))
  3170. return 0;
  3171. // load DLL
  3172. if (RegOpenKeyExA(HKEY_CURRENT_USER, "Software\VFPlugin", 0, KEY_ALL_ACCESS, &key)==ERROR_SUCCESS)
  3173. {
  3174. RegQueryValueExA(key, "DVD2AVI", NULL, &value, (unsigned char*)buffer, &length);
  3175. ext = strrchr(buffer, '\');
  3176. sprintf(buffer + (int)(ext-buffer) + 1, "OpenDVD.dll");
  3177. RegCloseKey(key);
  3178. }
  3179. if ((hLibrary = LoadLibraryA(buffer)) != NULL)
  3180. BufferOp = (PBufferOp) GetProcAddress(hLibrary, "BufferOp");
  3181. for (i=0; i<MAX_FILE_NUMBER; i++)
  3182. Infilename[i] = new char[_MAX_PATH];
  3183. if(1 != fscanf(out->VF_File, "%d", &File_Limit))
  3184. return 0;
  3185. i = File_Limit;
  3186. while (i)
  3187. {
  3188. if(1 != fscanf(out->VF_File, "%d ", &j))
  3189. return 0;
  3190. fgets(Infilename[File_Limit-i], j+1, out->VF_File);
  3191. if ((Infile[File_Limit-i] = _open(Infilename[File_Limit-i], _O_RDONLY | _O_BINARY))==-1)
  3192. return 0;
  3193. i--;
  3194. }
  3195. if(3 != sscanf(myfgets(buffer, sizeof(buffer), out->VF_File), "nStream_Type=%d,%X,%Xn", &SystemStream_Flag, &lfsr0, &lfsr1))
  3196. return 0;
  3197. if (lfsr0 || lfsr1)
  3198. KeyOp_Flag = 1;
  3199. else
  3200. KeyOp_Flag = 0;
  3201. if(1 != sscanf(myfgets(buffer, sizeof(buffer), out->VF_File), "iDCT_Algorithm=%dn", &IDCT_Flag))
  3202. return 0;
  3203. switch (IDCT_Flag)
  3204. {
  3205. case IDCT_SSEMMX:
  3206. if (!cpu.ssemmx)
  3207. IDCT_Flag = IDCT_MMX;
  3208. break;
  3209. case IDCT_FPU:
  3210. Initialize_FPU_IDCT();
  3211. break;
  3212. case IDCT_REF:
  3213. Initialize_REF_IDCT();
  3214. break;
  3215. }
  3216. File_Flag = 0;
  3217. _lseeki64(Infile[0], 0, SEEK_SET);
  3218. Initialize_Buffer();
  3219. do
  3220. {
  3221. next_start_code();
  3222. code = Get_Bits(32);
  3223. }
  3224. while (code!=SEQUENCE_HEADER_CODE);
  3225. sequence_header();
  3226. mb_width = (horizontal_size+15)/16;
  3227. mb_height = progressive_sequence ? (vertical_size+15)/16 : 2*((vertical_size+31)/32);
  3228. Coded_Picture_Width = 16 * mb_width;
  3229. Coded_Picture_Height = 16 * mb_height;
  3230. Chroma_Width = (chroma_format==CHROMA444) ? Coded_Picture_Width : Coded_Picture_Width>>1;
  3231. Chroma_Height = (chroma_format!=CHROMA420) ? Coded_Picture_Height : Coded_Picture_Height>>1;
  3232. block_count = ChromaFormat[chroma_format];
  3233. for (i=0; i<8; i++)
  3234. {
  3235. p_block[i] = (short *)new BYTE[sizeof(short)*64 + 64];
  3236. block[i]   = (short *)((long)p_block[i] + 64 - (long)p_block[i]%64);
  3237. }
  3238. p_fTempArray = (void *)new BYTE[sizeof(float)*128 + 64];
  3239. fTempArray = (void *)((long)p_fTempArray + 64 - (long)p_fTempArray%64);
  3240. for (i=0; i<3; i++)
  3241. {
  3242. if (i==0)
  3243. size = Coded_Picture_Width * Coded_Picture_Height;
  3244. else
  3245. size = Chroma_Width * Chroma_Height;
  3246. backward_reference_frame[i] = new unsigned char[size];
  3247. forward_reference_frame[i] = new unsigned char[size];
  3248. auxframe[i] = new unsigned char[size];
  3249. }
  3250. if(1 != sscanf(myfgets(buffer, sizeof(buffer), out->VF_File), "YUVRGB_Scale=%dn", &i))
  3251. return 0;
  3252. if (i)
  3253. {
  3254. RGB_Scale = 0x1000254310002543;
  3255. RGB_Offset = 0x0010001000100010;
  3256. RGB_CBU = 0x0000408D0000408D;
  3257. RGB_CGX = 0xF377E5FCF377E5FC;
  3258. RGB_CRV = 0x0000331300003313;
  3259. }
  3260. else
  3261. {
  3262. RGB_Scale = 0x1000200010002000;
  3263. RGB_Offset = 0x0000000000000000;
  3264. RGB_CBU = 0x000038B4000038B4;
  3265. RGB_CGX = 0xF4FDE926F4FDE926;
  3266. RGB_CRV = 0x00002CDD00002CDD;
  3267. }
  3268. char* tmp = myfgets(buffer, sizeof(buffer), out->VF_File);
  3269. if(2 != sscanf(tmp, "Luminance=%d,%dn", &i, &j))
  3270. {
  3271. if(2 != sscanf(tmp, "Luminance_Filter=%d,%dn", &i, &j))
  3272. return 0;
  3273. i=128; j=0;
  3274. }
  3275. if (i==128 && j==0)
  3276. Luminance_Flag = 0;
  3277. else
  3278. {
  3279. Luminance_Flag = 1;
  3280. LumGainMask = ((__int64)i<<48) + ((__int64)i<<32) + ((__int64)i<<16) + (__int64)i;
  3281. LumOffsetMask = ((__int64)j<<48) + ((__int64)j<<32) + ((__int64)j<<16) + (__int64)j;
  3282. lum = new unsigned char[Coded_Picture_Width * Coded_Picture_Height];
  3283. }
  3284. if(6 != sscanf(myfgets(buffer, sizeof(buffer), out->VF_File), "Picture_Size=%d,%d,%d,%d,%d,%dn", 
  3285. &Clip_Top, &Clip_Bottom, &Clip_Left, &Clip_Right, &Squeeze_Width, &Squeeze_Height))
  3286. return 0;
  3287. Resize_Flag = 0;
  3288. Resize_Width = Clip_Width = Coded_Picture_Width;
  3289. Resize_Height = Clip_Height = Coded_Picture_Height;
  3290. CLIP_AREA = HALF_CLIP_AREA = CLIP_STEP = 0;
  3291. if (Clip_Top || Clip_Bottom || Clip_Left || Clip_Right)
  3292. {
  3293. Clip_Width -= Clip_Left+Clip_Right;
  3294. Clip_Height -= Clip_Top+Clip_Bottom;
  3295. Resize_Width = Clip_Width;
  3296. Resize_Height = Clip_Height;
  3297. CLIP_AREA = Coded_Picture_Width * Clip_Top;
  3298. HALF_CLIP_AREA = (Coded_Picture_Width>>1) * Clip_Top;
  3299. CLIP_STEP = Coded_Picture_Width * Clip_Top + Clip_Left;
  3300. }
  3301. if (Squeeze_Width || Squeeze_Height)
  3302. {
  3303. Resize_Flag = 1;
  3304. Resize_Width -= Squeeze_Width;
  3305. Resize_Height -= Squeeze_Height;
  3306. }
  3307. DSTBYTES = Clip_Width * (dstRGB24() ? 3 : 2);
  3308. DSTBYTES2 = DSTBYTES * 2;
  3309. LUM_AREA = Coded_Picture_Width * Clip_Height;
  3310. PROGRESSIVE_HEIGHT = (Coded_Picture_Height>>1) - 2;
  3311. INTERLACED_HEIGHT = (Coded_Picture_Height>>2) - 2;
  3312. HALF_WIDTH = Coded_Picture_Width>>1;
  3313. HALF_WIDTH_D8 = (Coded_Picture_Width>>1) - 8;
  3314. DOUBLE_WIDTH = Coded_Picture_Width<<1;
  3315. u422 = new unsigned char[Coded_Picture_Width * Coded_Picture_Height / 2];
  3316. v422 = new unsigned char[Coded_Picture_Width * Coded_Picture_Height / 2];
  3317. u444 = new unsigned char[Coded_Picture_Width * Coded_Picture_Height];
  3318. v444 = new unsigned char[Coded_Picture_Width * Coded_Picture_Height];
  3319. dstFrame = new unsigned char[Clip_Width * Clip_Height * 4];  // max value (super set)
  3320. if(1 != sscanf(myfgets(buffer, sizeof(buffer), out->VF_File), "Field_Operation=%dn", &FO_Flag))
  3321. return 0;
  3322. if(1 != sscanf(myfgets(buffer, sizeof(buffer), out->VF_File), "Frame_Rate=%dn", &(out->VF_FrameRate)))
  3323. return 0;
  3324. if(4 != sscanf(myfgets(buffer, sizeof(buffer), out->VF_File), "Location=%d,%X,%d,%Xn", &i, &j, &i, &j))
  3325. return 0;
  3326. ntsc = film = top = bottom = gop = mapping = repeat_on = repeat_off = repeat_init = 0;
  3327. while (1 == fscanf(out->VF_File, "%d", &type) && type<9)
  3328. {
  3329. if (type==7) // I frame
  3330. {
  3331. GOPList[gop] = reinterpret_cast<GOPLIST*>(calloc(1, sizeof(GOPLIST)));
  3332. GOPList[gop]->number = film;
  3333. if(2 != fscanf(out->VF_File, "%d %X", &(GOPList[gop]->file), &j))
  3334. break;
  3335. GOPList[gop]->position = (__int64)j*BUFFER_SIZE;
  3336. gop ++;
  3337. if(1 != fscanf(out->VF_File, "%d", &j))
  3338. break;
  3339. tff = j>>1;
  3340. rff = j & 1;
  3341. }
  3342. else // P, B frame
  3343. {
  3344. tff = type>>1;
  3345. rff = type & 1;
  3346. }
  3347. if (!film)
  3348. {
  3349. if (tff)
  3350. Field_Order = 1;
  3351. else
  3352. Field_Order = 0;
  3353. }
  3354. if (FO_Flag==FO_FILM)
  3355. {
  3356. if (rff)
  3357. repeat_on++;
  3358. else
  3359. repeat_off++;
  3360. if (repeat_init)
  3361. {
  3362. if (repeat_off-repeat_on == 5)
  3363. {
  3364. repeat_on = repeat_off = 0;
  3365. }
  3366. else
  3367. {
  3368. FrameList[mapping] = reinterpret_cast<FRAMELIST*>(calloc(1, sizeof(FRAMELIST)));
  3369. FrameList[mapping]->top = FrameList[mapping]->bottom = film;
  3370. mapping ++;
  3371. }
  3372. if (repeat_on-repeat_off == 5)
  3373. {
  3374. repeat_on = repeat_off = 0;
  3375. FrameList[mapping] = reinterpret_cast<FRAMELIST*>(calloc(1, sizeof(FRAMELIST)));
  3376. FrameList[mapping]->top = FrameList[mapping]->bottom = film;
  3377. mapping ++;
  3378. }
  3379. }
  3380. else
  3381. {
  3382. if (repeat_off-repeat_on == 3)
  3383. {
  3384. repeat_on = repeat_off = 0;
  3385. repeat_init = 1;
  3386. }
  3387. else
  3388. {
  3389. FrameList[mapping] = reinterpret_cast<FRAMELIST*>(calloc(1, sizeof(FRAMELIST)));
  3390. FrameList[mapping]->top = FrameList[mapping]->bottom = film;
  3391. mapping ++;
  3392. }
  3393. if (repeat_on-repeat_off == 3)
  3394. {
  3395. repeat_on = repeat_off = 0;
  3396. repeat_init = 1;
  3397. FrameList[mapping] = reinterpret_cast<FRAMELIST*>(calloc(1, sizeof(FRAMELIST)));
  3398. FrameList[mapping]->top = FrameList[mapping]->bottom = film;
  3399. mapping ++;
  3400. }
  3401. }
  3402. }
  3403. else
  3404. {
  3405. if (top)
  3406. {
  3407. FrameList[ntsc]->bottom = film;
  3408. ntsc ++;
  3409. FrameList[ntsc] = reinterpret_cast<FRAMELIST*>(calloc(1, sizeof(FRAMELIST)));
  3410. FrameList[ntsc]->top = film;
  3411. }
  3412. else if (bottom)
  3413. {
  3414. FrameList[ntsc]->top = film;
  3415. ntsc ++;
  3416. FrameList[ntsc] = reinterpret_cast<FRAMELIST*>(calloc(1, sizeof(FRAMELIST)));
  3417. FrameList[ntsc]->bottom = film;
  3418. }
  3419. else
  3420. {
  3421. FrameList[ntsc] = reinterpret_cast<FRAMELIST*>(calloc(1, sizeof(FRAMELIST)));
  3422. FrameList[ntsc]->top = film;
  3423. FrameList[ntsc]->bottom = film;
  3424. ntsc ++;
  3425. }
  3426. if (rff)
  3427. {
  3428. if (!top && !bottom)
  3429. FrameList[ntsc] = reinterpret_cast<FRAMELIST*>(calloc(1, sizeof(FRAMELIST)));
  3430. if (tff)
  3431. {
  3432. FrameList[ntsc]->top = film;
  3433. top = 1;
  3434. }
  3435. else
  3436. {
  3437. FrameList[ntsc]->bottom = film;
  3438. bottom = 1;
  3439. }
  3440. if (top && bottom)
  3441. {
  3442. top = bottom = 0;
  3443. ntsc ++;
  3444. }
  3445. }
  3446. }
  3447. film ++;
  3448. }
  3449. out->VF_FrameBound = film;
  3450. film -= 2;
  3451. if (FO_Flag==FO_FILM)
  3452. {
  3453. while (FrameList[mapping-1]->top >= film)
  3454. mapping --;
  3455. out->VF_FrameLimit = mapping;
  3456. }
  3457. else
  3458. {
  3459. if (FO_Flag==FO_SWAP)
  3460. {
  3461. Field_Order = !Field_Order;
  3462. if (Field_Order)
  3463. for (i=0; i<ntsc-1; i++)
  3464. FrameList[i]->bottom = FrameList[i+1]->bottom;
  3465. else
  3466. for (i=0; i<ntsc-1; i++)
  3467. FrameList[i]->top = FrameList[i+1]->top;
  3468. }
  3469. while ((FrameList[ntsc-1]->top >= film) || (FrameList[ntsc-1]->bottom >= film))
  3470. ntsc --;
  3471. out->VF_FrameLimit = ntsc;
  3472. for (i=0; i<out->VF_FrameLimit-1; i++)
  3473. if (FrameList[i]->top==FrameList[i+1]->top || FrameList[i]->top==FrameList[i+1]->bottom ||
  3474. FrameList[i]->bottom==FrameList[i+1]->top || FrameList[i]->bottom==FrameList[i+1]->bottom)
  3475. {
  3476. FrameList[i]->forward = 1;
  3477. FrameList[i+1]->backward = 1;
  3478. }
  3479. }
  3480. Full_Frame = 1;
  3481. for (i=0; i<out->VF_FrameLimit; i++)
  3482. if (FrameList[i]->top!=FrameList[i]->bottom)
  3483. {
  3484. Full_Frame = 0;
  3485. break;
  3486. }
  3487. out->VF_GOPNow = out->VF_GOPLimit = gop;
  3488. out->VF_OldFrame = out->VF_FrameLimit;
  3489. out->VF_FrameSize = Clip_Width * Clip_Height * 3;
  3490. return 1;
  3491. }
  3492. void CMPEG2Dec::Decode(unsigned char *dst, DWORD frame, int pitch)
  3493. {
  3494. DWORD i, now, size, origin, ref, fo;
  3495. int remain;
  3496. CMPEG2Dec* in = this;
  3497. if (FO_Flag==FO_FILM)
  3498. {
  3499. fo = 0;
  3500. frame = FrameList[frame]->top;
  3501. }
  3502. origin = frame;
  3503. if (FO_Flag!=FO_FILM)
  3504. {
  3505. if (FrameList[frame]->top == FrameList[frame]->bottom)
  3506. {
  3507. fo = 0;
  3508. frame = FrameList[frame]->top;
  3509. }
  3510. else if (FrameList[frame]->top < FrameList[frame]->bottom)
  3511. {
  3512. fo = 1;
  3513. frame = FrameList[frame]->top;
  3514. }
  3515. else
  3516. {
  3517. fo = 2;
  3518. frame = FrameList[frame]->bottom;
  3519. }
  3520. }
  3521. ref = frame;
  3522. if (frame >= GOPList[in->VF_GOPLimit-1]->number)
  3523. {
  3524. now = in->VF_GOPLimit-1;
  3525. ref -= GOPList[in->VF_GOPLimit-1]->number;
  3526. size = in->VF_FrameBound - GOPList[in->VF_GOPLimit-1]->number + 1;
  3527. }
  3528. else
  3529. for (now = 0; now < (in->VF_GOPLimit-1); now++)
  3530. {
  3531. if (frame>=GOPList[now]->number && frame<GOPList[now+1]->number)
  3532. {
  3533. ref -= GOPList[now]->number;
  3534. size = GOPList[now+1]->number - GOPList[now]->number + 1;
  3535. break;
  3536. }
  3537. }
  3538. if (fo)
  3539. ref ++;
  3540. if (now != in->VF_GOPNow)
  3541. {
  3542. if ((in->VF_OldFrame + 1)==origin)
  3543. {
  3544. if (Full_Frame)
  3545. {
  3546. Get_Hdr();
  3547. Decode_Picture(1, dst, pitch);
  3548. if (picture_structure!=FRAME_PICTURE)
  3549. {
  3550. Get_Hdr();
  3551. Decode_Picture(1, dst, pitch);
  3552. }
  3553. }
  3554. else
  3555. switch (fo)
  3556. {
  3557. case 0:
  3558. if (!FrameList[origin]->backward)
  3559. {
  3560. Get_Hdr();
  3561. Decode_Picture(1, dst, pitch);
  3562. if (picture_structure!=FRAME_PICTURE)
  3563. {
  3564. Get_Hdr();
  3565. Decode_Picture(1, dst, pitch);
  3566. }
  3567. if (FrameList[origin]->forward)
  3568. {
  3569. if (Field_Order)
  3570. Copyodd(dst, dstFrame, pitch, 1);
  3571. else
  3572. Copyeven(dst, dstFrame, pitch, 1);
  3573. }
  3574. }
  3575. else
  3576. {
  3577. Copyodd(dstFrame, dst, pitch, 0);
  3578. Copyeven(dstFrame, dst, pitch, 0);
  3579. }
  3580. break;
  3581. case 1:
  3582. Copyodd(dstFrame, dst, pitch, 0);
  3583. Get_Hdr();
  3584. Decode_Picture(1, dstFrame, DSTBYTES);
  3585. if (picture_structure!=FRAME_PICTURE)
  3586. {
  3587. Get_Hdr();
  3588. Decode_Picture(1, dstFrame, DSTBYTES);
  3589. }
  3590. Copyeven(dstFrame, dst, pitch, 0);
  3591. break;
  3592. case 2:
  3593. Copyeven(dstFrame, dst, pitch, 0);
  3594. Get_Hdr();
  3595. Decode_Picture(1, dstFrame, DSTBYTES);
  3596. if (picture_structure!=FRAME_PICTURE)
  3597. {
  3598. Get_Hdr();
  3599. Decode_Picture(1, dstFrame, DSTBYTES);
  3600. }
  3601. Copyodd(dstFrame, dst, pitch, 0);
  3602. break;
  3603. }
  3604. if (in->VF_GOPSize)
  3605. {
  3606. for (i=0; i < in->VF_GOPSize; i++)
  3607. free(GOPBuffer[i]);
  3608. in->VF_GOPSize = 0;
  3609. }
  3610. in->VF_GOPNow = in->VF_GOPLimit;
  3611. in->VF_OldFrame = origin;
  3612. return;
  3613. }
  3614. remain = ref;
  3615. in->VF_OldRef = ref;
  3616. in->VF_GOPNow = now;
  3617. Second_Field = 0;
  3618. if (size < in->VF_GOPSize)
  3619. for (i=0; i < (in->VF_GOPSize - size); i++)
  3620. free(GOPBuffer[size+i]);
  3621. else if (size > in->VF_GOPSize)
  3622. for (i=0; i < (size - in->VF_GOPSize); i++)
  3623. GOPBuffer[in->VF_GOPSize+i] = reinterpret_cast<unsigned char*>(malloc(in->VF_FrameSize));
  3624. in->VF_GOPSize = size;
  3625. File_Flag = GOPList[now]->file;
  3626. _lseeki64(Infile[GOPList[now]->file], GOPList[now]->position, SEEK_SET);
  3627. Initialize_Buffer();
  3628. while (Get_Hdr() && picture_coding_type!=I_TYPE);
  3629. Decode_Picture(0, dst, pitch);
  3630. while (Get_Hdr() && picture_coding_type==B_TYPE);
  3631. if (picture_structure!=FRAME_PICTURE)
  3632. {
  3633. Decode_Picture(0, dst, pitch);
  3634. Get_Hdr();
  3635. }
  3636. Decode_Picture(1, dst, pitch);
  3637. if (picture_structure!=FRAME_PICTURE)
  3638. {
  3639. Get_Hdr();
  3640. Decode_Picture(1, dst, pitch);
  3641. }
  3642. Copyodd(dst, GOPBuffer[0], pitch, 1);
  3643. Copyeven(dst, GOPBuffer[0], pitch, 1);
  3644. while (remain && Get_Hdr())
  3645. {
  3646. Decode_Picture(1, dst, pitch);
  3647. if (picture_structure!=FRAME_PICTURE)
  3648. {
  3649. Get_Hdr();
  3650. Decode_Picture(1, dst, pitch);
  3651. }
  3652. Copyodd(dst, GOPBuffer[ref - remain + 1], pitch, 1);
  3653. Copyeven(dst, GOPBuffer[ref - remain + 1], pitch, 1);
  3654. remain--;
  3655. }
  3656. if (!Full_Frame && ref>=(size-2))
  3657. {
  3658. Copyodd(dst, dstFrame, pitch, 1);
  3659. Copyeven(dst, dstFrame, pitch, 1);
  3660. }
  3661. }
  3662. else
  3663. {
  3664. remain = ref - in->VF_OldRef;
  3665. if (remain > 0)
  3666. {
  3667. in->VF_OldRef = ref;
  3668. while (remain && Get_Hdr())
  3669. {
  3670. Decode_Picture(1, dst, pitch);
  3671. if (picture_structure!=FRAME_PICTURE)
  3672. {
  3673. Get_Hdr();
  3674. Decode_Picture(1, dst, pitch);
  3675. }
  3676. Copyodd(dst, GOPBuffer[ref - remain + 1], pitch, 1);
  3677. Copyeven(dst, GOPBuffer[ref - remain + 1], pitch, 1);
  3678. remain--;
  3679. }
  3680. if (!Full_Frame && ref>=(size-2))
  3681. {
  3682. Copyodd(dst, dstFrame, pitch, 1);
  3683. Copyeven(dst, dstFrame, pitch, 1);
  3684. }
  3685. }
  3686. }
  3687. switch (fo)
  3688. {
  3689. case 0:
  3690. Copyodd(GOPBuffer[ref], dst, pitch, 0);
  3691. Copyeven(GOPBuffer[ref], dst, pitch, 0);
  3692. break;
  3693. case 1:
  3694. Copyodd(GOPBuffer[ref-1], dst, pitch, 0);
  3695. Copyeven(GOPBuffer[ref], dst, pitch, 0);
  3696. break;
  3697. case 2:
  3698. Copyodd(GOPBuffer[ref], dst, pitch, 0);
  3699. Copyeven(GOPBuffer[ref-1], dst, pitch, 0);
  3700. break;
  3701. }
  3702. in->VF_OldFrame = origin;
  3703. }
  3704. void CMPEG2Dec::Close()
  3705. {
  3706. int i;
  3707. for(i = 0; i < VF_GOPLimit; i++) free(GOPList[i]);
  3708. for(i = 0; i < VF_FrameLimit; i++) free(FrameList[i]);
  3709. if (VF_File != NULL)
  3710. fclose(VF_File);
  3711. while (VF_GOPSize)
  3712. {
  3713. VF_GOPSize--;
  3714. free(GOPBuffer[VF_GOPSize]);
  3715. }
  3716. while (File_Limit)
  3717. {
  3718. File_Limit--;
  3719. _close(Infile[File_Limit]);
  3720. }
  3721. for (i=0; i<MAX_FILE_NUMBER; i++)
  3722. delete [] Infilename[i];
  3723. for (i=0; i<3; i++)
  3724. {
  3725. delete [] backward_reference_frame[i];
  3726. delete [] forward_reference_frame[i];
  3727. delete [] auxframe[i];
  3728. }
  3729. delete [] u422;
  3730. delete [] v422;
  3731. delete [] u444;
  3732. delete [] v444;
  3733. delete [] dstFrame;
  3734. if(Luminance_Flag)
  3735. delete [] lum;
  3736. for (i=0; i<8; i++)
  3737. delete [] p_block[i];
  3738. delete [] p_fTempArray;
  3739. if (hLibrary)
  3740. FreeLibrary(hLibrary);
  3741. }
  3742. void CMPEG2Dec::Copyodd(unsigned char *src, unsigned char *dst, int pitch, int forward)
  3743. {
  3744. int i;
  3745. int PWIDTH = forward ? (pitch<<1) : DSTBYTES2;
  3746. int QWIDTH = forward ? DSTBYTES2 : (pitch<<1);
  3747. for (i=0; i<(Clip_Height>>1); i++)
  3748. {
  3749. memcpy (dst, src, DSTBYTES);
  3750. src += PWIDTH;
  3751. dst += QWIDTH;
  3752. }
  3753. }
  3754. void CMPEG2Dec::Copyeven(unsigned char *src, unsigned char *dst, int pitch, int forward)
  3755. {
  3756. int i;
  3757. int PWIDTH = forward ? (pitch<<1) : DSTBYTES2;
  3758. int QWIDTH = forward ? DSTBYTES2 : (pitch<<1);
  3759. src += forward ? pitch : DSTBYTES;
  3760. dst += forward ? DSTBYTES : pitch;
  3761. for (i=0; i<(Clip_Height>>1); i++)
  3762. {
  3763. memcpy (dst, src, DSTBYTES);
  3764. src += PWIDTH;
  3765. dst += QWIDTH;
  3766. }
  3767. }