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.

1160 lines
31KB

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