configure: fetch a specific revision of FFmpeg.
[vaapi:challenzhous-mplayer.git] / fmt-conversion.c
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 "mp_msg.h"
20 #include "libavutil/avutil.h"
21 #include "libmpcodecs/img_format.h"
22 #include "libavutil/pixfmt.h"
23 #include "libavutil/samplefmt.h"
24 #include "libaf/af_format.h"
25 #include "fmt-conversion.h"
26
27 static const struct {
28     int fmt;
29     enum PixelFormat pix_fmt;
30 } conversion_map[] = {
31     {IMGFMT_ARGB,    PIX_FMT_ARGB},
32     {IMGFMT_BGRA,    PIX_FMT_BGRA},
33     {IMGFMT_BGR24,   PIX_FMT_BGR24},
34     {IMGFMT_BGR16BE, PIX_FMT_RGB565BE},
35     {IMGFMT_BGR16LE, PIX_FMT_RGB565LE},
36     {IMGFMT_BGR15BE, PIX_FMT_RGB555BE},
37     {IMGFMT_BGR15LE, PIX_FMT_RGB555LE},
38     {IMGFMT_BGR12BE, PIX_FMT_RGB444BE},
39     {IMGFMT_BGR12LE, PIX_FMT_RGB444LE},
40     {IMGFMT_BGR8,    PIX_FMT_RGB8},
41     {IMGFMT_BGR4,    PIX_FMT_RGB4},
42     {IMGFMT_BGR1,    PIX_FMT_MONOBLACK},
43     {IMGFMT_RGB1,    PIX_FMT_MONOBLACK},
44     {IMGFMT_RG4B,    PIX_FMT_BGR4_BYTE},
45     {IMGFMT_BG4B,    PIX_FMT_RGB4_BYTE},
46     {IMGFMT_RGB48LE, PIX_FMT_RGB48LE},
47     {IMGFMT_RGB48BE, PIX_FMT_RGB48BE},
48     {IMGFMT_ABGR,    PIX_FMT_ABGR},
49     {IMGFMT_RGBA,    PIX_FMT_RGBA},
50     {IMGFMT_RGB24,   PIX_FMT_RGB24},
51     {IMGFMT_RGB16BE, PIX_FMT_BGR565BE},
52     {IMGFMT_RGB16LE, PIX_FMT_BGR565LE},
53     {IMGFMT_RGB15BE, PIX_FMT_BGR555BE},
54     {IMGFMT_RGB15LE, PIX_FMT_BGR555LE},
55     {IMGFMT_RGB12BE, PIX_FMT_BGR444BE},
56     {IMGFMT_RGB12LE, PIX_FMT_BGR444LE},
57     {IMGFMT_RGB8,    PIX_FMT_BGR8},
58     {IMGFMT_RGB4,    PIX_FMT_BGR4},
59     {IMGFMT_BGR8,    PIX_FMT_PAL8},
60     {IMGFMT_BGR32,   PIX_FMT_0RGB32},
61 #if LIBAVUTIL_VERSION_INT >= AV_VERSION_INT(51, 20, 1)
62     {IMGFMT_GBR24P,  PIX_FMT_GBR24P},
63 #endif
64     {IMGFMT_YUY2,    PIX_FMT_YUYV422},
65     {IMGFMT_UYVY,    PIX_FMT_UYVY422},
66     {IMGFMT_NV12,    PIX_FMT_NV12},
67     {IMGFMT_NV21,    PIX_FMT_NV21},
68     {IMGFMT_Y800,    PIX_FMT_GRAY8},
69     {IMGFMT_Y8,      PIX_FMT_GRAY8},
70     {IMGFMT_YVU9,    PIX_FMT_YUV410P},
71     {IMGFMT_IF09,    PIX_FMT_YUV410P},
72     {IMGFMT_YV12,    PIX_FMT_YUV420P},
73     {IMGFMT_I420,    PIX_FMT_YUV420P},
74     {IMGFMT_IYUV,    PIX_FMT_YUV420P},
75     {IMGFMT_411P,    PIX_FMT_YUV411P},
76     {IMGFMT_422P,    PIX_FMT_YUV422P},
77     {IMGFMT_444P,    PIX_FMT_YUV444P},
78     {IMGFMT_440P,    PIX_FMT_YUV440P},
79
80     {IMGFMT_420A,  PIX_FMT_YUVA420P},
81
82     {IMGFMT_420P16_LE,  PIX_FMT_YUV420P16LE},
83     {IMGFMT_420P16_BE,  PIX_FMT_YUV420P16BE},
84     {IMGFMT_420P10_LE,  PIX_FMT_YUV420P10LE},
85     {IMGFMT_420P10_BE,  PIX_FMT_YUV420P10BE},
86     {IMGFMT_420P9_LE,   PIX_FMT_YUV420P9LE},
87     {IMGFMT_420P9_BE,   PIX_FMT_YUV420P9BE},
88     {IMGFMT_422P16_LE,  PIX_FMT_YUV422P16LE},
89     {IMGFMT_422P16_BE,  PIX_FMT_YUV422P16BE},
90     {IMGFMT_422P10_LE,  PIX_FMT_YUV422P10LE},
91     {IMGFMT_422P10_BE,  PIX_FMT_YUV422P10BE},
92     {IMGFMT_444P16_LE,  PIX_FMT_YUV444P16LE},
93     {IMGFMT_444P16_BE,  PIX_FMT_YUV444P16BE},
94     {IMGFMT_444P10_LE,  PIX_FMT_YUV444P10LE},
95     {IMGFMT_444P10_BE,  PIX_FMT_YUV444P10BE},
96     {IMGFMT_444P9_LE,   PIX_FMT_YUV444P9LE},
97     {IMGFMT_444P9_BE,   PIX_FMT_YUV444P9BE},
98
99     // YUVJ are YUV formats that use the full Y range and not just
100     // 16 - 235 (see colorspaces.txt).
101     // Currently they are all treated the same way.
102     {IMGFMT_YV12,  PIX_FMT_YUVJ420P},
103     {IMGFMT_422P,  PIX_FMT_YUVJ422P},
104     {IMGFMT_444P,  PIX_FMT_YUVJ444P},
105     {IMGFMT_440P,  PIX_FMT_YUVJ440P},
106
107     {IMGFMT_XVMC_MOCO_MPEG2, PIX_FMT_XVMC_MPEG2_MC},
108     {IMGFMT_XVMC_IDCT_MPEG2, PIX_FMT_XVMC_MPEG2_IDCT},
109     {IMGFMT_VDPAU_MPEG1,     PIX_FMT_VDPAU_MPEG1},
110     {IMGFMT_VDPAU_MPEG2,     PIX_FMT_VDPAU_MPEG2},
111     {IMGFMT_VDPAU_H264,      PIX_FMT_VDPAU_H264},
112     {IMGFMT_VDPAU_WMV3,      PIX_FMT_VDPAU_WMV3},
113     {IMGFMT_VDPAU_VC1,       PIX_FMT_VDPAU_VC1},
114     {IMGFMT_VDPAU_MPEG4,     PIX_FMT_VDPAU_MPEG4},
115     {0, PIX_FMT_NONE}
116 };
117
118 enum PixelFormat imgfmt2pixfmt(int fmt)
119 {
120     int i;
121     enum PixelFormat pix_fmt;
122     for (i = 0; conversion_map[i].fmt; i++)
123         if (conversion_map[i].fmt == fmt)
124             break;
125     pix_fmt = conversion_map[i].pix_fmt;
126     if (pix_fmt == PIX_FMT_NONE)
127         mp_msg(MSGT_GLOBAL, MSGL_ERR, "Unsupported format %s\n", vo_format_name(fmt));
128     return pix_fmt;
129 }
130
131 int pixfmt2imgfmt(enum PixelFormat pix_fmt)
132 {
133     int i;
134     int fmt;
135     for (i = 0; conversion_map[i].pix_fmt != PIX_FMT_NONE; i++)
136         if (conversion_map[i].pix_fmt == pix_fmt)
137             break;
138     fmt = conversion_map[i].fmt;
139     if (!fmt)
140         mp_msg(MSGT_GLOBAL, MSGL_ERR, "Unsupported PixelFormat %i\n", pix_fmt);
141     return fmt;
142 }
143
144 static const struct {
145     int fmt;
146     enum AVSampleFormat sample_fmt;
147 } samplefmt_conversion_map[] = {
148     {AF_FORMAT_U8, AV_SAMPLE_FMT_U8},
149     {AF_FORMAT_S16_NE, AV_SAMPLE_FMT_S16},
150     {AF_FORMAT_S32_NE, AV_SAMPLE_FMT_S32},
151     {AF_FORMAT_FLOAT_NE, AV_SAMPLE_FMT_FLT},
152     {0, AV_SAMPLE_FMT_NONE}
153 };
154
155 enum AVSampleFormat affmt2samplefmt(int fmt)
156 {
157     char str[50];
158     int i;
159     enum AVSampleFormat sample_fmt;
160     for (i = 0; samplefmt_conversion_map[i].fmt; i++)
161         if (samplefmt_conversion_map[i].fmt == fmt)
162             break;
163     sample_fmt = samplefmt_conversion_map[i].sample_fmt;
164     if (sample_fmt == AV_SAMPLE_FMT_NONE)
165         mp_msg(MSGT_GLOBAL, MSGL_ERR, "Unsupported format %s\n",
166                af_fmt2str(fmt, str, sizeof(str)));
167     return sample_fmt;
168 }
169
170 int samplefmt2affmt(enum AVSampleFormat sample_fmt)
171 {
172     int i;
173     int fmt;
174     for (i = 0; samplefmt_conversion_map[i].sample_fmt != AV_SAMPLE_FMT_NONE; i++)
175         if (samplefmt_conversion_map[i].sample_fmt == sample_fmt)
176             break;
177     fmt = samplefmt_conversion_map[i].fmt;
178     if (!fmt)
179         mp_msg(MSGT_GLOBAL, MSGL_ERR, "Unsupported AVSampleFormat %i\n", sample_fmt);
180     return fmt;
181 }