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.

843 lines
22KB

  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. while(w--){
  52. int val;
  53. if(flags & PIX_FMT_BE) val= AV_RB16(p);
  54. else val= AV_RL16(p);
  55. val = (val>>shift) & mask;
  56. if(read_pal_component)
  57. val= data[1][4*val + c];
  58. p+= step;
  59. *dst++= val;
  60. }
  61. }
  62. }
  63. void av_write_image_line(const uint16_t *src, uint8_t *data[4], const int linesize[4],
  64. const AVPixFmtDescriptor *desc, int x, int y, int c, int w)
  65. {
  66. AVComponentDescriptor comp = desc->comp[c];
  67. int plane = comp.plane;
  68. int depth = comp.depth_minus1+1;
  69. int step = comp.step_minus1+1;
  70. int flags = desc->flags;
  71. if (flags & PIX_FMT_BITSTREAM) {
  72. int skip = x*step + comp.offset_plus1-1;
  73. uint8_t *p = data[plane] + y*linesize[plane] + (skip>>3);
  74. int shift = 8 - depth - (skip&7);
  75. while (w--) {
  76. *p |= *src++ << shift;
  77. shift -= step;
  78. p -= shift>>3;
  79. shift &= 7;
  80. }
  81. } else {
  82. int shift = comp.shift;
  83. uint8_t *p = data[plane]+ y*linesize[plane] + x*step + comp.offset_plus1-1;
  84. while (w--) {
  85. if (flags & PIX_FMT_BE) {
  86. uint16_t val = AV_RB16(p) | (*src++<<shift);
  87. AV_WB16(p, val);
  88. } else {
  89. uint16_t val = AV_RL16(p) | (*src++<<shift);
  90. AV_WL16(p, val);
  91. }
  92. p+= step;
  93. }
  94. }
  95. }
  96. const AVPixFmtDescriptor av_pix_fmt_descriptors[PIX_FMT_NB] = {
  97. [PIX_FMT_YUV420P] = {
  98. .name = "yuv420p",
  99. .nb_components= 3,
  100. .log2_chroma_w= 1,
  101. .log2_chroma_h= 1,
  102. .comp = {
  103. {0,0,1,0,7}, /* Y */
  104. {1,0,1,0,7}, /* U */
  105. {2,0,1,0,7}, /* V */
  106. },
  107. },
  108. [PIX_FMT_YUYV422] = {
  109. .name = "yuyv422",
  110. .nb_components= 3,
  111. .log2_chroma_w= 1,
  112. .log2_chroma_h= 0,
  113. .comp = {
  114. {0,1,1,0,7}, /* Y */
  115. {0,3,2,0,7}, /* U */
  116. {0,3,4,0,7}, /* V */
  117. },
  118. },
  119. [PIX_FMT_RGB24] = {
  120. .name = "rgb24",
  121. .nb_components= 3,
  122. .log2_chroma_w= 0,
  123. .log2_chroma_h= 0,
  124. .comp = {
  125. {0,2,1,0,7}, /* R */
  126. {0,2,2,0,7}, /* G */
  127. {0,2,3,0,7}, /* B */
  128. },
  129. },
  130. [PIX_FMT_BGR24] = {
  131. .name = "bgr24",
  132. .nb_components= 3,
  133. .log2_chroma_w= 0,
  134. .log2_chroma_h= 0,
  135. .comp = {
  136. {0,2,1,0,7}, /* B */
  137. {0,2,2,0,7}, /* G */
  138. {0,2,3,0,7}, /* R */
  139. },
  140. },
  141. [PIX_FMT_YUV422P] = {
  142. .name = "yuv422p",
  143. .nb_components= 3,
  144. .log2_chroma_w= 1,
  145. .log2_chroma_h= 0,
  146. .comp = {
  147. {0,0,1,0,7}, /* Y */
  148. {1,0,1,0,7}, /* U */
  149. {2,0,1,0,7}, /* V */
  150. },
  151. },
  152. [PIX_FMT_YUV444P] = {
  153. .name = "yuv444p",
  154. .nb_components= 3,
  155. .log2_chroma_w= 0,
  156. .log2_chroma_h= 0,
  157. .comp = {
  158. {0,0,1,0,7}, /* Y */
  159. {1,0,1,0,7}, /* U */
  160. {2,0,1,0,7}, /* V */
  161. },
  162. },
  163. [PIX_FMT_YUV410P] = {
  164. .name = "yuv410p",
  165. .nb_components= 3,
  166. .log2_chroma_w= 2,
  167. .log2_chroma_h= 2,
  168. .comp = {
  169. {0,0,1,0,7}, /* Y */
  170. {1,0,1,0,7}, /* U */
  171. {2,0,1,0,7}, /* V */
  172. },
  173. },
  174. [PIX_FMT_YUV411P] = {
  175. .name = "yuv411p",
  176. .nb_components= 3,
  177. .log2_chroma_w= 2,
  178. .log2_chroma_h= 0,
  179. .comp = {
  180. {0,0,1,0,7}, /* Y */
  181. {1,0,1,0,7}, /* U */
  182. {2,0,1,0,7}, /* V */
  183. },
  184. },
  185. [PIX_FMT_GRAY8] = {
  186. .name = "gray",
  187. .nb_components= 1,
  188. .log2_chroma_w= 0,
  189. .log2_chroma_h= 0,
  190. .comp = {
  191. {0,0,1,0,7}, /* Y */
  192. },
  193. .flags = PIX_FMT_PAL,
  194. },
  195. [PIX_FMT_MONOWHITE] = {
  196. .name = "monow",
  197. .nb_components= 1,
  198. .log2_chroma_w= 0,
  199. .log2_chroma_h= 0,
  200. .comp = {
  201. {0,0,1,0,0}, /* Y */
  202. },
  203. .flags = PIX_FMT_BITSTREAM,
  204. },
  205. [PIX_FMT_MONOBLACK] = {
  206. .name = "monob",
  207. .nb_components= 1,
  208. .log2_chroma_w= 0,
  209. .log2_chroma_h= 0,
  210. .comp = {
  211. {0,0,1,7,0}, /* Y */
  212. },
  213. .flags = PIX_FMT_BITSTREAM,
  214. },
  215. [PIX_FMT_PAL8] = {
  216. .name = "pal8",
  217. .nb_components= 1,
  218. .log2_chroma_w= 0,
  219. .log2_chroma_h= 0,
  220. .comp = {
  221. {0,0,1,0,7},
  222. },
  223. .flags = PIX_FMT_PAL,
  224. },
  225. [PIX_FMT_YUVJ420P] = {
  226. .name = "yuvj420p",
  227. .nb_components= 3,
  228. .log2_chroma_w= 1,
  229. .log2_chroma_h= 1,
  230. .comp = {
  231. {0,0,1,0,7}, /* Y */
  232. {1,0,1,0,7}, /* U */
  233. {2,0,1,0,7}, /* V */
  234. },
  235. },
  236. [PIX_FMT_YUVJ422P] = {
  237. .name = "yuvj422p",
  238. .nb_components= 3,
  239. .log2_chroma_w= 1,
  240. .log2_chroma_h= 0,
  241. .comp = {
  242. {0,0,1,0,7}, /* Y */
  243. {1,0,1,0,7}, /* U */
  244. {2,0,1,0,7}, /* V */
  245. },
  246. },
  247. [PIX_FMT_YUVJ444P] = {
  248. .name = "yuvj444p",
  249. .nb_components= 3,
  250. .log2_chroma_w= 0,
  251. .log2_chroma_h= 0,
  252. .comp = {
  253. {0,0,1,0,7}, /* Y */
  254. {1,0,1,0,7}, /* U */
  255. {2,0,1,0,7}, /* V */
  256. },
  257. },
  258. [PIX_FMT_XVMC_MPEG2_MC] = {
  259. .name = "xvmcmc",
  260. .flags = PIX_FMT_HWACCEL,
  261. },
  262. [PIX_FMT_XVMC_MPEG2_IDCT] = {
  263. .name = "xvmcidct",
  264. .flags = PIX_FMT_HWACCEL,
  265. },
  266. [PIX_FMT_UYVY422] = {
  267. .name = "uyvy422",
  268. .nb_components= 3,
  269. .log2_chroma_w= 1,
  270. .log2_chroma_h= 0,
  271. .comp = {
  272. {0,1,2,0,7}, /* Y */
  273. {0,3,1,0,7}, /* U */
  274. {0,3,3,0,7}, /* V */
  275. },
  276. },
  277. [PIX_FMT_UYYVYY411] = {
  278. .name = "uyyvyy411",
  279. .nb_components= 3,
  280. .log2_chroma_w= 2,
  281. .log2_chroma_h= 0,
  282. .comp = {
  283. {0,3,2,0,7}, /* Y */
  284. {0,5,1,0,7}, /* U */
  285. {0,5,4,0,7}, /* V */
  286. },
  287. },
  288. [PIX_FMT_BGR8] = {
  289. .name = "bgr8",
  290. .nb_components= 3,
  291. .log2_chroma_w= 0,
  292. .log2_chroma_h= 0,
  293. .comp = {
  294. {0,0,1,6,1}, /* B */
  295. {0,0,1,3,2}, /* G */
  296. {0,0,1,0,2}, /* R */
  297. },
  298. .flags = PIX_FMT_PAL,
  299. },
  300. [PIX_FMT_BGR4] = {
  301. .name = "bgr4",
  302. .nb_components= 3,
  303. .log2_chroma_w= 0,
  304. .log2_chroma_h= 0,
  305. .comp = {
  306. {0,3,1,0,0}, /* B */
  307. {0,3,2,0,1}, /* G */
  308. {0,3,4,0,0}, /* R */
  309. },
  310. .flags = PIX_FMT_BITSTREAM,
  311. },
  312. [PIX_FMT_BGR4_BYTE] = {
  313. .name = "bgr4_byte",
  314. .nb_components= 3,
  315. .log2_chroma_w= 0,
  316. .log2_chroma_h= 0,
  317. .comp = {
  318. {0,0,1,3,0}, /* B */
  319. {0,0,1,1,1}, /* G */
  320. {0,0,1,0,0}, /* R */
  321. },
  322. .flags = PIX_FMT_PAL,
  323. },
  324. [PIX_FMT_RGB8] = {
  325. .name = "rgb8",
  326. .nb_components= 3,
  327. .log2_chroma_w= 0,
  328. .log2_chroma_h= 0,
  329. .comp = {
  330. {0,0,1,6,1}, /* R */
  331. {0,0,1,3,2}, /* G */
  332. {0,0,1,0,2}, /* B */
  333. },
  334. .flags = PIX_FMT_PAL,
  335. },
  336. [PIX_FMT_RGB4] = {
  337. .name = "rgb4",
  338. .nb_components= 3,
  339. .log2_chroma_w= 0,
  340. .log2_chroma_h= 0,
  341. .comp = {
  342. {0,3,1,0,0}, /* R */
  343. {0,3,2,0,1}, /* G */
  344. {0,3,4,0,0}, /* B */
  345. },
  346. .flags = PIX_FMT_BITSTREAM,
  347. },
  348. [PIX_FMT_RGB4_BYTE] = {
  349. .name = "rgb4_byte",
  350. .nb_components= 3,
  351. .log2_chroma_w= 0,
  352. .log2_chroma_h= 0,
  353. .comp = {
  354. {0,0,1,3,0}, /* R */
  355. {0,0,1,1,1}, /* G */
  356. {0,0,1,0,0}, /* B */
  357. },
  358. .flags = PIX_FMT_PAL,
  359. },
  360. [PIX_FMT_NV12] = {
  361. .name = "nv12",
  362. .nb_components= 3,
  363. .log2_chroma_w= 1,
  364. .log2_chroma_h= 1,
  365. .comp = {
  366. {0,0,1,0,7}, /* Y */
  367. {1,1,1,0,7}, /* U */
  368. {1,1,2,0,7}, /* V */
  369. },
  370. },
  371. [PIX_FMT_NV21] = {
  372. .name = "nv21",
  373. .nb_components= 3,
  374. .log2_chroma_w= 1,
  375. .log2_chroma_h= 1,
  376. .comp = {
  377. {0,0,1,0,7}, /* Y */
  378. {1,1,1,0,7}, /* V */
  379. {1,1,2,0,7}, /* U */
  380. },
  381. },
  382. [PIX_FMT_ARGB] = {
  383. .name = "argb",
  384. .nb_components= 4,
  385. .log2_chroma_w= 0,
  386. .log2_chroma_h= 0,
  387. .comp = {
  388. {0,3,1,0,7}, /* A */
  389. {0,3,2,0,7}, /* R */
  390. {0,3,3,0,7}, /* G */
  391. {0,3,4,0,7}, /* B */
  392. },
  393. },
  394. [PIX_FMT_RGBA] = {
  395. .name = "rgba",
  396. .nb_components= 4,
  397. .log2_chroma_w= 0,
  398. .log2_chroma_h= 0,
  399. .comp = {
  400. {0,3,1,0,7}, /* R */
  401. {0,3,2,0,7}, /* G */
  402. {0,3,3,0,7}, /* B */
  403. {0,3,4,0,7}, /* A */
  404. },
  405. },
  406. [PIX_FMT_ABGR] = {
  407. .name = "abgr",
  408. .nb_components= 4,
  409. .log2_chroma_w= 0,
  410. .log2_chroma_h= 0,
  411. .comp = {
  412. {0,3,1,0,7}, /* A */
  413. {0,3,2,0,7}, /* B */
  414. {0,3,3,0,7}, /* G */
  415. {0,3,4,0,7}, /* R */
  416. },
  417. },
  418. [PIX_FMT_BGRA] = {
  419. .name = "bgra",
  420. .nb_components= 4,
  421. .log2_chroma_w= 0,
  422. .log2_chroma_h= 0,
  423. .comp = {
  424. {0,3,1,0,7}, /* B */
  425. {0,3,2,0,7}, /* G */
  426. {0,3,3,0,7}, /* R */
  427. {0,3,4,0,7}, /* A */
  428. },
  429. },
  430. [PIX_FMT_GRAY16BE] = {
  431. .name = "gray16be",
  432. .nb_components= 1,
  433. .log2_chroma_w= 0,
  434. .log2_chroma_h= 0,
  435. .comp = {
  436. {0,1,1,0,15}, /* Y */
  437. },
  438. .flags = PIX_FMT_BE,
  439. },
  440. [PIX_FMT_GRAY16LE] = {
  441. .name = "gray16le",
  442. .nb_components= 1,
  443. .log2_chroma_w= 0,
  444. .log2_chroma_h= 0,
  445. .comp = {
  446. {0,1,1,0,15}, /* Y */
  447. },
  448. },
  449. [PIX_FMT_YUV440P] = {
  450. .name = "yuv440p",
  451. .nb_components= 3,
  452. .log2_chroma_w= 0,
  453. .log2_chroma_h= 1,
  454. .comp = {
  455. {0,0,1,0,7}, /* Y */
  456. {1,0,1,0,7}, /* U */
  457. {2,0,1,0,7}, /* V */
  458. },
  459. },
  460. [PIX_FMT_YUVJ440P] = {
  461. .name = "yuvj440p",
  462. .nb_components= 3,
  463. .log2_chroma_w= 0,
  464. .log2_chroma_h= 1,
  465. .comp = {
  466. {0,0,1,0,7}, /* Y */
  467. {1,0,1,0,7}, /* U */
  468. {2,0,1,0,7}, /* V */
  469. },
  470. },
  471. [PIX_FMT_YUVA420P] = {
  472. .name = "yuva420p",
  473. .nb_components= 4,
  474. .log2_chroma_w= 1,
  475. .log2_chroma_h= 1,
  476. .comp = {
  477. {0,0,1,0,7}, /* Y */
  478. {1,0,1,0,7}, /* U */
  479. {2,0,1,0,7}, /* V */
  480. {3,0,1,0,7}, /* A */
  481. },
  482. },
  483. [PIX_FMT_VDPAU_H264] = {
  484. .name = "vdpau_h264",
  485. .log2_chroma_w = 1,
  486. .log2_chroma_h = 1,
  487. .flags = PIX_FMT_HWACCEL,
  488. },
  489. [PIX_FMT_VDPAU_MPEG1] = {
  490. .name = "vdpau_mpeg1",
  491. .log2_chroma_w = 1,
  492. .log2_chroma_h = 1,
  493. .flags = PIX_FMT_HWACCEL,
  494. },
  495. [PIX_FMT_VDPAU_MPEG2] = {
  496. .name = "vdpau_mpeg2",
  497. .log2_chroma_w = 1,
  498. .log2_chroma_h = 1,
  499. .flags = PIX_FMT_HWACCEL,
  500. },
  501. [PIX_FMT_VDPAU_WMV3] = {
  502. .name = "vdpau_wmv3",
  503. .log2_chroma_w = 1,
  504. .log2_chroma_h = 1,
  505. .flags = PIX_FMT_HWACCEL,
  506. },
  507. [PIX_FMT_VDPAU_VC1] = {
  508. .name = "vdpau_vc1",
  509. .log2_chroma_w = 1,
  510. .log2_chroma_h = 1,
  511. .flags = PIX_FMT_HWACCEL,
  512. },
  513. [PIX_FMT_VDPAU_MPEG4] = {
  514. .name = "vdpau_mpeg4",
  515. .log2_chroma_w = 1,
  516. .log2_chroma_h = 1,
  517. .flags = PIX_FMT_HWACCEL,
  518. },
  519. [PIX_FMT_RGB48BE] = {
  520. .name = "rgb48be",
  521. .nb_components= 3,
  522. .log2_chroma_w= 0,
  523. .log2_chroma_h= 0,
  524. .comp = {
  525. {0,5,1,0,15}, /* R */
  526. {0,5,3,0,15}, /* G */
  527. {0,5,5,0,15}, /* B */
  528. },
  529. .flags = PIX_FMT_BE,
  530. },
  531. [PIX_FMT_RGB48LE] = {
  532. .name = "rgb48le",
  533. .nb_components= 3,
  534. .log2_chroma_w= 0,
  535. .log2_chroma_h= 0,
  536. .comp = {
  537. {0,5,1,0,15}, /* R */
  538. {0,5,3,0,15}, /* G */
  539. {0,5,5,0,15}, /* B */
  540. },
  541. },
  542. [PIX_FMT_RGB565BE] = {
  543. .name = "rgb565be",
  544. .nb_components= 3,
  545. .log2_chroma_w= 0,
  546. .log2_chroma_h= 0,
  547. .comp = {
  548. {0,1,0,3,4}, /* R */
  549. {0,1,1,5,5}, /* G */
  550. {0,1,1,0,4}, /* B */
  551. },
  552. .flags = PIX_FMT_BE,
  553. },
  554. [PIX_FMT_RGB565LE] = {
  555. .name = "rgb565le",
  556. .nb_components= 3,
  557. .log2_chroma_w= 0,
  558. .log2_chroma_h= 0,
  559. .comp = {
  560. {0,1,2,3,4}, /* R */
  561. {0,1,1,5,5}, /* G */
  562. {0,1,1,0,4}, /* B */
  563. },
  564. },
  565. [PIX_FMT_RGB555BE] = {
  566. .name = "rgb555be",
  567. .nb_components= 3,
  568. .log2_chroma_w= 0,
  569. .log2_chroma_h= 0,
  570. .comp = {
  571. {0,1,0,2,4}, /* R */
  572. {0,1,1,5,4}, /* G */
  573. {0,1,1,0,4}, /* B */
  574. },
  575. .flags = PIX_FMT_BE,
  576. },
  577. [PIX_FMT_RGB555LE] = {
  578. .name = "rgb555le",
  579. .nb_components= 3,
  580. .log2_chroma_w= 0,
  581. .log2_chroma_h= 0,
  582. .comp = {
  583. {0,1,2,2,4}, /* R */
  584. {0,1,1,5,4}, /* G */
  585. {0,1,1,0,4}, /* B */
  586. },
  587. },
  588. [PIX_FMT_RGB444BE] = {
  589. .name = "rgb444be",
  590. .nb_components= 3,
  591. .log2_chroma_w= 0,
  592. .log2_chroma_h= 0,
  593. .comp = {
  594. {0,1,0,0,3}, /* R */
  595. {0,1,1,4,3}, /* G */
  596. {0,1,1,0,3}, /* B */
  597. },
  598. .flags = PIX_FMT_BE,
  599. },
  600. [PIX_FMT_RGB444LE] = {
  601. .name = "rgb444le",
  602. .nb_components= 3,
  603. .log2_chroma_w= 0,
  604. .log2_chroma_h= 0,
  605. .comp = {
  606. {0,1,2,0,3}, /* R */
  607. {0,1,1,4,3}, /* G */
  608. {0,1,1,0,3}, /* B */
  609. },
  610. },
  611. [PIX_FMT_BGR565BE] = {
  612. .name = "bgr565be",
  613. .nb_components= 3,
  614. .log2_chroma_w= 0,
  615. .log2_chroma_h= 0,
  616. .comp = {
  617. {0,1,0,3,4}, /* B */
  618. {0,1,1,5,5}, /* G */
  619. {0,1,1,0,4}, /* R */
  620. },
  621. .flags = PIX_FMT_BE,
  622. },
  623. [PIX_FMT_BGR565LE] = {
  624. .name = "bgr565le",
  625. .nb_components= 3,
  626. .log2_chroma_w= 0,
  627. .log2_chroma_h= 0,
  628. .comp = {
  629. {0,1,2,3,4}, /* B */
  630. {0,1,1,5,5}, /* G */
  631. {0,1,1,0,4}, /* R */
  632. },
  633. },
  634. [PIX_FMT_BGR555BE] = {
  635. .name = "bgr555be",
  636. .nb_components= 3,
  637. .log2_chroma_w= 0,
  638. .log2_chroma_h= 0,
  639. .comp = {
  640. {0,1,0,2,4}, /* B */
  641. {0,1,1,5,4}, /* G */
  642. {0,1,1,0,4}, /* R */
  643. },
  644. .flags = PIX_FMT_BE,
  645. },
  646. [PIX_FMT_BGR555LE] = {
  647. .name = "bgr555le",
  648. .nb_components= 3,
  649. .log2_chroma_w= 0,
  650. .log2_chroma_h= 0,
  651. .comp = {
  652. {0,1,2,2,4}, /* B */
  653. {0,1,1,5,4}, /* G */
  654. {0,1,1,0,4}, /* R */
  655. },
  656. },
  657. [PIX_FMT_BGR444BE] = {
  658. .name = "bgr444be",
  659. .nb_components= 3,
  660. .log2_chroma_w= 0,
  661. .log2_chroma_h= 0,
  662. .comp = {
  663. {0,1,0,0,3}, /* B */
  664. {0,1,1,4,3}, /* G */
  665. {0,1,1,0,3}, /* R */
  666. },
  667. .flags = PIX_FMT_BE,
  668. },
  669. [PIX_FMT_BGR444LE] = {
  670. .name = "bgr444le",
  671. .nb_components= 3,
  672. .log2_chroma_w= 0,
  673. .log2_chroma_h= 0,
  674. .comp = {
  675. {0,1,2,0,3}, /* B */
  676. {0,1,1,4,3}, /* G */
  677. {0,1,1,0,3}, /* R */
  678. },
  679. },
  680. [PIX_FMT_VAAPI_MOCO] = {
  681. .name = "vaapi_moco",
  682. .log2_chroma_w = 1,
  683. .log2_chroma_h = 1,
  684. .flags = PIX_FMT_HWACCEL,
  685. },
  686. [PIX_FMT_VAAPI_IDCT] = {
  687. .name = "vaapi_idct",
  688. .log2_chroma_w = 1,
  689. .log2_chroma_h = 1,
  690. .flags = PIX_FMT_HWACCEL,
  691. },
  692. [PIX_FMT_VAAPI_VLD] = {
  693. .name = "vaapi_vld",
  694. .log2_chroma_w = 1,
  695. .log2_chroma_h = 1,
  696. .flags = PIX_FMT_HWACCEL,
  697. },
  698. [PIX_FMT_YUV420P16LE] = {
  699. .name = "yuv420p16le",
  700. .nb_components= 3,
  701. .log2_chroma_w= 1,
  702. .log2_chroma_h= 1,
  703. .comp = {
  704. {0,1,1,0,15}, /* Y */
  705. {1,1,1,0,15}, /* U */
  706. {2,1,1,0,15}, /* V */
  707. },
  708. },
  709. [PIX_FMT_YUV420P16BE] = {
  710. .name = "yuv420p16be",
  711. .nb_components= 3,
  712. .log2_chroma_w= 1,
  713. .log2_chroma_h= 1,
  714. .comp = {
  715. {0,1,1,0,15}, /* Y */
  716. {1,1,1,0,15}, /* U */
  717. {2,1,1,0,15}, /* V */
  718. },
  719. .flags = PIX_FMT_BE,
  720. },
  721. [PIX_FMT_YUV422P16LE] = {
  722. .name = "yuv422p16le",
  723. .nb_components= 3,
  724. .log2_chroma_w= 1,
  725. .log2_chroma_h= 0,
  726. .comp = {
  727. {0,1,1,0,15}, /* Y */
  728. {1,1,1,0,15}, /* U */
  729. {2,1,1,0,15}, /* V */
  730. },
  731. },
  732. [PIX_FMT_YUV422P16BE] = {
  733. .name = "yuv422p16be",
  734. .nb_components= 3,
  735. .log2_chroma_w= 1,
  736. .log2_chroma_h= 0,
  737. .comp = {
  738. {0,1,1,0,15}, /* Y */
  739. {1,1,1,0,15}, /* U */
  740. {2,1,1,0,15}, /* V */
  741. },
  742. .flags = PIX_FMT_BE,
  743. },
  744. [PIX_FMT_YUV444P16LE] = {
  745. .name = "yuv444p16le",
  746. .nb_components= 3,
  747. .log2_chroma_w= 0,
  748. .log2_chroma_h= 0,
  749. .comp = {
  750. {0,1,1,0,15}, /* Y */
  751. {1,1,1,0,15}, /* U */
  752. {2,1,1,0,15}, /* V */
  753. },
  754. },
  755. [PIX_FMT_YUV444P16BE] = {
  756. .name = "yuv444p16be",
  757. .nb_components= 3,
  758. .log2_chroma_w= 0,
  759. .log2_chroma_h= 0,
  760. .comp = {
  761. {0,1,1,0,15}, /* Y */
  762. {1,1,1,0,15}, /* U */
  763. {2,1,1,0,15}, /* V */
  764. },
  765. .flags = PIX_FMT_BE,
  766. },
  767. [PIX_FMT_DXVA2_VLD] = {
  768. .name = "dxva2_vld",
  769. .log2_chroma_w = 1,
  770. .log2_chroma_h = 1,
  771. .flags = PIX_FMT_HWACCEL,
  772. },
  773. [PIX_FMT_Y400A] = {
  774. .name = "y400a",
  775. .nb_components= 2,
  776. .comp = {
  777. {0,1,1,0,7}, /* Y */
  778. {0,1,2,0,7}, /* A */
  779. },
  780. },
  781. };
  782. static enum PixelFormat get_pix_fmt_internal(const char *name)
  783. {
  784. enum PixelFormat pix_fmt;
  785. for (pix_fmt = 0; pix_fmt < PIX_FMT_NB; pix_fmt++)
  786. if (av_pix_fmt_descriptors[pix_fmt].name &&
  787. !strcmp(av_pix_fmt_descriptors[pix_fmt].name, name))
  788. return pix_fmt;
  789. return PIX_FMT_NONE;
  790. }
  791. #if HAVE_BIGENDIAN
  792. # define X_NE(be, le) be
  793. #else
  794. # define X_NE(be, le) le
  795. #endif
  796. enum PixelFormat av_get_pix_fmt(const char *name)
  797. {
  798. enum PixelFormat pix_fmt;
  799. if (!strcmp(name, "rgb32"))
  800. name = X_NE("argb", "bgra");
  801. else if (!strcmp(name, "bgr32"))
  802. name = X_NE("abgr", "rgba");
  803. pix_fmt = get_pix_fmt_internal(name);
  804. if (pix_fmt == PIX_FMT_NONE) {
  805. char name2[32];
  806. snprintf(name2, sizeof(name2), "%s%s", name, X_NE("be", "le"));
  807. pix_fmt = get_pix_fmt_internal(name2);
  808. }
  809. return pix_fmt;
  810. }
  811. int av_get_bits_per_pixel(const AVPixFmtDescriptor *pixdesc)
  812. {
  813. int c, bits = 0;
  814. int log2_pixels = pixdesc->log2_chroma_w + pixdesc->log2_chroma_h;
  815. for (c = 0; c < pixdesc->nb_components; c++) {
  816. int s = c==1 || c==2 ? 0 : log2_pixels;
  817. bits += (pixdesc->comp[c].depth_minus1+1) << s;
  818. }
  819. return bits >> log2_pixels;
  820. }