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

DirextX编程

开发平台:

Visual C++

  1. /* Copyright (C) 1996, MPEG Software Simulation Group. All Rights Reserved. */
  2. /*
  3.  * Disclaimer of Warranty
  4.  *
  5.  * These software programs are available to the user without any license fee or
  6.  * royalty on an "as is" basis.  The MPEG Software Simulation Group disclaims
  7.  * any and all warranties, whether express, implied, or statuary, including any
  8.  * implied warranties or merchantability or of fitness for a particular
  9.  * purpose.  In no event shall the copyright-holder be liable for any
  10.  * incidental, punitive, or consequential damages of any kind whatsoever
  11.  * arising from the use of these programs.
  12.  *
  13.  * This disclaimer of warranty extends to the user of these programs and user's
  14.  * customers, employees, agents, transferees, successors, and assigns.
  15.  *
  16.  * The MPEG Software Simulation Group does not represent or warrant that the
  17.  * programs furnished hereunder are free of infringement of any third-party
  18.  * patents.
  19.  *
  20.  * Commercial implementations of MPEG-1 and MPEG-2 video, including shareware,
  21.  * are subject to royalty fees to patent holders.  Many of these patents are
  22.  * general enough such that they are unavoidable regardless of implementation
  23.  * design.
  24.  *
  25.  */
  26. #include "global.h"
  27. #include "getbit.h"
  28. static int cc_table[12] = {
  29. 0, 0, 0, 0, 1, 2, 1, 2, 1, 2, 1, 2
  30. };
  31. /* private prototypes*/
  32. __forceinline static void Update_Picture_Buffers(void);
  33. __forceinline static void picture_data(void);
  34. __forceinline static int slice(int MBAmax);
  35. __forceinline static void macroblock_modes(int *pmacroblock_type, int *pmotion_type,
  36. int *pmotion_vector_count, int *pmv_format, int *pdmv, int *pmvscale, int *pdct_type);
  37. __forceinline static void Clear_Block(int count);
  38. __forceinline static void Add_Block(int count, int bx, int by, int dct_type, int addflag);
  39. __forceinline static void motion_compensation(int MBA, int macroblock_type, int motion_type,
  40. int PMV[2][2][2], int motion_vertical_field_select[2][2], int dmvector[2], int dct_type);
  41. __forceinline static void skipped_macroblock(int dc_dct_pred[3], int PMV[2][2][2], 
  42. int *motion_type, int motion_vertical_field_select[2][2], int *macroblock_type);
  43. __forceinline static int start_of_slice(int *MBA, int *MBAinc, int dc_dct_pred[3], int PMV[2][2][2]);
  44. __forceinline static int decode_macroblock(int *macroblock_type, int *motion_type, int *dct_type,
  45. int PMV[2][2][2], int dc_dct_pred[3], int motion_vertical_field_select[2][2], int dmvector[2]);
  46. __forceinline static void Decode_MPEG2_Intra_Block(int comp, int dc_dct_pred[]);
  47. __forceinline static void Decode_MPEG2_Non_Intra_Block(int comp);
  48. __forceinline static int Get_macroblock_type(void);
  49. __forceinline static int Get_I_macroblock_type(void);
  50. __forceinline static int Get_P_macroblock_type(void);
  51. __forceinline static int Get_B_macroblock_type(void);
  52. __forceinline static int Get_D_macroblock_type(void);
  53. __forceinline static int Get_coded_block_pattern(void);
  54. __forceinline static int Get_macroblock_address_increment(void);
  55. __forceinline static int Get_Luma_DC_dct_diff(void);
  56. __forceinline static int Get_Chroma_DC_dct_diff(void);
  57. __forceinline static void form_predictions(int bx, int by, int macroblock_type, int motion_type, int PMV[2][2][2], 
  58. int motion_vertical_field_select[2][2], int dmvector[2]);
  59. static void form_prediction(unsigned char *src[], int sfield, unsigned char *dst[], int dfield, 
  60. int lx, int lx2, int w, int h, int x, int y, int dx, int dy, int average_flag);
  61. __forceinline static void form_component_prediction(unsigned char *src, unsigned char *dst,
  62. int lx, int lx2, int w, int h, int x, int y, int dx, int dy, int average_flag);
  63. /* decode one frame */
  64. int Decode_Picture()
  65. {
  66. gIsPictureDecoding = TRUE;
  67. if (picture_structure==FRAME_PICTURE && Second_Field)
  68. Second_Field = 0;
  69. if (picture_coding_type!=B_TYPE)
  70. {
  71. d2v_forward = d2v_backward;
  72. d2v_backward = d2v_current;
  73. }
  74. /* update picture buffer pointers */
  75. Update_Picture_Buffers();
  76. /* decode picture data ISO/IEC 13818-2 section 6.2.3.7 */
  77. picture_data();
  78. /* write or display current or previously decoded reference frame */
  79. /* ISO/IEC 13818-2 section 6.1.1.11: Frame reordering */
  80. if (Frame_Number && (picture_structure==FRAME_PICTURE || Second_Field))
  81. {
  82. if (picture_coding_type==B_TYPE)
  83. Write_Frame(auxframe, d2v_current, Frame_Number-1);
  84. else
  85. Write_Frame(forward_reference_frame, d2v_forward, Frame_Number-1);
  86. }
  87. else if (picture_structure==FRAME_PICTURE || Second_Field)
  88. {
  89. Write_Frame(backward_reference_frame, d2v_backward, 0);
  90. }
  91. if (picture_structure!=FRAME_PICTURE)
  92. Second_Field = !Second_Field;
  93. if (!Second_Field)
  94. Frame_Number++;
  95. gIsPictureDecoding = FALSE;
  96. if (Fault_Flag)
  97. return 0; // Indicating decoding failure
  98. return 1;
  99. }
  100. /* reuse old picture buffers as soon as they are no longer needed */
  101. static void Update_Picture_Buffers()
  102. {
  103. int cc;              /* color component index */
  104. unsigned char *tmp;  /* temporary swap pointer */
  105. for (cc=0; cc<3; cc++)
  106. {
  107. /* B pictures do not need to be save for future reference */
  108. if (picture_coding_type==B_TYPE)
  109. current_frame[cc] = auxframe[cc];
  110. else
  111. {
  112. if (!Second_Field)
  113. {
  114. /* only update at the beginning of the coded frame */
  115. tmp = forward_reference_frame[cc];
  116. /* the previously decoded reference frame is stored coincident with the 
  117.    location where the backward reference frame is stored (backwards 
  118.    prediction is not needed in P pictures) */
  119. forward_reference_frame[cc] = backward_reference_frame[cc];
  120. /* update pointer for potential future B pictures */
  121. backward_reference_frame[cc] = tmp;
  122. }
  123. /* can erase over old backward reference frame since it is not used
  124.    in a P picture, and since any subsequent B pictures will use the 
  125.    previously decoded I or P frame as the backward_reference_frame */
  126. current_frame[cc] = backward_reference_frame[cc];
  127. }
  128.     if (picture_structure==BOTTOM_FIELD)
  129. current_frame[cc] += (cc==0) ? Coded_Picture_Width : Chroma_Width;
  130. }
  131. }
  132. /* decode all macroblocks of the current picture */
  133. /* stages described in ISO/IEC 13818-2 section 7 */
  134. static void picture_data()
  135. {
  136. int MBAmax;
  137. /* number of macroblocks per picture */
  138. MBAmax = mb_width*mb_height;
  139. if (picture_structure!=FRAME_PICTURE)
  140. MBAmax>>=1;
  141. for (;;)
  142. if (slice(MBAmax)<0) // If return -1, terminate slice decoding
  143. return;
  144. }
  145. /* decode all macroblocks of the current picture */
  146. /* ISO/IEC 13818-2 section 6.3.16 */
  147. /* return 0 : go to next slice */
  148. /* return -1: go to next picture */
  149. static int slice(int MBAmax)
  150. {
  151. int MBA = 0, MBAinc =0, macroblock_type, motion_type, dct_type, ret;
  152. int dc_dct_pred[3], PMV[2][2][2], motion_vertical_field_select[2][2], dmvector[2];
  153. if ((ret=start_of_slice(&MBA, &MBAinc, dc_dct_pred, PMV)) != 1)
  154. return ret;
  155. for (;;)
  156. {
  157. /* this is how we properly exit out of picture */
  158. if (MBA>=MBAmax) return -1; // all macroblocks decoded
  159. if (MBAinc==0)
  160. {
  161. if (!Show_Bits(23) || Fault_Flag) // next_start_code or fault
  162. {
  163. resync:
  164. if (Fault_Flag == ERROR_FLUSH)
  165. return -1; // exit because flushing
  166. Fault_Flag = 0;
  167. return 0; // trigger: go to next slice
  168. }
  169. else /* neither next_start_code nor Fault_Flag */
  170. {
  171. /* decode macroblock address increment */
  172. MBAinc = Get_macroblock_address_increment();
  173. if (Fault_Flag) goto resync;
  174. }
  175. }
  176. if (MBAinc==1) /* not skipped */
  177. {
  178. if (!decode_macroblock(&macroblock_type, &motion_type, &dct_type, PMV,
  179. dc_dct_pred, motion_vertical_field_select, dmvector))
  180. goto resync;
  181. }
  182. else /* MBAinc!=1: skipped macroblock */
  183. /* ISO/IEC 13818-2 section 7.6.6 */
  184. skipped_macroblock(dc_dct_pred, PMV, &motion_type, motion_vertical_field_select, &macroblock_type);
  185. /* ISO/IEC 13818-2 section 7.6 */
  186. motion_compensation(MBA, macroblock_type, motion_type, PMV,
  187. motion_vertical_field_select, dmvector, dct_type);
  188. __asm emms;
  189. /* advance to next macroblock */
  190. MBA++; MBAinc--;
  191. if (MBA>=MBAmax) return -1; // all macroblocks decoded
  192. }
  193. }
  194. /* ISO/IEC 13818-2 section 6.3.17.1: Macroblock modes */
  195. static void macroblock_modes(int *pmacroblock_type, int *pmotion_type,
  196.  int *pmotion_vector_count, int *pmv_format,
  197.  int *pdmv, int *pmvscale, int *pdct_type)
  198. {
  199. int macroblock_type, motion_type, motion_vector_count;
  200. int mv_format, dmv, mvscale, dct_type;
  201. /* get macroblock_type */
  202. macroblock_type = Get_macroblock_type();
  203. if (Fault_Flag) return;
  204. /* get frame/field motion type */
  205. if (macroblock_type & (MACROBLOCK_MOTION_FORWARD|MACROBLOCK_MOTION_BACKWARD))
  206. {
  207. if (picture_structure==FRAME_PICTURE)
  208. motion_type = frame_pred_frame_dct ? MC_FRAME : Get_Bits(2);
  209. else
  210. motion_type = Get_Bits(2);
  211.     }
  212. else if ((macroblock_type & MACROBLOCK_INTRA) && concealment_motion_vectors)
  213. motion_type = (picture_structure==FRAME_PICTURE) ? MC_FRAME : MC_FIELD;
  214. /* derive motion_vector_count, mv_format and dmv, (table 6-17, 6-18) */
  215. if (picture_structure==FRAME_PICTURE)
  216. {
  217. motion_vector_count = (motion_type==MC_FIELD) ? 2 : 1;
  218. mv_format = (motion_type==MC_FRAME) ? MV_FRAME : MV_FIELD;
  219. }
  220. else
  221. {
  222. motion_vector_count = (motion_type==MC_16X8) ? 2 : 1;
  223. mv_format = MV_FIELD;
  224. }
  225. dmv = (motion_type==MC_DMV); /* dual prime */
  226. /*
  227.    field mv predictions in frame pictures have to be scaled
  228.    ISO/IEC 13818-2 section 7.6.3.1 Decoding the motion vectors
  229. */
  230. mvscale = (mv_format==MV_FIELD && picture_structure==FRAME_PICTURE);
  231. /* get dct_type (frame DCT / field DCT) */
  232. dct_type = picture_structure==FRAME_PICTURE && !frame_pred_frame_dct
  233. && (macroblock_type & (MACROBLOCK_PATTERN|MACROBLOCK_INTRA)) ? Get_Bits(1) : 0;
  234. /* return values */
  235. *pmacroblock_type = macroblock_type;
  236. *pmotion_type = motion_type;
  237. *pmotion_vector_count = motion_vector_count;
  238. *pmv_format = mv_format;
  239. *pdmv = dmv;
  240. *pmvscale = mvscale;
  241. *pdct_type = dct_type;
  242. }
  243. /* move/add 8x8-Block from block[comp] to backward_reference_frame */
  244. /* copy reconstructed 8x8 block from block[comp] to current_frame[]
  245.    ISO/IEC 13818-2 section 7.6.8: Adding prediction and coefficient data
  246.    This stage also embodies some of the operations implied by:
  247.    - ISO/IEC 13818-2 section 7.6.7: Combining predictions
  248.    - ISO/IEC 13818-2 section 6.1.3: Macroblock
  249. */
  250. static void Add_Block(int count, int bx, int by, int dct_type, int addflag)
  251. {
  252. static const __int64 mmmask_128 = 0x0080008000800080;
  253. int comp, cc, iincr, bxh, byh;
  254. unsigned char *rfp;
  255. short *Block_Ptr;
  256. for (comp=0; comp<count; comp++)
  257. {
  258. Block_Ptr = block[comp];
  259. cc = cc_table[comp];
  260. if (cc==0)
  261. {
  262. if (picture_structure==FRAME_PICTURE)
  263. {
  264. if (dct_type)
  265. {
  266. rfp = current_frame[0] + Coded_Picture_Width*(by+((comp&2)>>1)) + bx + ((comp&1)<<3);
  267. iincr = Coded_Picture_Width<<1;
  268. }
  269. else
  270. {
  271. rfp = current_frame[0] + Coded_Picture_Width*(by+((comp&2)<<2)) + bx + ((comp&1)<<3);
  272. iincr = Coded_Picture_Width;
  273. }
  274. }
  275. else
  276. {
  277. rfp = current_frame[0] + (Coded_Picture_Width<<1)*(by+((comp&2)<<2)) + bx + ((comp&1)<<3);
  278. iincr = Coded_Picture_Width<<1;
  279. }
  280. }
  281. else
  282. {
  283. if (chroma_format!=CHROMA444)
  284. bxh = bx >> 1;
  285. if (chroma_format==CHROMA420)
  286. byh = by >> 1;
  287. if (picture_structure==FRAME_PICTURE)
  288. {
  289. if (dct_type && chroma_format!=CHROMA420)
  290. {
  291. /* field DCT coding */
  292. rfp = current_frame[cc] + Chroma_Width*(byh+((comp&2)>>1)) + bxh + (comp&8);
  293. iincr = Chroma_Width<<1;
  294. }
  295. else
  296. {
  297. /* frame DCT coding */
  298. rfp = current_frame[cc] + Chroma_Width*(byh+((comp&2)<<2)) + bxh + (comp&8);
  299. iincr = Chroma_Width;
  300. }
  301. }
  302. else
  303. {
  304. /* field picture */
  305. rfp = current_frame[cc] + (Chroma_Width<<1)*(byh+((comp&2)<<2)) + bxh + (comp&8);
  306. iincr = Chroma_Width<<1;
  307. }
  308. }
  309. if (addflag)
  310. {
  311. __asm
  312. {
  313. pxor mm0, mm0
  314. mov eax, [rfp]
  315. mov ebx, [Block_Ptr]
  316. mov edi, 8
  317. addon:
  318. movq mm2, [ebx+8]
  319. movq mm3, [eax]
  320. movq mm4, mm3
  321. movq mm1, [ebx]
  322. punpckhbw mm3, mm0
  323. paddsw mm3, mm2
  324. packuswb mm3, mm0
  325. punpcklbw mm4, mm0
  326. psllq mm3, 32
  327. paddsw mm4, mm1
  328. packuswb mm4, mm0
  329. por mm3, mm4
  330. add ebx, 16
  331. sub edi, 0x01
  332. movq [eax], mm3
  333. add eax, [iincr]
  334. cmp edi, 0x00
  335. jg addon
  336. }
  337. }
  338. else
  339. {
  340. __asm
  341. {
  342. mov eax, [rfp]
  343. mov ebx, [Block_Ptr]
  344. mov edi, 8
  345. pxor mm0, mm0
  346. movq mm7, [mmmask_128]
  347. addoff:
  348. movq mm3, [ebx+8]
  349. movq mm4, [ebx]
  350. paddsw mm3, mm7
  351. paddsw mm4, mm7
  352. packuswb mm3, mm0
  353. packuswb mm4, mm0
  354. psllq mm3, 32
  355. por mm3, mm4
  356. add ebx, 16
  357. sub edi, 0x01
  358. movq [eax], mm3
  359. add eax, [iincr]
  360. cmp edi, 0x00
  361. jg addoff
  362. }
  363. }
  364. }
  365. }
  366. /* set scratch pad macroblock to zero */
  367. static void Clear_Block(int count)
  368. {
  369. int comp;
  370. short *Block_Ptr;
  371. for (comp=0; comp<count; comp++)
  372. {
  373. Block_Ptr = block[comp];
  374. __asm
  375. {
  376. mov eax, [Block_Ptr];
  377. pxor mm0, mm0;
  378. movq [eax+0 ], mm0;
  379. movq [eax+8 ], mm0;
  380. movq [eax+16], mm0;
  381. movq [eax+24], mm0;
  382. movq [eax+32], mm0;
  383. movq [eax+40], mm0;
  384. movq [eax+48], mm0;
  385. movq [eax+56], mm0;
  386. movq [eax+64], mm0;
  387. movq [eax+72], mm0;
  388. movq [eax+80], mm0;
  389. movq [eax+88], mm0;
  390. movq [eax+96], mm0;
  391. movq [eax+104],mm0;
  392. movq [eax+112],mm0;
  393. movq [eax+120],mm0;
  394. }
  395. }
  396. __asm emms;
  397. }
  398. /* ISO/IEC 13818-2 section 7.6 */
  399. static void motion_compensation(int MBA, int macroblock_type, int motion_type, 
  400. int PMV[2][2][2], int motion_vertical_field_select[2][2],
  401. int dmvector[2], int dct_type)
  402. {
  403. int bx, by;
  404. int comp;
  405. /* derive current macroblock position within picture */
  406. /* ISO/IEC 13818-2 section 6.3.1.6 and 6.3.1.7 */
  407. bx = 16*(MBA%mb_width);
  408. by = 16*(MBA/mb_width);
  409. /* motion compensation */
  410. if (!(macroblock_type & MACROBLOCK_INTRA))
  411. form_predictions(bx, by, macroblock_type, motion_type, PMV,
  412.  motion_vertical_field_select, dmvector);
  413. switch (iDCT_Flag)
  414. {
  415. case IDCT_MMX:
  416. for (comp=0; comp<block_count; comp++)
  417. MMX_IDCT(block[comp]);
  418. break;
  419. case IDCT_FPU:
  420. __asm emms;
  421. for (comp=0; comp<block_count; comp++)
  422. FPU_IDCT(block[comp]);
  423. break;
  424. case IDCT_REF:
  425. __asm emms;
  426. for (comp=0; comp<block_count; comp++)
  427. REF_IDCT(block[comp]);
  428. break;
  429. }
  430. Add_Block(block_count, bx, by, dct_type, (macroblock_type & MACROBLOCK_INTRA)==0);
  431. }
  432. /* ISO/IEC 13818-2 section 7.6.6 */
  433. static void skipped_macroblock(int dc_dct_pred[3], int PMV[2][2][2], int *motion_type, 
  434.    int motion_vertical_field_select[2][2], int *macroblock_type)
  435. {
  436. Clear_Block(block_count);
  437. /* reset intra_dc predictors */
  438. /* ISO/IEC 13818-2 section 7.2.1: DC coefficients in intra blocks */
  439. dc_dct_pred[0]=dc_dct_pred[1]=dc_dct_pred[2]=0;
  440. /* reset motion vector predictors */
  441. /* ISO/IEC 13818-2 section 7.6.3.4: Resetting motion vector predictors */
  442. if (picture_coding_type==P_TYPE)
  443. PMV[0][0][0]=PMV[0][0][1]=PMV[1][0][0]=PMV[1][0][1]=0;
  444. /* derive motion_type */
  445. if (picture_structure==FRAME_PICTURE)
  446. *motion_type = MC_FRAME;
  447. else
  448. {
  449. *motion_type = MC_FIELD;
  450. motion_vertical_field_select[0][0] = motion_vertical_field_select[0][1] = 
  451. (picture_structure==BOTTOM_FIELD);
  452. }
  453. /* clear MACROBLOCK_INTRA */
  454. *macroblock_type&= ~MACROBLOCK_INTRA;
  455. }
  456. /* return==-1 means go to next picture */
  457. /* the expression "start of slice" is used throughout the normative
  458.    body of the MPEG specification */
  459. static int start_of_slice(int *MBA, int *MBAinc,
  460.   int dc_dct_pred[3], int PMV[2][2][2])
  461. {
  462. unsigned int code;
  463. int slice_vert_pos_ext;
  464. next_start_code();
  465. code = Get_Bits(32);
  466. if (code<SLICE_START_CODE_MIN || code>SLICE_START_CODE_MAX)
  467. {
  468. // only slice headers are allowed in picture_data
  469. Fault_Flag = 10;
  470. return -1;
  471. }
  472. /* decode slice header (may change quantizer_scale) */
  473. slice_vert_pos_ext = slice_header();
  474. /* decode macroblock address increment */
  475. *MBAinc = Get_macroblock_address_increment();
  476. if (Fault_Flag) return -1;
  477. /* set current location */
  478. /* NOTE: the arithmetic used to derive macroblock_address below is
  479.    equivalent to ISO/IEC 13818-2 section 6.3.17: Macroblock */
  480. *MBA = ((slice_vert_pos_ext<<7) + (code&255) - 1)*mb_width + *MBAinc - 1;
  481. *MBAinc = 1; // first macroblock in slice: not skipped
  482. /* reset all DC coefficient and motion vector predictors */
  483. /* ISO/IEC 13818-2 section 7.2.1: DC coefficients in intra blocks */
  484. dc_dct_pred[0]=dc_dct_pred[1]=dc_dct_pred[2]=0;
  485.   
  486. /* ISO/IEC 13818-2 section 7.6.3.4: Resetting motion vector predictors */
  487. PMV[0][0][0]=PMV[0][0][1]=PMV[1][0][0]=PMV[1][0][1]=0;
  488. PMV[0][1][0]=PMV[0][1][1]=PMV[1][1][0]=PMV[1][1][1]=0;
  489. /* successfull: trigger decode macroblocks in slice */
  490. return 1;
  491. }
  492. /* ISO/IEC 13818-2 sections 7.2 through 7.5 */
  493. static int decode_macroblock(int *macroblock_type, int *motion_type, int *dct_type,
  494.  int PMV[2][2][2], int dc_dct_pred[3], 
  495.  int motion_vertical_field_select[2][2], int dmvector[2])
  496. {
  497. int quantizer_scale_code, comp, motion_vector_count, mv_format; 
  498. int dmv, mvscale, coded_block_pattern;
  499. /* ISO/IEC 13818-2 section 6.3.17.1: Macroblock modes */
  500. macroblock_modes(macroblock_type, motion_type, &motion_vector_count, &mv_format,
  501.  &dmv, &mvscale, dct_type);
  502. if (Fault_Flag) return 0; // trigger: go to next slice
  503. if (*macroblock_type & MACROBLOCK_QUANT)
  504. {
  505. quantizer_scale_code = Get_Bits(5);
  506. /* ISO/IEC 13818-2 section 7.4.2.2: Quantizer scale factor */
  507. quantizer_scale = q_scale_type ?
  508. Non_Linear_quantizer_scale[quantizer_scale_code] : (quantizer_scale_code << 1);
  509. }
  510. /* ISO/IEC 13818-2 section 6.3.17.2: Motion vectors */
  511. /* decode forward motion vectors */
  512. if ((*macroblock_type & MACROBLOCK_MOTION_FORWARD) 
  513. || ((*macroblock_type & MACROBLOCK_INTRA) && concealment_motion_vectors))
  514. motion_vectors(PMV, dmvector, motion_vertical_field_select, 0,
  515. motion_vector_count, mv_format, f_code[0][0]-1, f_code[0][1]-1, dmv, mvscale);
  516. if (Fault_Flag) return 0; // trigger: go to next slice
  517. /* decode backward motion vectors */
  518. if (*macroblock_type & MACROBLOCK_MOTION_BACKWARD)
  519. motion_vectors(PMV, dmvector, motion_vertical_field_select, 1,
  520. motion_vector_count,mv_format, f_code[1][0]-1, f_code[1][1]-1, 0, mvscale);
  521. if (Fault_Flag) return 0;  // trigger: go to next slice
  522. if ((*macroblock_type & MACROBLOCK_INTRA) && concealment_motion_vectors)
  523. Flush_Buffer(1); // marker bit
  524. /* macroblock_pattern */
  525. /* ISO/IEC 13818-2 section 6.3.17.4: Coded block pattern */
  526. if (*macroblock_type & MACROBLOCK_PATTERN)
  527. {
  528. coded_block_pattern = Get_coded_block_pattern();
  529. if (chroma_format==CHROMA422)
  530. coded_block_pattern = (coded_block_pattern<<2) | Get_Bits(2);
  531. else if (chroma_format==CHROMA444)
  532. coded_block_pattern = (coded_block_pattern<<6) | Get_Bits(6);
  533. }
  534. else
  535.     coded_block_pattern = (*macroblock_type & MACROBLOCK_INTRA) ? (1<<block_count)-1 : 0;
  536. if (Fault_Flag) return 0; // trigger: go to next slice
  537. Clear_Block(block_count);
  538. /* decode blocks */
  539. for (comp=0; comp<block_count; comp++)
  540. {
  541. if (coded_block_pattern & (1<<(block_count-1-comp)))
  542. {
  543. if (*macroblock_type & MACROBLOCK_INTRA)
  544. Decode_MPEG2_Intra_Block(comp, dc_dct_pred);
  545. else
  546. Decode_MPEG2_Non_Intra_Block(comp);
  547. if (Fault_Flag) return 0; // trigger: go to next slice
  548. }
  549. }
  550. /* reset intra_dc predictors */
  551. /* ISO/IEC 13818-2 section 7.2.1: DC coefficients in intra blocks */
  552. if (!(*macroblock_type & MACROBLOCK_INTRA))
  553. dc_dct_pred[0]=dc_dct_pred[1]=dc_dct_pred[2]=0;
  554. /* reset motion vector predictors */
  555. if ((*macroblock_type & MACROBLOCK_INTRA) && !concealment_motion_vectors)
  556. {
  557. /* intra mb without concealment motion vectors */
  558. /* ISO/IEC 13818-2 section 7.6.3.4: Resetting motion vector predictors */
  559. PMV[0][0][0]=PMV[0][0][1]=PMV[1][0][0]=PMV[1][0][1]=0;
  560. PMV[0][1][0]=PMV[0][1][1]=PMV[1][1][0]=PMV[1][1][1]=0;
  561. }
  562. /* special "No_MC" macroblock_type case */
  563. /* ISO/IEC 13818-2 section 7.6.3.5: Prediction in P pictures */
  564. if (picture_coding_type==P_TYPE && !(*macroblock_type & (MACROBLOCK_MOTION_FORWARD|MACROBLOCK_INTRA)))
  565. {
  566. /* non-intra mb without forward mv in a P picture */
  567. /* ISO/IEC 13818-2 section 7.6.3.4: Resetting motion vector predictors */
  568. PMV[0][0][0]=PMV[0][0][1]=PMV[1][0][0]=PMV[1][0][1]=0;
  569. /* derive motion_type */
  570. /* ISO/IEC 13818-2 section 6.3.17.1: Macroblock modes, frame_motion_type */
  571. if (picture_structure==FRAME_PICTURE)
  572. *motion_type = MC_FRAME;
  573. else
  574. {
  575. *motion_type = MC_FIELD;
  576. motion_vertical_field_select[0][0] = (picture_structure==BOTTOM_FIELD);
  577. }
  578. }
  579. /* successfully decoded macroblock */
  580. return 1 ;
  581. }
  582. /* decode one intra coded MPEG-2 block */
  583. static void Decode_MPEG2_Intra_Block(int comp, int dc_dct_pred[])
  584. {
  585. int val, i, j, sign, *qmat;
  586. unsigned int code;
  587. DCTtab *tab;
  588. short *bp;
  589. bp = block[comp];
  590. qmat = (comp<4 || chroma_format==CHROMA420) 
  591. ? intra_quantizer_matrix : chroma_intra_quantizer_matrix;
  592. /* ISO/IEC 13818-2 section 7.2.1: decode DC coefficients */
  593. switch (cc_table[comp])
  594. {
  595. case 0:
  596. val = (dc_dct_pred[0]+= Get_Luma_DC_dct_diff());
  597. break;
  598. case 1:
  599. val = (dc_dct_pred[1]+= Get_Chroma_DC_dct_diff());
  600. break;
  601. case 2:
  602. val = (dc_dct_pred[2]+= Get_Chroma_DC_dct_diff());
  603. break;
  604. }
  605. bp[0] = val << (3-intra_dc_precision);
  606. /* decode AC coefficients */
  607. for (i=1; ; i++)
  608. {
  609. code = Show_Bits(16);
  610. if (code>=16384 && !intra_vlc_format)
  611. tab = &DCTtabnext[(code>>12)-4];
  612. else if (code>=1024)
  613. {
  614. if (intra_vlc_format)
  615. tab = &DCTtab0a[(code>>8)-4];
  616. else
  617. tab = &DCTtab0[(code>>8)-4];
  618. }
  619. else if (code>=512)
  620. {
  621. if (intra_vlc_format)
  622. tab = &DCTtab1a[(code>>6)-8];
  623. else
  624. tab = &DCTtab1[(code>>6)-8];
  625. }
  626. else if (code>=256)
  627. tab = &DCTtab2[(code>>4)-16];
  628. else if (code>=128)
  629. tab = &DCTtab3[(code>>3)-16];
  630. else if (code>=64)
  631. tab = &DCTtab4[(code>>2)-16];
  632. else if (code>=32)
  633. tab = &DCTtab5[(code>>1)-16];
  634. else if (code>=16)
  635. tab = &DCTtab6[code-16];
  636. else
  637. {
  638. Fault_Flag = 1;
  639. return;
  640. }
  641. Flush_Buffer(tab->len);
  642. if (tab->run<64)
  643. {
  644. i+= tab->run;
  645. val = tab->level;
  646. sign = Get_Bits(1);
  647. }
  648. else if (tab->run==64) /* end_of_block */
  649. return;
  650. else /* escape */
  651. {
  652. i+= Get_Bits(6);
  653. val = Get_Bits(12);
  654. if (sign = (val>=2048))
  655. val = 4096 - val;
  656. }
  657. j = scan[alternate_scan][i];
  658. val = (val * quantizer_scale * qmat[j]) >> 4;
  659. bp[j] = sign ? -val : val;
  660. }
  661. }
  662. /* decode one non-intra coded MPEG-2 block */
  663. static void Decode_MPEG2_Non_Intra_Block(int comp)
  664. {
  665. int val, i, j, sign, *qmat;
  666. unsigned int code;
  667. DCTtab *tab;
  668. short *bp;
  669. bp = block[comp];
  670. qmat = (comp<4 || chroma_format==CHROMA420) 
  671. ? non_intra_quantizer_matrix : chroma_non_intra_quantizer_matrix;
  672. /* decode AC coefficients */
  673. for (i=0; ; i++)
  674. {
  675. code = Show_Bits(16);
  676. if (code>=16384)
  677. {
  678. if (i==0)
  679. tab = &DCTtabfirst[(code>>12)-4];
  680. else
  681. tab = &DCTtabnext[(code>>12)-4];
  682. }
  683. else if (code>=1024)
  684. tab = &DCTtab0[(code>>8)-4];
  685. else if (code>=512)
  686. tab = &DCTtab1[(code>>6)-8];
  687. else if (code>=256)
  688. tab = &DCTtab2[(code>>4)-16];
  689. else if (code>=128)
  690. tab = &DCTtab3[(code>>3)-16];
  691. else if (code>=64)
  692. tab = &DCTtab4[(code>>2)-16];
  693. else if (code>=32)
  694. tab = &DCTtab5[(code>>1)-16];
  695. else if (code>=16)
  696. tab = &DCTtab6[code-16];
  697. else
  698. {
  699. Fault_Flag = 1;
  700. return;
  701. }
  702. Flush_Buffer(tab->len);
  703. if (tab->run<64)
  704. {
  705. i+= tab->run;
  706. val = tab->level;
  707. sign = Get_Bits(1);
  708. }
  709. else if (tab->run==64) /* end_of_block */
  710. return;
  711. else /* escape */
  712. {
  713. i+= Get_Bits(6);
  714. val = Get_Bits(12);
  715. if (sign = (val>=2048))
  716. val = 4096 - val;
  717. }
  718. j = scan[alternate_scan][i];
  719. val = (((val<<1)+1) * quantizer_scale * qmat[j]) >> 5;
  720. bp[j] = sign ? -val : val;
  721. }
  722. }
  723. static int Get_macroblock_type()
  724. {
  725. int macroblock_type;
  726. switch (picture_coding_type)
  727. {
  728. case I_TYPE:
  729. macroblock_type = Get_I_macroblock_type();
  730. break;
  731. case P_TYPE:
  732. macroblock_type = Get_P_macroblock_type();
  733. break;
  734. case B_TYPE:
  735. macroblock_type = Get_B_macroblock_type();
  736. break;
  737. }
  738. return macroblock_type;
  739. }
  740. static int Get_I_macroblock_type()
  741. {
  742. if (Get_Bits(1))
  743. return 1;
  744. if (!Get_Bits(1))
  745. Fault_Flag = 2;
  746. return 17;
  747. }
  748. static int Get_P_macroblock_type()
  749. {
  750. int code;
  751. if ((code = Show_Bits(6))>=8)
  752. {
  753. code >>= 3;
  754. Flush_Buffer(PMBtab0[code].len);
  755. return PMBtab0[code].val;
  756. }
  757. if (code==0)
  758. {
  759. Fault_Flag = 2;
  760. return 0;
  761. }
  762. Flush_Buffer(PMBtab1[code].len);
  763. return PMBtab1[code].val;
  764. }
  765. static int Get_B_macroblock_type()
  766. {
  767. int code;
  768. if ((code = Show_Bits(6))>=8)
  769. {
  770. code >>= 2;
  771. Flush_Buffer(BMBtab0[code].len);
  772. return BMBtab0[code].val;
  773. }
  774. if (code==0)
  775. {
  776. Fault_Flag = 2;
  777. return 0;
  778. }
  779. Flush_Buffer(BMBtab1[code].len);
  780. return BMBtab1[code].val;
  781. }
  782. static int Get_coded_block_pattern()
  783. {
  784. int code;
  785. if ((code = Show_Bits(9))>=128)
  786. {
  787. code >>= 4;
  788. Flush_Buffer(CBPtab0[code].len);
  789. return CBPtab0[code].val;
  790. }
  791. if (code>=8)
  792. {
  793. code >>= 1;
  794. Flush_Buffer(CBPtab1[code].len);
  795. return CBPtab1[code].val;
  796. }
  797. if (code<1)
  798. {
  799. Fault_Flag = 3;
  800. return 0;
  801. }
  802. Flush_Buffer(CBPtab2[code].len);
  803. return CBPtab2[code].val;
  804. }
  805. static int Get_macroblock_address_increment()
  806. {
  807. int code, val;
  808. val = 0;
  809. while ((code = Show_Bits(11))<24)
  810. {
  811. if (code!=15) /* if not macroblock_stuffing */
  812. {
  813. if (code==8) /* if macroblock_escape */
  814. val+= 33;
  815. else
  816. {
  817. Fault_Flag = 4;
  818. return 1;
  819. }
  820. }
  821. Flush_Buffer(11);
  822. }
  823. /* macroblock_address_increment == 1 */
  824. /* ('1' is in the MSB position of the lookahead) */
  825. if (code>=1024)
  826. {
  827. Flush_Buffer(1);
  828. return val + 1;
  829. }
  830. /* codes 00010 ... 011xx */
  831. if (code>=128)
  832. {
  833. /* remove leading zeros */
  834. code >>= 6;
  835. Flush_Buffer(MBAtab1[code].len);
  836.     
  837. return val + MBAtab1[code].val;
  838. }
  839.   
  840. /* codes 00000011000 ... 0000111xxxx */
  841. code-= 24; /* remove common base */
  842. Flush_Buffer(MBAtab2[code].len);
  843. return val + MBAtab2[code].val;
  844. }
  845. /*
  846.    parse VLC and perform dct_diff arithmetic.
  847.    MPEG-2:  ISO/IEC 13818-2 section 7.2.1 
  848.    Note: the arithmetic here is presented more elegantly than
  849.    the spec, yet the results, dct_diff, are the same.
  850. */
  851. static int Get_Luma_DC_dct_diff()
  852. {
  853. int code, size, dct_diff;
  854. /* decode length */
  855. code = Show_Bits(5);
  856. if (code<31)
  857. {
  858. size = DClumtab0[code].val;
  859. Flush_Buffer(DClumtab0[code].len);
  860. }
  861. else
  862. {
  863. code = Show_Bits(9) - 0x1f0;
  864. size = DClumtab1[code].val;
  865. Flush_Buffer(DClumtab1[code].len);
  866. }
  867. if (size==0)
  868. dct_diff = 0;
  869. else
  870. {
  871. dct_diff = Get_Bits(size);
  872. if ((dct_diff & (1<<(size-1)))==0)
  873. dct_diff-= (1<<size) - 1;
  874. }
  875. return dct_diff;
  876. }
  877. static int Get_Chroma_DC_dct_diff()
  878. {
  879. int code, size, dct_diff;
  880. /* decode length */
  881. code = Show_Bits(5);
  882. if (code<31)
  883. {
  884. size = DCchromtab0[code].val;
  885. Flush_Buffer(DCchromtab0[code].len);
  886. }
  887. else
  888. {
  889. code = Show_Bits(10) - 0x3e0;
  890. size = DCchromtab1[code].val;
  891. Flush_Buffer(DCchromtab1[code].len);
  892. }
  893. if (size==0)
  894. dct_diff = 0;
  895. else
  896. {
  897. dct_diff = Get_Bits(size);
  898. if ((dct_diff & (1<<(size-1)))==0)
  899. dct_diff-= (1<<size) - 1;
  900. }
  901. return dct_diff;
  902. }
  903. static void form_predictions(int bx, int by, int macroblock_type, int motion_type,
  904.   int PMV[2][2][2], int motion_vertical_field_select[2][2],
  905.   int dmvector[2])
  906. {
  907. static int currentfield;
  908. static unsigned char **predframe;
  909. static int DMV[2][2];
  910. static int stw;
  911. stw = 0;
  912. if ((macroblock_type & MACROBLOCK_MOTION_FORWARD) || picture_coding_type==P_TYPE)
  913. {
  914. if (picture_structure==FRAME_PICTURE)
  915. {
  916. if (motion_type==MC_FRAME || !(macroblock_type & MACROBLOCK_MOTION_FORWARD))
  917. {
  918. /* frame-based prediction (broken into top and bottom halves
  919.    for spatial scalability prediction purposes) */
  920. form_prediction(forward_reference_frame, 0, current_frame, 0, Coded_Picture_Width, 
  921. Coded_Picture_Width<<1, 16, 8, bx, by, PMV[0][0][0], PMV[0][0][1], stw);
  922. form_prediction(forward_reference_frame, 1, current_frame, 1, Coded_Picture_Width, 
  923. Coded_Picture_Width<<1, 16, 8, bx, by, PMV[0][0][0], PMV[0][0][1], stw);
  924. }
  925. else if (motion_type==MC_FIELD) /* field-based prediction */
  926. {
  927. /* top field prediction */
  928. form_prediction(forward_reference_frame, motion_vertical_field_select[0][0], 
  929. current_frame, 0, Coded_Picture_Width<<1, Coded_Picture_Width<<1, 16, 8,
  930. bx, by>>1, PMV[0][0][0], PMV[0][0][1]>>1, stw);
  931. /* bottom field prediction */
  932. form_prediction(forward_reference_frame, motion_vertical_field_select[1][0], 
  933. current_frame, 1, Coded_Picture_Width<<1, Coded_Picture_Width<<1, 16, 8,
  934. bx, by>>1, PMV[1][0][0], PMV[1][0][1]>>1, stw);
  935. }
  936. else if (motion_type==MC_DMV) /* dual prime prediction */
  937. {
  938. /* calculate derived motion vectors */
  939. Dual_Prime_Arithmetic(DMV, dmvector, PMV[0][0][0], PMV[0][0][1]>>1);
  940. /* predict top field from top field */
  941. form_prediction(forward_reference_frame, 0, current_frame, 0, 
  942. Coded_Picture_Width<<1, Coded_Picture_Width<<1, 16, 8, bx, by>>1,
  943. PMV[0][0][0], PMV[0][0][1]>>1, 0);
  944. /* predict and add to top field from bottom field */
  945. form_prediction(forward_reference_frame, 1, current_frame, 0,
  946. Coded_Picture_Width<<1, Coded_Picture_Width<<1, 16, 8, bx, by>>1,
  947. DMV[0][0], DMV[0][1], 1);
  948. /* predict bottom field from bottom field */
  949. form_prediction(forward_reference_frame, 1, current_frame, 1,
  950. Coded_Picture_Width<<1, Coded_Picture_Width<<1, 16, 8, bx, by>>1,
  951. PMV[0][0][0], PMV[0][0][1]>>1, 0);
  952. /* predict and add to bottom field from top field */
  953. form_prediction(forward_reference_frame, 0, current_frame, 1,
  954. Coded_Picture_Width<<1, Coded_Picture_Width<<1, 16, 8, bx, by>>1,
  955. DMV[1][0], DMV[1][1], 1);
  956. }
  957. else
  958. Fault_Flag = 5;
  959. }
  960. else
  961. {
  962. /* field picture */
  963. currentfield = (picture_structure==BOTTOM_FIELD);
  964. /* determine which frame to use for prediction */
  965. if (picture_coding_type==P_TYPE && Second_Field && currentfield!=motion_vertical_field_select[0][0])
  966. predframe = backward_reference_frame;
  967. else
  968. predframe = forward_reference_frame;
  969. if (motion_type==MC_FIELD || !(macroblock_type & MACROBLOCK_MOTION_FORWARD))
  970. {
  971. form_prediction(predframe, motion_vertical_field_select[0][0], current_frame, 0, 
  972. Coded_Picture_Width<<1, Coded_Picture_Width<<1, 16, 16, bx, by,
  973. PMV[0][0][0], PMV[0][0][1], stw);
  974. }
  975. else if (motion_type==MC_16X8)
  976. {
  977. form_prediction(predframe, motion_vertical_field_select[0][0], current_frame, 0, 
  978. Coded_Picture_Width<<1, Coded_Picture_Width<<1, 16, 8, bx, by,
  979. PMV[0][0][0], PMV[0][0][1], stw);
  980. if (picture_coding_type==P_TYPE && Second_Field && currentfield!=motion_vertical_field_select[1][0])
  981. predframe = backward_reference_frame;
  982. else
  983. predframe = forward_reference_frame;
  984. form_prediction(predframe, motion_vertical_field_select[1][0], current_frame, 
  985. 0, Coded_Picture_Width<<1, Coded_Picture_Width<<1, 16, 8, bx, by+8,
  986. PMV[1][0][0], PMV[1][0][1], stw);
  987. }
  988. else if (motion_type==MC_DMV)
  989. {
  990. if (Second_Field)
  991. predframe = backward_reference_frame;
  992. else
  993. predframe = forward_reference_frame;
  994. /* calculate derived motion vectors */
  995. Dual_Prime_Arithmetic(DMV, dmvector, PMV[0][0][0], PMV[0][0][1]);
  996. /* predict from field of same parity */
  997. form_prediction(forward_reference_frame, currentfield, current_frame, 0, 
  998. Coded_Picture_Width<<1, Coded_Picture_Width<<1, 16, 16, bx, by,
  999. PMV[0][0][0], PMV[0][0][1], 0);
  1000. /* predict from field of opposite parity */
  1001. form_prediction(predframe, !currentfield, current_frame, 0,
  1002. Coded_Picture_Width<<1, Coded_Picture_Width<<1, 16, 16, bx, by,
  1003. DMV[0][0], DMV[0][1], 1);
  1004. }
  1005. else
  1006. Fault_Flag = 5;
  1007. }
  1008. stw = 1;
  1009. }
  1010. if (macroblock_type & MACROBLOCK_MOTION_BACKWARD)
  1011. {
  1012. if (picture_structure==FRAME_PICTURE)
  1013. {
  1014. if (motion_type==MC_FRAME)
  1015. {
  1016. /* frame-based prediction */
  1017. form_prediction(backward_reference_frame, 0, current_frame, 0,
  1018. Coded_Picture_Width, Coded_Picture_Width<<1, 16, 8, bx, by,
  1019. PMV[0][1][0], PMV[0][1][1], stw);
  1020. form_prediction(backward_reference_frame, 1, current_frame, 1,
  1021. Coded_Picture_Width, Coded_Picture_Width<<1, 16, 8, bx, by,
  1022. PMV[0][1][0], PMV[0][1][1], stw);
  1023. }
  1024. else /* field-based prediction */
  1025. {
  1026. /* top field prediction */
  1027. form_prediction(backward_reference_frame, motion_vertical_field_select[0][1], 
  1028. current_frame, 0, Coded_Picture_Width<<1, Coded_Picture_Width<<1, 16, 8,
  1029. bx, by>>1, PMV[0][1][0], PMV[0][1][1]>>1, stw);
  1030. /* bottom field prediction */
  1031. form_prediction(backward_reference_frame, motion_vertical_field_select[1][1], 
  1032. current_frame, 1, Coded_Picture_Width<<1, Coded_Picture_Width<<1, 16, 8,
  1033. bx, by>>1, PMV[1][1][0], PMV[1][1][1]>>1, stw);
  1034. }
  1035. }
  1036. else
  1037. {
  1038. /* field picture */
  1039. if (motion_type==MC_FIELD)
  1040. {
  1041. /* field-based prediction */
  1042. form_prediction(backward_reference_frame, motion_vertical_field_select[0][1], 
  1043. current_frame, 0, Coded_Picture_Width<<1, Coded_Picture_Width<<1, 16, 16,
  1044. bx, by, PMV[0][1][0], PMV[0][1][1], stw);
  1045. }
  1046. else if (motion_type==MC_16X8)
  1047. {
  1048. form_prediction(backward_reference_frame, motion_vertical_field_select[0][1],
  1049. current_frame, 0, Coded_Picture_Width<<1, Coded_Picture_Width<<1, 16, 8,
  1050. bx, by, PMV[0][1][0], PMV[0][1][1], stw);
  1051. form_prediction(backward_reference_frame, motion_vertical_field_select[1][1],
  1052. current_frame, 0, Coded_Picture_Width<<1, Coded_Picture_Width<<1, 16, 8,
  1053. bx, by+8, PMV[1][1][0], PMV[1][1][1], stw);
  1054. }
  1055. else
  1056. Fault_Flag = 5;
  1057. }
  1058. }
  1059. }
  1060. static void form_prediction(unsigned char *src[], int sfield, unsigned char *dst[],
  1061. int dfield, int lx, int lx2, int w, int h, int x, int y,
  1062. int dx, int dy, int average_flag)
  1063. {
  1064. form_component_prediction(src[0]+(sfield?lx2>>1:0), dst[0]+(dfield?lx2>>1:0),
  1065. lx, lx2, w, h, x, y, dx, dy, average_flag);
  1066. if (chroma_format!=CHROMA444)
  1067. {
  1068. lx>>=1; lx2>>=1; w>>=1; x>>=1; dx/=2;
  1069. }
  1070. if (chroma_format==CHROMA420)
  1071. {
  1072. h>>=1; y>>=1; dy/=2;
  1073. }
  1074. /* Cb */
  1075. form_component_prediction(src[1]+(sfield?lx2>>1:0), dst[1]+(dfield?lx2>>1:0),
  1076. lx, lx2, w, h, x, y, dx, dy, average_flag);
  1077. /* Cr */
  1078. form_component_prediction(src[2]+(sfield?lx2>>1:0), dst[2]+(dfield?lx2>>1:0),
  1079. lx, lx2, w, h, x, y, dx, dy, average_flag);
  1080. }
  1081. /* ISO/IEC 13818-2 section 7.6.4: Forming predictions */
  1082. static void form_component_prediction(unsigned char *src, unsigned char *dst,
  1083.   int lx, int lx2, int w, int h, int x, int y,
  1084.   int dx, int dy, int average_flag)
  1085. {
  1086. static const __int64 mmmask_0001 = 0x0001000100010001;
  1087. static const __int64 mmmask_0002 = 0x0002000200020002;
  1088. static const __int64 mmmask_0003 = 0x0003000300030003;
  1089. static const __int64 mmmask_0006 = 0x0006000600060006;
  1090. unsigned char *s = src + lx * (y + (dy>>1)) + x + (dx>>1);
  1091. unsigned char *d = dst + lx * y + x;
  1092. int flag = (average_flag<<2) + ((dx & 1)<<1) + (dy & 1);
  1093. switch (flag)
  1094. {
  1095. case 0:
  1096. // d[i] = s[i];
  1097. __asm
  1098. {
  1099. mov eax, [s]
  1100. mov ebx, [d]
  1101. mov esi, 0x00
  1102. mov edi, [h]
  1103. mc0:
  1104. movq mm1, [eax+esi]
  1105. add esi, 0x08
  1106. cmp esi, [w]
  1107. movq [ebx+esi-8], mm1
  1108. jl mc0
  1109. add eax, [lx2]
  1110. add ebx, [lx2]
  1111. sub edi, 0x01
  1112. mov esi, 0x00
  1113. cmp edi, 0x00
  1114. jg mc0
  1115. }
  1116. break;
  1117. case 1:
  1118. // d[i] = (s[i]+s[i+lx]+1)>>1;
  1119. __asm
  1120. {
  1121. pxor mm0, mm0
  1122. movq mm7, [mmmask_0001]
  1123. mov eax, [s]
  1124. mov ebx, [d]
  1125. mov ecx, eax
  1126. add ecx, [lx]
  1127. mov esi, 0x00
  1128. mov edi, [h]
  1129. mc1:
  1130. movq mm1, [eax+esi]
  1131. movq mm2, [ecx+esi]
  1132. movq mm3, mm1
  1133. movq mm4, mm2
  1134. punpcklbw mm1, mm0
  1135. punpckhbw mm3, mm0
  1136. punpcklbw mm2, mm0
  1137. punpckhbw mm4, mm0
  1138. paddsw mm1, mm2
  1139. paddsw mm3, mm4
  1140. paddsw mm1, mm7
  1141. paddsw mm3, mm7
  1142. psrlw mm1, 1
  1143. psrlw mm3, 1
  1144. packuswb mm1, mm0
  1145. packuswb mm3, mm0
  1146. psllq mm3, 32
  1147. por mm1, mm3
  1148. add esi, 0x08
  1149. cmp esi, [w]
  1150. movq [ebx+esi-8], mm1
  1151. jl mc1
  1152. add eax, [lx2]
  1153. add ebx, [lx2]
  1154. add ecx, [lx2]
  1155. sub edi, 0x01
  1156. mov esi, 0x00
  1157. cmp edi, 0x00
  1158. jg mc1
  1159. }
  1160. break;
  1161. case 2:
  1162. // d[i] = (s[i]+s[i+1]+1)>>1;
  1163. __asm
  1164. {
  1165. pxor mm0, mm0
  1166. movq mm7, [mmmask_0001]
  1167. mov eax, [s]
  1168. mov ebx, [d]
  1169. mov esi, 0x00
  1170. mov edi, [h]
  1171. mc2:
  1172. movq mm1, [eax+esi]
  1173. movq mm2, [eax+esi+1]
  1174. movq mm3, mm1
  1175. movq mm4, mm2
  1176. punpcklbw mm1, mm0
  1177. punpckhbw mm3, mm0
  1178. punpcklbw mm2, mm0
  1179. punpckhbw mm4, mm0
  1180. paddsw mm1, mm2
  1181. paddsw mm3, mm4
  1182. paddsw mm1, mm7
  1183. paddsw mm3, mm7
  1184. psrlw mm1, 1
  1185. psrlw mm3, 1
  1186. packuswb mm1, mm0
  1187. packuswb mm3, mm0
  1188. psllq mm3, 32
  1189. por mm1, mm3
  1190. add esi, 0x08
  1191. cmp esi, [w]
  1192. movq [ebx+esi-8], mm1
  1193. jl mc2
  1194. add eax, [lx2]
  1195. add ebx, [lx2]
  1196. sub edi, 0x01
  1197. mov esi, 0x00
  1198. cmp edi, 0x00
  1199. jg mc2
  1200. }
  1201. break;
  1202. case 3:
  1203. // d[i] = (s[i]+s[i+1]+s[i+lx]+s[i+lx+1]+2)>>2;
  1204. __asm
  1205. {
  1206. pxor mm0, mm0
  1207. movq mm7, [mmmask_0002]
  1208. mov eax, [s]
  1209. mov ebx, [d]
  1210. mov ecx, eax
  1211. add ecx, [lx]
  1212. mov esi, 0x00
  1213. mov edi, [h]
  1214. mc3:
  1215. movq mm1, [eax+esi]
  1216. movq mm2, [eax+esi+1]
  1217. movq mm3, mm1
  1218. movq mm4, mm2
  1219. punpcklbw mm1, mm0
  1220. punpckhbw mm3, mm0
  1221. punpcklbw mm2, mm0
  1222. punpckhbw mm4, mm0
  1223. paddsw mm1, mm2
  1224. paddsw mm3, mm4
  1225. movq mm5, [ecx+esi]
  1226. paddsw mm1, mm7
  1227. movq mm6, [ecx+esi+1]
  1228. paddsw mm3, mm7
  1229. movq mm2, mm5
  1230. movq mm4, mm6
  1231. punpcklbw mm2, mm0
  1232. punpckhbw mm5, mm0
  1233. punpcklbw mm4, mm0
  1234. punpckhbw mm6, mm0
  1235. paddsw mm2, mm4
  1236. paddsw mm5, mm6
  1237. paddsw mm1, mm2
  1238. paddsw mm3, mm5
  1239. psrlw mm1, 2
  1240. psrlw mm3, 2
  1241. packuswb mm1, mm0
  1242. packuswb mm3, mm0
  1243. psllq mm3, 32
  1244. por mm1, mm3
  1245. add esi, 0x08
  1246. cmp esi, [w]
  1247. movq [ebx+esi-8], mm1
  1248. jl mc3
  1249. add eax, [lx2]
  1250. add ebx, [lx2]
  1251. add ecx, [lx2]
  1252. sub edi, 0x01
  1253. mov esi, 0x00
  1254. cmp edi, 0x00
  1255. jg mc3
  1256. }
  1257. break;
  1258. case 4:
  1259. // d[i] = (s[i]+d[i]+1)>>1;
  1260. __asm
  1261. {
  1262. pxor mm0, mm0
  1263. movq mm7, [mmmask_0001]
  1264. mov eax, [s]
  1265. mov ebx, [d]
  1266. mov esi, 0x00
  1267. mov edi, [h]
  1268. mc4:
  1269. movq mm1, [eax+esi]
  1270. movq mm2, [ebx+esi]
  1271. movq mm3, mm1
  1272. movq mm4, mm2
  1273. punpcklbw mm1, mm0
  1274. punpckhbw mm3, mm0
  1275. punpcklbw mm2, mm0
  1276. punpckhbw mm4, mm0
  1277. paddsw mm1, mm2
  1278. paddsw mm3, mm4
  1279. paddsw mm1, mm7
  1280. paddsw mm3, mm7
  1281. psrlw mm1, 1
  1282. psrlw mm3, 1
  1283. packuswb mm1, mm0
  1284. packuswb mm3, mm0
  1285. psllq mm3, 32
  1286. por mm1, mm3
  1287. add esi, 0x08
  1288. cmp esi, [w]
  1289. movq [ebx+esi-8], mm1
  1290. jl mc4
  1291. add eax, [lx2]
  1292. add ebx, [lx2]
  1293. sub edi, 0x01
  1294. mov esi, 0x00
  1295. cmp edi, 0x00
  1296. jg mc4
  1297. }
  1298. break;
  1299. case 5:
  1300. // d[i] = ((d[i]<<1) + s[i]+s[i+lx] + 3)>>2;
  1301. __asm
  1302. {
  1303. pxor mm0, mm0
  1304. movq mm7, [mmmask_0003]
  1305. mov eax, [s]
  1306. mov ebx, [d]
  1307. mov ecx, eax
  1308. add ecx, [lx]
  1309. mov esi, 0x00
  1310. mov edi, [h]
  1311. mc5:
  1312. movq mm1, [eax+esi]
  1313. movq mm2, [ecx+esi]
  1314. movq mm3, mm1
  1315. movq mm4, mm2
  1316. punpcklbw mm1, mm0
  1317. punpckhbw mm3, mm0
  1318. punpcklbw mm2, mm0
  1319. punpckhbw mm4, mm0
  1320. paddsw mm1, mm2
  1321. paddsw mm3, mm4
  1322. movq mm5, [ebx+esi]
  1323. paddsw mm1, mm7
  1324. paddsw mm3, mm7
  1325. movq mm6, mm5
  1326. punpcklbw mm5, mm0
  1327. punpckhbw mm6, mm0
  1328. psllw mm5, 1
  1329. psllw mm6, 1
  1330. paddsw mm1, mm5
  1331. paddsw mm3, mm6
  1332. psrlw mm1, 2
  1333. psrlw mm3, 2
  1334. packuswb mm1, mm0
  1335. packuswb mm3, mm0
  1336. psllq mm3, 32
  1337. por mm1, mm3
  1338. add esi, 0x08
  1339. cmp esi, [w]
  1340. movq [ebx+esi-8], mm1
  1341. jl mc5
  1342. add eax, [lx2]
  1343. add ebx, [lx2]
  1344. add ecx, [lx2]
  1345. sub edi, 0x01
  1346. mov esi, 0x00
  1347. cmp edi, 0x00
  1348. jg mc5
  1349. }
  1350. break;
  1351. case 6:
  1352. // d[i] = ((d[i]<<1) + s[i]+s[i+1] + 3) >> 2;
  1353. __asm
  1354. {
  1355. pxor mm0, mm0
  1356. movq mm7, [mmmask_0003]
  1357. mov eax, [s]
  1358. mov ebx, [d]
  1359. mov esi, 0x00
  1360. mov edi, [h]
  1361. mc6:
  1362. movq mm1, [eax+esi]
  1363. movq mm2, [eax+esi+1]
  1364. movq mm3, mm1
  1365. movq mm4, mm2
  1366. punpcklbw mm1, mm0
  1367. punpckhbw mm3, mm0
  1368. punpcklbw mm2, mm0
  1369. punpckhbw mm4, mm0
  1370. paddsw mm1, mm2
  1371. paddsw mm3, mm4
  1372. movq mm5, [ebx+esi]
  1373. paddsw mm1, mm7
  1374. paddsw mm3, mm7
  1375. movq mm6, mm5
  1376. punpcklbw mm5, mm0
  1377. punpckhbw mm6, mm0
  1378. psllw mm5, 1
  1379. psllw mm6, 1
  1380. paddsw mm1, mm5
  1381. paddsw mm3, mm6
  1382. psrlw mm1, 2
  1383. psrlw mm3, 2
  1384. packuswb mm1, mm0
  1385. packuswb mm3, mm0
  1386. psllq mm3, 32
  1387. por mm1, mm3
  1388. add esi, 0x08
  1389. cmp esi, [w]
  1390. movq [ebx+esi-8], mm1
  1391. jl mc6
  1392. add eax, [lx2]
  1393. add ebx, [lx2]
  1394. sub edi, 0x01
  1395. mov esi, 0x00
  1396. cmp edi, 0x00
  1397. jg mc6
  1398. }
  1399. break;
  1400. case 7:
  1401. // d[i] = ((d[i]<<2) + s[i]+s[i+1]+s[i+lx]+s[i+lx+1] + 6)>>3;
  1402. __asm
  1403. {
  1404. pxor mm0, mm0
  1405. movq mm7, [mmmask_0006]
  1406. mov eax, [s]
  1407. mov ebx, [d]
  1408. mov ecx, eax
  1409. add ecx, [lx]
  1410. mov esi, 0x00
  1411. mov edi, [h]
  1412. mc7:
  1413. movq mm1, [eax+esi]
  1414. movq mm2, [eax+esi+1]
  1415. movq mm3, mm1
  1416. movq mm4, mm2
  1417. punpcklbw mm1, mm0
  1418. punpckhbw mm3, mm0
  1419. punpcklbw mm2, mm0
  1420. punpckhbw mm4, mm0
  1421. paddsw mm1, mm2
  1422. paddsw mm3, mm4
  1423. movq mm5, [ecx+esi]
  1424. paddsw mm1, mm7
  1425. movq mm6, [ecx+esi+1]
  1426. paddsw mm3, mm7
  1427. movq mm2, mm5
  1428. movq mm4, mm6
  1429. punpcklbw mm2, mm0
  1430. punpckhbw mm5, mm0
  1431. punpcklbw mm4, mm0
  1432. punpckhbw mm6, mm0
  1433. paddsw mm2, mm4
  1434. paddsw mm5, mm6
  1435. paddsw mm1, mm2
  1436. paddsw mm3, mm5
  1437. movq mm6, [ebx+esi]
  1438. movq mm4, mm6
  1439. punpcklbw mm4, mm0
  1440. punpckhbw mm6, mm0
  1441. psllw mm4, 2
  1442. psllw mm6, 2
  1443. paddsw mm1, mm4
  1444. paddsw mm3, mm6
  1445. psrlw mm1, 3
  1446. psrlw mm3, 3
  1447. packuswb mm1, mm0
  1448. packuswb mm3, mm0
  1449. psllq mm3, 32
  1450. por mm1, mm3
  1451. add esi, 0x08
  1452. cmp esi, [w]
  1453. movq [ebx+esi-8], mm1
  1454. jl mc7
  1455. add eax, [lx2]
  1456. add ebx, [lx2]
  1457. add ecx, [lx2]
  1458. sub edi, 0x01
  1459. mov esi, 0x00
  1460. cmp edi, 0x00
  1461. jg mc7
  1462. }
  1463. break;
  1464. }
  1465. }