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.

786 lines
21KB

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