img_format.c 8.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233
  1. /*
  2. * This file is part of MPlayer.
  3. *
  4. * MPlayer is free software; you can redistribute it and/or modify
  5. * it under the terms of the GNU General Public License as published by
  6. * the Free Software Foundation; either version 2 of the License, or
  7. * (at your option) any later version.
  8. *
  9. * MPlayer is distributed in the hope that it will be useful,
  10. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  11. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  12. * GNU General Public License for more details.
  13. *
  14. * You should have received a copy of the GNU General Public License along
  15. * with MPlayer; if not, write to the Free Software Foundation, Inc.,
  16. * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
  17. */
  18. #include "config.h"
  19. #include "img_format.h"
  20. #include "stdio.h"
  21. #include "libavutil/bswap.h"
  22. const char *ff_vo_format_name(int format)
  23. {
  24. static char unknown_format[20];
  25. switch(format)
  26. {
  27. case IMGFMT_RGB1: return "RGB 1-bit";
  28. case IMGFMT_RGB4: return "RGB 4-bit";
  29. case IMGFMT_RG4B: return "RGB 4-bit per byte";
  30. case IMGFMT_RGB8: return "RGB 8-bit";
  31. case IMGFMT_RGB12: return "RGB 12-bit";
  32. case IMGFMT_RGB15: return "RGB 15-bit";
  33. case IMGFMT_RGB16: return "RGB 16-bit";
  34. case IMGFMT_RGB24: return "RGB 24-bit";
  35. // case IMGFMT_RGB32: return "RGB 32-bit";
  36. case IMGFMT_RGB48LE: return "RGB 48-bit LE";
  37. case IMGFMT_RGB48BE: return "RGB 48-bit BE";
  38. case IMGFMT_RGB64LE: return "RGB 64-bit LE";
  39. case IMGFMT_RGB64BE: return "RGB 64-bit BE";
  40. case IMGFMT_BGR1: return "BGR 1-bit";
  41. case IMGFMT_BGR4: return "BGR 4-bit";
  42. case IMGFMT_BG4B: return "BGR 4-bit per byte";
  43. case IMGFMT_BGR8: return "BGR 8-bit";
  44. case IMGFMT_BGR12: return "BGR 12-bit";
  45. case IMGFMT_BGR15: return "BGR 15-bit";
  46. case IMGFMT_BGR16: return "BGR 16-bit";
  47. case IMGFMT_BGR24: return "BGR 24-bit";
  48. // case IMGFMT_BGR32: return "BGR 32-bit";
  49. case IMGFMT_ABGR: return "ABGR";
  50. case IMGFMT_BGRA: return "BGRA";
  51. case IMGFMT_ARGB: return "ARGB";
  52. case IMGFMT_RGBA: return "RGBA";
  53. case IMGFMT_GBR24P: return "Planar GBR 24-bit";
  54. case IMGFMT_GBR12P: return "Planar GBR 36-bit";
  55. case IMGFMT_GBR14P: return "Planar GBR 42-bit";
  56. case IMGFMT_YVU9: return "Planar YVU9";
  57. case IMGFMT_IF09: return "Planar IF09";
  58. case IMGFMT_YV12: return "Planar YV12";
  59. case IMGFMT_I420: return "Planar I420";
  60. case IMGFMT_IYUV: return "Planar IYUV";
  61. case IMGFMT_CLPL: return "Planar CLPL";
  62. case IMGFMT_Y800: return "Planar Y800";
  63. case IMGFMT_Y8: return "Planar Y8";
  64. case IMGFMT_Y8A: return "Planar Y8 with alpha";
  65. case IMGFMT_Y16_LE: return "Planar Y16 little-endian";
  66. case IMGFMT_Y16_BE: return "Planar Y16 big-endian";
  67. case IMGFMT_420P16_LE: return "Planar 420P 16-bit little-endian";
  68. case IMGFMT_420P16_BE: return "Planar 420P 16-bit big-endian";
  69. case IMGFMT_420P14_LE: return "Planar 420P 14-bit little-endian";
  70. case IMGFMT_420P14_BE: return "Planar 420P 14-bit big-endian";
  71. case IMGFMT_420P12_LE: return "Planar 420P 12-bit little-endian";
  72. case IMGFMT_420P12_BE: return "Planar 420P 12-bit big-endian";
  73. case IMGFMT_420P10_LE: return "Planar 420P 10-bit little-endian";
  74. case IMGFMT_420P10_BE: return "Planar 420P 10-bit big-endian";
  75. case IMGFMT_420P9_LE: return "Planar 420P 9-bit little-endian";
  76. case IMGFMT_420P9_BE: return "Planar 420P 9-bit big-endian";
  77. case IMGFMT_422P16_LE: return "Planar 422P 16-bit little-endian";
  78. case IMGFMT_422P16_BE: return "Planar 422P 16-bit big-endian";
  79. case IMGFMT_422P14_LE: return "Planar 422P 14-bit little-endian";
  80. case IMGFMT_422P14_BE: return "Planar 422P 14-bit big-endian";
  81. case IMGFMT_422P12_LE: return "Planar 422P 12-bit little-endian";
  82. case IMGFMT_422P12_BE: return "Planar 422P 12-bit big-endian";
  83. case IMGFMT_422P10_LE: return "Planar 422P 10-bit little-endian";
  84. case IMGFMT_422P10_BE: return "Planar 422P 10-bit big-endian";
  85. case IMGFMT_422P9_LE: return "Planar 422P 9-bit little-endian";
  86. case IMGFMT_422P9_BE: return "Planar 422P 9-bit big-endian";
  87. case IMGFMT_444P16_LE: return "Planar 444P 16-bit little-endian";
  88. case IMGFMT_444P16_BE: return "Planar 444P 16-bit big-endian";
  89. case IMGFMT_444P14_LE: return "Planar 444P 14-bit little-endian";
  90. case IMGFMT_444P14_BE: return "Planar 444P 14-bit big-endian";
  91. case IMGFMT_444P12_LE: return "Planar 444P 12-bit little-endian";
  92. case IMGFMT_444P12_BE: return "Planar 444P 12-bit big-endian";
  93. case IMGFMT_444P10_LE: return "Planar 444P 10-bit little-endian";
  94. case IMGFMT_444P10_BE: return "Planar 444P 10-bit big-endian";
  95. case IMGFMT_444P9_LE: return "Planar 444P 9-bit little-endian";
  96. case IMGFMT_444P9_BE: return "Planar 444P 9-bit big-endian";
  97. case IMGFMT_420A: return "Planar 420P with alpha";
  98. case IMGFMT_444P: return "Planar 444P";
  99. case IMGFMT_444A: return "Planar 444P with alpha";
  100. case IMGFMT_422P: return "Planar 422P";
  101. case IMGFMT_422A: return "Planar 422P with alpha";
  102. case IMGFMT_411P: return "Planar 411P";
  103. case IMGFMT_NV12: return "Planar NV12";
  104. case IMGFMT_NV21: return "Planar NV21";
  105. case IMGFMT_HM12: return "Planar NV12 Macroblock";
  106. case IMGFMT_IUYV: return "Packed IUYV";
  107. case IMGFMT_IY41: return "Packed IY41";
  108. case IMGFMT_IYU1: return "Packed IYU1";
  109. case IMGFMT_IYU2: return "Packed IYU2";
  110. case IMGFMT_UYVY: return "Packed UYVY";
  111. case IMGFMT_UYNV: return "Packed UYNV";
  112. case IMGFMT_cyuv: return "Packed CYUV";
  113. case IMGFMT_Y422: return "Packed Y422";
  114. case IMGFMT_YUY2: return "Packed YUY2";
  115. case IMGFMT_YUNV: return "Packed YUNV";
  116. case IMGFMT_YVYU: return "Packed YVYU";
  117. case IMGFMT_Y41P: return "Packed Y41P";
  118. case IMGFMT_Y211: return "Packed Y211";
  119. case IMGFMT_Y41T: return "Packed Y41T";
  120. case IMGFMT_Y42T: return "Packed Y42T";
  121. case IMGFMT_V422: return "Packed V422";
  122. case IMGFMT_V655: return "Packed V655";
  123. case IMGFMT_CLJR: return "Packed CLJR";
  124. case IMGFMT_YUVP: return "Packed YUVP";
  125. case IMGFMT_UYVP: return "Packed UYVP";
  126. case IMGFMT_MPEGPES: return "Mpeg PES";
  127. case IMGFMT_ZRMJPEGNI: return "Zoran MJPEG non-interlaced";
  128. case IMGFMT_ZRMJPEGIT: return "Zoran MJPEG top field first";
  129. case IMGFMT_ZRMJPEGIB: return "Zoran MJPEG bottom field first";
  130. case IMGFMT_XVMC_MOCO_MPEG2: return "MPEG1/2 Motion Compensation";
  131. case IMGFMT_XVMC_IDCT_MPEG2: return "MPEG1/2 Motion Compensation and IDCT";
  132. case IMGFMT_VDPAU_MPEG1: return "MPEG1 VDPAU acceleration";
  133. case IMGFMT_VDPAU_MPEG2: return "MPEG2 VDPAU acceleration";
  134. case IMGFMT_VDPAU_H264: return "H.264 VDPAU acceleration";
  135. case IMGFMT_VDPAU_MPEG4: return "MPEG-4 Part 2 VDPAU acceleration";
  136. case IMGFMT_VDPAU_WMV3: return "WMV3 VDPAU acceleration";
  137. case IMGFMT_VDPAU_VC1: return "VC1 VDPAU acceleration";
  138. }
  139. snprintf(unknown_format,20,"Unknown 0x%04x",format);
  140. return unknown_format;
  141. }
  142. int ff_mp_get_chroma_shift(int format, int *x_shift, int *y_shift, int *component_bits)
  143. {
  144. int xs = 0, ys = 0;
  145. int bpp;
  146. int err = 0;
  147. int bits = 8;
  148. if ((format & 0xff0000f0) == 0x34000050)
  149. format = av_bswap32(format);
  150. if ((format & 0xf00000ff) == 0x50000034) {
  151. switch (format >> 24) {
  152. case 0x50:
  153. break;
  154. case 0x51:
  155. bits = 16;
  156. break;
  157. case 0x52:
  158. bits = 10;
  159. break;
  160. case 0x53:
  161. bits = 9;
  162. break;
  163. default:
  164. err = 1;
  165. break;
  166. }
  167. switch (format & 0x00ffffff) {
  168. case 0x00343434: // 444
  169. xs = 0;
  170. ys = 0;
  171. break;
  172. case 0x00323234: // 422
  173. xs = 1;
  174. ys = 0;
  175. break;
  176. case 0x00303234: // 420
  177. xs = 1;
  178. ys = 1;
  179. break;
  180. case 0x00313134: // 411
  181. xs = 2;
  182. ys = 0;
  183. break;
  184. case 0x00303434: // 440
  185. xs = 0;
  186. ys = 1;
  187. break;
  188. default:
  189. err = 1;
  190. break;
  191. }
  192. } else switch (format) {
  193. case IMGFMT_444A:
  194. xs = 0;
  195. ys = 0;
  196. break;
  197. case IMGFMT_422A:
  198. xs = 1;
  199. ys = 0;
  200. break;
  201. case IMGFMT_420A:
  202. case IMGFMT_I420:
  203. case IMGFMT_IYUV:
  204. case IMGFMT_YV12:
  205. xs = 1;
  206. ys = 1;
  207. break;
  208. case IMGFMT_IF09:
  209. case IMGFMT_YVU9:
  210. xs = 2;
  211. ys = 2;
  212. break;
  213. case IMGFMT_Y8:
  214. case IMGFMT_Y800:
  215. xs = 31;
  216. ys = 31;
  217. break;
  218. default:
  219. err = 1;
  220. break;
  221. }
  222. if (x_shift) *x_shift = xs;
  223. if (y_shift) *y_shift = ys;
  224. if (component_bits) *component_bits = bits;
  225. bpp = 8 + ((16 >> xs) >> ys);
  226. if (format == IMGFMT_420A || format == IMGFMT_422A || format == IMGFMT_444A)
  227. bpp += 8;
  228. bpp *= (bits + 7) >> 3;
  229. return err ? 0 : bpp;
  230. }