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

DirextX编程

开发平台:

Visual C++

  1. /* 
  2.  * Copyright (C) Chia-chen Kuo - Jan 2001
  3.  *
  4.  *  This file is part of DVD2AVI, a free MPEG-2 decoder
  5.  *
  6.  *  DVD2AVI is free software; you can redistribute it and/or modify
  7.  *  it under the terms of the GNU General Public License as published by
  8.  *  the Free Software Foundation; either version 2, or (at your option)
  9.  *  any later version.
  10.  *   
  11.  *  DVD2AVI is distributed in the hope that it will be useful,
  12.  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
  13.  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  14.  *  GNU General Public License for more details.
  15.  *   
  16.  *  You should have received a copy of the GNU General Public License
  17.  *  along with GNU Make; see the file COPYING.  If not, write to
  18.  *  the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. 
  19.  *
  20.  */
  21. #include "global.h"
  22. #define MAX_AVI_SIZE 2073600000
  23. __forceinline static void Store_RGB24(unsigned char *src[], DWORD frame);
  24. __forceinline static void Store_YUY2(unsigned char *src[], DWORD frame);
  25. static void Luminance_Filter(unsigned char *src, unsigned char *dst);
  26. static void conv420to422(unsigned char *src, unsigned char *dst);
  27. static void conv422to444(unsigned char *src, unsigned char *dst);
  28. static void conv444toRGB24odd(unsigned char *py, unsigned char *pu, unsigned char *pv, unsigned char *dst);
  29. static void conv444toRGB24even(unsigned char *py, unsigned char *pu, unsigned char *pv, unsigned char *dst);
  30. static void conv422toyuy2odd(unsigned char *py, unsigned char *pu, unsigned char *pv, unsigned char *dst);
  31. static void conv422toyuy2even(unsigned char *py, unsigned char *pu, unsigned char *pv, unsigned char *dst);
  32. static unsigned char *y444;
  33. static int TFF, RFF, TFB, BFB, playback, Old_Playback, frame_size, frame_type;
  34. static char VideoOut[_MAX_PATH];
  35. static char *FrameType[3] = {
  36. "", "Interlaced", "Progressive"
  37. };
  38. static const __int64 mmmask_0001 = 0x0001000100010001;
  39. static const __int64 mmmask_0002 = 0x0002000200020002;
  40. static const __int64 mmmask_0003 = 0x0003000300030003;
  41. static const __int64 mmmask_0004 = 0x0004000400040004;
  42. static const __int64 mmmask_0005 = 0x0005000500050005;
  43. static const __int64 mmmask_0007 = 0x0007000700070007;
  44. static const __int64 mmmask_0064 = 0x0040004000400040;
  45. static const __int64 mmmask_0128 = 0x0080008000800080;
  46. static const __int64 mmmask_cbu = 0x0000408D0000408D;
  47. static const __int64 mmmask_cgu_cgv = 0xF377E5FCF377E5FC;
  48. static const __int64 mmmask_crv = 0x0000331300003313;
  49. void Write_Frame(unsigned char *src[], D2VData d2v, DWORD frame)
  50. {
  51. int i, repeat;
  52. if (Fault_Flag)
  53. {
  54. if (Fault_Flag < CRITICAL_ERROR_LEVEL)
  55. {
  56. Fault_Flag = 0; // Fault Tolerance
  57. }
  58. }
  59. frame_type = d2v.pf;
  60. TFF = d2v.trf>>1;
  61. RFF = d2v.trf & 0x01;
  62. if (!frame)
  63. {
  64. TFB = BFB = 0; Old_Playback = 0;
  65. frame_size = 0;  playback = 0;
  66. if (FO_Flag==FO_SWAP)
  67. {
  68. if (TFF)
  69. BFB = 1;
  70. else
  71. TFB = 1;
  72. ZeroMemory(rgb24, Coded_Picture_Width*Coded_Picture_Height*3);
  73. for (i=0; i<Coded_Picture_Width*Coded_Picture_Height*2; i += 2)
  74. {
  75. yuy2[i] = 0;
  76. yuy2[i+1] = 128;
  77. }
  78. }
  79. }
  80. repeat = DetectVideoType(frame, d2v.trf);
  81. if (FO_Flag!=FO_FILM || repeat)
  82. {
  83. if (Store_Flag==STORE_YUY2)
  84. Store_YUY2(src, frame);
  85. else
  86. Store_RGB24(src, frame);
  87. }
  88. if (FO_Flag==FO_FILM && repeat==2)
  89. {
  90. if (Store_Flag==STORE_YUY2)
  91. Store_YUY2(src, frame);
  92. else
  93. Store_RGB24(src, frame);
  94. }
  95. __asm emms;
  96. }
  97. /*
  98. void FinalDecodedOut(unsigned char * outBuffer)
  99. {
  100. if (Store_Flag==STORE_YUY2)
  101. {
  102. if (BFB)
  103. {
  104. conv422toyuy2odd(y444, u422, v422, outBuffer);
  105. conv422toyuy2even(y444, u422, v422, outBuffer);
  106. }
  107. else
  108. {
  109. conv422toyuy2even(y444, u422, v422, outBuffer);
  110. conv422toyuy2odd(y444, u422, v422, outBuffer);
  111. }
  112. if (FO_Flag!=FO_FILM && RFF)
  113. {
  114. if (TFF)
  115. {
  116. conv422toyuy2odd(y444, u422, v422, outBuffer);
  117. }
  118. else
  119. {
  120. conv422toyuy2even(y444, u422, v422, outBuffer);
  121. }
  122. }
  123. }
  124. else
  125. {
  126. if (BFB)
  127. {
  128. conv444toRGB24odd(y444, u444, v444, outBuffer);
  129. conv444toRGB24even(y444, u444, v444, outBuffer);
  130. }
  131. else
  132. {
  133. conv444toRGB24even(y444, u444, v444, outBuffer);
  134. conv444toRGB24odd(y444, u444, v444, outBuffer);
  135. }
  136. if (FO_Flag!=FO_FILM && RFF)
  137. {
  138. if (TFF)
  139. {
  140. conv444toRGB24odd(y444, u444, v444, outBuffer);
  141. }
  142. else
  143. {
  144. conv444toRGB24even(y444, u444, v444, outBuffer);
  145. }
  146. }
  147. }
  148. }*/
  149. // --------------------------------------------------------------------------
  150. static void Store_RGB24(unsigned char *src[], DWORD frame)
  151. {
  152. if (Luminance_Flag)
  153. {
  154. Luminance_Filter(src[0], lum);
  155. y444 = lum;
  156. }
  157. else
  158. y444 = src[0];
  159. if (chroma_format==CHROMA420)
  160. {
  161. conv420to422(src[1], u422);
  162. conv420to422(src[2], v422);
  163. conv422to444(u422, u444);
  164. conv422to444(v422, v444);
  165. }
  166. else
  167. {
  168. conv422to444(src[1], u444);
  169. conv422to444(src[2], v444);
  170. }
  171. // Convert to RGB24 buffer
  172. if (BFB)
  173. {
  174. conv444toRGB24odd(y444, u444, v444, rgb24);
  175. conv444toRGB24even(y444, u444, v444, rgb24);
  176. }
  177. else
  178. {
  179. conv444toRGB24even(y444, u444, v444, rgb24);
  180. conv444toRGB24odd(y444, u444, v444, rgb24);
  181. }
  182. if (FO_Flag!=FO_FILM && RFF)
  183. {
  184. if (TFF)
  185. {
  186. conv444toRGB24odd(y444, u444, v444, rgb24);
  187. }
  188. else
  189. {
  190. conv444toRGB24even(y444, u444, v444, rgb24);
  191. }
  192. }
  193. }
  194. // --------------------------------------------------------------------------
  195. static void Store_YUY2(unsigned char *src[], DWORD frame)
  196. {
  197. if (Luminance_Flag)
  198. {
  199. Luminance_Filter(src[0], lum);
  200. y444 = lum;
  201. }
  202. else
  203. y444 = src[0];
  204. if (chroma_format==CHROMA420)
  205. {
  206. conv420to422(src[1], u422);
  207. conv420to422(src[2], v422);
  208. }
  209. else
  210. {
  211. u422 = src[1];
  212. v422 = src[2];
  213. }
  214. // Convert to YUY2 buffer
  215. if (BFB)
  216. {
  217. conv422toyuy2odd(y444, u422, v422, yuy2);
  218. conv422toyuy2even(y444, u422, v422, yuy2);
  219. }
  220. else
  221. {
  222. conv422toyuy2even(y444, u422, v422, yuy2);
  223. conv422toyuy2odd(y444, u422, v422, yuy2);
  224. }
  225. if (FO_Flag!=FO_FILM && RFF)
  226. {
  227. if (TFF)
  228. {
  229. conv422toyuy2odd(y444, u422, v422, yuy2);
  230. }
  231. else
  232. {
  233. conv422toyuy2even(y444, u422, v422, yuy2);
  234. }
  235. }
  236. }
  237. // --------------------------------------------------------------------------
  238. static void Luminance_Filter(unsigned char *src, unsigned char *dst)
  239. {
  240. int area = Coded_Picture_Width * Coded_Picture_Height;
  241. __asm
  242. {
  243. mov eax, [src]
  244. mov ebx, [dst]
  245. mov esi, 0x00
  246. mov edi, [area]
  247. pxor mm0, mm0
  248. movq mm5, [LumOffsetMask]
  249. movq mm6, [LumGainMask]
  250. movq mm7, [mmmask_0064]
  251. lumconv:
  252. movq mm1, [eax+esi]
  253. movq mm2, mm1
  254. punpcklbw mm1, mm0
  255. punpckhbw mm2, mm0
  256. pmullw mm1, mm6
  257. pmullw mm2, mm6
  258. paddw mm1, mm7
  259. paddw mm2, mm7
  260. psrlw mm1, 7
  261. psrlw mm2, 7
  262. paddw mm1, mm5
  263. paddw mm2, mm5
  264. packuswb mm1, mm0
  265. packuswb mm2, mm0
  266. add esi, 0x08
  267. cmp esi, edi
  268. movq [ebx+esi-8], mm1
  269. movq [ebx+esi-4], mm2
  270. jl lumconv
  271. }
  272. }
  273. static void conv422to444(unsigned char *src, unsigned char *dst)
  274. {
  275. __asm
  276. {
  277. mov eax, [src]
  278. mov ebx, [dst]
  279. mov edi, [Coded_Picture_Height]
  280. movq mm1, [mmmask_0001]
  281. pxor mm0, mm0
  282. convyuv444init:
  283. movq mm7, [eax]
  284. mov esi, 0x00
  285. convyuv444:
  286. movq mm2, mm7
  287. movq mm7, [eax+esi+8]
  288. movq mm3, mm2
  289. movq mm4, mm7
  290. psrlq mm3, 8
  291. psllq mm4, 56
  292. por mm3, mm4
  293. movq mm4, mm2
  294. movq mm5, mm3
  295. punpcklbw mm4, mm0
  296. punpcklbw mm5, mm0
  297. movq mm6, mm4
  298. paddusw mm4, mm1
  299. paddusw mm4, mm5
  300. psrlw mm4, 1
  301. psllq mm4, 8
  302. por mm4, mm6
  303. punpckhbw mm2, mm0
  304. punpckhbw mm3, mm0
  305. movq mm6, mm2
  306. paddusw mm2, mm1
  307. paddusw mm2, mm3
  308. movq [ebx+esi*2], mm4
  309. psrlw mm2, 1
  310. psllq mm2, 8
  311. por mm2, mm6
  312. add esi, 0x08
  313. cmp esi, [hwidthd8]
  314. movq [ebx+esi*2-8], mm2
  315. jl convyuv444
  316. movq mm2, mm7
  317. punpcklbw mm2, mm0
  318. movq mm3, mm2
  319. psllq mm2, 8
  320. por mm2, mm3
  321. movq [ebx+esi*2], mm2
  322. punpckhbw mm7, mm0
  323. movq mm6, mm7
  324. psllq mm6, 8
  325. por mm6, mm7
  326. movq [ebx+esi*2+8], mm6
  327. add eax, [hwidth]
  328. add ebx, [Coded_Picture_Width]
  329. sub edi, 0x01
  330. cmp edi, 0x00
  331. jg convyuv444init
  332. }
  333. }
  334. static void conv420to422(unsigned char *src, unsigned char *dst)
  335. {
  336. if (frame_type)
  337. {
  338. __asm
  339. {
  340. mov eax, [src]
  341. mov ebx, [dst]
  342. mov ecx, ebx
  343. add ecx, [hwidth]
  344. mov esi, 0x00
  345. movq mm3, [mmmask_0003]
  346. pxor mm0, mm0
  347. movq mm4, [mmmask_0002]
  348. mov edx, eax
  349. add edx, [hwidth]
  350. convyuv422topp:
  351. movd mm1, [eax+esi]
  352. movd mm2, [edx+esi]
  353. movd [ebx+esi], mm1
  354. punpcklbw mm1, mm0
  355. pmullw mm1, mm3
  356. paddusw mm1, mm4
  357. punpcklbw mm2, mm0
  358. paddusw mm2, mm1
  359. psrlw mm2, 0x02
  360. packuswb mm2, mm0
  361. add esi, 0x04
  362. cmp esi, [hwidth]
  363. movd [ecx+esi-4], mm2
  364. jl convyuv422topp
  365. add eax, [hwidth]
  366. add ebx, [Coded_Picture_Width]
  367. add ecx, [Coded_Picture_Width]
  368. mov esi, 0x00
  369. mov edi, [hheightd2]
  370. convyuv422p:
  371. movd mm1, [eax+esi]
  372. punpcklbw mm1, mm0
  373. mov edx, eax
  374. pmullw mm1, mm3
  375. sub edx, [hwidth]
  376. movd mm5, [edx+esi]
  377. movd mm2, [edx+esi]
  378. punpcklbw mm5, mm0
  379. punpcklbw mm2, mm0
  380. paddusw mm5, mm1
  381. paddusw mm2, mm1
  382. paddusw mm5, mm4
  383. paddusw mm2, mm4
  384. psrlw mm5, 0x02
  385. psrlw mm2, 0x02
  386. packuswb mm5, mm0
  387. packuswb mm2, mm0
  388. mov edx, eax
  389. add edx, [hwidth]
  390. add esi, 0x04
  391. cmp esi, [hwidth]
  392. movd [ebx+esi-4], mm5
  393. movd [ecx+esi-4], mm2
  394. jl convyuv422p
  395. add eax, [hwidth]
  396. add ebx, [Coded_Picture_Width]
  397. add ecx, [Coded_Picture_Width]
  398. mov esi, 0x00
  399. sub edi, 0x01
  400. cmp edi, 0x00
  401. jg convyuv422p
  402. mov edx, eax
  403. sub edx, [hwidth]
  404. convyuv422bottomp:
  405. movd mm1, [eax+esi]
  406. movd mm5, [edx+esi]
  407. punpcklbw mm5, mm0
  408. movd [ecx+esi], mm1
  409. punpcklbw mm1, mm0
  410. pmullw mm1, mm3
  411. paddusw mm5, mm1
  412. paddusw mm5, mm4
  413. psrlw mm5, 0x02
  414. packuswb mm5, mm0
  415. add esi, 0x04
  416. cmp esi, [hwidth]
  417. movd [ebx+esi-4], mm5
  418. jl convyuv422bottomp
  419. }
  420. }
  421. else
  422. {
  423. __asm
  424. {
  425. mov eax, [src]
  426. mov ecx, [dst]
  427. mov esi, 0x00
  428. pxor mm0, mm0
  429. movq mm3, [mmmask_0003]
  430. movq mm4, [mmmask_0004]
  431. movq mm5, [mmmask_0005]
  432. convyuv422topi:
  433. movd mm1, [eax+esi]
  434. mov ebx, eax
  435. add ebx, [hwidth]
  436. movd mm2, [ebx+esi]
  437. movd [ecx+esi], mm1
  438. punpcklbw mm1, mm0
  439. movq mm6, mm1
  440. pmullw mm1, mm3
  441. punpcklbw mm2, mm0
  442. movq mm7, mm2
  443. pmullw mm2, mm5
  444. paddusw mm2, mm1
  445. paddusw mm2, mm4
  446. psrlw mm2, 0x03
  447. packuswb mm2, mm0
  448. mov edx, ecx
  449. add edx, [hwidth]
  450. pmullw mm6, mm5
  451. movd [edx+esi], mm2
  452. add ebx, [hwidth]
  453. movd mm2, [ebx+esi]
  454. punpcklbw mm2, mm0
  455. pmullw mm2, mm3
  456. paddusw mm2, mm6
  457. paddusw mm2, mm4
  458. psrlw mm2, 0x03
  459. packuswb mm2, mm0
  460. add edx, [hwidth]
  461. add ebx, [hwidth]
  462. pmullw mm7, [mmmask_0007]
  463. movd [edx+esi], mm2
  464. movd mm2, [ebx+esi]
  465. punpcklbw mm2, mm0
  466. paddusw mm2, mm7
  467. paddusw mm2, mm4
  468. psrlw mm2, 0x03
  469. packuswb mm2, mm0
  470. add edx, [hwidth]
  471. add esi, 0x04
  472. cmp esi, [hwidth]
  473. movd [edx+esi-4], mm2
  474. jl convyuv422topi
  475. add eax, [Coded_Picture_Width]
  476. add ecx, [dwidth]
  477. mov esi, 0x00
  478. mov edi, [qheightd2]
  479. convyuv422i:
  480. movd mm1, [eax+esi]
  481. punpcklbw mm1, mm0
  482. movq mm6, mm1
  483. mov ebx, eax
  484. sub ebx, [Coded_Picture_Width]
  485. movd mm3, [ebx+esi]
  486. pmullw mm1, [mmmask_0007]
  487. punpcklbw mm3, mm0
  488. paddusw mm3, mm1
  489. paddusw mm3, mm4
  490. psrlw mm3, 0x03
  491. packuswb mm3, mm0
  492. add ebx, [hwidth]
  493. movq mm1, [ebx+esi]
  494. add ebx, [Coded_Picture_Width]
  495. movd [ecx+esi], mm3
  496. movq mm3, [mmmask_0003]
  497. movd mm2, [ebx+esi]
  498. punpcklbw mm1, mm0
  499. pmullw mm1, mm3
  500. punpcklbw mm2, mm0
  501. movq mm7, mm2
  502. pmullw mm2, mm5
  503. paddusw mm2, mm1
  504. paddusw mm2, mm4
  505. psrlw mm2, 0x03
  506. packuswb mm2, mm0
  507. pmullw mm6, mm5
  508. mov edx, ecx
  509. add edx, [hwidth]
  510. movd [edx+esi], mm2
  511. add ebx, [hwidth]
  512. movd mm2, [ebx+esi]
  513. punpcklbw mm2, mm0
  514. pmullw mm2, mm3
  515. paddusw mm2, mm6
  516. paddusw mm2, mm4
  517. psrlw mm2, 0x03
  518. packuswb mm2, mm0
  519. pmullw mm7, [mmmask_0007]
  520. add edx, [hwidth]
  521. add ebx, [hwidth]
  522.   movd [edx+esi], mm2
  523. movd mm2, [ebx+esi]
  524. punpcklbw mm2, mm0
  525. paddusw mm2, mm7
  526. paddusw mm2, mm4
  527. psrlw mm2, 0x03
  528. packuswb mm2, mm0
  529. add edx, [hwidth]
  530. add esi, 0x04
  531. cmp esi, [hwidth]
  532. movd [edx+esi-4], mm2
  533. jl convyuv422i
  534. add eax, [Coded_Picture_Width]
  535. add ecx, [dwidth]
  536. mov esi, 0x00
  537. sub edi, 0x01
  538. cmp edi, 0x00
  539. jg convyuv422i
  540. convyuv422bottomi:
  541. movd mm1, [eax+esi]
  542. movq mm6, mm1
  543. punpcklbw mm1, mm0
  544. mov ebx, eax
  545. sub ebx, [Coded_Picture_Width]
  546. movd mm3, [ebx+esi]
  547. punpcklbw mm3, mm0
  548. pmullw mm1, [mmmask_0007]
  549. paddusw mm3, mm1
  550. paddusw mm3, mm4
  551. psrlw mm3, 0x03
  552. packuswb mm3, mm0
  553. add ebx, [hwidth]
  554. movq mm1, [ebx+esi]
  555. punpcklbw mm1, mm0
  556. movd [ecx+esi], mm3
  557. pmullw mm1, [mmmask_0003]
  558. add ebx, [Coded_Picture_Width]
  559. movd mm2, [ebx+esi]
  560. punpcklbw mm2, mm0
  561. movq mm7, mm2
  562. pmullw mm2, mm5
  563. paddusw mm2, mm1
  564. paddusw mm2, mm4
  565. psrlw mm2, 0x03
  566. packuswb mm2, mm0
  567. mov edx, ecx
  568. add edx, [hwidth]
  569. pmullw mm7, [mmmask_0007]
  570. movd [edx+esi], mm2
  571. add edx, [hwidth]
  572. movd [edx+esi], mm6
  573. punpcklbw mm6, mm0
  574. paddusw mm6, mm7
  575. paddusw mm6, mm4
  576. psrlw mm6, 0x03
  577. packuswb mm6, mm0
  578. add edx, [hwidth]
  579. add esi, 0x04
  580. cmp esi, [hwidth]
  581. movd [edx+esi-4], mm6
  582. jl convyuv422bottomi
  583. }
  584. }
  585. }
  586. static void conv422toyuy2odd(unsigned char *py, unsigned char *pu, unsigned char *pv, unsigned char *dst)
  587. {
  588. TFB = 1;
  589. __asm
  590. {
  591. mov eax, [py]
  592. mov ebx, [pu]
  593. mov ecx, [pv]
  594. mov edx, [dst]
  595. mov esi, 0x00
  596. mov edi, [Coded_Picture_Height]
  597. yuy2conv:
  598. movd mm2, [ebx+esi]
  599. movd mm3, [ecx+esi]
  600. punpcklbw mm2, mm3
  601. movq mm1, [eax+esi*2]
  602. movq mm4, mm1
  603. punpcklbw mm1, mm2
  604. punpckhbw mm4, mm2
  605. add esi, 0x04
  606. cmp esi, [hwidth]
  607. movq [edx+esi*4-16], mm1
  608. movq [edx+esi*4-8], mm4
  609. jl yuy2conv
  610. add eax, [dwidth]
  611. add ebx, [Coded_Picture_Width]
  612. add ecx, [Coded_Picture_Width]
  613. add edx, [qwidth]
  614. sub edi, 0x02
  615. mov esi, 0x00
  616. cmp edi, 0x00
  617. jg yuy2conv
  618. }
  619. }
  620. static void conv422toyuy2even(unsigned char *py, unsigned char *pu, unsigned char *pv, unsigned char *dst)
  621. {
  622. py += Coded_Picture_Width; pu += hwidth; pv += hwidth; dst += dwidth;
  623. BFB = 1;
  624. __asm
  625. {
  626. mov eax, [py]
  627. mov ebx, [pu]
  628. mov ecx, [pv]
  629. mov edx, [dst]
  630. mov esi, 0x00
  631. mov edi, [Coded_Picture_Height]
  632. yuy2conv:
  633. movd mm2, [ebx+esi]
  634. movd mm3, [ecx+esi]
  635. punpcklbw mm2, mm3
  636. movq mm1, [eax+esi*2]
  637. movq mm4, mm1
  638. punpcklbw mm1, mm2
  639. punpckhbw mm4, mm2
  640. add esi, 0x04
  641. cmp esi, [hwidth]
  642. movq [edx+esi*4-16], mm1
  643. movq [edx+esi*4-8], mm4
  644. jl yuy2conv
  645. add eax, [dwidth]
  646. add ebx, [Coded_Picture_Width]
  647. add ecx, [Coded_Picture_Width]
  648. add edx, [qwidth]
  649. sub edi, 0x02
  650. mov esi, 0x00
  651. cmp edi, 0x00
  652. jg yuy2conv
  653. }
  654. }
  655. static void conv444toRGB24odd(unsigned char *py, unsigned char *pu, unsigned char *pv, unsigned char *dst)
  656. {
  657. dst += Coded_Picture_Width * (Coded_Picture_Height-1) * 3;
  658. TFB = 1;
  659. __asm
  660. {
  661. mov eax, [py]
  662. mov ebx, [pu]
  663. mov ecx, [pv]
  664. mov edx, [dst]
  665. mov edi, [Coded_Picture_Height]
  666. mov esi, 0x00
  667. pxor mm0, mm0
  668. convRGB24:
  669. movd mm1, [eax+esi]
  670. movd mm3, [ebx+esi]
  671. punpcklbw mm1, mm0
  672. punpcklbw mm3, mm0
  673. movd mm5, [ecx+esi]
  674. punpcklbw mm5, mm0
  675. movq mm7, [mmmask_0128]
  676. psubw mm3, mm7
  677. psubw mm5, mm7
  678. psubw mm1, [YUVRGB_Offset]
  679. movq mm2, mm1
  680. movq mm7, [mmmask_0001]
  681. punpcklwd mm1, mm7
  682. punpckhwd mm2, mm7
  683. movq mm7, [YUVRGB_Scale]
  684. pmaddwd mm1, mm7
  685. pmaddwd mm2, mm7
  686. movq mm4, mm3
  687. punpcklwd mm3, mm0
  688. punpckhwd mm4, mm0
  689. movq mm7, [mmmask_cbu]
  690. pmaddwd mm3, mm7
  691. pmaddwd mm4, mm7
  692. paddd mm3, mm1
  693. paddd mm4, mm2
  694. psrld mm3, 13
  695. psrld mm4, 13
  696. packuswb mm3, mm0
  697. packuswb mm4, mm0
  698. movq mm6, mm5
  699. punpcklwd mm5, mm0
  700. punpckhwd mm6, mm0
  701. movq mm7, [mmmask_crv]
  702. pmaddwd mm5, mm7
  703. pmaddwd mm6, mm7
  704. paddd mm5, mm1
  705. paddd mm6, mm2
  706. psrld mm5, 13
  707. psrld mm6, 13
  708. packuswb mm5, mm0
  709. packuswb mm6, mm0
  710. punpcklbw mm3, mm5
  711. punpcklbw mm4, mm6
  712. movq mm5, mm3
  713. movq mm6, mm4
  714. psrlq mm5, 16
  715. psrlq mm6, 16
  716. por mm3, mm5
  717. por mm4, mm6
  718. movd mm5, [ebx+esi]
  719. movd mm6, [ecx+esi]
  720. punpcklbw mm5, mm0
  721. punpcklbw mm6, mm0
  722. movq mm7, [mmmask_0128]
  723. psubw mm5, mm7
  724. psubw mm6, mm7
  725. movq mm7, mm6
  726. punpcklwd mm6, mm5
  727. punpckhwd mm7, mm5
  728. movq mm5, [mmmask_cgu_cgv]
  729. pmaddwd mm6, mm5
  730. pmaddwd mm7, mm5
  731. paddd mm6, mm1
  732. paddd mm7, mm2
  733. psrld mm6, 13
  734. psrld mm7, 13
  735. packuswb mm6, mm0
  736. packuswb mm7, mm0
  737. punpcklbw mm3, mm6
  738. punpcklbw mm4, mm7
  739. movq mm1, mm3
  740. movq mm5, mm4
  741. movq mm6, mm4
  742. psrlq mm1, 32
  743. psllq mm1, 24
  744. por mm1, mm3
  745. psrlq mm3, 40
  746. psllq mm6, 16
  747. por mm3, mm6
  748. movd [edx], mm1
  749. psrld mm4, 16
  750. psrlq mm5, 24
  751. por mm5, mm4
  752. movd [edx+4], mm3
  753. add edx, 0x0c
  754. add esi, 0x04
  755. cmp esi, [Coded_Picture_Width]
  756. movd [edx-4], mm5
  757. jl convRGB24
  758. add eax, [dwidth]
  759. add ebx, [dwidth]
  760. add ecx, [dwidth]
  761. sub edx, [nwidth]
  762. mov esi, 0x00
  763. sub edi, 0x02
  764. cmp edi, 0x00
  765. jg convRGB24
  766. }
  767. }
  768. static void conv444toRGB24even(unsigned char *py, unsigned char *pu, unsigned char *pv, unsigned char *dst)
  769. {
  770. dst += Coded_Picture_Width * (Coded_Picture_Height-2) * 3;
  771. py += Coded_Picture_Width; pu += Coded_Picture_Width; pv += Coded_Picture_Width;
  772. BFB = 1;
  773. __asm
  774. {
  775. mov eax, [py]
  776. mov ebx, [pu]
  777. mov ecx, [pv]
  778. mov edx, [dst]
  779. mov edi, [Coded_Picture_Height]
  780. mov esi, 0x00
  781. pxor mm0, mm0
  782. convRGB24:
  783. movd mm1, [eax+esi]
  784. movd mm3, [ebx+esi]
  785. punpcklbw mm1, mm0
  786. punpcklbw mm3, mm0
  787. movd mm5, [ecx+esi]
  788. punpcklbw mm5, mm0
  789. movq mm7, [mmmask_0128]
  790. psubw mm3, mm7
  791. psubw mm5, mm7
  792. psubw mm1, [YUVRGB_Offset]
  793. movq mm2, mm1
  794. movq mm7, [mmmask_0001]
  795. punpcklwd mm1, mm7
  796. punpckhwd mm2, mm7
  797. movq mm7, [YUVRGB_Scale]
  798. pmaddwd mm1, mm7
  799. pmaddwd mm2, mm7
  800. movq mm4, mm3
  801. punpcklwd mm3, mm0
  802. punpckhwd mm4, mm0
  803. movq mm7, [mmmask_cbu]
  804. pmaddwd mm3, mm7
  805. pmaddwd mm4, mm7
  806. paddd mm3, mm1
  807. paddd mm4, mm2
  808. psrld mm3, 13
  809. psrld mm4, 13
  810. packuswb mm3, mm0
  811. packuswb mm4, mm0
  812. movq mm6, mm5
  813. punpcklwd mm5, mm0
  814. punpckhwd mm6, mm0
  815. movq mm7, [mmmask_crv]
  816. pmaddwd mm5, mm7
  817. pmaddwd mm6, mm7
  818. paddd mm5, mm1
  819. paddd mm6, mm2
  820. psrld mm5, 13
  821. psrld mm6, 13
  822. packuswb mm5, mm0
  823. packuswb mm6, mm0
  824. punpcklbw mm3, mm5
  825. punpcklbw mm4, mm6
  826. movq mm5, mm3
  827. movq mm6, mm4
  828. psrlq mm5, 16
  829. psrlq mm6, 16
  830. por mm3, mm5
  831. por mm4, mm6
  832. movd mm5, [ebx+esi]
  833. movd mm6, [ecx+esi]
  834. punpcklbw mm5, mm0
  835. punpcklbw mm6, mm0
  836. movq mm7, [mmmask_0128]
  837. psubw mm5, mm7
  838. psubw mm6, mm7
  839. movq mm7, mm6
  840. punpcklwd mm6, mm5
  841. punpckhwd mm7, mm5
  842. movq mm5, [mmmask_cgu_cgv]
  843. pmaddwd mm6, mm5
  844. pmaddwd mm7, mm5
  845. paddd mm6, mm1
  846. paddd mm7, mm2
  847. psrld mm6, 13
  848. psrld mm7, 13
  849. packuswb mm6, mm0
  850. packuswb mm7, mm0
  851. punpcklbw mm3, mm6
  852. punpcklbw mm4, mm7
  853. movq mm1, mm3
  854. movq mm5, mm4
  855. movq mm6, mm4
  856. psrlq mm1, 32
  857. psllq mm1, 24
  858. por mm1, mm3
  859. psrlq mm3, 40
  860. psllq mm6, 16
  861. por mm3, mm6
  862. movd [edx], mm1
  863. psrld mm4, 16
  864. psrlq mm5, 24
  865. por mm5, mm4
  866. movd [edx+4], mm3
  867. add edx, 0x0c
  868. add esi, 0x04
  869. cmp esi, [Coded_Picture_Width]
  870. movd [edx-4], mm5
  871. jl convRGB24
  872. add eax, [dwidth]
  873. add ebx, [dwidth]
  874. add ecx, [dwidth]
  875. sub edx, [nwidth]
  876. mov esi, 0x00
  877. sub edi, 0x02
  878. cmp edi, 0x00
  879. jg convRGB24
  880. }
  881. }
  882. int DetectVideoType(int frame, int trf)
  883. {
  884. static int Old_TRF, Repeat_On, Repeat_Off, Repeat_Init;
  885. if (frame)
  886. {
  887. if ((trf & 3) == ((Old_TRF+1) & 3))
  888. FILM_Purity++;
  889. else
  890. NTSC_Purity++;
  891. }
  892. else
  893. Video_Type = FILM_Purity = NTSC_Purity = Repeat_On = Repeat_Off = Repeat_Init = 0; 
  894. Old_TRF = trf;
  895. if (trf & 1)
  896. Repeat_On ++;
  897. else
  898. Repeat_Off ++;
  899. if (Repeat_Init)
  900. {
  901. if (Repeat_Off-Repeat_On == 5)
  902. {
  903. Repeat_Off = Repeat_On = 0;
  904. return 0;
  905. }
  906. else if (Repeat_On-Repeat_Off == 5)
  907. {
  908. Repeat_Off = Repeat_On = 0;
  909. return 2;
  910. }
  911. }
  912. else
  913. {
  914. if (Repeat_Off-Repeat_On == 3)
  915. {
  916. Repeat_Off = Repeat_On = 0;
  917. Repeat_Init = 1;
  918. return 0;
  919. }
  920. else if (Repeat_On-Repeat_Off == 3)
  921. {
  922. Repeat_Off = Repeat_On = 0;
  923. Repeat_Init = 1;
  924. return 2;
  925. }
  926. }
  927. return 1;
  928. }