You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

890 lines
29KB

  1. /*
  2. * software YUV to RGB converter
  3. *
  4. * Copyright (C) 2009 Konstantin Shishkov
  5. *
  6. * 1,4,8bpp support and context / deglobalize stuff
  7. * by Michael Niedermayer (michaelni@gmx.at)
  8. *
  9. * This file is part of Libav.
  10. *
  11. * Libav is free software; you can redistribute it and/or
  12. * modify it under the terms of the GNU Lesser General Public
  13. * License as published by the Free Software Foundation; either
  14. * version 2.1 of the License, or (at your option) any later version.
  15. *
  16. * Libav is distributed in the hope that it will be useful,
  17. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  18. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  19. * Lesser General Public License for more details.
  20. *
  21. * You should have received a copy of the GNU Lesser General Public
  22. * License along with Libav; if not, write to the Free Software
  23. * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  24. */
  25. #include <stdio.h>
  26. #include <stdlib.h>
  27. #include <inttypes.h>
  28. #include <assert.h>
  29. #include "libavutil/cpu.h"
  30. #include "libavutil/bswap.h"
  31. #include "config.h"
  32. #include "rgb2rgb.h"
  33. #include "swscale.h"
  34. #include "swscale_internal.h"
  35. extern const uint8_t dither_4x4_16[4][8];
  36. extern const uint8_t dither_8x8_32[8][8];
  37. extern const uint8_t dither_8x8_73[8][8];
  38. extern const uint8_t dither_8x8_220[8][8];
  39. const int32_t ff_yuv2rgb_coeffs[8][4] = {
  40. { 117504, 138453, 13954, 34903 }, /* no sequence_display_extension */
  41. { 117504, 138453, 13954, 34903 }, /* ITU-R Rec. 709 (1990) */
  42. { 104597, 132201, 25675, 53279 }, /* unspecified */
  43. { 104597, 132201, 25675, 53279 }, /* reserved */
  44. { 104448, 132798, 24759, 53109 }, /* FCC */
  45. { 104597, 132201, 25675, 53279 }, /* ITU-R Rec. 624-4 System B, G */
  46. { 104597, 132201, 25675, 53279 }, /* SMPTE 170M */
  47. { 117579, 136230, 16907, 35559 } /* SMPTE 240M (1987) */
  48. };
  49. const int *sws_getCoefficients(int colorspace)
  50. {
  51. if (colorspace > 7 || colorspace < 0)
  52. colorspace = SWS_CS_DEFAULT;
  53. return ff_yuv2rgb_coeffs[colorspace];
  54. }
  55. #define LOADCHROMA(i) \
  56. U = pu[i]; \
  57. V = pv[i]; \
  58. r = (void *)c->table_rV[V]; \
  59. g = (void *)(c->table_gU[U] + c->table_gV[V]); \
  60. b = (void *)c->table_bU[U];
  61. #define PUTRGB(dst, src, i) \
  62. Y = src[2 * i]; \
  63. dst[2 * i] = r[Y] + g[Y] + b[Y]; \
  64. Y = src[2 * i + 1]; \
  65. dst[2 * i + 1] = r[Y] + g[Y] + b[Y];
  66. #define PUTRGB24(dst, src, i) \
  67. Y = src[2 * i]; \
  68. dst[6 * i + 0] = r[Y]; \
  69. dst[6 * i + 1] = g[Y]; \
  70. dst[6 * i + 2] = b[Y]; \
  71. Y = src[2 * i + 1]; \
  72. dst[6 * i + 3] = r[Y]; \
  73. dst[6 * i + 4] = g[Y]; \
  74. dst[6 * i + 5] = b[Y];
  75. #define PUTBGR24(dst, src, i) \
  76. Y = src[2 * i]; \
  77. dst[6 * i + 0] = b[Y]; \
  78. dst[6 * i + 1] = g[Y]; \
  79. dst[6 * i + 2] = r[Y]; \
  80. Y = src[2 * i + 1]; \
  81. dst[6 * i + 3] = b[Y]; \
  82. dst[6 * i + 4] = g[Y]; \
  83. dst[6 * i + 5] = r[Y];
  84. #define PUTRGBA(dst, ysrc, asrc, i, s) \
  85. Y = ysrc[2 * i]; \
  86. dst[2 * i] = r[Y] + g[Y] + b[Y] + (asrc[2 * i] << s); \
  87. Y = ysrc[2 * i + 1]; \
  88. dst[2 * i + 1] = r[Y] + g[Y] + b[Y] + (asrc[2 * i + 1] << s);
  89. #define PUTRGB48(dst, src, i) \
  90. Y = src[ 2 * i]; \
  91. dst[12 * i + 0] = dst[12 * i + 1] = r[Y]; \
  92. dst[12 * i + 2] = dst[12 * i + 3] = g[Y]; \
  93. dst[12 * i + 4] = dst[12 * i + 5] = b[Y]; \
  94. Y = src[ 2 * i + 1]; \
  95. dst[12 * i + 6] = dst[12 * i + 7] = r[Y]; \
  96. dst[12 * i + 8] = dst[12 * i + 9] = g[Y]; \
  97. dst[12 * i + 10] = dst[12 * i + 11] = b[Y];
  98. #define PUTBGR48(dst, src, i) \
  99. Y = src[2 * i]; \
  100. dst[12 * i + 0] = dst[12 * i + 1] = b[Y]; \
  101. dst[12 * i + 2] = dst[12 * i + 3] = g[Y]; \
  102. dst[12 * i + 4] = dst[12 * i + 5] = r[Y]; \
  103. Y = src[2 * i + 1]; \
  104. dst[12 * i + 6] = dst[12 * i + 7] = b[Y]; \
  105. dst[12 * i + 8] = dst[12 * i + 9] = g[Y]; \
  106. dst[12 * i + 10] = dst[12 * i + 11] = r[Y];
  107. #define YUV2RGBFUNC(func_name, dst_type, alpha) \
  108. static int func_name(SwsContext *c, const uint8_t *src[], \
  109. int srcStride[], int srcSliceY, int srcSliceH, \
  110. uint8_t *dst[], int dstStride[]) \
  111. { \
  112. int y; \
  113. \
  114. if (!alpha && c->srcFormat == AV_PIX_FMT_YUV422P) { \
  115. srcStride[1] *= 2; \
  116. srcStride[2] *= 2; \
  117. } \
  118. for (y = 0; y < srcSliceH; y += 2) { \
  119. dst_type *dst_1 = \
  120. (dst_type *)(dst[0] + (y + srcSliceY) * dstStride[0]); \
  121. dst_type *dst_2 = \
  122. (dst_type *)(dst[0] + (y + srcSliceY + 1) * dstStride[0]); \
  123. dst_type av_unused *r, *g, *b; \
  124. const uint8_t *py_1 = src[0] + y * srcStride[0]; \
  125. const uint8_t *py_2 = py_1 + srcStride[0]; \
  126. const uint8_t *pu = src[1] + (y >> 1) * srcStride[1]; \
  127. const uint8_t *pv = src[2] + (y >> 1) * srcStride[2]; \
  128. const uint8_t av_unused *pa_1, *pa_2; \
  129. unsigned int h_size = c->dstW >> 3; \
  130. if (alpha) { \
  131. pa_1 = src[3] + y * srcStride[3]; \
  132. pa_2 = pa_1 + srcStride[3]; \
  133. } \
  134. while (h_size--) { \
  135. int av_unused U, V, Y; \
  136. #define ENDYUV2RGBLINE(dst_delta, ss) \
  137. pu += 4 >> ss; \
  138. pv += 4 >> ss; \
  139. py_1 += 8 >> ss; \
  140. py_2 += 8 >> ss; \
  141. dst_1 += dst_delta >> ss; \
  142. dst_2 += dst_delta >> ss; \
  143. } \
  144. if (c->dstW & (4 >> ss)) { \
  145. int av_unused Y, U, V; \
  146. #define ENDYUV2RGBFUNC() \
  147. } \
  148. } \
  149. return srcSliceH; \
  150. }
  151. #define CLOSEYUV2RGBFUNC(dst_delta) \
  152. ENDYUV2RGBLINE(dst_delta, 0) \
  153. ENDYUV2RGBFUNC()
  154. YUV2RGBFUNC(yuv2rgb_c_48, uint8_t, 0)
  155. LOADCHROMA(0);
  156. PUTRGB48(dst_1, py_1, 0);
  157. PUTRGB48(dst_2, py_2, 0);
  158. LOADCHROMA(1);
  159. PUTRGB48(dst_2, py_2, 1);
  160. PUTRGB48(dst_1, py_1, 1);
  161. LOADCHROMA(2);
  162. PUTRGB48(dst_1, py_1, 2);
  163. PUTRGB48(dst_2, py_2, 2);
  164. LOADCHROMA(3);
  165. PUTRGB48(dst_2, py_2, 3);
  166. PUTRGB48(dst_1, py_1, 3);
  167. ENDYUV2RGBLINE(48, 0)
  168. LOADCHROMA(0);
  169. PUTRGB48(dst_1, py_1, 0);
  170. PUTRGB48(dst_2, py_2, 0);
  171. LOADCHROMA(1);
  172. PUTRGB48(dst_2, py_2, 1);
  173. PUTRGB48(dst_1, py_1, 1);
  174. ENDYUV2RGBLINE(48, 1)
  175. LOADCHROMA(0);
  176. PUTRGB48(dst_1, py_1, 0);
  177. PUTRGB48(dst_2, py_2, 0);
  178. ENDYUV2RGBFUNC()
  179. YUV2RGBFUNC(yuv2rgb_c_bgr48, uint8_t, 0)
  180. LOADCHROMA(0);
  181. PUTBGR48(dst_1, py_1, 0);
  182. PUTBGR48(dst_2, py_2, 0);
  183. LOADCHROMA(1);
  184. PUTBGR48(dst_2, py_2, 1);
  185. PUTBGR48(dst_1, py_1, 1);
  186. LOADCHROMA(2);
  187. PUTBGR48(dst_1, py_1, 2);
  188. PUTBGR48(dst_2, py_2, 2);
  189. LOADCHROMA(3);
  190. PUTBGR48(dst_2, py_2, 3);
  191. PUTBGR48(dst_1, py_1, 3);
  192. ENDYUV2RGBLINE(48, 0)
  193. LOADCHROMA(0);
  194. PUTBGR48(dst_1, py_1, 0);
  195. PUTBGR48(dst_2, py_2, 0);
  196. LOADCHROMA(1);
  197. PUTBGR48(dst_2, py_2, 1);
  198. PUTBGR48(dst_1, py_1, 1);
  199. ENDYUV2RGBLINE(48, 1)
  200. LOADCHROMA(0);
  201. PUTBGR48(dst_1, py_1, 0);
  202. PUTBGR48(dst_2, py_2, 0);
  203. ENDYUV2RGBFUNC()
  204. YUV2RGBFUNC(yuv2rgb_c_32, uint32_t, 0)
  205. LOADCHROMA(0);
  206. PUTRGB(dst_1, py_1, 0);
  207. PUTRGB(dst_2, py_2, 0);
  208. LOADCHROMA(1);
  209. PUTRGB(dst_2, py_2, 1);
  210. PUTRGB(dst_1, py_1, 1);
  211. LOADCHROMA(2);
  212. PUTRGB(dst_1, py_1, 2);
  213. PUTRGB(dst_2, py_2, 2);
  214. LOADCHROMA(3);
  215. PUTRGB(dst_2, py_2, 3);
  216. PUTRGB(dst_1, py_1, 3);
  217. ENDYUV2RGBLINE(8, 0)
  218. LOADCHROMA(0);
  219. PUTRGB(dst_1, py_1, 0);
  220. PUTRGB(dst_2, py_2, 0);
  221. LOADCHROMA(1);
  222. PUTRGB(dst_2, py_2, 1);
  223. PUTRGB(dst_1, py_1, 1);
  224. ENDYUV2RGBLINE(8, 1)
  225. LOADCHROMA(0);
  226. PUTRGB(dst_1, py_1, 0);
  227. PUTRGB(dst_2, py_2, 0);
  228. ENDYUV2RGBFUNC()
  229. YUV2RGBFUNC(yuva2rgba_c, uint32_t, 1)
  230. LOADCHROMA(0);
  231. PUTRGBA(dst_1, py_1, pa_1, 0, 24);
  232. PUTRGBA(dst_2, py_2, pa_2, 0, 24);
  233. LOADCHROMA(1);
  234. PUTRGBA(dst_2, py_2, pa_1, 1, 24);
  235. PUTRGBA(dst_1, py_1, pa_2, 1, 24);
  236. LOADCHROMA(2);
  237. PUTRGBA(dst_1, py_1, pa_1, 2, 24);
  238. PUTRGBA(dst_2, py_2, pa_2, 2, 24);
  239. LOADCHROMA(3);
  240. PUTRGBA(dst_2, py_2, pa_1, 3, 24);
  241. PUTRGBA(dst_1, py_1, pa_2, 3, 24);
  242. pa_1 += 8; \
  243. pa_2 += 8; \
  244. ENDYUV2RGBLINE(8, 0)
  245. LOADCHROMA(0);
  246. PUTRGBA(dst_1, py_1, pa_1, 0, 24);
  247. PUTRGBA(dst_2, py_2, pa_2, 0, 24);
  248. LOADCHROMA(1);
  249. PUTRGBA(dst_2, py_2, pa_1, 1, 24);
  250. PUTRGBA(dst_1, py_1, pa_2, 1, 24);
  251. pa_1 += 4; \
  252. pa_2 += 4; \
  253. ENDYUV2RGBLINE(8, 1)
  254. LOADCHROMA(0);
  255. PUTRGBA(dst_1, py_1, pa_1, 0, 24);
  256. PUTRGBA(dst_2, py_2, pa_2, 0, 24);
  257. ENDYUV2RGBFUNC()
  258. YUV2RGBFUNC(yuva2argb_c, uint32_t, 1)
  259. LOADCHROMA(0);
  260. PUTRGBA(dst_1, py_1, pa_1, 0, 0);
  261. PUTRGBA(dst_2, py_2, pa_2, 0, 0);
  262. LOADCHROMA(1);
  263. PUTRGBA(dst_2, py_2, pa_2, 1, 0);
  264. PUTRGBA(dst_1, py_1, pa_1, 1, 0);
  265. LOADCHROMA(2);
  266. PUTRGBA(dst_1, py_1, pa_1, 2, 0);
  267. PUTRGBA(dst_2, py_2, pa_2, 2, 0);
  268. LOADCHROMA(3);
  269. PUTRGBA(dst_2, py_2, pa_2, 3, 0);
  270. PUTRGBA(dst_1, py_1, pa_1, 3, 0);
  271. pa_1 += 8; \
  272. pa_2 += 8; \
  273. ENDYUV2RGBLINE(8, 0)
  274. LOADCHROMA(0);
  275. PUTRGBA(dst_1, py_1, pa_1, 0, 0);
  276. PUTRGBA(dst_2, py_2, pa_2, 0, 0);
  277. LOADCHROMA(1);
  278. PUTRGBA(dst_2, py_2, pa_2, 1, 0);
  279. PUTRGBA(dst_1, py_1, pa_1, 1, 0);
  280. pa_1 += 4; \
  281. pa_2 += 4; \
  282. ENDYUV2RGBLINE(8, 1)
  283. LOADCHROMA(0);
  284. PUTRGBA(dst_1, py_1, pa_1, 0, 0);
  285. PUTRGBA(dst_2, py_2, pa_2, 0, 0);
  286. ENDYUV2RGBFUNC()
  287. YUV2RGBFUNC(yuv2rgb_c_24_rgb, uint8_t, 0)
  288. LOADCHROMA(0);
  289. PUTRGB24(dst_1, py_1, 0);
  290. PUTRGB24(dst_2, py_2, 0);
  291. LOADCHROMA(1);
  292. PUTRGB24(dst_2, py_2, 1);
  293. PUTRGB24(dst_1, py_1, 1);
  294. LOADCHROMA(2);
  295. PUTRGB24(dst_1, py_1, 2);
  296. PUTRGB24(dst_2, py_2, 2);
  297. LOADCHROMA(3);
  298. PUTRGB24(dst_2, py_2, 3);
  299. PUTRGB24(dst_1, py_1, 3);
  300. ENDYUV2RGBLINE(24, 0)
  301. LOADCHROMA(0);
  302. PUTRGB24(dst_1, py_1, 0);
  303. PUTRGB24(dst_2, py_2, 0);
  304. LOADCHROMA(1);
  305. PUTRGB24(dst_2, py_2, 1);
  306. PUTRGB24(dst_1, py_1, 1);
  307. ENDYUV2RGBLINE(24, 1)
  308. LOADCHROMA(0);
  309. PUTRGB24(dst_1, py_1, 0);
  310. PUTRGB24(dst_2, py_2, 0);
  311. ENDYUV2RGBFUNC()
  312. // only trivial mods from yuv2rgb_c_24_rgb
  313. YUV2RGBFUNC(yuv2rgb_c_24_bgr, uint8_t, 0)
  314. LOADCHROMA(0);
  315. PUTBGR24(dst_1, py_1, 0);
  316. PUTBGR24(dst_2, py_2, 0);
  317. LOADCHROMA(1);
  318. PUTBGR24(dst_2, py_2, 1);
  319. PUTBGR24(dst_1, py_1, 1);
  320. LOADCHROMA(2);
  321. PUTBGR24(dst_1, py_1, 2);
  322. PUTBGR24(dst_2, py_2, 2);
  323. LOADCHROMA(3);
  324. PUTBGR24(dst_2, py_2, 3);
  325. PUTBGR24(dst_1, py_1, 3);
  326. ENDYUV2RGBLINE(24, 0)
  327. LOADCHROMA(0);
  328. PUTBGR24(dst_1, py_1, 0);
  329. PUTBGR24(dst_2, py_2, 0);
  330. LOADCHROMA(1);
  331. PUTBGR24(dst_2, py_2, 1);
  332. PUTBGR24(dst_1, py_1, 1);
  333. ENDYUV2RGBLINE(24, 1)
  334. LOADCHROMA(0);
  335. PUTBGR24(dst_1, py_1, 0);
  336. PUTBGR24(dst_2, py_2, 0);
  337. ENDYUV2RGBFUNC()
  338. // This is exactly the same code as yuv2rgb_c_32 except for the types of
  339. // r, g, b, dst_1, dst_2
  340. YUV2RGBFUNC(yuv2rgb_c_16, uint16_t, 0)
  341. LOADCHROMA(0);
  342. PUTRGB(dst_1, py_1, 0);
  343. PUTRGB(dst_2, py_2, 0);
  344. LOADCHROMA(1);
  345. PUTRGB(dst_2, py_2, 1);
  346. PUTRGB(dst_1, py_1, 1);
  347. LOADCHROMA(2);
  348. PUTRGB(dst_1, py_1, 2);
  349. PUTRGB(dst_2, py_2, 2);
  350. LOADCHROMA(3);
  351. PUTRGB(dst_2, py_2, 3);
  352. PUTRGB(dst_1, py_1, 3);
  353. CLOSEYUV2RGBFUNC(8)
  354. // r, g, b, dst_1, dst_2
  355. YUV2RGBFUNC(yuv2rgb_c_12_ordered_dither, uint16_t, 0)
  356. const uint8_t *d16 = dither_4x4_16[y & 3];
  357. #define PUTRGB12(dst, src, i, o) \
  358. Y = src[2 * i]; \
  359. dst[2 * i] = r[Y + d16[0 + o]] + \
  360. g[Y + d16[0 + o]] + \
  361. b[Y + d16[0 + o]]; \
  362. Y = src[2 * i + 1]; \
  363. dst[2 * i + 1] = r[Y + d16[1 + o]] + \
  364. g[Y + d16[1 + o]] + \
  365. b[Y + d16[1 + o]];
  366. LOADCHROMA(0);
  367. PUTRGB12(dst_1, py_1, 0, 0);
  368. PUTRGB12(dst_2, py_2, 0, 0 + 8);
  369. LOADCHROMA(1);
  370. PUTRGB12(dst_2, py_2, 1, 2 + 8);
  371. PUTRGB12(dst_1, py_1, 1, 2);
  372. LOADCHROMA(2);
  373. PUTRGB12(dst_1, py_1, 2, 4);
  374. PUTRGB12(dst_2, py_2, 2, 4 + 8);
  375. LOADCHROMA(3);
  376. PUTRGB12(dst_2, py_2, 3, 6 + 8);
  377. PUTRGB12(dst_1, py_1, 3, 6);
  378. CLOSEYUV2RGBFUNC(8)
  379. // r, g, b, dst_1, dst_2
  380. YUV2RGBFUNC(yuv2rgb_c_8_ordered_dither, uint8_t, 0)
  381. const uint8_t *d32 = dither_8x8_32[y & 7];
  382. const uint8_t *d64 = dither_8x8_73[y & 7];
  383. #define PUTRGB8(dst, src, i, o) \
  384. Y = src[2 * i]; \
  385. dst[2 * i] = r[Y + d32[0 + o]] + \
  386. g[Y + d32[0 + o]] + \
  387. b[Y + d64[0 + o]]; \
  388. Y = src[2 * i + 1]; \
  389. dst[2 * i + 1] = r[Y + d32[1 + o]] + \
  390. g[Y + d32[1 + o]] + \
  391. b[Y + d64[1 + o]];
  392. LOADCHROMA(0);
  393. PUTRGB8(dst_1, py_1, 0, 0);
  394. PUTRGB8(dst_2, py_2, 0, 0 + 8);
  395. LOADCHROMA(1);
  396. PUTRGB8(dst_2, py_2, 1, 2 + 8);
  397. PUTRGB8(dst_1, py_1, 1, 2);
  398. LOADCHROMA(2);
  399. PUTRGB8(dst_1, py_1, 2, 4);
  400. PUTRGB8(dst_2, py_2, 2, 4 + 8);
  401. LOADCHROMA(3);
  402. PUTRGB8(dst_2, py_2, 3, 6 + 8);
  403. PUTRGB8(dst_1, py_1, 3, 6);
  404. CLOSEYUV2RGBFUNC(8)
  405. YUV2RGBFUNC(yuv2rgb_c_4_ordered_dither, uint8_t, 0)
  406. const uint8_t * d64 = dither_8x8_73[y & 7];
  407. const uint8_t *d128 = dither_8x8_220[y & 7];
  408. int acc;
  409. #define PUTRGB4D(dst, src, i, o) \
  410. Y = src[2 * i]; \
  411. acc = r[Y + d128[0 + o]] + \
  412. g[Y + d64[0 + o]] + \
  413. b[Y + d128[0 + o]]; \
  414. Y = src[2 * i + 1]; \
  415. acc |= (r[Y + d128[1 + o]] + \
  416. g[Y + d64[1 + o]] + \
  417. b[Y + d128[1 + o]]) << 4; \
  418. dst[i] = acc;
  419. LOADCHROMA(0);
  420. PUTRGB4D(dst_1, py_1, 0, 0);
  421. PUTRGB4D(dst_2, py_2, 0, 0 + 8);
  422. LOADCHROMA(1);
  423. PUTRGB4D(dst_2, py_2, 1, 2 + 8);
  424. PUTRGB4D(dst_1, py_1, 1, 2);
  425. LOADCHROMA(2);
  426. PUTRGB4D(dst_1, py_1, 2, 4);
  427. PUTRGB4D(dst_2, py_2, 2, 4 + 8);
  428. LOADCHROMA(3);
  429. PUTRGB4D(dst_2, py_2, 3, 6 + 8);
  430. PUTRGB4D(dst_1, py_1, 3, 6);
  431. CLOSEYUV2RGBFUNC(4)
  432. YUV2RGBFUNC(yuv2rgb_c_4b_ordered_dither, uint8_t, 0)
  433. const uint8_t *d64 = dither_8x8_73[y & 7];
  434. const uint8_t *d128 = dither_8x8_220[y & 7];
  435. #define PUTRGB4DB(dst, src, i, o) \
  436. Y = src[2 * i]; \
  437. dst[2 * i] = r[Y + d128[0 + o]] + \
  438. g[Y + d64[0 + o]] + \
  439. b[Y + d128[0 + o]]; \
  440. Y = src[2 * i + 1]; \
  441. dst[2 * i + 1] = r[Y + d128[1 + o]] + \
  442. g[Y + d64[1 + o]] + \
  443. b[Y + d128[1 + o]];
  444. LOADCHROMA(0);
  445. PUTRGB4DB(dst_1, py_1, 0, 0);
  446. PUTRGB4DB(dst_2, py_2, 0, 0 + 8);
  447. LOADCHROMA(1);
  448. PUTRGB4DB(dst_2, py_2, 1, 2 + 8);
  449. PUTRGB4DB(dst_1, py_1, 1, 2);
  450. LOADCHROMA(2);
  451. PUTRGB4DB(dst_1, py_1, 2, 4);
  452. PUTRGB4DB(dst_2, py_2, 2, 4 + 8);
  453. LOADCHROMA(3);
  454. PUTRGB4DB(dst_2, py_2, 3, 6 + 8);
  455. PUTRGB4DB(dst_1, py_1, 3, 6);
  456. CLOSEYUV2RGBFUNC(8)
  457. YUV2RGBFUNC(yuv2rgb_c_1_ordered_dither, uint8_t, 0)
  458. const uint8_t *d128 = dither_8x8_220[y & 7];
  459. char out_1 = 0, out_2 = 0;
  460. g = c->table_gU[128] + c->table_gV[128];
  461. #define PUTRGB1(out, src, i, o) \
  462. Y = src[2 * i]; \
  463. out += out + g[Y + d128[0 + o]]; \
  464. Y = src[2 * i + 1]; \
  465. out += out + g[Y + d128[1 + o]];
  466. PUTRGB1(out_1, py_1, 0, 0);
  467. PUTRGB1(out_2, py_2, 0, 0 + 8);
  468. PUTRGB1(out_2, py_2, 1, 2 + 8);
  469. PUTRGB1(out_1, py_1, 1, 2);
  470. PUTRGB1(out_1, py_1, 2, 4);
  471. PUTRGB1(out_2, py_2, 2, 4 + 8);
  472. PUTRGB1(out_2, py_2, 3, 6 + 8);
  473. PUTRGB1(out_1, py_1, 3, 6);
  474. dst_1[0] = out_1;
  475. dst_2[0] = out_2;
  476. CLOSEYUV2RGBFUNC(1)
  477. SwsFunc ff_yuv2rgb_get_func_ptr(SwsContext *c)
  478. {
  479. SwsFunc t = NULL;
  480. if (HAVE_MMX)
  481. t = ff_yuv2rgb_init_mmx(c);
  482. else if (HAVE_VIS)
  483. t = ff_yuv2rgb_init_vis(c);
  484. else if (HAVE_ALTIVEC)
  485. t = ff_yuv2rgb_init_altivec(c);
  486. else if (ARCH_BFIN)
  487. t = ff_yuv2rgb_get_func_ptr_bfin(c);
  488. if (t)
  489. return t;
  490. av_log(c, AV_LOG_WARNING,
  491. "No accelerated colorspace conversion found from %s to %s.\n",
  492. sws_format_name(c->srcFormat), sws_format_name(c->dstFormat));
  493. switch (c->dstFormat) {
  494. case AV_PIX_FMT_BGR48BE:
  495. case AV_PIX_FMT_BGR48LE:
  496. return yuv2rgb_c_bgr48;
  497. case AV_PIX_FMT_RGB48BE:
  498. case AV_PIX_FMT_RGB48LE:
  499. return yuv2rgb_c_48;
  500. case AV_PIX_FMT_ARGB:
  501. case AV_PIX_FMT_ABGR:
  502. if (CONFIG_SWSCALE_ALPHA && c->srcFormat == AV_PIX_FMT_YUVA420P)
  503. return yuva2argb_c;
  504. case AV_PIX_FMT_RGBA:
  505. case AV_PIX_FMT_BGRA:
  506. if (CONFIG_SWSCALE_ALPHA && c->srcFormat == AV_PIX_FMT_YUVA420P)
  507. return yuva2rgba_c;
  508. else
  509. return yuv2rgb_c_32;
  510. case AV_PIX_FMT_RGB24:
  511. return yuv2rgb_c_24_rgb;
  512. case AV_PIX_FMT_BGR24:
  513. return yuv2rgb_c_24_bgr;
  514. case AV_PIX_FMT_RGB565:
  515. case AV_PIX_FMT_BGR565:
  516. case AV_PIX_FMT_RGB555:
  517. case AV_PIX_FMT_BGR555:
  518. return yuv2rgb_c_16;
  519. case AV_PIX_FMT_RGB444:
  520. case AV_PIX_FMT_BGR444:
  521. return yuv2rgb_c_12_ordered_dither;
  522. case AV_PIX_FMT_RGB8:
  523. case AV_PIX_FMT_BGR8:
  524. return yuv2rgb_c_8_ordered_dither;
  525. case AV_PIX_FMT_RGB4:
  526. case AV_PIX_FMT_BGR4:
  527. return yuv2rgb_c_4_ordered_dither;
  528. case AV_PIX_FMT_RGB4_BYTE:
  529. case AV_PIX_FMT_BGR4_BYTE:
  530. return yuv2rgb_c_4b_ordered_dither;
  531. case AV_PIX_FMT_MONOBLACK:
  532. return yuv2rgb_c_1_ordered_dither;
  533. default:
  534. assert(0);
  535. }
  536. return NULL;
  537. }
  538. static void fill_table(uint8_t *table[256], const int elemsize,
  539. const int inc, void *y_tab)
  540. {
  541. int i;
  542. int64_t cb = 0;
  543. uint8_t *y_table = y_tab;
  544. y_table -= elemsize * (inc >> 9);
  545. for (i = 0; i < 256; i++) {
  546. table[i] = y_table + elemsize * (cb >> 16);
  547. cb += inc;
  548. }
  549. }
  550. static void fill_gv_table(int table[256], const int elemsize, const int inc)
  551. {
  552. int i;
  553. int64_t cb = 0;
  554. int off = -(inc >> 9);
  555. for (i = 0; i < 256; i++) {
  556. table[i] = elemsize * (off + (cb >> 16));
  557. cb += inc;
  558. }
  559. }
  560. static uint16_t roundToInt16(int64_t f)
  561. {
  562. int r = (f + (1 << 15)) >> 16;
  563. if (r < -0x7FFF)
  564. return 0x8000;
  565. else if (r > 0x7FFF)
  566. return 0x7FFF;
  567. else
  568. return r;
  569. }
  570. av_cold int ff_yuv2rgb_c_init_tables(SwsContext *c, const int inv_table[4],
  571. int fullRange, int brightness,
  572. int contrast, int saturation)
  573. {
  574. const int isRgb = c->dstFormat == AV_PIX_FMT_RGB32 ||
  575. c->dstFormat == AV_PIX_FMT_RGB32_1 ||
  576. c->dstFormat == AV_PIX_FMT_BGR24 ||
  577. c->dstFormat == AV_PIX_FMT_RGB565BE ||
  578. c->dstFormat == AV_PIX_FMT_RGB565LE ||
  579. c->dstFormat == AV_PIX_FMT_RGB555BE ||
  580. c->dstFormat == AV_PIX_FMT_RGB555LE ||
  581. c->dstFormat == AV_PIX_FMT_RGB444BE ||
  582. c->dstFormat == AV_PIX_FMT_RGB444LE ||
  583. c->dstFormat == AV_PIX_FMT_RGB8 ||
  584. c->dstFormat == AV_PIX_FMT_RGB4 ||
  585. c->dstFormat == AV_PIX_FMT_RGB4_BYTE ||
  586. c->dstFormat == AV_PIX_FMT_MONOBLACK;
  587. const int isNotNe = c->dstFormat == AV_PIX_FMT_NE(RGB565LE, RGB565BE) ||
  588. c->dstFormat == AV_PIX_FMT_NE(RGB555LE, RGB555BE) ||
  589. c->dstFormat == AV_PIX_FMT_NE(RGB444LE, RGB444BE) ||
  590. c->dstFormat == AV_PIX_FMT_NE(BGR565LE, BGR565BE) ||
  591. c->dstFormat == AV_PIX_FMT_NE(BGR555LE, BGR555BE) ||
  592. c->dstFormat == AV_PIX_FMT_NE(BGR444LE, BGR444BE);
  593. const int bpp = c->dstFormatBpp;
  594. uint8_t *y_table;
  595. uint16_t *y_table16;
  596. uint32_t *y_table32;
  597. int i, base, rbase, gbase, bbase, abase, needAlpha;
  598. const int yoffs = fullRange ? 384 : 326;
  599. int64_t crv = inv_table[0];
  600. int64_t cbu = inv_table[1];
  601. int64_t cgu = -inv_table[2];
  602. int64_t cgv = -inv_table[3];
  603. int64_t cy = 1 << 16;
  604. int64_t oy = 0;
  605. int64_t yb = 0;
  606. if (!fullRange) {
  607. cy = (cy * 255) / 219;
  608. oy = 16 << 16;
  609. } else {
  610. crv = (crv * 224) / 255;
  611. cbu = (cbu * 224) / 255;
  612. cgu = (cgu * 224) / 255;
  613. cgv = (cgv * 224) / 255;
  614. }
  615. cy = (cy * contrast) >> 16;
  616. crv = (crv * contrast * saturation) >> 32;
  617. cbu = (cbu * contrast * saturation) >> 32;
  618. cgu = (cgu * contrast * saturation) >> 32;
  619. cgv = (cgv * contrast * saturation) >> 32;
  620. oy -= 256 * brightness;
  621. c->uOffset = 0x0400040004000400LL;
  622. c->vOffset = 0x0400040004000400LL;
  623. c->yCoeff = roundToInt16(cy * 8192) * 0x0001000100010001ULL;
  624. c->vrCoeff = roundToInt16(crv * 8192) * 0x0001000100010001ULL;
  625. c->ubCoeff = roundToInt16(cbu * 8192) * 0x0001000100010001ULL;
  626. c->vgCoeff = roundToInt16(cgv * 8192) * 0x0001000100010001ULL;
  627. c->ugCoeff = roundToInt16(cgu * 8192) * 0x0001000100010001ULL;
  628. c->yOffset = roundToInt16(oy * 8) * 0x0001000100010001ULL;
  629. c->yuv2rgb_y_coeff = (int16_t)roundToInt16(cy << 13);
  630. c->yuv2rgb_y_offset = (int16_t)roundToInt16(oy << 9);
  631. c->yuv2rgb_v2r_coeff = (int16_t)roundToInt16(crv << 13);
  632. c->yuv2rgb_v2g_coeff = (int16_t)roundToInt16(cgv << 13);
  633. c->yuv2rgb_u2g_coeff = (int16_t)roundToInt16(cgu << 13);
  634. c->yuv2rgb_u2b_coeff = (int16_t)roundToInt16(cbu << 13);
  635. //scale coefficients by cy
  636. crv = ((crv << 16) + 0x8000) / cy;
  637. cbu = ((cbu << 16) + 0x8000) / cy;
  638. cgu = ((cgu << 16) + 0x8000) / cy;
  639. cgv = ((cgv << 16) + 0x8000) / cy;
  640. av_free(c->yuvTable);
  641. switch (bpp) {
  642. case 1:
  643. c->yuvTable = av_malloc(1024);
  644. y_table = c->yuvTable;
  645. yb = -(384 << 16) - oy;
  646. for (i = 0; i < 1024 - 110; i++) {
  647. y_table[i + 110] = av_clip_uint8((yb + 0x8000) >> 16) >> 7;
  648. yb += cy;
  649. }
  650. fill_table(c->table_gU, 1, cgu, y_table + yoffs);
  651. fill_gv_table(c->table_gV, 1, cgv);
  652. break;
  653. case 4:
  654. case 4 | 128:
  655. rbase = isRgb ? 3 : 0;
  656. gbase = 1;
  657. bbase = isRgb ? 0 : 3;
  658. c->yuvTable = av_malloc(1024 * 3);
  659. y_table = c->yuvTable;
  660. yb = -(384 << 16) - oy;
  661. for (i = 0; i < 1024 - 110; i++) {
  662. int yval = av_clip_uint8((yb + 0x8000) >> 16);
  663. y_table[i + 110] = (yval >> 7) << rbase;
  664. y_table[i + 37 + 1024] = ((yval + 43) / 85) << gbase;
  665. y_table[i + 110 + 2048] = (yval >> 7) << bbase;
  666. yb += cy;
  667. }
  668. fill_table(c->table_rV, 1, crv, y_table + yoffs);
  669. fill_table(c->table_gU, 1, cgu, y_table + yoffs + 1024);
  670. fill_table(c->table_bU, 1, cbu, y_table + yoffs + 2048);
  671. fill_gv_table(c->table_gV, 1, cgv);
  672. break;
  673. case 8:
  674. rbase = isRgb ? 5 : 0;
  675. gbase = isRgb ? 2 : 3;
  676. bbase = isRgb ? 0 : 6;
  677. c->yuvTable = av_malloc(1024 * 3);
  678. y_table = c->yuvTable;
  679. yb = -(384 << 16) - oy;
  680. for (i = 0; i < 1024 - 38; i++) {
  681. int yval = av_clip_uint8((yb + 0x8000) >> 16);
  682. y_table[i + 16] = ((yval + 18) / 36) << rbase;
  683. y_table[i + 16 + 1024] = ((yval + 18) / 36) << gbase;
  684. y_table[i + 37 + 2048] = ((yval + 43) / 85) << bbase;
  685. yb += cy;
  686. }
  687. fill_table(c->table_rV, 1, crv, y_table + yoffs);
  688. fill_table(c->table_gU, 1, cgu, y_table + yoffs + 1024);
  689. fill_table(c->table_bU, 1, cbu, y_table + yoffs + 2048);
  690. fill_gv_table(c->table_gV, 1, cgv);
  691. break;
  692. case 12:
  693. rbase = isRgb ? 8 : 0;
  694. gbase = 4;
  695. bbase = isRgb ? 0 : 8;
  696. c->yuvTable = av_malloc(1024 * 3 * 2);
  697. y_table16 = c->yuvTable;
  698. yb = -(384 << 16) - oy;
  699. for (i = 0; i < 1024; i++) {
  700. uint8_t yval = av_clip_uint8((yb + 0x8000) >> 16);
  701. y_table16[i] = (yval >> 4) << rbase;
  702. y_table16[i + 1024] = (yval >> 4) << gbase;
  703. y_table16[i + 2048] = (yval >> 4) << bbase;
  704. yb += cy;
  705. }
  706. if (isNotNe)
  707. for (i = 0; i < 1024 * 3; i++)
  708. y_table16[i] = av_bswap16(y_table16[i]);
  709. fill_table(c->table_rV, 2, crv, y_table16 + yoffs);
  710. fill_table(c->table_gU, 2, cgu, y_table16 + yoffs + 1024);
  711. fill_table(c->table_bU, 2, cbu, y_table16 + yoffs + 2048);
  712. fill_gv_table(c->table_gV, 2, cgv);
  713. break;
  714. case 15:
  715. case 16:
  716. rbase = isRgb ? bpp - 5 : 0;
  717. gbase = 5;
  718. bbase = isRgb ? 0 : (bpp - 5);
  719. c->yuvTable = av_malloc(1024 * 3 * 2);
  720. y_table16 = c->yuvTable;
  721. yb = -(384 << 16) - oy;
  722. for (i = 0; i < 1024; i++) {
  723. uint8_t yval = av_clip_uint8((yb + 0x8000) >> 16);
  724. y_table16[i] = (yval >> 3) << rbase;
  725. y_table16[i + 1024] = (yval >> (18 - bpp)) << gbase;
  726. y_table16[i + 2048] = (yval >> 3) << bbase;
  727. yb += cy;
  728. }
  729. if (isNotNe)
  730. for (i = 0; i < 1024 * 3; i++)
  731. y_table16[i] = av_bswap16(y_table16[i]);
  732. fill_table(c->table_rV, 2, crv, y_table16 + yoffs);
  733. fill_table(c->table_gU, 2, cgu, y_table16 + yoffs + 1024);
  734. fill_table(c->table_bU, 2, cbu, y_table16 + yoffs + 2048);
  735. fill_gv_table(c->table_gV, 2, cgv);
  736. break;
  737. case 24:
  738. case 48:
  739. c->yuvTable = av_malloc(1024);
  740. y_table = c->yuvTable;
  741. yb = -(384 << 16) - oy;
  742. for (i = 0; i < 1024; i++) {
  743. y_table[i] = av_clip_uint8((yb + 0x8000) >> 16);
  744. yb += cy;
  745. }
  746. fill_table(c->table_rV, 1, crv, y_table + yoffs);
  747. fill_table(c->table_gU, 1, cgu, y_table + yoffs);
  748. fill_table(c->table_bU, 1, cbu, y_table + yoffs);
  749. fill_gv_table(c->table_gV, 1, cgv);
  750. break;
  751. case 32:
  752. base = (c->dstFormat == AV_PIX_FMT_RGB32_1 ||
  753. c->dstFormat == AV_PIX_FMT_BGR32_1) ? 8 : 0;
  754. rbase = base + (isRgb ? 16 : 0);
  755. gbase = base + 8;
  756. bbase = base + (isRgb ? 0 : 16);
  757. needAlpha = CONFIG_SWSCALE_ALPHA && isALPHA(c->srcFormat);
  758. if (!needAlpha)
  759. abase = (base + 24) & 31;
  760. c->yuvTable = av_malloc(1024 * 3 * 4);
  761. y_table32 = c->yuvTable;
  762. yb = -(384 << 16) - oy;
  763. for (i = 0; i < 1024; i++) {
  764. unsigned yval = av_clip_uint8((yb + 0x8000) >> 16);
  765. y_table32[i] = (yval << rbase) +
  766. (needAlpha ? 0 : (255u << abase));
  767. y_table32[i + 1024] = yval << gbase;
  768. y_table32[i + 2048] = yval << bbase;
  769. yb += cy;
  770. }
  771. fill_table(c->table_rV, 4, crv, y_table32 + yoffs);
  772. fill_table(c->table_gU, 4, cgu, y_table32 + yoffs + 1024);
  773. fill_table(c->table_bU, 4, cbu, y_table32 + yoffs + 2048);
  774. fill_gv_table(c->table_gV, 4, cgv);
  775. break;
  776. default:
  777. c->yuvTable = NULL;
  778. av_log(c, AV_LOG_ERROR, "%ibpp not supported by yuv2rgb\n", bpp);
  779. return -1;
  780. }
  781. return 0;
  782. }