yuv2rgb.c
上传用户:riyaled888
上传日期:2009-03-27
资源大小:7338k
文件大小:21k
源码类别:

多媒体

开发平台:

MultiPlatform

  1. /*
  2.  * yuv2rgb.c, Software YUV to RGB coverter
  3.  *
  4.  *  Copyright (C) 1999, Aaron Holtzman <aholtzma@ess.engr.uvic.ca>
  5.  *  All Rights Reserved.
  6.  *
  7.  *  Functions broken out from display_x11.c and several new modes
  8.  *  added by H錵an Hjort <d95hjort@dtek.chalmers.se>
  9.  *
  10.  *  15 & 16 bpp support by Franck Sicard <Franck.Sicard@solsoft.fr>
  11.  *
  12.  *  This file is part of mpeg2dec, a free MPEG-2 video decoder
  13.  *
  14.  *  mpeg2dec is free software; you can redistribute it and/or modify
  15.  *  it under the terms of the GNU General Public License as published by
  16.  *  the Free Software Foundation; either version 2, or (at your option)
  17.  *  any later version.
  18.  *
  19.  *  mpeg2dec is distributed in the hope that it will be useful,
  20.  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
  21.  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  22.  *  GNU General Public License for more details.
  23.  *
  24.  *  You should have received a copy of the GNU General Public License
  25.  *  along with GNU Make; see the file COPYING.  If not, write to
  26.  *  the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
  27.  *
  28.  * MMX/MMX2 Template stuff from Michael Niedermayer (michaelni@gmx.at) (needed for fast movntq support)
  29.  * 1,4,8bpp support by Michael Niedermayer (michaelni@gmx.at)
  30.  * context / deglobalize stuff by Michael Niedermayer
  31.  */
  32. #include <stdio.h>
  33. #include <stdlib.h>
  34. #include <inttypes.h>
  35. #include <assert.h>
  36. #include "config.h"
  37. //#include "video_out.h"
  38. #include "rgb2rgb.h"
  39. #include "swscale.h"
  40. #include "swscale_internal.h"
  41. #include "common.h"
  42. #ifdef HAVE_MLIB
  43. #include "yuv2rgb_mlib.c"
  44. #endif
  45. #define DITHER1XBPP // only for mmx
  46. const uint8_t  __attribute__((aligned(8))) dither_2x2_4[2][8]={
  47. {  1,   3,   1,   3,   1,   3,   1,   3, },
  48. {  2,   0,   2,   0,   2,   0,   2,   0, },
  49. };
  50. const uint8_t  __attribute__((aligned(8))) dither_2x2_8[2][8]={
  51. {  6,   2,   6,   2,   6,   2,   6,   2, },
  52. {  0,   4,   0,   4,   0,   4,   0,   4, },
  53. };
  54. const uint8_t  __attribute__((aligned(8))) dither_8x8_32[8][8]={
  55. { 17,   9,  23,  15,  16,   8,  22,  14, },
  56. {  5,  29,   3,  27,   4,  28,   2,  26, },
  57. { 21,  13,  19,  11,  20,  12,  18,  10, },
  58. {  0,  24,   6,  30,   1,  25,   7,  31, },
  59. { 16,   8,  22,  14,  17,   9,  23,  15, },
  60. {  4,  28,   2,  26,   5,  29,   3,  27, },
  61. { 20,  12,  18,  10,  21,  13,  19,  11, },
  62. {  1,  25,   7,  31,   0,  24,   6,  30, },
  63. };
  64. #if 0
  65. const uint8_t  __attribute__((aligned(8))) dither_8x8_64[8][8]={
  66. {  0,  48,  12,  60,   3,  51,  15,  63, },
  67. { 32,  16,  44,  28,  35,  19,  47,  31, },
  68. {  8,  56,   4,  52,  11,  59,   7,  55, },
  69. { 40,  24,  36,  20,  43,  27,  39,  23, },
  70. {  2,  50,  14,  62,   1,  49,  13,  61, },
  71. { 34,  18,  46,  30,  33,  17,  45,  29, },
  72. { 10,  58,   6,  54,   9,  57,   5,  53, },
  73. { 42,  26,  38,  22,  41,  25,  37,  21, },
  74. };
  75. #endif
  76. const uint8_t  __attribute__((aligned(8))) dither_8x8_73[8][8]={
  77. {  0,  55,  14,  68,   3,  58,  17,  72, },
  78. { 37,  18,  50,  32,  40,  22,  54,  35, },
  79. {  9,  64,   5,  59,  13,  67,   8,  63, },
  80. { 46,  27,  41,  23,  49,  31,  44,  26, },
  81. {  2,  57,  16,  71,   1,  56,  15,  70, },
  82. { 39,  21,  52,  34,  38,  19,  51,  33, },
  83. { 11,  66,   7,  62,  10,  65,   6,  60, },
  84. { 48,  30,  43,  25,  47,  29,  42,  24, },
  85. };
  86. #if 0
  87. const uint8_t  __attribute__((aligned(8))) dither_8x8_128[8][8]={
  88. { 68,  36,  92,  60,  66,  34,  90,  58, },
  89. { 20, 116,  12, 108,  18, 114,  10, 106, },
  90. { 84,  52,  76,  44,  82,  50,  74,  42, },
  91. {  0,  96,  24, 120,   6, 102,  30, 126, },
  92. { 64,  32,  88,  56,  70,  38,  94,  62, },
  93. { 16, 112,   8, 104,  22, 118,  14, 110, },
  94. { 80,  48,  72,  40,  86,  54,  78,  46, },
  95. {  4, 100,  28, 124,   2,  98,  26, 122, },
  96. };
  97. #endif
  98. #if 1
  99. const uint8_t  __attribute__((aligned(8))) dither_8x8_220[8][8]={
  100. {117,  62, 158, 103, 113,  58, 155, 100, },
  101. { 34, 199,  21, 186,  31, 196,  17, 182, },
  102. {144,  89, 131,  76, 141,  86, 127,  72, },
  103. {  0, 165,  41, 206,  10, 175,  52, 217, },
  104. {110,  55, 151,  96, 120,  65, 162, 107, },
  105. { 28, 193,  14, 179,  38, 203,  24, 189, },
  106. {138,  83, 124,  69, 148,  93, 134,  79, },
  107. {  7, 172,  48, 213,   3, 168,  45, 210, },
  108. };
  109. #elif 1
  110. // tries to correct a gamma of 1.5
  111. const uint8_t  __attribute__((aligned(8))) dither_8x8_220[8][8]={
  112. {  0, 143,  18, 200,   2, 156,  25, 215, },
  113. { 78,  28, 125,  64,  89,  36, 138,  74, },
  114. { 10, 180,   3, 161,  16, 195,   8, 175, },
  115. {109,  51,  93,  38, 121,  60, 105,  47, },
  116. {  1, 152,  23, 210,   0, 147,  20, 205, },
  117. { 85,  33, 134,  71,  81,  30, 130,  67, },
  118. { 14, 190,   6, 171,  12, 185,   5, 166, },
  119. {117,  57, 101,  44, 113,  54,  97,  41, },
  120. };
  121. #elif 1
  122. // tries to correct a gamma of 2.0
  123. const uint8_t  __attribute__((aligned(8))) dither_8x8_220[8][8]={
  124. {  0, 124,   8, 193,   0, 140,  12, 213, },
  125. { 55,  14, 104,  42,  66,  19, 119,  52, },
  126. {  3, 168,   1, 145,   6, 187,   3, 162, },
  127. { 86,  31,  70,  21,  99,  39,  82,  28, },
  128. {  0, 134,  11, 206,   0, 129,   9, 200, },
  129. { 62,  17, 114,  48,  58,  16, 109,  45, },
  130. {  5, 181,   2, 157,   4, 175,   1, 151, },
  131. { 95,  36,  78,  26,  90,  34,  74,  24, },
  132. };
  133. #else
  134. // tries to correct a gamma of 2.5
  135. const uint8_t  __attribute__((aligned(8))) dither_8x8_220[8][8]={
  136. {  0, 107,   3, 187,   0, 125,   6, 212, },
  137. { 39,   7,  86,  28,  49,  11, 102,  36, },
  138. {  1, 158,   0, 131,   3, 180,   1, 151, },
  139. { 68,  19,  52,  12,  81,  25,  64,  17, },
  140. {  0, 119,   5, 203,   0, 113,   4, 195, },
  141. { 45,   9,  96,  33,  42,   8,  91,  30, },
  142. {  2, 172,   1, 144,   2, 165,   0, 137, },
  143. { 77,  23,  60,  15,  72,  21,  56,  14, },
  144. };
  145. #endif
  146. #ifdef ARCH_X86
  147. /* hope these constant values are cache line aligned */
  148. uint64_t attribute_used __attribute__((aligned(8))) mmx_00ffw = 0x00ff00ff00ff00ffULL;
  149. uint64_t attribute_used __attribute__((aligned(8))) mmx_redmask = 0xf8f8f8f8f8f8f8f8ULL;
  150. uint64_t attribute_used __attribute__((aligned(8))) mmx_grnmask = 0xfcfcfcfcfcfcfcfcULL;
  151. uint64_t attribute_used __attribute__((aligned(8))) M24A=   0x00FF0000FF0000FFULL;
  152. uint64_t attribute_used __attribute__((aligned(8))) M24B=   0xFF0000FF0000FF00ULL;
  153. uint64_t attribute_used __attribute__((aligned(8))) M24C=   0x0000FF0000FF0000ULL;
  154. // the volatile is required because gcc otherwise optimizes some writes away not knowing that these
  155. // are read in the asm block
  156. volatile uint64_t attribute_used __attribute__((aligned(8))) b5Dither;
  157. volatile uint64_t attribute_used __attribute__((aligned(8))) g5Dither;
  158. volatile uint64_t attribute_used __attribute__((aligned(8))) g6Dither;
  159. volatile uint64_t attribute_used __attribute__((aligned(8))) r5Dither;
  160. uint64_t __attribute__((aligned(8))) dither4[2]={
  161. 0x0103010301030103LL,
  162. 0x0200020002000200LL,};
  163. uint64_t __attribute__((aligned(8))) dither8[2]={
  164. 0x0602060206020602LL,
  165. 0x0004000400040004LL,};
  166. #undef HAVE_MMX
  167. #undef ARCH_X86
  168. //MMX versions
  169. #undef RENAME
  170. #define HAVE_MMX
  171. #undef HAVE_MMX2
  172. #undef HAVE_3DNOW
  173. #define ARCH_X86
  174. #define RENAME(a) a ## _MMX
  175. #include "yuv2rgb_template.c"
  176. //MMX2 versions
  177. #undef RENAME
  178. #define HAVE_MMX
  179. #define HAVE_MMX2
  180. #undef HAVE_3DNOW
  181. #define ARCH_X86
  182. #define RENAME(a) a ## _MMX2
  183. #include "yuv2rgb_template.c"
  184. #endif // CAN_COMPILE_X86_ASM
  185. const int32_t Inverse_Table_6_9[8][4] = {
  186.     {117504, 138453, 13954, 34903}, /* no sequence_display_extension */
  187.     {117504, 138453, 13954, 34903}, /* ITU-R Rec. 709 (1990) */
  188.     {104597, 132201, 25675, 53279}, /* unspecified */
  189.     {104597, 132201, 25675, 53279}, /* reserved */
  190.     {104448, 132798, 24759, 53109}, /* FCC */
  191.     {104597, 132201, 25675, 53279}, /* ITU-R Rec. 624-4 System B, G */
  192.     {104597, 132201, 25675, 53279}, /* SMPTE 170M */
  193.     {117579, 136230, 16907, 35559}  /* SMPTE 240M (1987) */
  194. };
  195. #define RGB(i)
  196. U = pu[i];
  197. V = pv[i];
  198. r = c->table_rV[V];
  199. g = c->table_gU[U] + c->table_gV[V];
  200. b = c->table_bU[U];
  201. #define DST1(i)
  202. Y = py_1[2*i];
  203. dst_1[2*i] = r[Y] + g[Y] + b[Y];
  204. Y = py_1[2*i+1];
  205. dst_1[2*i+1] = r[Y] + g[Y] + b[Y];
  206. #define DST2(i)
  207. Y = py_2[2*i];
  208. dst_2[2*i] = r[Y] + g[Y] + b[Y];
  209. Y = py_2[2*i+1];
  210. dst_2[2*i+1] = r[Y] + g[Y] + b[Y];
  211. #define DST1RGB(i)
  212. Y = py_1[2*i];
  213. dst_1[6*i] = r[Y]; dst_1[6*i+1] = g[Y]; dst_1[6*i+2] = b[Y];
  214. Y = py_1[2*i+1];
  215. dst_1[6*i+3] = r[Y]; dst_1[6*i+4] = g[Y]; dst_1[6*i+5] = b[Y];
  216. #define DST2RGB(i)
  217. Y = py_2[2*i];
  218. dst_2[6*i] = r[Y]; dst_2[6*i+1] = g[Y]; dst_2[6*i+2] = b[Y];
  219. Y = py_2[2*i+1];
  220. dst_2[6*i+3] = r[Y]; dst_2[6*i+4] = g[Y]; dst_2[6*i+5] = b[Y];
  221. #define DST1BGR(i)
  222. Y = py_1[2*i];
  223. dst_1[6*i] = b[Y]; dst_1[6*i+1] = g[Y]; dst_1[6*i+2] = r[Y];
  224. Y = py_1[2*i+1];
  225. dst_1[6*i+3] = b[Y]; dst_1[6*i+4] = g[Y]; dst_1[6*i+5] = r[Y];
  226. #define DST2BGR(i)
  227. Y = py_2[2*i];
  228. dst_2[6*i] = b[Y]; dst_2[6*i+1] = g[Y]; dst_2[6*i+2] = r[Y];
  229. Y = py_2[2*i+1];
  230. dst_2[6*i+3] = b[Y]; dst_2[6*i+4] = g[Y]; dst_2[6*i+5] = r[Y];
  231. #define PROLOG(func_name, dst_type) 
  232. static int func_name(SwsContext *c, uint8_t* src[], int srcStride[], int srcSliceY, 
  233.              int srcSliceH, uint8_t* dst[], int dstStride[]){
  234.     int y;
  235.     if(c->srcFormat == IMGFMT_422P){
  236. srcStride[1] *= 2;
  237. srcStride[2] *= 2;
  238.     }
  239.     for(y=0; y<srcSliceH; y+=2){
  240. dst_type *dst_1= (dst_type*)(dst[0] + (y+srcSliceY  )*dstStride[0]);
  241. dst_type *dst_2= (dst_type*)(dst[0] + (y+srcSliceY+1)*dstStride[0]);
  242. dst_type *r, *g, *b;
  243. uint8_t *py_1= src[0] + y*srcStride[0];
  244. uint8_t *py_2= py_1 + srcStride[0];
  245. uint8_t *pu= src[1] + (y>>1)*srcStride[1];
  246. uint8_t *pv= src[2] + (y>>1)*srcStride[2];
  247. unsigned int h_size= c->dstW>>3;
  248. while (h_size--) {
  249.     int U, V, Y;
  250. #define EPILOG(dst_delta)
  251.     pu += 4;
  252.     pv += 4;
  253.     py_1 += 8;
  254.     py_2 += 8;
  255.     dst_1 += dst_delta;
  256.     dst_2 += dst_delta;
  257. }
  258.     }
  259.     return srcSliceH;
  260. }
  261. PROLOG(yuv2rgb_c_32, uint32_t)
  262. RGB(0);
  263. DST1(0);
  264. DST2(0);
  265. RGB(1);
  266. DST2(1);
  267. DST1(1);
  268. RGB(2);
  269. DST1(2);
  270. DST2(2);
  271. RGB(3);
  272. DST2(3);
  273. DST1(3);
  274. EPILOG(8)
  275. PROLOG(yuv2rgb_c_24_rgb, uint8_t)
  276. RGB(0);
  277. DST1RGB(0);
  278. DST2RGB(0);
  279. RGB(1);
  280. DST2RGB(1);
  281. DST1RGB(1);
  282. RGB(2);
  283. DST1RGB(2);
  284. DST2RGB(2);
  285. RGB(3);
  286. DST2RGB(3);
  287. DST1RGB(3);
  288. EPILOG(24)
  289. // only trivial mods from yuv2rgb_c_24_rgb
  290. PROLOG(yuv2rgb_c_24_bgr, uint8_t)
  291. RGB(0);
  292. DST1BGR(0);
  293. DST2BGR(0);
  294. RGB(1);
  295. DST2BGR(1);
  296. DST1BGR(1);
  297. RGB(2);
  298. DST1BGR(2);
  299. DST2BGR(2);
  300. RGB(3);
  301. DST2BGR(3);
  302. DST1BGR(3);
  303. EPILOG(24)
  304. // This is exactly the same code as yuv2rgb_c_32 except for the types of
  305. // r, g, b, dst_1, dst_2
  306. PROLOG(yuv2rgb_c_16, uint16_t)
  307. RGB(0);
  308. DST1(0);
  309. DST2(0);
  310. RGB(1);
  311. DST2(1);
  312. DST1(1);
  313. RGB(2);
  314. DST1(2);
  315. DST2(2);
  316. RGB(3);
  317. DST2(3);
  318. DST1(3);
  319. EPILOG(8)
  320. // This is exactly the same code as yuv2rgb_c_32 except for the types of
  321. // r, g, b, dst_1, dst_2
  322. PROLOG(yuv2rgb_c_8, uint8_t)
  323. RGB(0);
  324. DST1(0);
  325. DST2(0);
  326. RGB(1);
  327. DST2(1);
  328. DST1(1);
  329. RGB(2);
  330. DST1(2);
  331. DST2(2);
  332. RGB(3);
  333. DST2(3);
  334. DST1(3);
  335. EPILOG(8)
  336. // r, g, b, dst_1, dst_2
  337. PROLOG(yuv2rgb_c_8_ordered_dither, uint8_t)
  338. const uint8_t *d32= dither_8x8_32[y&7];
  339. const uint8_t *d64= dither_8x8_73[y&7];
  340. #define DST1bpp8(i,o)
  341. Y = py_1[2*i];
  342. dst_1[2*i] = r[Y+d32[0+o]] + g[Y+d32[0+o]] + b[Y+d64[0+o]];
  343. Y = py_1[2*i+1];
  344. dst_1[2*i+1] = r[Y+d32[1+o]] + g[Y+d32[1+o]] + b[Y+d64[1+o]];
  345. #define DST2bpp8(i,o)
  346. Y = py_2[2*i];
  347. dst_2[2*i] =  r[Y+d32[8+o]] + g[Y+d32[8+o]] + b[Y+d64[8+o]];
  348. Y = py_2[2*i+1];
  349. dst_2[2*i+1] =  r[Y+d32[9+o]] + g[Y+d32[9+o]] + b[Y+d64[9+o]];
  350. RGB(0);
  351. DST1bpp8(0,0);
  352. DST2bpp8(0,0);
  353. RGB(1);
  354. DST2bpp8(1,2);
  355. DST1bpp8(1,2);
  356. RGB(2);
  357. DST1bpp8(2,4);
  358. DST2bpp8(2,4);
  359. RGB(3);
  360. DST2bpp8(3,6);
  361. DST1bpp8(3,6);
  362. EPILOG(8)
  363. // This is exactly the same code as yuv2rgb_c_32 except for the types of
  364. // r, g, b, dst_1, dst_2
  365. PROLOG(yuv2rgb_c_4, uint8_t)
  366.         int acc;
  367. #define DST1_4(i)
  368. Y = py_1[2*i];
  369. acc = r[Y] + g[Y] + b[Y];
  370. Y = py_1[2*i+1];
  371.         acc |= (r[Y] + g[Y] + b[Y])<<4;
  372. dst_1[i] = acc; 
  373. #define DST2_4(i)
  374. Y = py_2[2*i];
  375. acc = r[Y] + g[Y] + b[Y];
  376. Y = py_2[2*i+1];
  377. acc |= (r[Y] + g[Y] + b[Y])<<4;
  378. dst_2[i] = acc; 
  379.         RGB(0);
  380. DST1_4(0);
  381. DST2_4(0);
  382. RGB(1);
  383. DST2_4(1);
  384. DST1_4(1);
  385. RGB(2);
  386. DST1_4(2);
  387. DST2_4(2);
  388. RGB(3);
  389. DST2_4(3);
  390. DST1_4(3);
  391. EPILOG(4)
  392. PROLOG(yuv2rgb_c_4_ordered_dither, uint8_t)
  393. const uint8_t *d64= dither_8x8_73[y&7];
  394. const uint8_t *d128=dither_8x8_220[y&7];
  395.         int acc;
  396. #define DST1bpp4(i,o)
  397. Y = py_1[2*i];
  398. acc = r[Y+d128[0+o]] + g[Y+d64[0+o]] + b[Y+d128[0+o]];
  399. Y = py_1[2*i+1];
  400. acc |= (r[Y+d128[1+o]] + g[Y+d64[1+o]] + b[Y+d128[1+o]])<<4;
  401.         dst_1[i]= acc;
  402. #define DST2bpp4(i,o)
  403. Y = py_2[2*i];
  404. acc =  r[Y+d128[8+o]] + g[Y+d64[8+o]] + b[Y+d128[8+o]];
  405. Y = py_2[2*i+1];
  406. acc |=  (r[Y+d128[9+o]] + g[Y+d64[9+o]] + b[Y+d128[9+o]])<<4;
  407.         dst_2[i]= acc;
  408. RGB(0);
  409. DST1bpp4(0,0);
  410. DST2bpp4(0,0);
  411. RGB(1);
  412. DST2bpp4(1,2);
  413. DST1bpp4(1,2);
  414. RGB(2);
  415. DST1bpp4(2,4);
  416. DST2bpp4(2,4);
  417. RGB(3);
  418. DST2bpp4(3,6);
  419. DST1bpp4(3,6);
  420. EPILOG(4)
  421. // This is exactly the same code as yuv2rgb_c_32 except for the types of
  422. // r, g, b, dst_1, dst_2
  423. PROLOG(yuv2rgb_c_4b, uint8_t)
  424. RGB(0);
  425. DST1(0);
  426. DST2(0);
  427. RGB(1);
  428. DST2(1);
  429. DST1(1);
  430. RGB(2);
  431. DST1(2);
  432. DST2(2);
  433. RGB(3);
  434. DST2(3);
  435. DST1(3);
  436. EPILOG(8)
  437. PROLOG(yuv2rgb_c_4b_ordered_dither, uint8_t)
  438. const uint8_t *d64= dither_8x8_73[y&7];
  439. const uint8_t *d128=dither_8x8_220[y&7];
  440. #define DST1bpp4b(i,o)
  441. Y = py_1[2*i];
  442. dst_1[2*i] = r[Y+d128[0+o]] + g[Y+d64[0+o]] + b[Y+d128[0+o]];
  443. Y = py_1[2*i+1];
  444. dst_1[2*i+1] = r[Y+d128[1+o]] + g[Y+d64[1+o]] + b[Y+d128[1+o]];
  445. #define DST2bpp4b(i,o)
  446. Y = py_2[2*i];
  447. dst_2[2*i] =  r[Y+d128[8+o]] + g[Y+d64[8+o]] + b[Y+d128[8+o]];
  448. Y = py_2[2*i+1];
  449. dst_2[2*i+1] =  r[Y+d128[9+o]] + g[Y+d64[9+o]] + b[Y+d128[9+o]];
  450. RGB(0);
  451. DST1bpp4b(0,0);
  452. DST2bpp4b(0,0);
  453. RGB(1);
  454. DST2bpp4b(1,2);
  455. DST1bpp4b(1,2);
  456. RGB(2);
  457. DST1bpp4b(2,4);
  458. DST2bpp4b(2,4);
  459. RGB(3);
  460. DST2bpp4b(3,6);
  461. DST1bpp4b(3,6);
  462. EPILOG(8)
  463. PROLOG(yuv2rgb_c_1_ordered_dither, uint8_t)
  464. const uint8_t *d128=dither_8x8_220[y&7];
  465. char out_1=0, out_2=0;
  466. g= c->table_gU[128] + c->table_gV[128];
  467. #define DST1bpp1(i,o)
  468. Y = py_1[2*i];
  469. out_1+= out_1 + g[Y+d128[0+o]];
  470. Y = py_1[2*i+1];
  471. out_1+= out_1 + g[Y+d128[1+o]];
  472. #define DST2bpp1(i,o)
  473. Y = py_2[2*i];
  474. out_2+= out_2 + g[Y+d128[8+o]];
  475. Y = py_2[2*i+1];
  476. out_2+= out_2 + g[Y+d128[9+o]];
  477. DST1bpp1(0,0);
  478. DST2bpp1(0,0);
  479. DST2bpp1(1,2);
  480. DST1bpp1(1,2);
  481. DST1bpp1(2,4);
  482. DST2bpp1(2,4);
  483. DST2bpp1(3,6);
  484. DST1bpp1(3,6);
  485. dst_1[0]= out_1;
  486. dst_2[0]= out_2;
  487. EPILOG(1)
  488. SwsFunc yuv2rgb_get_func_ptr (SwsContext *c)
  489. {
  490. #ifdef ARCH_X86
  491.     if(c->flags & SWS_CPU_CAPS_MMX2){
  492. switch(c->dstFormat){
  493. case IMGFMT_BGR32: return yuv420_rgb32_MMX2;
  494. case IMGFMT_BGR24: return yuv420_rgb24_MMX2;
  495. case IMGFMT_BGR16: return yuv420_rgb16_MMX2;
  496. case IMGFMT_BGR15: return yuv420_rgb15_MMX2;
  497. }
  498.     }
  499.     if(c->flags & SWS_CPU_CAPS_MMX){
  500. switch(c->dstFormat){
  501. case IMGFMT_BGR32: return yuv420_rgb32_MMX;
  502. case IMGFMT_BGR24: return yuv420_rgb24_MMX;
  503. case IMGFMT_BGR16: return yuv420_rgb16_MMX;
  504. case IMGFMT_BGR15: return yuv420_rgb15_MMX;
  505. }
  506.     }
  507. #endif
  508. #ifdef HAVE_MLIB
  509.     {
  510. SwsFunc t= yuv2rgb_init_mlib(c);
  511. if(t) return t;
  512.     }
  513. #endif
  514. #ifdef HAVE_ALTIVEC
  515.     if (c->flags & SWS_CPU_CAPS_ALTIVEC)
  516.     {
  517. SwsFunc t = yuv2rgb_init_altivec(c);
  518. if(t) return t;
  519.     }
  520. #endif
  521.     MSG_WARN("No accelerated colorspace conversion foundn");
  522.     switch(c->dstFormat){
  523.     case IMGFMT_RGB32:
  524.     case IMGFMT_BGR32: return yuv2rgb_c_32;
  525.     case IMGFMT_RGB24: return yuv2rgb_c_24_rgb;
  526.     case IMGFMT_BGR24: return yuv2rgb_c_24_bgr;
  527.     case IMGFMT_RGB16:
  528.     case IMGFMT_BGR16:
  529.     case IMGFMT_RGB15:
  530.     case IMGFMT_BGR15: return yuv2rgb_c_16;
  531.     case IMGFMT_RGB8:
  532.     case IMGFMT_BGR8:  return yuv2rgb_c_8_ordered_dither;
  533.     case IMGFMT_RGB4:
  534.     case IMGFMT_BGR4:  return yuv2rgb_c_4_ordered_dither;
  535.     case IMGFMT_RG4B:
  536.     case IMGFMT_BG4B:  return yuv2rgb_c_4b_ordered_dither;
  537.     case IMGFMT_RGB1:
  538.     case IMGFMT_BGR1:  return yuv2rgb_c_1_ordered_dither;
  539.     default:
  540.      assert(0);
  541.     }
  542.     return NULL;
  543. }
  544. static int div_round (int dividend, int divisor)
  545. {
  546.     if (dividend > 0)
  547. return (dividend + (divisor>>1)) / divisor;
  548.     else
  549. return -((-dividend + (divisor>>1)) / divisor);
  550. }
  551. int yuv2rgb_c_init_tables (SwsContext *c, const int inv_table[4], int fullRange, int brightness, int contrast, int saturation)
  552. {  
  553.     const int isRgb = IMGFMT_IS_BGR(c->dstFormat);
  554.     const int bpp = isRgb?IMGFMT_RGB_DEPTH(c->dstFormat):IMGFMT_BGR_DEPTH(c->dstFormat);
  555.     int i;
  556.     uint8_t table_Y[1024];
  557.     uint32_t *table_32 = 0;
  558.     uint16_t *table_16 = 0;
  559.     uint8_t *table_8 = 0;
  560.     uint8_t *table_332 = 0;
  561.     uint8_t *table_121 = 0;
  562.     uint8_t *table_1 = 0;
  563.     int entry_size = 0;
  564.     void *table_r = 0, *table_g = 0, *table_b = 0;
  565.     void *table_start;
  566.     int64_t crv =  inv_table[0];
  567.     int64_t cbu =  inv_table[1];
  568.     int64_t cgu = -inv_table[2];
  569.     int64_t cgv = -inv_table[3];
  570.     int64_t cy  = 1<<16;
  571.     int64_t oy  = 0;
  572. //printf("%lld %lld %lld %lld %lldn", cy, crv, cbu, cgu, cgv);
  573.     if(!fullRange){
  574. cy= (cy*255) / 219;
  575. oy= 16<<16;
  576.     }
  577.     cy = (cy *contrast             )>>16;
  578.     crv= (crv*contrast * saturation)>>32;
  579.     cbu= (cbu*contrast * saturation)>>32;
  580.     cgu= (cgu*contrast * saturation)>>32;
  581.     cgv= (cgv*contrast * saturation)>>32;
  582. //printf("%lld %lld %lld %lld %lldn", cy, crv, cbu, cgu, cgv);
  583.     oy -= 256*brightness;
  584.     for (i = 0; i < 1024; i++) {
  585. int j;
  586. j= (cy*(((i - 384)<<16) - oy) + (1<<31))>>32;
  587. j = (j < 0) ? 0 : ((j > 255) ? 255 : j);
  588. table_Y[i] = j;
  589.     }
  590.     switch (bpp) {
  591.     case 32:
  592. table_start= table_32 = malloc ((197 + 2*682 + 256 + 132) * sizeof (uint32_t));
  593. entry_size = sizeof (uint32_t);
  594. table_r = table_32 + 197;
  595. table_b = table_32 + 197 + 685;
  596. table_g = table_32 + 197 + 2*682;
  597. for (i = -197; i < 256+197; i++)
  598.     ((uint32_t *)table_r)[i] = table_Y[i+384] << (isRgb ? 16 : 0);
  599. for (i = -132; i < 256+132; i++)
  600.     ((uint32_t *)table_g)[i] = table_Y[i+384] << 8;
  601. for (i = -232; i < 256+232; i++)
  602.     ((uint32_t *)table_b)[i] = table_Y[i+384] << (isRgb ? 0 : 16);
  603. break;
  604.     case 24:
  605. table_start= table_8 = malloc ((256 + 2*232) * sizeof (uint8_t));
  606. entry_size = sizeof (uint8_t);
  607. table_r = table_g = table_b = table_8 + 232;
  608. for (i = -232; i < 256+232; i++)
  609.     ((uint8_t * )table_b)[i] = table_Y[i+384];
  610. break;
  611.     case 15:
  612.     case 16:
  613. table_start= table_16 = malloc ((197 + 2*682 + 256 + 132) * sizeof (uint16_t));
  614. entry_size = sizeof (uint16_t);
  615. table_r = table_16 + 197;
  616. table_b = table_16 + 197 + 685;
  617. table_g = table_16 + 197 + 2*682;
  618. for (i = -197; i < 256+197; i++) {
  619.     int j = table_Y[i+384] >> 3;
  620.     if (isRgb)
  621. j <<= ((bpp==16) ? 11 : 10);
  622.     ((uint16_t *)table_r)[i] = j;
  623. }
  624. for (i = -132; i < 256+132; i++) {
  625.     int j = table_Y[i+384] >> ((bpp==16) ? 2 : 3);
  626.     ((uint16_t *)table_g)[i] = j << 5;
  627. }
  628. for (i = -232; i < 256+232; i++) {
  629.     int j = table_Y[i+384] >> 3;
  630.     if (!isRgb)
  631. j <<= ((bpp==16) ? 11 : 10);
  632.     ((uint16_t *)table_b)[i] = j;
  633. }
  634. break;
  635.     case 8:
  636. table_start= table_332 = malloc ((197 + 2*682 + 256 + 132) * sizeof (uint8_t));
  637. entry_size = sizeof (uint8_t);
  638. table_r = table_332 + 197;
  639. table_b = table_332 + 197 + 685;
  640. table_g = table_332 + 197 + 2*682;
  641. for (i = -197; i < 256+197; i++) {
  642.     int j = (table_Y[i+384 - 16] + 18)/36;
  643.     if (isRgb)
  644. j <<= 5;
  645.     ((uint8_t *)table_r)[i] = j;
  646. }
  647. for (i = -132; i < 256+132; i++) {
  648.     int j = (table_Y[i+384 - 16] + 18)/36;
  649.     if (!isRgb)
  650. j <<= 1;
  651.     ((uint8_t *)table_g)[i] = j << 2;
  652. }
  653. for (i = -232; i < 256+232; i++) {
  654.     int j = (table_Y[i+384 - 37] + 43)/85;
  655.     if (!isRgb)
  656. j <<= 6;
  657.     ((uint8_t *)table_b)[i] = j;
  658. }
  659. break;
  660.     case 4:
  661.     case 4|128:
  662. table_start= table_121 = malloc ((197 + 2*682 + 256 + 132) * sizeof (uint8_t));
  663. entry_size = sizeof (uint8_t);
  664. table_r = table_121 + 197;
  665. table_b = table_121 + 197 + 685;
  666. table_g = table_121 + 197 + 2*682;
  667. for (i = -197; i < 256+197; i++) {
  668.     int j = table_Y[i+384 - 110] >> 7;
  669.     if (isRgb)
  670. j <<= 3;
  671.     ((uint8_t *)table_r)[i] = j;
  672. }
  673. for (i = -132; i < 256+132; i++) {
  674.     int j = (table_Y[i+384 - 37]+ 43)/85;
  675.     ((uint8_t *)table_g)[i] = j << 1;
  676. }
  677. for (i = -232; i < 256+232; i++) {
  678.     int j =table_Y[i+384 - 110] >> 7;
  679.     if (!isRgb)
  680. j <<= 3;
  681.     ((uint8_t *)table_b)[i] = j;
  682. }
  683. break;
  684.     case 1:
  685. table_start= table_1 = malloc (256*2 * sizeof (uint8_t));
  686. entry_size = sizeof (uint8_t);
  687. table_g = table_1;
  688. table_r = table_b = NULL;
  689. for (i = 0; i < 256+256; i++) {
  690.     int j = table_Y[i + 384 - 110]>>7;
  691.     ((uint8_t *)table_g)[i] = j;
  692. }
  693. break;
  694.     default:
  695. table_start= NULL;
  696. MSG_ERR("%ibpp not supported by yuv2rgbn", bpp);
  697. //free mem?
  698. return -1;
  699.     }
  700.     for (i = 0; i < 256; i++) {
  701. c->table_rV[i] = table_r + entry_size * div_round (crv * (i-128), 76309);
  702. c->table_gU[i] = table_g + entry_size * div_round (cgu * (i-128), 76309);
  703. c->table_gV[i] = entry_size * div_round (cgv * (i-128), 76309);
  704. c->table_bU[i] = table_b + entry_size * div_round (cbu * (i-128), 76309);
  705.     }
  706.     if(c->yuvTable) free(c->yuvTable);
  707.     c->yuvTable= table_start;
  708.     return 0;
  709. }