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.

1277 lines
34KB

  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 <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_0RGB] = {
  456. .name = "0rgb",
  457. .nb_components= 3,
  458. .log2_chroma_w= 0,
  459. .log2_chroma_h= 0,
  460. .comp = {
  461. {0,3,2,0,7}, /* R */
  462. {0,3,3,0,7}, /* G */
  463. {0,3,4,0,7}, /* B */
  464. },
  465. .flags = PIX_FMT_RGB,
  466. },
  467. [PIX_FMT_RGB0] = {
  468. .name = "rgb0",
  469. .nb_components= 3,
  470. .log2_chroma_w= 0,
  471. .log2_chroma_h= 0,
  472. .comp = {
  473. {0,3,1,0,7}, /* R */
  474. {0,3,2,0,7}, /* G */
  475. {0,3,3,0,7}, /* B */
  476. {0,3,4,0,7}, /* A */
  477. },
  478. .flags = PIX_FMT_RGB,
  479. },
  480. [PIX_FMT_0BGR] = {
  481. .name = "0bgr",
  482. .nb_components= 3,
  483. .log2_chroma_w= 0,
  484. .log2_chroma_h= 0,
  485. .comp = {
  486. {0,3,2,0,7}, /* B */
  487. {0,3,3,0,7}, /* G */
  488. {0,3,4,0,7}, /* R */
  489. },
  490. .flags = PIX_FMT_RGB,
  491. },
  492. [PIX_FMT_BGR0] = {
  493. .name = "bgr0",
  494. .nb_components= 3,
  495. .log2_chroma_w= 0,
  496. .log2_chroma_h= 0,
  497. .comp = {
  498. {0,3,1,0,7}, /* B */
  499. {0,3,2,0,7}, /* G */
  500. {0,3,3,0,7}, /* R */
  501. {0,3,4,0,7}, /* A */
  502. },
  503. .flags = PIX_FMT_RGB,
  504. },
  505. [PIX_FMT_GRAY16BE] = {
  506. .name = "gray16be",
  507. .nb_components= 1,
  508. .log2_chroma_w= 0,
  509. .log2_chroma_h= 0,
  510. .comp = {
  511. {0,1,1,0,15}, /* Y */
  512. },
  513. .flags = PIX_FMT_BE,
  514. },
  515. [PIX_FMT_GRAY16LE] = {
  516. .name = "gray16le",
  517. .nb_components= 1,
  518. .log2_chroma_w= 0,
  519. .log2_chroma_h= 0,
  520. .comp = {
  521. {0,1,1,0,15}, /* Y */
  522. },
  523. },
  524. [PIX_FMT_YUV440P] = {
  525. .name = "yuv440p",
  526. .nb_components= 3,
  527. .log2_chroma_w= 0,
  528. .log2_chroma_h= 1,
  529. .comp = {
  530. {0,0,1,0,7}, /* Y */
  531. {1,0,1,0,7}, /* U */
  532. {2,0,1,0,7}, /* V */
  533. },
  534. .flags = PIX_FMT_PLANAR,
  535. },
  536. [PIX_FMT_YUVJ440P] = {
  537. .name = "yuvj440p",
  538. .nb_components= 3,
  539. .log2_chroma_w= 0,
  540. .log2_chroma_h= 1,
  541. .comp = {
  542. {0,0,1,0,7}, /* Y */
  543. {1,0,1,0,7}, /* U */
  544. {2,0,1,0,7}, /* V */
  545. },
  546. .flags = PIX_FMT_PLANAR,
  547. },
  548. [PIX_FMT_YUVA420P] = {
  549. .name = "yuva420p",
  550. .nb_components= 4,
  551. .log2_chroma_w= 1,
  552. .log2_chroma_h= 1,
  553. .comp = {
  554. {0,0,1,0,7}, /* Y */
  555. {1,0,1,0,7}, /* U */
  556. {2,0,1,0,7}, /* V */
  557. {3,0,1,0,7}, /* A */
  558. },
  559. .flags = PIX_FMT_PLANAR,
  560. },
  561. [PIX_FMT_VDPAU_H264] = {
  562. .name = "vdpau_h264",
  563. .log2_chroma_w = 1,
  564. .log2_chroma_h = 1,
  565. .flags = PIX_FMT_HWACCEL,
  566. },
  567. [PIX_FMT_VDPAU_MPEG1] = {
  568. .name = "vdpau_mpeg1",
  569. .log2_chroma_w = 1,
  570. .log2_chroma_h = 1,
  571. .flags = PIX_FMT_HWACCEL,
  572. },
  573. [PIX_FMT_VDPAU_MPEG2] = {
  574. .name = "vdpau_mpeg2",
  575. .log2_chroma_w = 1,
  576. .log2_chroma_h = 1,
  577. .flags = PIX_FMT_HWACCEL,
  578. },
  579. [PIX_FMT_VDPAU_WMV3] = {
  580. .name = "vdpau_wmv3",
  581. .log2_chroma_w = 1,
  582. .log2_chroma_h = 1,
  583. .flags = PIX_FMT_HWACCEL,
  584. },
  585. [PIX_FMT_VDPAU_VC1] = {
  586. .name = "vdpau_vc1",
  587. .log2_chroma_w = 1,
  588. .log2_chroma_h = 1,
  589. .flags = PIX_FMT_HWACCEL,
  590. },
  591. [PIX_FMT_VDPAU_MPEG4] = {
  592. .name = "vdpau_mpeg4",
  593. .log2_chroma_w = 1,
  594. .log2_chroma_h = 1,
  595. .flags = PIX_FMT_HWACCEL,
  596. },
  597. [PIX_FMT_RGB48BE] = {
  598. .name = "rgb48be",
  599. .nb_components= 3,
  600. .log2_chroma_w= 0,
  601. .log2_chroma_h= 0,
  602. .comp = {
  603. {0,5,1,0,15}, /* R */
  604. {0,5,3,0,15}, /* G */
  605. {0,5,5,0,15}, /* B */
  606. },
  607. .flags = PIX_FMT_RGB | PIX_FMT_BE,
  608. },
  609. [PIX_FMT_RGB48LE] = {
  610. .name = "rgb48le",
  611. .nb_components= 3,
  612. .log2_chroma_w= 0,
  613. .log2_chroma_h= 0,
  614. .comp = {
  615. {0,5,1,0,15}, /* R */
  616. {0,5,3,0,15}, /* G */
  617. {0,5,5,0,15}, /* B */
  618. },
  619. .flags = PIX_FMT_RGB,
  620. },
  621. [PIX_FMT_RGBA64BE] = {
  622. .name = "rgba64be",
  623. .nb_components= 4,
  624. .log2_chroma_w= 0,
  625. .log2_chroma_h= 0,
  626. .comp = {
  627. {0,5,1,0,15}, /* R */
  628. {0,5,3,0,15}, /* G */
  629. {0,5,5,0,15}, /* B */
  630. {0,5,7,0,15}, /* A */
  631. },
  632. .flags = PIX_FMT_RGB | PIX_FMT_BE,
  633. },
  634. [PIX_FMT_RGBA64LE] = {
  635. .name = "rgba64le",
  636. .nb_components= 4,
  637. .log2_chroma_w= 0,
  638. .log2_chroma_h= 0,
  639. .comp = {
  640. {0,5,1,0,15}, /* R */
  641. {0,5,3,0,15}, /* G */
  642. {0,5,5,0,15}, /* B */
  643. {0,5,7,0,15}, /* B */
  644. },
  645. .flags = PIX_FMT_RGB,
  646. },
  647. [PIX_FMT_RGB565BE] = {
  648. .name = "rgb565be",
  649. .nb_components= 3,
  650. .log2_chroma_w= 0,
  651. .log2_chroma_h= 0,
  652. .comp = {
  653. {0,1,0,3,4}, /* R */
  654. {0,1,1,5,5}, /* G */
  655. {0,1,1,0,4}, /* B */
  656. },
  657. .flags = PIX_FMT_BE | PIX_FMT_RGB,
  658. },
  659. [PIX_FMT_RGB565LE] = {
  660. .name = "rgb565le",
  661. .nb_components= 3,
  662. .log2_chroma_w= 0,
  663. .log2_chroma_h= 0,
  664. .comp = {
  665. {0,1,2,3,4}, /* R */
  666. {0,1,1,5,5}, /* G */
  667. {0,1,1,0,4}, /* B */
  668. },
  669. .flags = PIX_FMT_RGB,
  670. },
  671. [PIX_FMT_RGB555BE] = {
  672. .name = "rgb555be",
  673. .nb_components= 3,
  674. .log2_chroma_w= 0,
  675. .log2_chroma_h= 0,
  676. .comp = {
  677. {0,1,0,2,4}, /* R */
  678. {0,1,1,5,4}, /* G */
  679. {0,1,1,0,4}, /* B */
  680. },
  681. .flags = PIX_FMT_BE | PIX_FMT_RGB,
  682. },
  683. [PIX_FMT_RGB555LE] = {
  684. .name = "rgb555le",
  685. .nb_components= 3,
  686. .log2_chroma_w= 0,
  687. .log2_chroma_h= 0,
  688. .comp = {
  689. {0,1,2,2,4}, /* R */
  690. {0,1,1,5,4}, /* G */
  691. {0,1,1,0,4}, /* B */
  692. },
  693. .flags = PIX_FMT_RGB,
  694. },
  695. [PIX_FMT_RGB444BE] = {
  696. .name = "rgb444be",
  697. .nb_components= 3,
  698. .log2_chroma_w= 0,
  699. .log2_chroma_h= 0,
  700. .comp = {
  701. {0,1,0,0,3}, /* R */
  702. {0,1,1,4,3}, /* G */
  703. {0,1,1,0,3}, /* B */
  704. },
  705. .flags = PIX_FMT_BE | PIX_FMT_RGB,
  706. },
  707. [PIX_FMT_RGB444LE] = {
  708. .name = "rgb444le",
  709. .nb_components= 3,
  710. .log2_chroma_w= 0,
  711. .log2_chroma_h= 0,
  712. .comp = {
  713. {0,1,2,0,3}, /* R */
  714. {0,1,1,4,3}, /* G */
  715. {0,1,1,0,3}, /* B */
  716. },
  717. .flags = PIX_FMT_RGB,
  718. },
  719. [PIX_FMT_BGR48BE] = {
  720. .name = "bgr48be",
  721. .nb_components= 3,
  722. .log2_chroma_w= 0,
  723. .log2_chroma_h= 0,
  724. .comp = {
  725. {0,5,1,0,15}, /* B */
  726. {0,5,3,0,15}, /* G */
  727. {0,5,5,0,15}, /* R */
  728. },
  729. .flags = PIX_FMT_BE | PIX_FMT_RGB,
  730. },
  731. [PIX_FMT_BGR48LE] = {
  732. .name = "bgr48le",
  733. .nb_components= 3,
  734. .log2_chroma_w= 0,
  735. .log2_chroma_h= 0,
  736. .comp = {
  737. {0,5,1,0,15}, /* B */
  738. {0,5,3,0,15}, /* G */
  739. {0,5,5,0,15}, /* R */
  740. },
  741. .flags = PIX_FMT_RGB,
  742. },
  743. [PIX_FMT_BGRA64BE] = {
  744. .name = "bgra64be",
  745. .nb_components= 4,
  746. .log2_chroma_w= 0,
  747. .log2_chroma_h= 0,
  748. .comp = {
  749. {0,5,1,0,15}, /* B */
  750. {0,5,3,0,15}, /* G */
  751. {0,5,5,0,15}, /* R */
  752. {0,5,7,0,15}, /* A */
  753. },
  754. .flags = PIX_FMT_BE,
  755. },
  756. [PIX_FMT_BGRA64LE] = {
  757. .name = "bgra64le",
  758. .nb_components= 4,
  759. .log2_chroma_w= 0,
  760. .log2_chroma_h= 0,
  761. .comp = {
  762. {0,5,1,0,15}, /* B */
  763. {0,5,3,0,15}, /* G */
  764. {0,5,5,0,15}, /* R */
  765. {0,5,7,0,15}, /* A */
  766. },
  767. },
  768. [PIX_FMT_BGR565BE] = {
  769. .name = "bgr565be",
  770. .nb_components= 3,
  771. .log2_chroma_w= 0,
  772. .log2_chroma_h= 0,
  773. .comp = {
  774. {0,1,0,3,4}, /* B */
  775. {0,1,1,5,5}, /* G */
  776. {0,1,1,0,4}, /* R */
  777. },
  778. .flags = PIX_FMT_BE | PIX_FMT_RGB,
  779. },
  780. [PIX_FMT_BGR565LE] = {
  781. .name = "bgr565le",
  782. .nb_components= 3,
  783. .log2_chroma_w= 0,
  784. .log2_chroma_h= 0,
  785. .comp = {
  786. {0,1,2,3,4}, /* B */
  787. {0,1,1,5,5}, /* G */
  788. {0,1,1,0,4}, /* R */
  789. },
  790. .flags = PIX_FMT_RGB,
  791. },
  792. [PIX_FMT_BGR555BE] = {
  793. .name = "bgr555be",
  794. .nb_components= 3,
  795. .log2_chroma_w= 0,
  796. .log2_chroma_h= 0,
  797. .comp = {
  798. {0,1,0,2,4}, /* B */
  799. {0,1,1,5,4}, /* G */
  800. {0,1,1,0,4}, /* R */
  801. },
  802. .flags = PIX_FMT_BE | PIX_FMT_RGB,
  803. },
  804. [PIX_FMT_BGR555LE] = {
  805. .name = "bgr555le",
  806. .nb_components= 3,
  807. .log2_chroma_w= 0,
  808. .log2_chroma_h= 0,
  809. .comp = {
  810. {0,1,2,2,4}, /* B */
  811. {0,1,1,5,4}, /* G */
  812. {0,1,1,0,4}, /* R */
  813. },
  814. .flags = PIX_FMT_RGB,
  815. },
  816. [PIX_FMT_BGR444BE] = {
  817. .name = "bgr444be",
  818. .nb_components= 3,
  819. .log2_chroma_w= 0,
  820. .log2_chroma_h= 0,
  821. .comp = {
  822. {0,1,0,0,3}, /* B */
  823. {0,1,1,4,3}, /* G */
  824. {0,1,1,0,3}, /* R */
  825. },
  826. .flags = PIX_FMT_BE | PIX_FMT_RGB,
  827. },
  828. [PIX_FMT_BGR444LE] = {
  829. .name = "bgr444le",
  830. .nb_components= 3,
  831. .log2_chroma_w= 0,
  832. .log2_chroma_h= 0,
  833. .comp = {
  834. {0,1,2,0,3}, /* B */
  835. {0,1,1,4,3}, /* G */
  836. {0,1,1,0,3}, /* R */
  837. },
  838. .flags = PIX_FMT_RGB,
  839. },
  840. [PIX_FMT_VAAPI_MOCO] = {
  841. .name = "vaapi_moco",
  842. .log2_chroma_w = 1,
  843. .log2_chroma_h = 1,
  844. .flags = PIX_FMT_HWACCEL,
  845. },
  846. [PIX_FMT_VAAPI_IDCT] = {
  847. .name = "vaapi_idct",
  848. .log2_chroma_w = 1,
  849. .log2_chroma_h = 1,
  850. .flags = PIX_FMT_HWACCEL,
  851. },
  852. [PIX_FMT_VAAPI_VLD] = {
  853. .name = "vaapi_vld",
  854. .log2_chroma_w = 1,
  855. .log2_chroma_h = 1,
  856. .flags = PIX_FMT_HWACCEL,
  857. },
  858. [PIX_FMT_VDA_VLD] = {
  859. .name = "vda_vld",
  860. .log2_chroma_w = 1,
  861. .log2_chroma_h = 1,
  862. .flags = PIX_FMT_HWACCEL,
  863. },
  864. [PIX_FMT_YUV420P9LE] = {
  865. .name = "yuv420p9le",
  866. .nb_components= 3,
  867. .log2_chroma_w= 1,
  868. .log2_chroma_h= 1,
  869. .comp = {
  870. {0,1,1,0,8}, /* Y */
  871. {1,1,1,0,8}, /* U */
  872. {2,1,1,0,8}, /* V */
  873. },
  874. .flags = PIX_FMT_PLANAR,
  875. },
  876. [PIX_FMT_YUV420P9BE] = {
  877. .name = "yuv420p9be",
  878. .nb_components= 3,
  879. .log2_chroma_w= 1,
  880. .log2_chroma_h= 1,
  881. .comp = {
  882. {0,1,1,0,8}, /* Y */
  883. {1,1,1,0,8}, /* U */
  884. {2,1,1,0,8}, /* V */
  885. },
  886. .flags = PIX_FMT_BE | PIX_FMT_PLANAR,
  887. },
  888. [PIX_FMT_YUV420P10LE] = {
  889. .name = "yuv420p10le",
  890. .nb_components= 3,
  891. .log2_chroma_w= 1,
  892. .log2_chroma_h= 1,
  893. .comp = {
  894. {0,1,1,0,9}, /* Y */
  895. {1,1,1,0,9}, /* U */
  896. {2,1,1,0,9}, /* V */
  897. },
  898. .flags = PIX_FMT_PLANAR,
  899. },
  900. [PIX_FMT_YUV420P10BE] = {
  901. .name = "yuv420p10be",
  902. .nb_components= 3,
  903. .log2_chroma_w= 1,
  904. .log2_chroma_h= 1,
  905. .comp = {
  906. {0,1,1,0,9}, /* Y */
  907. {1,1,1,0,9}, /* U */
  908. {2,1,1,0,9}, /* V */
  909. },
  910. .flags = PIX_FMT_BE | PIX_FMT_PLANAR,
  911. },
  912. [PIX_FMT_YUV420P16LE] = {
  913. .name = "yuv420p16le",
  914. .nb_components= 3,
  915. .log2_chroma_w= 1,
  916. .log2_chroma_h= 1,
  917. .comp = {
  918. {0,1,1,0,15}, /* Y */
  919. {1,1,1,0,15}, /* U */
  920. {2,1,1,0,15}, /* V */
  921. },
  922. .flags = PIX_FMT_PLANAR,
  923. },
  924. [PIX_FMT_YUV420P16BE] = {
  925. .name = "yuv420p16be",
  926. .nb_components= 3,
  927. .log2_chroma_w= 1,
  928. .log2_chroma_h= 1,
  929. .comp = {
  930. {0,1,1,0,15}, /* Y */
  931. {1,1,1,0,15}, /* U */
  932. {2,1,1,0,15}, /* V */
  933. },
  934. .flags = PIX_FMT_BE | PIX_FMT_PLANAR,
  935. },
  936. [PIX_FMT_YUV422P9LE] = {
  937. .name = "yuv422p9le",
  938. .nb_components= 3,
  939. .log2_chroma_w= 1,
  940. .log2_chroma_h= 0,
  941. .comp = {
  942. {0,1,1,0,8}, /* Y */
  943. {1,1,1,0,8}, /* U */
  944. {2,1,1,0,8}, /* V */
  945. },
  946. .flags = PIX_FMT_PLANAR,
  947. },
  948. [PIX_FMT_YUV422P9BE] = {
  949. .name = "yuv422p9be",
  950. .nb_components= 3,
  951. .log2_chroma_w= 1,
  952. .log2_chroma_h= 0,
  953. .comp = {
  954. {0,1,1,0,8}, /* Y */
  955. {1,1,1,0,8}, /* U */
  956. {2,1,1,0,8}, /* V */
  957. },
  958. .flags = PIX_FMT_BE | PIX_FMT_PLANAR,
  959. },
  960. [PIX_FMT_YUV422P10LE] = {
  961. .name = "yuv422p10le",
  962. .nb_components= 3,
  963. .log2_chroma_w= 1,
  964. .log2_chroma_h= 0,
  965. .comp = {
  966. {0,1,1,0,9}, /* Y */
  967. {1,1,1,0,9}, /* U */
  968. {2,1,1,0,9}, /* V */
  969. },
  970. .flags = PIX_FMT_PLANAR,
  971. },
  972. [PIX_FMT_YUV422P10BE] = {
  973. .name = "yuv422p10be",
  974. .nb_components= 3,
  975. .log2_chroma_w= 1,
  976. .log2_chroma_h= 0,
  977. .comp = {
  978. {0,1,1,0,9}, /* Y */
  979. {1,1,1,0,9}, /* U */
  980. {2,1,1,0,9}, /* V */
  981. },
  982. .flags = PIX_FMT_BE | PIX_FMT_PLANAR,
  983. },
  984. [PIX_FMT_YUV422P16LE] = {
  985. .name = "yuv422p16le",
  986. .nb_components= 3,
  987. .log2_chroma_w= 1,
  988. .log2_chroma_h= 0,
  989. .comp = {
  990. {0,1,1,0,15}, /* Y */
  991. {1,1,1,0,15}, /* U */
  992. {2,1,1,0,15}, /* V */
  993. },
  994. .flags = PIX_FMT_PLANAR,
  995. },
  996. [PIX_FMT_YUV422P16BE] = {
  997. .name = "yuv422p16be",
  998. .nb_components= 3,
  999. .log2_chroma_w= 1,
  1000. .log2_chroma_h= 0,
  1001. .comp = {
  1002. {0,1,1,0,15}, /* Y */
  1003. {1,1,1,0,15}, /* U */
  1004. {2,1,1,0,15}, /* V */
  1005. },
  1006. .flags = PIX_FMT_BE | PIX_FMT_PLANAR,
  1007. },
  1008. [PIX_FMT_YUV444P16LE] = {
  1009. .name = "yuv444p16le",
  1010. .nb_components= 3,
  1011. .log2_chroma_w= 0,
  1012. .log2_chroma_h= 0,
  1013. .comp = {
  1014. {0,1,1,0,15}, /* Y */
  1015. {1,1,1,0,15}, /* U */
  1016. {2,1,1,0,15}, /* V */
  1017. },
  1018. .flags = PIX_FMT_PLANAR,
  1019. },
  1020. [PIX_FMT_YUV444P16BE] = {
  1021. .name = "yuv444p16be",
  1022. .nb_components= 3,
  1023. .log2_chroma_w= 0,
  1024. .log2_chroma_h= 0,
  1025. .comp = {
  1026. {0,1,1,0,15}, /* Y */
  1027. {1,1,1,0,15}, /* U */
  1028. {2,1,1,0,15}, /* V */
  1029. },
  1030. .flags = PIX_FMT_BE | PIX_FMT_PLANAR,
  1031. },
  1032. [PIX_FMT_YUV444P10LE] = {
  1033. .name = "yuv444p10le",
  1034. .nb_components= 3,
  1035. .log2_chroma_w= 0,
  1036. .log2_chroma_h= 0,
  1037. .comp = {
  1038. {0,1,1,0,9}, /* Y */
  1039. {1,1,1,0,9}, /* U */
  1040. {2,1,1,0,9}, /* V */
  1041. },
  1042. .flags = PIX_FMT_PLANAR,
  1043. },
  1044. [PIX_FMT_YUV444P10BE] = {
  1045. .name = "yuv444p10be",
  1046. .nb_components= 3,
  1047. .log2_chroma_w= 0,
  1048. .log2_chroma_h= 0,
  1049. .comp = {
  1050. {0,1,1,0,9}, /* Y */
  1051. {1,1,1,0,9}, /* U */
  1052. {2,1,1,0,9}, /* V */
  1053. },
  1054. .flags = PIX_FMT_BE | PIX_FMT_PLANAR,
  1055. },
  1056. [PIX_FMT_YUV444P9LE] = {
  1057. .name = "yuv444p9le",
  1058. .nb_components= 3,
  1059. .log2_chroma_w= 0,
  1060. .log2_chroma_h= 0,
  1061. .comp = {
  1062. {0,1,1,0,8}, /* Y */
  1063. {1,1,1,0,8}, /* U */
  1064. {2,1,1,0,8}, /* V */
  1065. },
  1066. .flags = PIX_FMT_PLANAR,
  1067. },
  1068. [PIX_FMT_YUV444P9BE] = {
  1069. .name = "yuv444p9be",
  1070. .nb_components= 3,
  1071. .log2_chroma_w= 0,
  1072. .log2_chroma_h= 0,
  1073. .comp = {
  1074. {0,1,1,0,8}, /* Y */
  1075. {1,1,1,0,8}, /* U */
  1076. {2,1,1,0,8}, /* V */
  1077. },
  1078. .flags = PIX_FMT_BE | PIX_FMT_PLANAR,
  1079. },
  1080. [PIX_FMT_DXVA2_VLD] = {
  1081. .name = "dxva2_vld",
  1082. .log2_chroma_w = 1,
  1083. .log2_chroma_h = 1,
  1084. .flags = PIX_FMT_HWACCEL,
  1085. },
  1086. [PIX_FMT_VDA_VLD] = {
  1087. .name = "vda_vld",
  1088. .log2_chroma_w = 1,
  1089. .log2_chroma_h = 1,
  1090. .flags = PIX_FMT_HWACCEL,
  1091. },
  1092. [PIX_FMT_GRAY8A] = {
  1093. .name = "gray8a",
  1094. .nb_components= 2,
  1095. .comp = {
  1096. {0,1,1,0,7}, /* Y */
  1097. {0,1,2,0,7}, /* A */
  1098. },
  1099. },
  1100. [PIX_FMT_GBR24P] = {
  1101. .name = "gbr24p",
  1102. .nb_components= 3,
  1103. .comp = {
  1104. {1,0,1,0,7}, /* B */
  1105. {0,0,1,0,7}, /* G */
  1106. {2,0,1,0,7}, /* R */
  1107. },
  1108. .flags = PIX_FMT_PLANAR | PIX_FMT_RGB,
  1109. },
  1110. [PIX_FMT_GBRP] = {
  1111. .name = "gbrp",
  1112. .nb_components= 3,
  1113. .log2_chroma_w= 0,
  1114. .log2_chroma_h= 0,
  1115. .comp = {
  1116. {0,0,1,0,7}, /* G */
  1117. {1,0,1,0,7}, /* B */
  1118. {2,0,1,0,7}, /* R */
  1119. },
  1120. .flags = PIX_FMT_PLANAR | PIX_FMT_RGB,
  1121. },
  1122. [PIX_FMT_GBRP9LE] = {
  1123. .name = "gbrp9le",
  1124. .nb_components= 3,
  1125. .log2_chroma_w= 0,
  1126. .log2_chroma_h= 0,
  1127. .comp = {
  1128. {0,1,1,0,8}, /* G */
  1129. {1,1,1,0,8}, /* B */
  1130. {2,1,1,0,8}, /* R */
  1131. },
  1132. .flags = PIX_FMT_PLANAR | PIX_FMT_RGB,
  1133. },
  1134. [PIX_FMT_GBRP9BE] = {
  1135. .name = "gbrp9be",
  1136. .nb_components= 3,
  1137. .log2_chroma_w= 0,
  1138. .log2_chroma_h= 0,
  1139. .comp = {
  1140. {0,1,1,0,8}, /* G */
  1141. {1,1,1,0,8}, /* B */
  1142. {2,1,1,0,8}, /* R */
  1143. },
  1144. .flags = PIX_FMT_BE | PIX_FMT_PLANAR | PIX_FMT_RGB,
  1145. },
  1146. [PIX_FMT_GBRP10LE] = {
  1147. .name = "gbrp10le",
  1148. .nb_components= 3,
  1149. .log2_chroma_w= 0,
  1150. .log2_chroma_h= 0,
  1151. .comp = {
  1152. {0,1,1,0,9}, /* G */
  1153. {1,1,1,0,9}, /* B */
  1154. {2,1,1,0,9}, /* R */
  1155. },
  1156. .flags = PIX_FMT_PLANAR | PIX_FMT_RGB,
  1157. },
  1158. [PIX_FMT_GBRP10BE] = {
  1159. .name = "gbrp10be",
  1160. .nb_components= 3,
  1161. .log2_chroma_w= 0,
  1162. .log2_chroma_h= 0,
  1163. .comp = {
  1164. {0,1,1,0,9}, /* G */
  1165. {1,1,1,0,9}, /* B */
  1166. {2,1,1,0,9}, /* R */
  1167. },
  1168. .flags = PIX_FMT_BE | PIX_FMT_PLANAR | PIX_FMT_RGB,
  1169. },
  1170. [PIX_FMT_GBRP16LE] = {
  1171. .name = "gbrp16le",
  1172. .nb_components= 3,
  1173. .log2_chroma_w= 0,
  1174. .log2_chroma_h= 0,
  1175. .comp = {
  1176. {0,1,1,0,15}, /* G */
  1177. {1,1,1,0,15}, /* B */
  1178. {2,1,1,0,15}, /* R */
  1179. },
  1180. .flags = PIX_FMT_PLANAR | PIX_FMT_RGB,
  1181. },
  1182. [PIX_FMT_GBRP16BE] = {
  1183. .name = "gbrp16be",
  1184. .nb_components= 3,
  1185. .log2_chroma_w= 0,
  1186. .log2_chroma_h= 0,
  1187. .comp = {
  1188. {0,1,1,0,15}, /* G */
  1189. {1,1,1,0,15}, /* B */
  1190. {2,1,1,0,15}, /* R */
  1191. },
  1192. .flags = PIX_FMT_BE | PIX_FMT_PLANAR | PIX_FMT_RGB,
  1193. },
  1194. };
  1195. static enum PixelFormat get_pix_fmt_internal(const char *name)
  1196. {
  1197. enum PixelFormat pix_fmt;
  1198. for (pix_fmt = 0; pix_fmt < PIX_FMT_NB; pix_fmt++)
  1199. if (av_pix_fmt_descriptors[pix_fmt].name &&
  1200. !strcmp(av_pix_fmt_descriptors[pix_fmt].name, name))
  1201. return pix_fmt;
  1202. return PIX_FMT_NONE;
  1203. }
  1204. const char *av_get_pix_fmt_name(enum PixelFormat pix_fmt)
  1205. {
  1206. return (unsigned)pix_fmt < PIX_FMT_NB ?
  1207. av_pix_fmt_descriptors[pix_fmt].name : NULL;
  1208. }
  1209. #if HAVE_BIGENDIAN
  1210. # define X_NE(be, le) be
  1211. #else
  1212. # define X_NE(be, le) le
  1213. #endif
  1214. enum PixelFormat av_get_pix_fmt(const char *name)
  1215. {
  1216. enum PixelFormat pix_fmt;
  1217. if (!strcmp(name, "rgb32"))
  1218. name = X_NE("argb", "bgra");
  1219. else if (!strcmp(name, "bgr32"))
  1220. name = X_NE("abgr", "rgba");
  1221. pix_fmt = get_pix_fmt_internal(name);
  1222. if (pix_fmt == PIX_FMT_NONE) {
  1223. char name2[32];
  1224. snprintf(name2, sizeof(name2), "%s%s", name, X_NE("be", "le"));
  1225. pix_fmt = get_pix_fmt_internal(name2);
  1226. }
  1227. return pix_fmt;
  1228. }
  1229. int av_get_bits_per_pixel(const AVPixFmtDescriptor *pixdesc)
  1230. {
  1231. int c, bits = 0;
  1232. int log2_pixels = pixdesc->log2_chroma_w + pixdesc->log2_chroma_h;
  1233. for (c = 0; c < pixdesc->nb_components; c++) {
  1234. int s = c==1 || c==2 ? 0 : log2_pixels;
  1235. bits += (pixdesc->comp[c].depth_minus1+1) << s;
  1236. }
  1237. return bits >> log2_pixels;
  1238. }
  1239. char *av_get_pix_fmt_string (char *buf, int buf_size, enum PixelFormat pix_fmt)
  1240. {
  1241. /* print header */
  1242. if (pix_fmt < 0) {
  1243. snprintf (buf, buf_size, "name " " nb_components" " nb_bits");
  1244. } else {
  1245. const AVPixFmtDescriptor *pixdesc = &av_pix_fmt_descriptors[pix_fmt];
  1246. snprintf(buf, buf_size, "%-11s %7d %10d",
  1247. pixdesc->name, pixdesc->nb_components, av_get_bits_per_pixel(pixdesc));
  1248. }
  1249. return buf;
  1250. }