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.

597 lines
16KB

  1. /*
  2. * pixel format descriptor
  3. * Copyright (c) 2009 Michael Niedermayer <michaelni@gmx.at>
  4. *
  5. * This file is part of FFmpeg.
  6. *
  7. * FFmpeg 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. * FFmpeg 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 FFmpeg; if not, write to the Free Software
  19. * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  20. */
  21. #include "libavutil/pixfmt.h"
  22. #include "pixdesc.h"
  23. const AVPixFmtDescriptor av_pix_fmt_descriptors[PIX_FMT_NB] = {
  24. [PIX_FMT_YUV420P] = {
  25. .name = "yuv420p",
  26. .nb_channels = 3,
  27. .log2_chroma_w= 1,
  28. .log2_chroma_h= 1,
  29. .comp = {
  30. {0,0,1,0,7}, /* Y */
  31. {1,0,1,0,7}, /* U */
  32. {2,0,1,0,7}, /* V */
  33. },
  34. },
  35. [PIX_FMT_YUYV422] = {
  36. .name = "yuyv422",
  37. .nb_channels = 3,
  38. .log2_chroma_w= 1,
  39. .log2_chroma_h= 0,
  40. .comp = {
  41. {0,1,1,0,7}, /* Y */
  42. {0,3,2,0,7}, /* U */
  43. {0,3,4,0,7}, /* V */
  44. },
  45. },
  46. [PIX_FMT_RGB24] = {
  47. .name = "rgb24",
  48. .nb_channels = 3,
  49. .log2_chroma_w= 0,
  50. .log2_chroma_h= 0,
  51. .comp = {
  52. {0,2,1,0,7}, /* R */
  53. {0,2,2,0,7}, /* G */
  54. {0,2,3,0,7}, /* B */
  55. },
  56. },
  57. [PIX_FMT_BGR24] = {
  58. .name = "bgr24",
  59. .nb_channels = 3,
  60. .log2_chroma_w= 0,
  61. .log2_chroma_h= 0,
  62. .comp = {
  63. {0,2,1,0,7}, /* B */
  64. {0,2,2,0,7}, /* G */
  65. {0,2,3,0,7}, /* R */
  66. },
  67. },
  68. [PIX_FMT_YUV422P] = {
  69. .name = "yuv422p",
  70. .nb_channels = 3,
  71. .log2_chroma_w= 1,
  72. .log2_chroma_h= 0,
  73. .comp = {
  74. {0,0,1,0,7}, /* Y */
  75. {1,0,1,0,7}, /* U */
  76. {2,0,1,0,7}, /* V */
  77. },
  78. },
  79. [PIX_FMT_YUV444P] = {
  80. .name = "yuv444p",
  81. .nb_channels = 3,
  82. .log2_chroma_w= 0,
  83. .log2_chroma_h= 0,
  84. .comp = {
  85. {0,0,1,0,7}, /* Y */
  86. {1,0,1,0,7}, /* U */
  87. {2,0,1,0,7}, /* V */
  88. },
  89. },
  90. [PIX_FMT_YUV410P] = {
  91. .name = "yuv410p",
  92. .nb_channels = 3,
  93. .log2_chroma_w= 2,
  94. .log2_chroma_h= 2,
  95. .comp = {
  96. {0,0,1,0,7}, /* Y */
  97. {1,0,1,0,7}, /* U */
  98. {2,0,1,0,7}, /* V */
  99. },
  100. },
  101. [PIX_FMT_YUV411P] = {
  102. .name = "yuv411p",
  103. .nb_channels = 3,
  104. .log2_chroma_w= 2,
  105. .log2_chroma_h= 0,
  106. .comp = {
  107. {0,0,1,0,7}, /* Y */
  108. {1,0,1,0,7}, /* U */
  109. {2,0,1,0,7}, /* V */
  110. },
  111. },
  112. [PIX_FMT_GRAY8] = {
  113. .name = "gray8",
  114. .nb_channels = 1,
  115. .log2_chroma_w= 0,
  116. .log2_chroma_h= 0,
  117. .comp = {
  118. {0,0,1,0,7}, /* Y */
  119. },
  120. },
  121. [PIX_FMT_MONOWHITE] = {
  122. .name = "monowhite",
  123. .nb_channels = 1,
  124. .log2_chroma_w= 0,
  125. .log2_chroma_h= 0,
  126. .comp = {
  127. {0,0,1,0,0}, /* Y */
  128. },
  129. .flags = PIX_FMT_BITSTREAM,
  130. },
  131. [PIX_FMT_MONOBLACK] = {
  132. .name = "monoblack",
  133. .nb_channels = 1,
  134. .log2_chroma_w= 0,
  135. .log2_chroma_h= 0,
  136. .comp = {
  137. {0,0,1,7,0}, /* Y */
  138. },
  139. .flags = PIX_FMT_BITSTREAM,
  140. },
  141. [PIX_FMT_PAL8] = {
  142. .name = "pal8",
  143. .nb_channels = 1,
  144. .log2_chroma_w= 0,
  145. .log2_chroma_h= 0,
  146. .comp = {
  147. {0,0,1,0,7},
  148. },
  149. .flags = PIX_FMT_PAL,
  150. },
  151. [PIX_FMT_YUVJ420P] = {
  152. .name = "yuvj420p",
  153. .nb_channels = 3,
  154. .log2_chroma_w= 1,
  155. .log2_chroma_h= 1,
  156. .comp = {
  157. {0,0,1,0,7}, /* Y */
  158. {1,0,1,0,7}, /* U */
  159. {2,0,1,0,7}, /* V */
  160. },
  161. },
  162. [PIX_FMT_YUVJ422P] = {
  163. .name = "yuvj422p",
  164. .nb_channels = 3,
  165. .log2_chroma_w= 1,
  166. .log2_chroma_h= 0,
  167. .comp = {
  168. {0,0,1,0,7}, /* Y */
  169. {1,0,1,0,7}, /* U */
  170. {2,0,1,0,7}, /* V */
  171. },
  172. },
  173. [PIX_FMT_YUVJ444P] = {
  174. .name = "yuvj444p",
  175. .nb_channels = 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. },
  184. [PIX_FMT_UYVY422] = {
  185. .name = "uyvy422",
  186. .nb_channels = 3,
  187. .log2_chroma_w= 1,
  188. .log2_chroma_h= 0,
  189. .comp = {
  190. {0,1,2,0,7}, /* Y */
  191. {0,3,1,0,7}, /* U */
  192. {0,3,3,0,7}, /* V */
  193. },
  194. },
  195. [PIX_FMT_UYYVYY411] = {
  196. .name = "uyyvyy411",
  197. .nb_channels = 3,
  198. .log2_chroma_w= 2,
  199. .log2_chroma_h= 0,
  200. .comp = {
  201. {0,3,2,0,7}, /* Y */
  202. {0,5,1,0,7}, /* U */
  203. {0,5,4,0,7}, /* V */
  204. },
  205. },
  206. [PIX_FMT_BGR8] = {
  207. .name = "bgr8",
  208. .nb_channels = 3,
  209. .log2_chroma_w= 0,
  210. .log2_chroma_h= 0,
  211. .comp = {
  212. {0,0,1,6,1}, /* B */
  213. {0,0,1,3,2}, /* G */
  214. {0,0,1,0,2}, /* R */
  215. },
  216. },
  217. [PIX_FMT_BGR4] = {
  218. .name = "bgr4",
  219. .nb_channels = 3,
  220. .log2_chroma_w= 0,
  221. .log2_chroma_h= 0,
  222. .comp = {
  223. {0,3,1,0,0}, /* B */
  224. {0,3,2,0,1}, /* G */
  225. {0,3,4,0,0}, /* R */
  226. },
  227. .flags = PIX_FMT_BITSTREAM,
  228. },
  229. [PIX_FMT_BGR4_BYTE] = {
  230. .name = "bgr4_byte",
  231. .nb_channels = 3,
  232. .log2_chroma_w= 0,
  233. .log2_chroma_h= 0,
  234. .comp = {
  235. {0,0,1,3,0}, /* B */
  236. {0,0,1,1,1}, /* G */
  237. {0,0,1,0,0}, /* R */
  238. },
  239. },
  240. [PIX_FMT_RGB8] = {
  241. .name = "rgb8",
  242. .nb_channels = 3,
  243. .log2_chroma_w= 0,
  244. .log2_chroma_h= 0,
  245. .comp = {
  246. {0,0,1,6,1}, /* R */
  247. {0,0,1,3,2}, /* G */
  248. {0,0,1,0,2}, /* B */
  249. },
  250. },
  251. [PIX_FMT_RGB4] = {
  252. .name = "rgb4",
  253. .nb_channels = 3,
  254. .log2_chroma_w= 0,
  255. .log2_chroma_h= 0,
  256. .comp = {
  257. {0,3,1,0,0}, /* R */
  258. {0,3,2,0,1}, /* G */
  259. {0,3,4,0,0}, /* B */
  260. },
  261. .flags = PIX_FMT_BITSTREAM,
  262. },
  263. [PIX_FMT_RGB4_BYTE] = {
  264. .name = "rgb4_byte",
  265. .nb_channels = 3,
  266. .log2_chroma_w= 0,
  267. .log2_chroma_h= 0,
  268. .comp = {
  269. {0,0,1,3,0}, /* R */
  270. {0,0,1,1,1}, /* G */
  271. {0,0,1,0,0}, /* B */
  272. },
  273. },
  274. [PIX_FMT_NV12] = {
  275. .name = "nv12",
  276. .nb_channels = 3,
  277. .log2_chroma_w= 1,
  278. .log2_chroma_h= 1,
  279. .comp = {
  280. {0,0,1,0,7}, /* Y */
  281. {1,1,1,0,7}, /* U */
  282. {1,1,2,0,7}, /* V */
  283. },
  284. },
  285. [PIX_FMT_NV21] = {
  286. .name = "nv21",
  287. .nb_channels = 3,
  288. .log2_chroma_w= 1,
  289. .log2_chroma_h= 1,
  290. .comp = {
  291. {0,0,1,0,7}, /* Y */
  292. {1,1,1,0,7}, /* V */
  293. {1,1,2,0,7}, /* U */
  294. },
  295. },
  296. [PIX_FMT_ARGB] = {
  297. .name = "argb",
  298. .nb_channels = 4,
  299. .log2_chroma_w= 0,
  300. .log2_chroma_h= 0,
  301. .comp = {
  302. {0,3,1,0,7}, /* A */
  303. {0,3,2,0,7}, /* R */
  304. {0,3,3,0,7}, /* G */
  305. {0,3,4,0,7}, /* B */
  306. },
  307. },
  308. [PIX_FMT_RGBA] = {
  309. .name = "rgba",
  310. .nb_channels = 4,
  311. .log2_chroma_w= 0,
  312. .log2_chroma_h= 0,
  313. .comp = {
  314. {0,3,1,0,7}, /* R */
  315. {0,3,2,0,7}, /* G */
  316. {0,3,3,0,7}, /* B */
  317. {0,3,4,0,7}, /* A */
  318. },
  319. },
  320. [PIX_FMT_ABGR] = {
  321. .name = "abgr",
  322. .nb_channels = 4,
  323. .log2_chroma_w= 0,
  324. .log2_chroma_h= 0,
  325. .comp = {
  326. {0,3,1,0,7}, /* A */
  327. {0,3,2,0,7}, /* B */
  328. {0,3,3,0,7}, /* G */
  329. {0,3,4,0,7}, /* R */
  330. },
  331. },
  332. [PIX_FMT_BGRA] = {
  333. .name = "bgra",
  334. .nb_channels = 4,
  335. .log2_chroma_w= 0,
  336. .log2_chroma_h= 0,
  337. .comp = {
  338. {0,3,1,0,7}, /* B */
  339. {0,3,2,0,7}, /* G */
  340. {0,3,3,0,7}, /* R */
  341. {0,3,4,0,7}, /* A */
  342. },
  343. },
  344. [PIX_FMT_GRAY16BE] = {
  345. .name = "gray16be",
  346. .nb_channels = 1,
  347. .log2_chroma_w= 0,
  348. .log2_chroma_h= 0,
  349. .comp = {
  350. {0,1,1,0,15}, /* Y */
  351. },
  352. .flags = PIX_FMT_BE,
  353. },
  354. [PIX_FMT_GRAY16LE] = {
  355. .name = "gray16le",
  356. .nb_channels = 1,
  357. .log2_chroma_w= 0,
  358. .log2_chroma_h= 0,
  359. .comp = {
  360. {0,1,1,0,15}, /* Y */
  361. },
  362. },
  363. [PIX_FMT_YUV440P] = {
  364. .name = "yuv440p",
  365. .nb_channels = 3,
  366. .log2_chroma_w= 0,
  367. .log2_chroma_h= 1,
  368. .comp = {
  369. {0,0,1,0,7}, /* Y */
  370. {1,0,1,0,7}, /* U */
  371. {2,0,1,0,7}, /* V */
  372. },
  373. },
  374. [PIX_FMT_YUVJ440P] = {
  375. .name = "yuvj440p",
  376. .nb_channels = 3,
  377. .log2_chroma_w= 0,
  378. .log2_chroma_h= 1,
  379. .comp = {
  380. {0,0,1,0,7}, /* Y */
  381. {1,0,1,0,7}, /* U */
  382. {2,0,1,0,7}, /* V */
  383. },
  384. },
  385. [PIX_FMT_YUVA420P] = {
  386. .name = "yuva420p",
  387. .nb_channels = 4,
  388. .log2_chroma_w= 1,
  389. .log2_chroma_h= 1,
  390. .comp = {
  391. {0,0,1,0,7}, /* Y */
  392. {1,0,1,0,7}, /* U */
  393. {2,0,1,0,7}, /* V */
  394. {3,0,1,0,7}, /* A */
  395. },
  396. },
  397. [PIX_FMT_RGB48BE] = {
  398. .name = "rgb48be",
  399. .nb_channels = 3,
  400. .log2_chroma_w= 0,
  401. .log2_chroma_h= 0,
  402. .comp = {
  403. {0,5,1,0,15}, /* R */
  404. {0,5,3,0,15}, /* G */
  405. {0,5,5,0,15}, /* B */
  406. },
  407. .flags = PIX_FMT_BE,
  408. },
  409. [PIX_FMT_RGB48LE] = {
  410. .name = "rgb48le",
  411. .nb_channels = 3,
  412. .log2_chroma_w= 0,
  413. .log2_chroma_h= 0,
  414. .comp = {
  415. {0,5,1,0,15}, /* R */
  416. {0,5,3,0,15}, /* G */
  417. {0,5,5,0,15}, /* B */
  418. },
  419. },
  420. [PIX_FMT_RGB565BE] = {
  421. .name = "rgb565be",
  422. .nb_channels = 3,
  423. .log2_chroma_w= 0,
  424. .log2_chroma_h= 0,
  425. .comp = {
  426. {0,1,0,3,4}, /* R */
  427. {0,1,1,5,5}, /* G */
  428. {0,1,1,0,4}, /* B */
  429. },
  430. .flags = PIX_FMT_BE,
  431. },
  432. [PIX_FMT_RGB565LE] = {
  433. .name = "rgb565le",
  434. .nb_channels = 3,
  435. .log2_chroma_w= 0,
  436. .log2_chroma_h= 0,
  437. .comp = {
  438. {0,1,2,3,4}, /* R */
  439. {0,1,1,5,5}, /* G */
  440. {0,1,1,0,4}, /* B */
  441. },
  442. },
  443. [PIX_FMT_RGB555BE] = {
  444. .name = "rgb555be",
  445. .nb_channels = 3,
  446. .log2_chroma_w= 0,
  447. .log2_chroma_h= 0,
  448. .comp = {
  449. {0,1,0,2,4}, /* R */
  450. {0,1,1,5,4}, /* G */
  451. {0,1,1,0,4}, /* B */
  452. },
  453. .flags = PIX_FMT_BE,
  454. },
  455. [PIX_FMT_RGB555LE] = {
  456. .name = "rgb555le",
  457. .nb_channels = 3,
  458. .log2_chroma_w= 0,
  459. .log2_chroma_h= 0,
  460. .comp = {
  461. {0,1,2,2,4}, /* R */
  462. {0,1,1,5,4}, /* G */
  463. {0,1,1,0,4}, /* B */
  464. },
  465. },
  466. [PIX_FMT_BGR565BE] = {
  467. .name = "bgr565be",
  468. .nb_channels = 3,
  469. .log2_chroma_w= 0,
  470. .log2_chroma_h= 0,
  471. .comp = {
  472. {0,1,0,3,4}, /* B */
  473. {0,1,1,5,5}, /* G */
  474. {0,1,1,0,4}, /* R */
  475. },
  476. .flags = PIX_FMT_BE,
  477. },
  478. [PIX_FMT_BGR565LE] = {
  479. .name = "bgr565le",
  480. .nb_channels = 3,
  481. .log2_chroma_w= 0,
  482. .log2_chroma_h= 0,
  483. .comp = {
  484. {0,1,2,3,4}, /* B */
  485. {0,1,1,5,5}, /* G */
  486. {0,1,1,0,4}, /* R */
  487. },
  488. },
  489. [PIX_FMT_BGR555BE] = {
  490. .name = "bgr555be",
  491. .nb_channels = 3,
  492. .log2_chroma_w= 0,
  493. .log2_chroma_h= 0,
  494. .comp = {
  495. {0,1,0,2,4}, /* B */
  496. {0,1,1,5,4}, /* G */
  497. {0,1,1,0,4}, /* R */
  498. },
  499. .flags = PIX_FMT_BE,
  500. },
  501. [PIX_FMT_BGR555LE] = {
  502. .name = "bgr555le",
  503. .nb_channels = 3,
  504. .log2_chroma_w= 0,
  505. .log2_chroma_h= 0,
  506. .comp = {
  507. {0,1,2,2,4}, /* B */
  508. {0,1,1,5,4}, /* G */
  509. {0,1,1,0,4}, /* R */
  510. },
  511. },
  512. [PIX_FMT_YUV420PLE] = {
  513. .name = "yuv420ple",
  514. .nb_channels = 3,
  515. .log2_chroma_w= 1,
  516. .log2_chroma_h= 1,
  517. .comp = {
  518. {0,1,1,0,15}, /* Y */
  519. {1,1,1,0,15}, /* U */
  520. {2,1,1,0,15}, /* V */
  521. },
  522. },
  523. [PIX_FMT_YUV420PBE] = {
  524. .name = "yuv420pbe",
  525. .nb_channels = 3,
  526. .log2_chroma_w= 1,
  527. .log2_chroma_h= 1,
  528. .comp = {
  529. {0,1,1,0,15}, /* Y */
  530. {1,1,1,0,15}, /* U */
  531. {2,1,1,0,15}, /* V */
  532. },
  533. .flags = PIX_FMT_BE,
  534. },
  535. [PIX_FMT_YUV422PLE] = {
  536. .name = "yuv422ple",
  537. .nb_channels = 3,
  538. .log2_chroma_w= 1,
  539. .log2_chroma_h= 0,
  540. .comp = {
  541. {0,1,1,0,15}, /* Y */
  542. {1,1,1,0,15}, /* U */
  543. {2,1,1,0,15}, /* V */
  544. },
  545. },
  546. [PIX_FMT_YUV422PBE] = {
  547. .name = "yuv422pbe",
  548. .nb_channels = 3,
  549. .log2_chroma_w= 1,
  550. .log2_chroma_h= 0,
  551. .comp = {
  552. {0,1,1,0,15}, /* Y */
  553. {1,1,1,0,15}, /* U */
  554. {2,1,1,0,15}, /* V */
  555. },
  556. .flags = PIX_FMT_BE,
  557. },
  558. [PIX_FMT_YUV444PLE] = {
  559. .name = "yuv444ple",
  560. .nb_channels = 3,
  561. .log2_chroma_w= 0,
  562. .log2_chroma_h= 0,
  563. .comp = {
  564. {0,1,1,0,15}, /* Y */
  565. {1,1,1,0,15}, /* U */
  566. {2,1,1,0,15}, /* V */
  567. },
  568. },
  569. [PIX_FMT_YUV444PBE] = {
  570. .name = "yuv444pbe",
  571. .nb_channels = 3,
  572. .log2_chroma_w= 0,
  573. .log2_chroma_h= 0,
  574. .comp = {
  575. {0,1,1,0,15}, /* Y */
  576. {1,1,1,0,15}, /* U */
  577. {2,1,1,0,15}, /* V */
  578. },
  579. .flags = PIX_FMT_BE,
  580. },
  581. };
  582. int av_get_bits_per_pixel(const AVPixFmtDescriptor *pixdesc)
  583. {
  584. int c, bits = 0;
  585. int log2_pixels = pixdesc->log2_chroma_w + pixdesc->log2_chroma_h;
  586. for (c = 0; c < pixdesc->nb_channels; c++) {
  587. int s = c==1 || c==2 ? 0 : log2_pixels;
  588. bits += (pixdesc->comp[c].depth_minus1+1) << s;
  589. }
  590. return bits >> log2_pixels;
  591. }