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.

1167 lines
33KB

  1. /*
  2. * pixel format descriptor
  3. * Copyright (c) 2009 Michael Niedermayer <michaelni@gmx.at>
  4. *
  5. * This file is part of Libav.
  6. *
  7. * Libav is free software; you can redistribute it and/or
  8. * modify it under the terms of the GNU Lesser General Public
  9. * License as published by the Free Software Foundation; either
  10. * version 2.1 of the License, or (at your option) any later version.
  11. *
  12. * Libav is distributed in the hope that it will be useful,
  13. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  14. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  15. * Lesser General Public License for more details.
  16. *
  17. * You should have received a copy of the GNU Lesser General Public
  18. * License along with Libav; if not, write to the Free Software
  19. * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  20. */
  21. #include <stdio.h>
  22. #include <string.h>
  23. #include "pixfmt.h"
  24. #include "pixdesc.h"
  25. #include "intreadwrite.h"
  26. void av_read_image_line(uint16_t *dst,
  27. const uint8_t *data[4], const int linesize[4],
  28. const AVPixFmtDescriptor *desc,
  29. int x, int y, int c, int w,
  30. int read_pal_component)
  31. {
  32. AVComponentDescriptor comp = desc->comp[c];
  33. int plane = comp.plane;
  34. int depth = comp.depth_minus1 + 1;
  35. int mask = (1 << depth) - 1;
  36. int shift = comp.shift;
  37. int step = comp.step_minus1 + 1;
  38. int flags = desc->flags;
  39. if (flags & PIX_FMT_BITSTREAM) {
  40. int skip = x * step + comp.offset_plus1 - 1;
  41. const uint8_t *p = data[plane] + y * linesize[plane] + (skip >> 3);
  42. int shift = 8 - depth - (skip & 7);
  43. while (w--) {
  44. int val = (*p >> shift) & mask;
  45. if (read_pal_component)
  46. val = data[1][4*val + c];
  47. shift -= step;
  48. p -= shift >> 3;
  49. shift &= 7;
  50. *dst++ = val;
  51. }
  52. } else {
  53. const uint8_t *p = data[plane] + y * linesize[plane] +
  54. x * step + comp.offset_plus1 - 1;
  55. int is_8bit = shift + depth <= 8;
  56. if (is_8bit)
  57. p += !!(flags & PIX_FMT_BE);
  58. while (w--) {
  59. int val = is_8bit ? *p :
  60. flags & PIX_FMT_BE ? AV_RB16(p) : AV_RL16(p);
  61. val = (val >> shift) & mask;
  62. if (read_pal_component)
  63. val = data[1][4 * val + c];
  64. p += step;
  65. *dst++ = val;
  66. }
  67. }
  68. }
  69. void av_write_image_line(const uint16_t *src,
  70. uint8_t *data[4], const int linesize[4],
  71. const AVPixFmtDescriptor *desc,
  72. int x, int y, int c, int w)
  73. {
  74. AVComponentDescriptor comp = desc->comp[c];
  75. int plane = comp.plane;
  76. int depth = comp.depth_minus1 + 1;
  77. int step = comp.step_minus1 + 1;
  78. int flags = desc->flags;
  79. if (flags & PIX_FMT_BITSTREAM) {
  80. int skip = x * step + comp.offset_plus1 - 1;
  81. uint8_t *p = data[plane] + y * linesize[plane] + (skip >> 3);
  82. int shift = 8 - depth - (skip & 7);
  83. while (w--) {
  84. *p |= *src++ << shift;
  85. shift -= step;
  86. p -= shift >> 3;
  87. shift &= 7;
  88. }
  89. } else {
  90. int shift = comp.shift;
  91. uint8_t *p = data[plane] + y * linesize[plane] +
  92. x * step + comp.offset_plus1 - 1;
  93. if (shift + depth <= 8) {
  94. p += !!(flags & PIX_FMT_BE);
  95. while (w--) {
  96. *p |= (*src++ << shift);
  97. p += step;
  98. }
  99. } else {
  100. while (w--) {
  101. if (flags & PIX_FMT_BE) {
  102. uint16_t val = AV_RB16(p) | (*src++ << shift);
  103. AV_WB16(p, val);
  104. } else {
  105. uint16_t val = AV_RL16(p) | (*src++ << shift);
  106. AV_WL16(p, val);
  107. }
  108. p += step;
  109. }
  110. }
  111. }
  112. }
  113. const AVPixFmtDescriptor av_pix_fmt_descriptors[PIX_FMT_NB] = {
  114. [PIX_FMT_YUV420P] = {
  115. .name = "yuv420p",
  116. .nb_components = 3,
  117. .log2_chroma_w = 1,
  118. .log2_chroma_h = 1,
  119. .comp = {
  120. { 0, 0, 1, 0, 7 }, /* Y */
  121. { 1, 0, 1, 0, 7 }, /* U */
  122. { 2, 0, 1, 0, 7 }, /* V */
  123. },
  124. .flags = PIX_FMT_PLANAR,
  125. },
  126. [PIX_FMT_YUYV422] = {
  127. .name = "yuyv422",
  128. .nb_components = 3,
  129. .log2_chroma_w = 1,
  130. .log2_chroma_h = 0,
  131. .comp = {
  132. { 0, 1, 1, 0, 7 }, /* Y */
  133. { 0, 3, 2, 0, 7 }, /* U */
  134. { 0, 3, 4, 0, 7 }, /* V */
  135. },
  136. },
  137. [PIX_FMT_RGB24] = {
  138. .name = "rgb24",
  139. .nb_components = 3,
  140. .log2_chroma_w = 0,
  141. .log2_chroma_h = 0,
  142. .comp = {
  143. { 0, 2, 1, 0, 7 }, /* R */
  144. { 0, 2, 2, 0, 7 }, /* G */
  145. { 0, 2, 3, 0, 7 }, /* B */
  146. },
  147. .flags = PIX_FMT_RGB,
  148. },
  149. [PIX_FMT_BGR24] = {
  150. .name = "bgr24",
  151. .nb_components = 3,
  152. .log2_chroma_w = 0,
  153. .log2_chroma_h = 0,
  154. .comp = {
  155. { 0, 2, 1, 0, 7 }, /* B */
  156. { 0, 2, 2, 0, 7 }, /* G */
  157. { 0, 2, 3, 0, 7 }, /* R */
  158. },
  159. .flags = PIX_FMT_RGB,
  160. },
  161. [PIX_FMT_YUV422P] = {
  162. .name = "yuv422p",
  163. .nb_components = 3,
  164. .log2_chroma_w = 1,
  165. .log2_chroma_h = 0,
  166. .comp = {
  167. { 0, 0, 1, 0, 7 }, /* Y */
  168. { 1, 0, 1, 0, 7 }, /* U */
  169. { 2, 0, 1, 0, 7 }, /* V */
  170. },
  171. .flags = PIX_FMT_PLANAR,
  172. },
  173. [PIX_FMT_YUV444P] = {
  174. .name = "yuv444p",
  175. .nb_components = 3,
  176. .log2_chroma_w = 0,
  177. .log2_chroma_h = 0,
  178. .comp = {
  179. { 0, 0, 1, 0, 7 }, /* Y */
  180. { 1, 0, 1, 0, 7 }, /* U */
  181. { 2, 0, 1, 0, 7 }, /* V */
  182. },
  183. .flags = PIX_FMT_PLANAR,
  184. },
  185. [PIX_FMT_YUV410P] = {
  186. .name = "yuv410p",
  187. .nb_components = 3,
  188. .log2_chroma_w = 2,
  189. .log2_chroma_h = 2,
  190. .comp = {
  191. { 0, 0, 1, 0, 7 }, /* Y */
  192. { 1, 0, 1, 0, 7 }, /* U */
  193. { 2, 0, 1, 0, 7 }, /* V */
  194. },
  195. .flags = PIX_FMT_PLANAR,
  196. },
  197. [PIX_FMT_YUV411P] = {
  198. .name = "yuv411p",
  199. .nb_components = 3,
  200. .log2_chroma_w = 2,
  201. .log2_chroma_h = 0,
  202. .comp = {
  203. { 0, 0, 1, 0, 7 }, /* Y */
  204. { 1, 0, 1, 0, 7 }, /* U */
  205. { 2, 0, 1, 0, 7 }, /* V */
  206. },
  207. .flags = PIX_FMT_PLANAR,
  208. },
  209. [PIX_FMT_GRAY8] = {
  210. .name = "gray",
  211. .nb_components = 1,
  212. .log2_chroma_w = 0,
  213. .log2_chroma_h = 0,
  214. .comp = {
  215. { 0, 0, 1, 0, 7 }, /* Y */
  216. },
  217. },
  218. [PIX_FMT_MONOWHITE] = {
  219. .name = "monow",
  220. .nb_components = 1,
  221. .log2_chroma_w = 0,
  222. .log2_chroma_h = 0,
  223. .comp = {
  224. { 0, 0, 1, 0, 0 }, /* Y */
  225. },
  226. .flags = PIX_FMT_BITSTREAM,
  227. },
  228. [PIX_FMT_MONOBLACK] = {
  229. .name = "monob",
  230. .nb_components = 1,
  231. .log2_chroma_w = 0,
  232. .log2_chroma_h = 0,
  233. .comp = {
  234. { 0, 0, 1, 7, 0 }, /* Y */
  235. },
  236. .flags = PIX_FMT_BITSTREAM,
  237. },
  238. [PIX_FMT_PAL8] = {
  239. .name = "pal8",
  240. .nb_components = 1,
  241. .log2_chroma_w = 0,
  242. .log2_chroma_h = 0,
  243. .comp = {
  244. { 0, 0, 1, 0, 7 },
  245. },
  246. .flags = PIX_FMT_PAL,
  247. },
  248. [PIX_FMT_YUVJ420P] = {
  249. .name = "yuvj420p",
  250. .nb_components = 3,
  251. .log2_chroma_w = 1,
  252. .log2_chroma_h = 1,
  253. .comp = {
  254. { 0, 0, 1, 0, 7 }, /* Y */
  255. { 1, 0, 1, 0, 7 }, /* U */
  256. { 2, 0, 1, 0, 7 }, /* V */
  257. },
  258. .flags = PIX_FMT_PLANAR,
  259. },
  260. [PIX_FMT_YUVJ422P] = {
  261. .name = "yuvj422p",
  262. .nb_components = 3,
  263. .log2_chroma_w = 1,
  264. .log2_chroma_h = 0,
  265. .comp = {
  266. { 0, 0, 1, 0, 7 }, /* Y */
  267. { 1, 0, 1, 0, 7 }, /* U */
  268. { 2, 0, 1, 0, 7 }, /* V */
  269. },
  270. .flags = PIX_FMT_PLANAR,
  271. },
  272. [PIX_FMT_YUVJ444P] = {
  273. .name = "yuvj444p",
  274. .nb_components = 3,
  275. .log2_chroma_w = 0,
  276. .log2_chroma_h = 0,
  277. .comp = {
  278. {0, 0, 1, 0, 7}, /* Y */
  279. {1, 0, 1, 0, 7}, /* U */
  280. {2, 0, 1, 0, 7}, /* V */
  281. },
  282. .flags = PIX_FMT_PLANAR,
  283. },
  284. [PIX_FMT_XVMC_MPEG2_MC] = {
  285. .name = "xvmcmc",
  286. .flags = PIX_FMT_HWACCEL,
  287. },
  288. [PIX_FMT_XVMC_MPEG2_IDCT] = {
  289. .name = "xvmcidct",
  290. .flags = PIX_FMT_HWACCEL,
  291. },
  292. [PIX_FMT_UYVY422] = {
  293. .name = "uyvy422",
  294. .nb_components = 3,
  295. .log2_chroma_w = 1,
  296. .log2_chroma_h = 0,
  297. .comp = {
  298. { 0, 1, 2, 0, 7 }, /* Y */
  299. { 0, 3, 1, 0, 7 }, /* U */
  300. { 0, 3, 3, 0, 7 }, /* V */
  301. },
  302. },
  303. [PIX_FMT_UYYVYY411] = {
  304. .name = "uyyvyy411",
  305. .nb_components = 3,
  306. .log2_chroma_w = 2,
  307. .log2_chroma_h = 0,
  308. .comp = {
  309. { 0, 3, 2, 0, 7 }, /* Y */
  310. { 0, 5, 1, 0, 7 }, /* U */
  311. { 0, 5, 4, 0, 7 }, /* V */
  312. },
  313. },
  314. [PIX_FMT_BGR8] = {
  315. .name = "bgr8",
  316. .nb_components = 3,
  317. .log2_chroma_w = 0,
  318. .log2_chroma_h = 0,
  319. .comp = {
  320. { 0, 0, 1, 6, 1 }, /* B */
  321. { 0, 0, 1, 3, 2 }, /* G */
  322. { 0, 0, 1, 0, 2 }, /* R */
  323. },
  324. .flags = PIX_FMT_RGB | PIX_FMT_PSEUDOPAL,
  325. },
  326. [PIX_FMT_BGR4] = {
  327. .name = "bgr4",
  328. .nb_components = 3,
  329. .log2_chroma_w = 0,
  330. .log2_chroma_h = 0,
  331. .comp = {
  332. { 0, 3, 1, 0, 0 }, /* B */
  333. { 0, 3, 2, 0, 1 }, /* G */
  334. { 0, 3, 4, 0, 0 }, /* R */
  335. },
  336. .flags = PIX_FMT_BITSTREAM | PIX_FMT_RGB,
  337. },
  338. [PIX_FMT_BGR4_BYTE] = {
  339. .name = "bgr4_byte",
  340. .nb_components = 3,
  341. .log2_chroma_w = 0,
  342. .log2_chroma_h = 0,
  343. .comp = {
  344. { 0, 0, 1, 3, 0 }, /* B */
  345. { 0, 0, 1, 1, 1 }, /* G */
  346. { 0, 0, 1, 0, 0 }, /* R */
  347. },
  348. .flags = PIX_FMT_RGB | PIX_FMT_PSEUDOPAL,
  349. },
  350. [PIX_FMT_RGB8] = {
  351. .name = "rgb8",
  352. .nb_components = 3,
  353. .log2_chroma_w = 0,
  354. .log2_chroma_h = 0,
  355. .comp = {
  356. { 0, 0, 1, 6, 1 }, /* R */
  357. { 0, 0, 1, 3, 2 }, /* G */
  358. { 0, 0, 1, 0, 2 }, /* B */
  359. },
  360. .flags = PIX_FMT_RGB | PIX_FMT_PSEUDOPAL,
  361. },
  362. [PIX_FMT_RGB4] = {
  363. .name = "rgb4",
  364. .nb_components = 3,
  365. .log2_chroma_w = 0,
  366. .log2_chroma_h = 0,
  367. .comp = {
  368. { 0, 3, 1, 0, 0 }, /* R */
  369. { 0, 3, 2, 0, 1 }, /* G */
  370. { 0, 3, 4, 0, 0 }, /* B */
  371. },
  372. .flags = PIX_FMT_BITSTREAM | PIX_FMT_RGB,
  373. },
  374. [PIX_FMT_RGB4_BYTE] = {
  375. .name = "rgb4_byte",
  376. .nb_components = 3,
  377. .log2_chroma_w = 0,
  378. .log2_chroma_h = 0,
  379. .comp = {
  380. { 0, 0, 1, 3, 0 }, /* R */
  381. { 0, 0, 1, 1, 1 }, /* G */
  382. { 0, 0, 1, 0, 0 }, /* B */
  383. },
  384. .flags = PIX_FMT_RGB | PIX_FMT_PSEUDOPAL,
  385. },
  386. [PIX_FMT_NV12] = {
  387. .name = "nv12",
  388. .nb_components = 3,
  389. .log2_chroma_w = 1,
  390. .log2_chroma_h = 1,
  391. .comp = {
  392. { 0, 0, 1, 0, 7 }, /* Y */
  393. { 1, 1, 1, 0, 7 }, /* U */
  394. { 1, 1, 2, 0, 7 }, /* V */
  395. },
  396. .flags = PIX_FMT_PLANAR,
  397. },
  398. [PIX_FMT_NV21] = {
  399. .name = "nv21",
  400. .nb_components = 3,
  401. .log2_chroma_w = 1,
  402. .log2_chroma_h = 1,
  403. .comp = {
  404. { 0, 0, 1, 0, 7 }, /* Y */
  405. { 1, 1, 1, 0, 7 }, /* V */
  406. { 1, 1, 2, 0, 7 }, /* U */
  407. },
  408. .flags = PIX_FMT_PLANAR,
  409. },
  410. [PIX_FMT_ARGB] = {
  411. .name = "argb",
  412. .nb_components = 4,
  413. .log2_chroma_w = 0,
  414. .log2_chroma_h = 0,
  415. .comp = {
  416. { 0, 3, 1, 0, 7 }, /* A */
  417. { 0, 3, 2, 0, 7 }, /* R */
  418. { 0, 3, 3, 0, 7 }, /* G */
  419. { 0, 3, 4, 0, 7 }, /* B */
  420. },
  421. .flags = PIX_FMT_RGB,
  422. },
  423. [PIX_FMT_RGBA] = {
  424. .name = "rgba",
  425. .nb_components = 4,
  426. .log2_chroma_w = 0,
  427. .log2_chroma_h = 0,
  428. .comp = {
  429. { 0, 3, 1, 0, 7 }, /* R */
  430. { 0, 3, 2, 0, 7 }, /* G */
  431. { 0, 3, 3, 0, 7 }, /* B */
  432. { 0, 3, 4, 0, 7 }, /* A */
  433. },
  434. .flags = PIX_FMT_RGB,
  435. },
  436. [PIX_FMT_ABGR] = {
  437. .name = "abgr",
  438. .nb_components = 4,
  439. .log2_chroma_w = 0,
  440. .log2_chroma_h = 0,
  441. .comp = {
  442. { 0, 3, 1, 0, 7 }, /* A */
  443. { 0, 3, 2, 0, 7 }, /* B */
  444. { 0, 3, 3, 0, 7 }, /* G */
  445. { 0, 3, 4, 0, 7 }, /* R */
  446. },
  447. .flags = PIX_FMT_RGB,
  448. },
  449. [PIX_FMT_BGRA] = {
  450. .name = "bgra",
  451. .nb_components = 4,
  452. .log2_chroma_w = 0,
  453. .log2_chroma_h = 0,
  454. .comp = {
  455. { 0, 3, 1, 0, 7 }, /* B */
  456. { 0, 3, 2, 0, 7 }, /* G */
  457. { 0, 3, 3, 0, 7 }, /* R */
  458. { 0, 3, 4, 0, 7 }, /* A */
  459. },
  460. .flags = PIX_FMT_RGB,
  461. },
  462. [PIX_FMT_GRAY16BE] = {
  463. .name = "gray16be",
  464. .nb_components = 1,
  465. .log2_chroma_w = 0,
  466. .log2_chroma_h = 0,
  467. .comp = {
  468. { 0, 1, 1, 0, 15 }, /* Y */
  469. },
  470. .flags = PIX_FMT_BE,
  471. },
  472. [PIX_FMT_GRAY16LE] = {
  473. .name = "gray16le",
  474. .nb_components = 1,
  475. .log2_chroma_w = 0,
  476. .log2_chroma_h = 0,
  477. .comp = {
  478. { 0, 1, 1, 0, 15 }, /* Y */
  479. },
  480. },
  481. [PIX_FMT_YUV440P] = {
  482. .name = "yuv440p",
  483. .nb_components = 3,
  484. .log2_chroma_w = 0,
  485. .log2_chroma_h = 1,
  486. .comp = {
  487. { 0, 0, 1, 0, 7 }, /* Y */
  488. { 1, 0, 1, 0, 7 }, /* U */
  489. { 2, 0, 1, 0, 7 }, /* V */
  490. },
  491. .flags = PIX_FMT_PLANAR,
  492. },
  493. [PIX_FMT_YUVJ440P] = {
  494. .name = "yuvj440p",
  495. .nb_components = 3,
  496. .log2_chroma_w = 0,
  497. .log2_chroma_h = 1,
  498. .comp = {
  499. { 0, 0, 1, 0, 7 }, /* Y */
  500. { 1, 0, 1, 0, 7 }, /* U */
  501. { 2, 0, 1, 0, 7 }, /* V */
  502. },
  503. .flags = PIX_FMT_PLANAR,
  504. },
  505. [PIX_FMT_YUVA420P] = {
  506. .name = "yuva420p",
  507. .nb_components = 4,
  508. .log2_chroma_w = 1,
  509. .log2_chroma_h = 1,
  510. .comp = {
  511. { 0, 0, 1, 0, 7 }, /* Y */
  512. { 1, 0, 1, 0, 7 }, /* U */
  513. { 2, 0, 1, 0, 7 }, /* V */
  514. { 3, 0, 1, 0, 7 }, /* A */
  515. },
  516. .flags = PIX_FMT_PLANAR,
  517. },
  518. [PIX_FMT_VDPAU_H264] = {
  519. .name = "vdpau_h264",
  520. .log2_chroma_w = 1,
  521. .log2_chroma_h = 1,
  522. .flags = PIX_FMT_HWACCEL,
  523. },
  524. [PIX_FMT_VDPAU_MPEG1] = {
  525. .name = "vdpau_mpeg1",
  526. .log2_chroma_w = 1,
  527. .log2_chroma_h = 1,
  528. .flags = PIX_FMT_HWACCEL,
  529. },
  530. [PIX_FMT_VDPAU_MPEG2] = {
  531. .name = "vdpau_mpeg2",
  532. .log2_chroma_w = 1,
  533. .log2_chroma_h = 1,
  534. .flags = PIX_FMT_HWACCEL,
  535. },
  536. [PIX_FMT_VDPAU_WMV3] = {
  537. .name = "vdpau_wmv3",
  538. .log2_chroma_w = 1,
  539. .log2_chroma_h = 1,
  540. .flags = PIX_FMT_HWACCEL,
  541. },
  542. [PIX_FMT_VDPAU_VC1] = {
  543. .name = "vdpau_vc1",
  544. .log2_chroma_w = 1,
  545. .log2_chroma_h = 1,
  546. .flags = PIX_FMT_HWACCEL,
  547. },
  548. [PIX_FMT_VDPAU_MPEG4] = {
  549. .name = "vdpau_mpeg4",
  550. .log2_chroma_w = 1,
  551. .log2_chroma_h = 1,
  552. .flags = PIX_FMT_HWACCEL,
  553. },
  554. [PIX_FMT_RGB48BE] = {
  555. .name = "rgb48be",
  556. .nb_components = 3,
  557. .log2_chroma_w = 0,
  558. .log2_chroma_h = 0,
  559. .comp = {
  560. { 0, 5, 1, 0, 15 }, /* R */
  561. { 0, 5, 3, 0, 15 }, /* G */
  562. { 0, 5, 5, 0, 15 }, /* B */
  563. },
  564. .flags = PIX_FMT_RGB | PIX_FMT_BE,
  565. },
  566. [PIX_FMT_RGB48LE] = {
  567. .name = "rgb48le",
  568. .nb_components = 3,
  569. .log2_chroma_w = 0,
  570. .log2_chroma_h = 0,
  571. .comp = {
  572. { 0, 5, 1, 0, 15 }, /* R */
  573. { 0, 5, 3, 0, 15 }, /* G */
  574. { 0, 5, 5, 0, 15 }, /* B */
  575. },
  576. .flags = PIX_FMT_RGB,
  577. },
  578. [PIX_FMT_RGB565BE] = {
  579. .name = "rgb565be",
  580. .nb_components = 3,
  581. .log2_chroma_w = 0,
  582. .log2_chroma_h = 0,
  583. .comp = {
  584. { 0, 1, 0, 3, 4 }, /* R */
  585. { 0, 1, 1, 5, 5 }, /* G */
  586. { 0, 1, 1, 0, 4 }, /* B */
  587. },
  588. .flags = PIX_FMT_BE | PIX_FMT_RGB,
  589. },
  590. [PIX_FMT_RGB565LE] = {
  591. .name = "rgb565le",
  592. .nb_components = 3,
  593. .log2_chroma_w = 0,
  594. .log2_chroma_h = 0,
  595. .comp = {
  596. { 0, 1, 2, 3, 4 }, /* R */
  597. { 0, 1, 1, 5, 5 }, /* G */
  598. { 0, 1, 1, 0, 4 }, /* B */
  599. },
  600. .flags = PIX_FMT_RGB,
  601. },
  602. [PIX_FMT_RGB555BE] = {
  603. .name = "rgb555be",
  604. .nb_components = 3,
  605. .log2_chroma_w = 0,
  606. .log2_chroma_h = 0,
  607. .comp = {
  608. { 0, 1, 0, 2, 4 }, /* R */
  609. { 0, 1, 1, 5, 4 }, /* G */
  610. { 0, 1, 1, 0, 4 }, /* B */
  611. },
  612. .flags = PIX_FMT_BE | PIX_FMT_RGB,
  613. },
  614. [PIX_FMT_RGB555LE] = {
  615. .name = "rgb555le",
  616. .nb_components = 3,
  617. .log2_chroma_w = 0,
  618. .log2_chroma_h = 0,
  619. .comp = {
  620. { 0, 1, 2, 2, 4 }, /* R */
  621. { 0, 1, 1, 5, 4 }, /* G */
  622. { 0, 1, 1, 0, 4 }, /* B */
  623. },
  624. .flags = PIX_FMT_RGB,
  625. },
  626. [PIX_FMT_RGB444BE] = {
  627. .name = "rgb444be",
  628. .nb_components = 3,
  629. .log2_chroma_w = 0,
  630. .log2_chroma_h = 0,
  631. .comp = {
  632. { 0, 1, 0, 0, 3 }, /* R */
  633. { 0, 1, 1, 4, 3 }, /* G */
  634. { 0, 1, 1, 0, 3 }, /* B */
  635. },
  636. .flags = PIX_FMT_BE | PIX_FMT_RGB,
  637. },
  638. [PIX_FMT_RGB444LE] = {
  639. .name = "rgb444le",
  640. .nb_components = 3,
  641. .log2_chroma_w = 0,
  642. .log2_chroma_h = 0,
  643. .comp = {
  644. { 0, 1, 2, 0, 3 }, /* R */
  645. { 0, 1, 1, 4, 3 }, /* G */
  646. { 0, 1, 1, 0, 3 }, /* B */
  647. },
  648. .flags = PIX_FMT_RGB,
  649. },
  650. [PIX_FMT_BGR48BE] = {
  651. .name = "bgr48be",
  652. .nb_components = 3,
  653. .log2_chroma_w = 0,
  654. .log2_chroma_h = 0,
  655. .comp = {
  656. { 0, 5, 1, 0, 15 }, /* B */
  657. { 0, 5, 3, 0, 15 }, /* G */
  658. { 0, 5, 5, 0, 15 }, /* R */
  659. },
  660. .flags = PIX_FMT_BE | PIX_FMT_RGB,
  661. },
  662. [PIX_FMT_BGR48LE] = {
  663. .name = "bgr48le",
  664. .nb_components = 3,
  665. .log2_chroma_w = 0,
  666. .log2_chroma_h = 0,
  667. .comp = {
  668. { 0, 5, 1, 0, 15 }, /* B */
  669. { 0, 5, 3, 0, 15 }, /* G */
  670. { 0, 5, 5, 0, 15 }, /* R */
  671. },
  672. .flags = PIX_FMT_RGB,
  673. },
  674. [PIX_FMT_BGR565BE] = {
  675. .name = "bgr565be",
  676. .nb_components = 3,
  677. .log2_chroma_w = 0,
  678. .log2_chroma_h = 0,
  679. .comp = {
  680. { 0, 1, 0, 3, 4 }, /* B */
  681. { 0, 1, 1, 5, 5 }, /* G */
  682. { 0, 1, 1, 0, 4 }, /* R */
  683. },
  684. .flags = PIX_FMT_BE | PIX_FMT_RGB,
  685. },
  686. [PIX_FMT_BGR565LE] = {
  687. .name = "bgr565le",
  688. .nb_components = 3,
  689. .log2_chroma_w = 0,
  690. .log2_chroma_h = 0,
  691. .comp = {
  692. { 0, 1, 2, 3, 4 }, /* B */
  693. { 0, 1, 1, 5, 5 }, /* G */
  694. { 0, 1, 1, 0, 4 }, /* R */
  695. },
  696. .flags = PIX_FMT_RGB,
  697. },
  698. [PIX_FMT_BGR555BE] = {
  699. .name = "bgr555be",
  700. .nb_components = 3,
  701. .log2_chroma_w = 0,
  702. .log2_chroma_h = 0,
  703. .comp = {
  704. { 0, 1, 0, 2, 4 }, /* B */
  705. { 0, 1, 1, 5, 4 }, /* G */
  706. { 0, 1, 1, 0, 4 }, /* R */
  707. },
  708. .flags = PIX_FMT_BE | PIX_FMT_RGB,
  709. },
  710. [PIX_FMT_BGR555LE] = {
  711. .name = "bgr555le",
  712. .nb_components = 3,
  713. .log2_chroma_w = 0,
  714. .log2_chroma_h = 0,
  715. .comp = {
  716. { 0, 1, 2, 2, 4 }, /* B */
  717. { 0, 1, 1, 5, 4 }, /* G */
  718. { 0, 1, 1, 0, 4 }, /* R */
  719. },
  720. .flags = PIX_FMT_RGB,
  721. },
  722. [PIX_FMT_BGR444BE] = {
  723. .name = "bgr444be",
  724. .nb_components = 3,
  725. .log2_chroma_w = 0,
  726. .log2_chroma_h = 0,
  727. .comp = {
  728. { 0, 1, 0, 0, 3 }, /* B */
  729. { 0, 1, 1, 4, 3 }, /* G */
  730. { 0, 1, 1, 0, 3 }, /* R */
  731. },
  732. .flags = PIX_FMT_BE | PIX_FMT_RGB,
  733. },
  734. [PIX_FMT_BGR444LE] = {
  735. .name = "bgr444le",
  736. .nb_components = 3,
  737. .log2_chroma_w = 0,
  738. .log2_chroma_h = 0,
  739. .comp = {
  740. { 0, 1, 2, 0, 3 }, /* B */
  741. { 0, 1, 1, 4, 3 }, /* G */
  742. { 0, 1, 1, 0, 3 }, /* R */
  743. },
  744. .flags = PIX_FMT_RGB,
  745. },
  746. [PIX_FMT_VAAPI_MOCO] = {
  747. .name = "vaapi_moco",
  748. .log2_chroma_w = 1,
  749. .log2_chroma_h = 1,
  750. .flags = PIX_FMT_HWACCEL,
  751. },
  752. [PIX_FMT_VAAPI_IDCT] = {
  753. .name = "vaapi_idct",
  754. .log2_chroma_w = 1,
  755. .log2_chroma_h = 1,
  756. .flags = PIX_FMT_HWACCEL,
  757. },
  758. [PIX_FMT_VAAPI_VLD] = {
  759. .name = "vaapi_vld",
  760. .log2_chroma_w = 1,
  761. .log2_chroma_h = 1,
  762. .flags = PIX_FMT_HWACCEL,
  763. },
  764. [PIX_FMT_VDA_VLD] = {
  765. .name = "vda_vld",
  766. .log2_chroma_w = 1,
  767. .log2_chroma_h = 1,
  768. .flags = PIX_FMT_HWACCEL,
  769. },
  770. [PIX_FMT_YUV420P9LE] = {
  771. .name = "yuv420p9le",
  772. .nb_components = 3,
  773. .log2_chroma_w = 1,
  774. .log2_chroma_h = 1,
  775. .comp = {
  776. { 0, 1, 1, 0, 8 }, /* Y */
  777. { 1, 1, 1, 0, 8 }, /* U */
  778. { 2, 1, 1, 0, 8 }, /* V */
  779. },
  780. .flags = PIX_FMT_PLANAR,
  781. },
  782. [PIX_FMT_YUV420P9BE] = {
  783. .name = "yuv420p9be",
  784. .nb_components = 3,
  785. .log2_chroma_w = 1,
  786. .log2_chroma_h = 1,
  787. .comp = {
  788. { 0, 1, 1, 0, 8 }, /* Y */
  789. { 1, 1, 1, 0, 8 }, /* U */
  790. { 2, 1, 1, 0, 8 }, /* V */
  791. },
  792. .flags = PIX_FMT_BE | PIX_FMT_PLANAR,
  793. },
  794. [PIX_FMT_YUV420P10LE] = {
  795. .name = "yuv420p10le",
  796. .nb_components = 3,
  797. .log2_chroma_w = 1,
  798. .log2_chroma_h = 1,
  799. .comp = {
  800. { 0, 1, 1, 0, 9 }, /* Y */
  801. { 1, 1, 1, 0, 9 }, /* U */
  802. { 2, 1, 1, 0, 9 }, /* V */
  803. },
  804. .flags = PIX_FMT_PLANAR,
  805. },
  806. [PIX_FMT_YUV420P10BE] = {
  807. .name = "yuv420p10be",
  808. .nb_components = 3,
  809. .log2_chroma_w = 1,
  810. .log2_chroma_h = 1,
  811. .comp = {
  812. { 0, 1, 1, 0, 9 }, /* Y */
  813. { 1, 1, 1, 0, 9 }, /* U */
  814. { 2, 1, 1, 0, 9 }, /* V */
  815. },
  816. .flags = PIX_FMT_BE | PIX_FMT_PLANAR,
  817. },
  818. [PIX_FMT_YUV420P16LE] = {
  819. .name = "yuv420p16le",
  820. .nb_components = 3,
  821. .log2_chroma_w = 1,
  822. .log2_chroma_h = 1,
  823. .comp = {
  824. { 0, 1, 1, 0, 15 }, /* Y */
  825. { 1, 1, 1, 0, 15 }, /* U */
  826. { 2, 1, 1, 0, 15 }, /* V */
  827. },
  828. .flags = PIX_FMT_PLANAR,
  829. },
  830. [PIX_FMT_YUV420P16BE] = {
  831. .name = "yuv420p16be",
  832. .nb_components = 3,
  833. .log2_chroma_w = 1,
  834. .log2_chroma_h = 1,
  835. .comp = {
  836. { 0, 1, 1, 0, 15 }, /* Y */
  837. { 1, 1, 1, 0, 15 }, /* U */
  838. { 2, 1, 1, 0, 15 }, /* V */
  839. },
  840. .flags = PIX_FMT_BE | PIX_FMT_PLANAR,
  841. },
  842. [PIX_FMT_YUV422P9LE] = {
  843. .name = "yuv422p9le",
  844. .nb_components = 3,
  845. .log2_chroma_w = 1,
  846. .log2_chroma_h = 0,
  847. .comp = {
  848. { 0, 1, 1, 0, 8 }, /* Y */
  849. { 1, 1, 1, 0, 8 }, /* U */
  850. { 2, 1, 1, 0, 8 }, /* V */
  851. },
  852. .flags = PIX_FMT_PLANAR,
  853. },
  854. [PIX_FMT_YUV422P9BE] = {
  855. .name = "yuv422p9be",
  856. .nb_components = 3,
  857. .log2_chroma_w = 1,
  858. .log2_chroma_h = 0,
  859. .comp = {
  860. { 0, 1, 1, 0, 8 }, /* Y */
  861. { 1, 1, 1, 0, 8 }, /* U */
  862. { 2, 1, 1, 0, 8 }, /* V */
  863. },
  864. .flags = PIX_FMT_BE | PIX_FMT_PLANAR,
  865. },
  866. [PIX_FMT_YUV422P10LE] = {
  867. .name = "yuv422p10le",
  868. .nb_components = 3,
  869. .log2_chroma_w = 1,
  870. .log2_chroma_h = 0,
  871. .comp = {
  872. { 0, 1, 1, 0, 9 }, /* Y */
  873. { 1, 1, 1, 0, 9 }, /* U */
  874. { 2, 1, 1, 0, 9 }, /* V */
  875. },
  876. .flags = PIX_FMT_PLANAR,
  877. },
  878. [PIX_FMT_YUV422P10BE] = {
  879. .name = "yuv422p10be",
  880. .nb_components = 3,
  881. .log2_chroma_w = 1,
  882. .log2_chroma_h = 0,
  883. .comp = {
  884. { 0, 1, 1, 0, 9 }, /* Y */
  885. { 1, 1, 1, 0, 9 }, /* U */
  886. { 2, 1, 1, 0, 9 }, /* V */
  887. },
  888. .flags = PIX_FMT_BE | PIX_FMT_PLANAR,
  889. },
  890. [PIX_FMT_YUV422P16LE] = {
  891. .name = "yuv422p16le",
  892. .nb_components = 3,
  893. .log2_chroma_w = 1,
  894. .log2_chroma_h = 0,
  895. .comp = {
  896. { 0, 1, 1, 0, 15 }, /* Y */
  897. { 1, 1, 1, 0, 15 }, /* U */
  898. { 2, 1, 1, 0, 15 }, /* V */
  899. },
  900. .flags = PIX_FMT_PLANAR,
  901. },
  902. [PIX_FMT_YUV422P16BE] = {
  903. .name = "yuv422p16be",
  904. .nb_components = 3,
  905. .log2_chroma_w = 1,
  906. .log2_chroma_h = 0,
  907. .comp = {
  908. { 0, 1, 1, 0, 15 }, /* Y */
  909. { 1, 1, 1, 0, 15 }, /* U */
  910. { 2, 1, 1, 0, 15 }, /* V */
  911. },
  912. .flags = PIX_FMT_BE | PIX_FMT_PLANAR,
  913. },
  914. [PIX_FMT_YUV444P16LE] = {
  915. .name = "yuv444p16le",
  916. .nb_components = 3,
  917. .log2_chroma_w = 0,
  918. .log2_chroma_h = 0,
  919. .comp = {
  920. { 0, 1, 1, 0, 15 }, /* Y */
  921. { 1, 1, 1, 0, 15 }, /* U */
  922. { 2, 1, 1, 0, 15 }, /* V */
  923. },
  924. .flags = PIX_FMT_PLANAR,
  925. },
  926. [PIX_FMT_YUV444P16BE] = {
  927. .name = "yuv444p16be",
  928. .nb_components = 3,
  929. .log2_chroma_w = 0,
  930. .log2_chroma_h = 0,
  931. .comp = {
  932. { 0, 1, 1, 0, 15 }, /* Y */
  933. { 1, 1, 1, 0, 15 }, /* U */
  934. { 2, 1, 1, 0, 15 }, /* V */
  935. },
  936. .flags = PIX_FMT_BE | PIX_FMT_PLANAR,
  937. },
  938. [PIX_FMT_YUV444P10LE] = {
  939. .name = "yuv444p10le",
  940. .nb_components = 3,
  941. .log2_chroma_w = 0,
  942. .log2_chroma_h = 0,
  943. .comp = {
  944. { 0, 1, 1, 0, 9 }, /* Y */
  945. { 1, 1, 1, 0, 9 }, /* U */
  946. { 2, 1, 1, 0, 9 }, /* V */
  947. },
  948. .flags = PIX_FMT_PLANAR,
  949. },
  950. [PIX_FMT_YUV444P10BE] = {
  951. .name = "yuv444p10be",
  952. .nb_components = 3,
  953. .log2_chroma_w = 0,
  954. .log2_chroma_h = 0,
  955. .comp = {
  956. { 0, 1, 1, 0, 9 }, /* Y */
  957. { 1, 1, 1, 0, 9 }, /* U */
  958. { 2, 1, 1, 0, 9 }, /* V */
  959. },
  960. .flags = PIX_FMT_BE | PIX_FMT_PLANAR,
  961. },
  962. [PIX_FMT_YUV444P9LE] = {
  963. .name = "yuv444p9le",
  964. .nb_components = 3,
  965. .log2_chroma_w = 0,
  966. .log2_chroma_h = 0,
  967. .comp = {
  968. { 0, 1, 1, 0, 8 }, /* Y */
  969. { 1, 1, 1, 0, 8 }, /* U */
  970. { 2, 1, 1, 0, 8 }, /* V */
  971. },
  972. .flags = PIX_FMT_PLANAR,
  973. },
  974. [PIX_FMT_YUV444P9BE] = {
  975. .name = "yuv444p9be",
  976. .nb_components = 3,
  977. .log2_chroma_w = 0,
  978. .log2_chroma_h = 0,
  979. .comp = {
  980. { 0, 1, 1, 0, 8 }, /* Y */
  981. { 1, 1, 1, 0, 8 }, /* U */
  982. { 2, 1, 1, 0, 8 }, /* V */
  983. },
  984. .flags = PIX_FMT_BE | PIX_FMT_PLANAR,
  985. },
  986. [PIX_FMT_DXVA2_VLD] = {
  987. .name = "dxva2_vld",
  988. .log2_chroma_w = 1,
  989. .log2_chroma_h = 1,
  990. .flags = PIX_FMT_HWACCEL,
  991. },
  992. [PIX_FMT_Y400A] = {
  993. .name = "y400a",
  994. .nb_components = 2,
  995. .comp = {
  996. { 0, 1, 1, 0, 7 }, /* Y */
  997. { 0, 1, 2, 0, 7 }, /* A */
  998. },
  999. },
  1000. [PIX_FMT_GBRP] = {
  1001. .name = "gbrp",
  1002. .nb_components = 3,
  1003. .log2_chroma_w = 0,
  1004. .log2_chroma_h = 0,
  1005. .comp = {
  1006. { 0, 0, 1, 0, 7 }, /* G */
  1007. { 1, 0, 1, 0, 7 }, /* B */
  1008. { 2, 0, 1, 0, 7 }, /* R */
  1009. },
  1010. .flags = PIX_FMT_PLANAR | PIX_FMT_RGB,
  1011. },
  1012. [PIX_FMT_GBRP9LE] = {
  1013. .name = "gbrp9le",
  1014. .nb_components = 3,
  1015. .log2_chroma_w = 0,
  1016. .log2_chroma_h = 0,
  1017. .comp = {
  1018. { 0, 1, 1, 0, 8 }, /* G */
  1019. { 1, 1, 1, 0, 8 }, /* B */
  1020. { 2, 1, 1, 0, 8 }, /* R */
  1021. },
  1022. .flags = PIX_FMT_PLANAR | PIX_FMT_RGB,
  1023. },
  1024. [PIX_FMT_GBRP9BE] = {
  1025. .name = "gbrp9be",
  1026. .nb_components = 3,
  1027. .log2_chroma_w = 0,
  1028. .log2_chroma_h = 0,
  1029. .comp = {
  1030. { 0, 1, 1, 0, 8 }, /* G */
  1031. { 1, 1, 1, 0, 8 }, /* B */
  1032. { 2, 1, 1, 0, 8 }, /* R */
  1033. },
  1034. .flags = PIX_FMT_BE | PIX_FMT_PLANAR | PIX_FMT_RGB,
  1035. },
  1036. [PIX_FMT_GBRP10LE] = {
  1037. .name = "gbrp10le",
  1038. .nb_components = 3,
  1039. .log2_chroma_w = 0,
  1040. .log2_chroma_h = 0,
  1041. .comp = {
  1042. { 0, 1, 1, 0, 9 }, /* G */
  1043. { 1, 1, 1, 0, 9 }, /* B */
  1044. { 2, 1, 1, 0, 9 }, /* R */
  1045. },
  1046. .flags = PIX_FMT_PLANAR | PIX_FMT_RGB,
  1047. },
  1048. [PIX_FMT_GBRP10BE] = {
  1049. .name = "gbrp10be",
  1050. .nb_components = 3,
  1051. .log2_chroma_w = 0,
  1052. .log2_chroma_h = 0,
  1053. .comp = {
  1054. { 0, 1, 1, 0, 9 }, /* G */
  1055. { 1, 1, 1, 0, 9 }, /* B */
  1056. { 2, 1, 1, 0, 9 }, /* R */
  1057. },
  1058. .flags = PIX_FMT_BE | PIX_FMT_PLANAR | PIX_FMT_RGB,
  1059. },
  1060. [PIX_FMT_GBRP16LE] = {
  1061. .name = "gbrp16le",
  1062. .nb_components = 3,
  1063. .log2_chroma_w = 0,
  1064. .log2_chroma_h = 0,
  1065. .comp = {
  1066. { 0, 1, 1, 0, 15 }, /* G */
  1067. { 1, 1, 1, 0, 15 }, /* B */
  1068. { 2, 1, 1, 0, 15 }, /* R */
  1069. },
  1070. .flags = PIX_FMT_PLANAR | PIX_FMT_RGB,
  1071. },
  1072. [PIX_FMT_GBRP16BE] = {
  1073. .name = "gbrp16be",
  1074. .nb_components = 3,
  1075. .log2_chroma_w = 0,
  1076. .log2_chroma_h = 0,
  1077. .comp = {
  1078. { 0, 1, 1, 0, 15 }, /* G */
  1079. { 1, 1, 1, 0, 15 }, /* B */
  1080. { 2, 1, 1, 0, 15 }, /* R */
  1081. },
  1082. .flags = PIX_FMT_BE | PIX_FMT_PLANAR | PIX_FMT_RGB,
  1083. },
  1084. };
  1085. static enum PixelFormat get_pix_fmt_internal(const char *name)
  1086. {
  1087. enum PixelFormat pix_fmt;
  1088. for (pix_fmt = 0; pix_fmt < PIX_FMT_NB; pix_fmt++)
  1089. if (av_pix_fmt_descriptors[pix_fmt].name &&
  1090. !strcmp(av_pix_fmt_descriptors[pix_fmt].name, name))
  1091. return pix_fmt;
  1092. return PIX_FMT_NONE;
  1093. }
  1094. const char *av_get_pix_fmt_name(enum PixelFormat pix_fmt)
  1095. {
  1096. return (unsigned)pix_fmt < PIX_FMT_NB ?
  1097. av_pix_fmt_descriptors[pix_fmt].name : NULL;
  1098. }
  1099. #if HAVE_BIGENDIAN
  1100. # define X_NE(be, le) be
  1101. #else
  1102. # define X_NE(be, le) le
  1103. #endif
  1104. enum PixelFormat av_get_pix_fmt(const char *name)
  1105. {
  1106. enum PixelFormat pix_fmt;
  1107. if (!strcmp(name, "rgb32"))
  1108. name = X_NE("argb", "bgra");
  1109. else if (!strcmp(name, "bgr32"))
  1110. name = X_NE("abgr", "rgba");
  1111. pix_fmt = get_pix_fmt_internal(name);
  1112. if (pix_fmt == PIX_FMT_NONE) {
  1113. char name2[32];
  1114. snprintf(name2, sizeof(name2), "%s%s", name, X_NE("be", "le"));
  1115. pix_fmt = get_pix_fmt_internal(name2);
  1116. }
  1117. return pix_fmt;
  1118. }
  1119. int av_get_bits_per_pixel(const AVPixFmtDescriptor *pixdesc)
  1120. {
  1121. int c, bits = 0;
  1122. int log2_pixels = pixdesc->log2_chroma_w + pixdesc->log2_chroma_h;
  1123. for (c = 0; c < pixdesc->nb_components; c++) {
  1124. int s = c == 1 || c == 2 ? 0 : log2_pixels;
  1125. bits += (pixdesc->comp[c].depth_minus1 + 1) << s;
  1126. }
  1127. return bits >> log2_pixels;
  1128. }
  1129. char *av_get_pix_fmt_string (char *buf, int buf_size, enum PixelFormat pix_fmt)
  1130. {
  1131. /* print header */
  1132. if (pix_fmt < 0) {
  1133. snprintf (buf, buf_size, "name" " nb_components" " nb_bits");
  1134. } else {
  1135. const AVPixFmtDescriptor *pixdesc = &av_pix_fmt_descriptors[pix_fmt];
  1136. snprintf(buf, buf_size, "%-11s %7d %10d", pixdesc->name,
  1137. pixdesc->nb_components, av_get_bits_per_pixel(pixdesc));
  1138. }
  1139. return buf;
  1140. }