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