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.

663 lines
17KB

  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 "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_components= 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_components= 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_components= 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_components= 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_components= 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_components= 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_components= 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_components= 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 = "gray",
  114. .nb_components= 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 = "monow",
  123. .nb_components= 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 = "monob",
  133. .nb_components= 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_components= 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_components= 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_components= 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_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. },
  184. [PIX_FMT_XVMC_MPEG2_MC] = {
  185. .name = "xvmcmc",
  186. .flags = PIX_FMT_HWACCEL,
  187. },
  188. [PIX_FMT_XVMC_MPEG2_IDCT] = {
  189. .name = "xvmcidct",
  190. .flags = PIX_FMT_HWACCEL,
  191. },
  192. [PIX_FMT_UYVY422] = {
  193. .name = "uyvy422",
  194. .nb_components= 3,
  195. .log2_chroma_w= 1,
  196. .log2_chroma_h= 0,
  197. .comp = {
  198. {0,1,2,0,7}, /* Y */
  199. {0,3,1,0,7}, /* U */
  200. {0,3,3,0,7}, /* V */
  201. },
  202. },
  203. [PIX_FMT_UYYVYY411] = {
  204. .name = "uyyvyy411",
  205. .nb_components= 3,
  206. .log2_chroma_w= 2,
  207. .log2_chroma_h= 0,
  208. .comp = {
  209. {0,3,2,0,7}, /* Y */
  210. {0,5,1,0,7}, /* U */
  211. {0,5,4,0,7}, /* V */
  212. },
  213. },
  214. [PIX_FMT_BGR8] = {
  215. .name = "bgr8",
  216. .nb_components= 3,
  217. .log2_chroma_w= 0,
  218. .log2_chroma_h= 0,
  219. .comp = {
  220. {0,0,1,6,1}, /* B */
  221. {0,0,1,3,2}, /* G */
  222. {0,0,1,0,2}, /* R */
  223. },
  224. .flags = PIX_FMT_PAL,
  225. },
  226. [PIX_FMT_BGR4] = {
  227. .name = "bgr4",
  228. .nb_components= 3,
  229. .log2_chroma_w= 0,
  230. .log2_chroma_h= 0,
  231. .comp = {
  232. {0,3,1,0,0}, /* B */
  233. {0,3,2,0,1}, /* G */
  234. {0,3,4,0,0}, /* R */
  235. },
  236. .flags = PIX_FMT_BITSTREAM,
  237. },
  238. [PIX_FMT_BGR4_BYTE] = {
  239. .name = "bgr4_byte",
  240. .nb_components= 3,
  241. .log2_chroma_w= 0,
  242. .log2_chroma_h= 0,
  243. .comp = {
  244. {0,0,1,3,0}, /* B */
  245. {0,0,1,1,1}, /* G */
  246. {0,0,1,0,0}, /* R */
  247. },
  248. .flags = PIX_FMT_PAL,
  249. },
  250. [PIX_FMT_RGB8] = {
  251. .name = "rgb8",
  252. .nb_components= 3,
  253. .log2_chroma_w= 0,
  254. .log2_chroma_h= 0,
  255. .comp = {
  256. {0,0,1,6,1}, /* R */
  257. {0,0,1,3,2}, /* G */
  258. {0,0,1,0,2}, /* B */
  259. },
  260. .flags = PIX_FMT_PAL,
  261. },
  262. [PIX_FMT_RGB4] = {
  263. .name = "rgb4",
  264. .nb_components= 3,
  265. .log2_chroma_w= 0,
  266. .log2_chroma_h= 0,
  267. .comp = {
  268. {0,3,1,0,0}, /* R */
  269. {0,3,2,0,1}, /* G */
  270. {0,3,4,0,0}, /* B */
  271. },
  272. .flags = PIX_FMT_BITSTREAM,
  273. },
  274. [PIX_FMT_RGB4_BYTE] = {
  275. .name = "rgb4_byte",
  276. .nb_components= 3,
  277. .log2_chroma_w= 0,
  278. .log2_chroma_h= 0,
  279. .comp = {
  280. {0,0,1,3,0}, /* R */
  281. {0,0,1,1,1}, /* G */
  282. {0,0,1,0,0}, /* B */
  283. },
  284. .flags = PIX_FMT_PAL,
  285. },
  286. [PIX_FMT_NV12] = {
  287. .name = "nv12",
  288. .nb_components= 3,
  289. .log2_chroma_w= 1,
  290. .log2_chroma_h= 1,
  291. .comp = {
  292. {0,0,1,0,7}, /* Y */
  293. {1,1,1,0,7}, /* U */
  294. {1,1,2,0,7}, /* V */
  295. },
  296. },
  297. [PIX_FMT_NV21] = {
  298. .name = "nv21",
  299. .nb_components= 3,
  300. .log2_chroma_w= 1,
  301. .log2_chroma_h= 1,
  302. .comp = {
  303. {0,0,1,0,7}, /* Y */
  304. {1,1,1,0,7}, /* V */
  305. {1,1,2,0,7}, /* U */
  306. },
  307. },
  308. [PIX_FMT_ARGB] = {
  309. .name = "argb",
  310. .nb_components= 4,
  311. .log2_chroma_w= 0,
  312. .log2_chroma_h= 0,
  313. .comp = {
  314. {0,3,1,0,7}, /* A */
  315. {0,3,2,0,7}, /* R */
  316. {0,3,3,0,7}, /* G */
  317. {0,3,4,0,7}, /* B */
  318. },
  319. },
  320. [PIX_FMT_RGBA] = {
  321. .name = "rgba",
  322. .nb_components= 4,
  323. .log2_chroma_w= 0,
  324. .log2_chroma_h= 0,
  325. .comp = {
  326. {0,3,1,0,7}, /* R */
  327. {0,3,2,0,7}, /* G */
  328. {0,3,3,0,7}, /* B */
  329. {0,3,4,0,7}, /* A */
  330. },
  331. },
  332. [PIX_FMT_ABGR] = {
  333. .name = "abgr",
  334. .nb_components= 4,
  335. .log2_chroma_w= 0,
  336. .log2_chroma_h= 0,
  337. .comp = {
  338. {0,3,1,0,7}, /* A */
  339. {0,3,2,0,7}, /* B */
  340. {0,3,3,0,7}, /* G */
  341. {0,3,4,0,7}, /* R */
  342. },
  343. },
  344. [PIX_FMT_BGRA] = {
  345. .name = "bgra",
  346. .nb_components= 4,
  347. .log2_chroma_w= 0,
  348. .log2_chroma_h= 0,
  349. .comp = {
  350. {0,3,1,0,7}, /* B */
  351. {0,3,2,0,7}, /* G */
  352. {0,3,3,0,7}, /* R */
  353. {0,3,4,0,7}, /* A */
  354. },
  355. },
  356. [PIX_FMT_GRAY16BE] = {
  357. .name = "gray16be",
  358. .nb_components= 1,
  359. .log2_chroma_w= 0,
  360. .log2_chroma_h= 0,
  361. .comp = {
  362. {0,1,1,0,15}, /* Y */
  363. },
  364. .flags = PIX_FMT_BE,
  365. },
  366. [PIX_FMT_GRAY16LE] = {
  367. .name = "gray16le",
  368. .nb_components= 1,
  369. .log2_chroma_w= 0,
  370. .log2_chroma_h= 0,
  371. .comp = {
  372. {0,1,1,0,15}, /* Y */
  373. },
  374. },
  375. [PIX_FMT_YUV440P] = {
  376. .name = "yuv440p",
  377. .nb_components= 3,
  378. .log2_chroma_w= 0,
  379. .log2_chroma_h= 1,
  380. .comp = {
  381. {0,0,1,0,7}, /* Y */
  382. {1,0,1,0,7}, /* U */
  383. {2,0,1,0,7}, /* V */
  384. },
  385. },
  386. [PIX_FMT_YUVJ440P] = {
  387. .name = "yuvj440p",
  388. .nb_components= 3,
  389. .log2_chroma_w= 0,
  390. .log2_chroma_h= 1,
  391. .comp = {
  392. {0,0,1,0,7}, /* Y */
  393. {1,0,1,0,7}, /* U */
  394. {2,0,1,0,7}, /* V */
  395. },
  396. },
  397. [PIX_FMT_YUVA420P] = {
  398. .name = "yuva420p",
  399. .nb_components= 4,
  400. .log2_chroma_w= 1,
  401. .log2_chroma_h= 1,
  402. .comp = {
  403. {0,0,1,0,7}, /* Y */
  404. {1,0,1,0,7}, /* U */
  405. {2,0,1,0,7}, /* V */
  406. {3,0,1,0,7}, /* A */
  407. },
  408. },
  409. [PIX_FMT_VDPAU_H264] = {
  410. .name = "vdpau_h264",
  411. .log2_chroma_w = 1,
  412. .log2_chroma_h = 1,
  413. .flags = PIX_FMT_HWACCEL,
  414. },
  415. [PIX_FMT_VDPAU_MPEG1] = {
  416. .name = "vdpau_mpeg1",
  417. .log2_chroma_w = 1,
  418. .log2_chroma_h = 1,
  419. .flags = PIX_FMT_HWACCEL,
  420. },
  421. [PIX_FMT_VDPAU_MPEG2] = {
  422. .name = "vdpau_mpeg2",
  423. .log2_chroma_w = 1,
  424. .log2_chroma_h = 1,
  425. .flags = PIX_FMT_HWACCEL,
  426. },
  427. [PIX_FMT_VDPAU_WMV3] = {
  428. .name = "vdpau_wmv3",
  429. .log2_chroma_w = 1,
  430. .log2_chroma_h = 1,
  431. .flags = PIX_FMT_HWACCEL,
  432. },
  433. [PIX_FMT_VDPAU_VC1] = {
  434. .name = "vdpau_vc1",
  435. .log2_chroma_w = 1,
  436. .log2_chroma_h = 1,
  437. .flags = PIX_FMT_HWACCEL,
  438. },
  439. [PIX_FMT_VDPAU_MPEG4] = {
  440. .name = "vdpau_mpeg4",
  441. .log2_chroma_w = 1,
  442. .log2_chroma_h = 1,
  443. .flags = PIX_FMT_HWACCEL,
  444. },
  445. [PIX_FMT_RGB48BE] = {
  446. .name = "rgb48be",
  447. .nb_components= 3,
  448. .log2_chroma_w= 0,
  449. .log2_chroma_h= 0,
  450. .comp = {
  451. {0,5,1,0,15}, /* R */
  452. {0,5,3,0,15}, /* G */
  453. {0,5,5,0,15}, /* B */
  454. },
  455. .flags = PIX_FMT_BE,
  456. },
  457. [PIX_FMT_RGB48LE] = {
  458. .name = "rgb48le",
  459. .nb_components= 3,
  460. .log2_chroma_w= 0,
  461. .log2_chroma_h= 0,
  462. .comp = {
  463. {0,5,1,0,15}, /* R */
  464. {0,5,3,0,15}, /* G */
  465. {0,5,5,0,15}, /* B */
  466. },
  467. },
  468. [PIX_FMT_RGB565BE] = {
  469. .name = "rgb565be",
  470. .nb_components= 3,
  471. .log2_chroma_w= 0,
  472. .log2_chroma_h= 0,
  473. .comp = {
  474. {0,1,0,3,4}, /* R */
  475. {0,1,1,5,5}, /* G */
  476. {0,1,1,0,4}, /* B */
  477. },
  478. .flags = PIX_FMT_BE,
  479. },
  480. [PIX_FMT_RGB565LE] = {
  481. .name = "rgb565le",
  482. .nb_components= 3,
  483. .log2_chroma_w= 0,
  484. .log2_chroma_h= 0,
  485. .comp = {
  486. {0,1,2,3,4}, /* R */
  487. {0,1,1,5,5}, /* G */
  488. {0,1,1,0,4}, /* B */
  489. },
  490. },
  491. [PIX_FMT_RGB555BE] = {
  492. .name = "rgb555be",
  493. .nb_components= 3,
  494. .log2_chroma_w= 0,
  495. .log2_chroma_h= 0,
  496. .comp = {
  497. {0,1,0,2,4}, /* R */
  498. {0,1,1,5,4}, /* G */
  499. {0,1,1,0,4}, /* B */
  500. },
  501. .flags = PIX_FMT_BE,
  502. },
  503. [PIX_FMT_RGB555LE] = {
  504. .name = "rgb555le",
  505. .nb_components= 3,
  506. .log2_chroma_w= 0,
  507. .log2_chroma_h= 0,
  508. .comp = {
  509. {0,1,2,2,4}, /* R */
  510. {0,1,1,5,4}, /* G */
  511. {0,1,1,0,4}, /* B */
  512. },
  513. },
  514. [PIX_FMT_BGR565BE] = {
  515. .name = "bgr565be",
  516. .nb_components= 3,
  517. .log2_chroma_w= 0,
  518. .log2_chroma_h= 0,
  519. .comp = {
  520. {0,1,0,3,4}, /* B */
  521. {0,1,1,5,5}, /* G */
  522. {0,1,1,0,4}, /* R */
  523. },
  524. .flags = PIX_FMT_BE,
  525. },
  526. [PIX_FMT_BGR565LE] = {
  527. .name = "bgr565le",
  528. .nb_components= 3,
  529. .log2_chroma_w= 0,
  530. .log2_chroma_h= 0,
  531. .comp = {
  532. {0,1,2,3,4}, /* B */
  533. {0,1,1,5,5}, /* G */
  534. {0,1,1,0,4}, /* R */
  535. },
  536. },
  537. [PIX_FMT_BGR555BE] = {
  538. .name = "bgr555be",
  539. .nb_components= 3,
  540. .log2_chroma_w= 0,
  541. .log2_chroma_h= 0,
  542. .comp = {
  543. {0,1,0,2,4}, /* B */
  544. {0,1,1,5,4}, /* G */
  545. {0,1,1,0,4}, /* R */
  546. },
  547. .flags = PIX_FMT_BE,
  548. },
  549. [PIX_FMT_BGR555LE] = {
  550. .name = "bgr555le",
  551. .nb_components= 3,
  552. .log2_chroma_w= 0,
  553. .log2_chroma_h= 0,
  554. .comp = {
  555. {0,1,2,2,4}, /* B */
  556. {0,1,1,5,4}, /* G */
  557. {0,1,1,0,4}, /* R */
  558. },
  559. },
  560. [PIX_FMT_VAAPI_MOCO] = {
  561. .name = "vaapi_moco",
  562. .log2_chroma_w = 1,
  563. .log2_chroma_h = 1,
  564. .flags = PIX_FMT_HWACCEL,
  565. },
  566. [PIX_FMT_VAAPI_IDCT] = {
  567. .name = "vaapi_idct",
  568. .log2_chroma_w = 1,
  569. .log2_chroma_h = 1,
  570. .flags = PIX_FMT_HWACCEL,
  571. },
  572. [PIX_FMT_VAAPI_VLD] = {
  573. .name = "vaapi_vld",
  574. .log2_chroma_w = 1,
  575. .log2_chroma_h = 1,
  576. .flags = PIX_FMT_HWACCEL,
  577. },
  578. [PIX_FMT_YUV420P16LE] = {
  579. .name = "yuv420p16le",
  580. .nb_components= 3,
  581. .log2_chroma_w= 1,
  582. .log2_chroma_h= 1,
  583. .comp = {
  584. {0,1,1,0,15}, /* Y */
  585. {1,1,1,0,15}, /* U */
  586. {2,1,1,0,15}, /* V */
  587. },
  588. },
  589. [PIX_FMT_YUV420P16BE] = {
  590. .name = "yuv420p16be",
  591. .nb_components= 3,
  592. .log2_chroma_w= 1,
  593. .log2_chroma_h= 1,
  594. .comp = {
  595. {0,1,1,0,15}, /* Y */
  596. {1,1,1,0,15}, /* U */
  597. {2,1,1,0,15}, /* V */
  598. },
  599. .flags = PIX_FMT_BE,
  600. },
  601. [PIX_FMT_YUV422P16LE] = {
  602. .name = "yuv422p16le",
  603. .nb_components= 3,
  604. .log2_chroma_w= 1,
  605. .log2_chroma_h= 0,
  606. .comp = {
  607. {0,1,1,0,15}, /* Y */
  608. {1,1,1,0,15}, /* U */
  609. {2,1,1,0,15}, /* V */
  610. },
  611. },
  612. [PIX_FMT_YUV422P16BE] = {
  613. .name = "yuv422p16be",
  614. .nb_components= 3,
  615. .log2_chroma_w= 1,
  616. .log2_chroma_h= 0,
  617. .comp = {
  618. {0,1,1,0,15}, /* Y */
  619. {1,1,1,0,15}, /* U */
  620. {2,1,1,0,15}, /* V */
  621. },
  622. .flags = PIX_FMT_BE,
  623. },
  624. [PIX_FMT_YUV444P16LE] = {
  625. .name = "yuv444p16le",
  626. .nb_components= 3,
  627. .log2_chroma_w= 0,
  628. .log2_chroma_h= 0,
  629. .comp = {
  630. {0,1,1,0,15}, /* Y */
  631. {1,1,1,0,15}, /* U */
  632. {2,1,1,0,15}, /* V */
  633. },
  634. },
  635. [PIX_FMT_YUV444P16BE] = {
  636. .name = "yuv444p16be",
  637. .nb_components= 3,
  638. .log2_chroma_w= 0,
  639. .log2_chroma_h= 0,
  640. .comp = {
  641. {0,1,1,0,15}, /* Y */
  642. {1,1,1,0,15}, /* U */
  643. {2,1,1,0,15}, /* V */
  644. },
  645. .flags = PIX_FMT_BE,
  646. },
  647. };
  648. int av_get_bits_per_pixel(const AVPixFmtDescriptor *pixdesc)
  649. {
  650. int c, bits = 0;
  651. int log2_pixels = pixdesc->log2_chroma_w + pixdesc->log2_chroma_h;
  652. for (c = 0; c < pixdesc->nb_components; c++) {
  653. int s = c==1 || c==2 ? 0 : log2_pixels;
  654. bits += (pixdesc->comp[c].depth_minus1+1) << s;
  655. }
  656. return bits >> log2_pixels;
  657. }