64
66
#define RET 0xC3 //near return opcode for x86
66
#define isSupportedIn(x) ( \
67
(x)==PIX_FMT_YUV420P \
68
|| (x)==PIX_FMT_YUVA420P \
69
|| (x)==PIX_FMT_YUYV422 \
70
|| (x)==PIX_FMT_UYVY422 \
71
|| (x)==PIX_FMT_RGB48BE \
72
|| (x)==PIX_FMT_RGB48LE \
73
|| (x)==PIX_FMT_RGB32 \
74
|| (x)==PIX_FMT_RGB32_1 \
75
|| (x)==PIX_FMT_BGR48BE \
76
|| (x)==PIX_FMT_BGR48LE \
77
|| (x)==PIX_FMT_BGR24 \
78
|| (x)==PIX_FMT_BGR565LE \
79
|| (x)==PIX_FMT_BGR565BE \
80
|| (x)==PIX_FMT_BGR555LE \
81
|| (x)==PIX_FMT_BGR555BE \
82
|| (x)==PIX_FMT_BGR32 \
83
|| (x)==PIX_FMT_BGR32_1 \
84
|| (x)==PIX_FMT_RGB24 \
85
|| (x)==PIX_FMT_RGB565LE \
86
|| (x)==PIX_FMT_RGB565BE \
87
|| (x)==PIX_FMT_RGB555LE \
88
|| (x)==PIX_FMT_RGB555BE \
89
|| (x)==PIX_FMT_GRAY8 \
90
|| (x)==PIX_FMT_Y400A \
91
|| (x)==PIX_FMT_YUV410P \
92
|| (x)==PIX_FMT_YUV440P \
93
|| (x)==PIX_FMT_NV12 \
94
|| (x)==PIX_FMT_NV21 \
95
|| (x)==PIX_FMT_GRAY16BE \
96
|| (x)==PIX_FMT_GRAY16LE \
97
|| (x)==PIX_FMT_YUV444P \
98
|| (x)==PIX_FMT_YUV422P \
99
|| (x)==PIX_FMT_YUV411P \
100
|| (x)==PIX_FMT_YUVJ420P \
101
|| (x)==PIX_FMT_YUVJ422P \
102
|| (x)==PIX_FMT_YUVJ440P \
103
|| (x)==PIX_FMT_YUVJ444P \
104
|| (x)==PIX_FMT_PAL8 \
105
|| (x)==PIX_FMT_BGR8 \
106
|| (x)==PIX_FMT_RGB8 \
107
|| (x)==PIX_FMT_BGR4_BYTE \
108
|| (x)==PIX_FMT_RGB4_BYTE \
109
|| (x)==PIX_FMT_YUV440P \
110
|| (x)==PIX_FMT_MONOWHITE \
111
|| (x)==PIX_FMT_MONOBLACK \
112
|| (x)==PIX_FMT_YUV420P9LE \
113
|| (x)==PIX_FMT_YUV444P9LE \
114
|| (x)==PIX_FMT_YUV420P10LE \
115
|| (x)==PIX_FMT_YUV422P10LE \
116
|| (x)==PIX_FMT_YUV444P10LE \
117
|| (x)==PIX_FMT_YUV420P16LE \
118
|| (x)==PIX_FMT_YUV422P16LE \
119
|| (x)==PIX_FMT_YUV444P16LE \
120
|| (x)==PIX_FMT_YUV420P9BE \
121
|| (x)==PIX_FMT_YUV444P9BE \
122
|| (x)==PIX_FMT_YUV420P10BE \
123
|| (x)==PIX_FMT_YUV444P10BE \
124
|| (x)==PIX_FMT_YUV422P10BE \
125
|| (x)==PIX_FMT_YUV420P16BE \
126
|| (x)==PIX_FMT_YUV422P16BE \
127
|| (x)==PIX_FMT_YUV444P16BE \
68
typedef struct FormatEntry {
69
int is_supported_in, is_supported_out;
72
const static FormatEntry format_entries[PIX_FMT_NB] = {
73
[PIX_FMT_YUV420P] = { 1 , 1 },
74
[PIX_FMT_YUYV422] = { 1 , 1 },
75
[PIX_FMT_RGB24] = { 1 , 1 },
76
[PIX_FMT_BGR24] = { 1 , 1 },
77
[PIX_FMT_YUV422P] = { 1 , 1 },
78
[PIX_FMT_YUV444P] = { 1 , 1 },
79
[PIX_FMT_YUV410P] = { 1 , 1 },
80
[PIX_FMT_YUV411P] = { 1 , 1 },
81
[PIX_FMT_GRAY8] = { 1 , 1 },
82
[PIX_FMT_MONOWHITE] = { 1 , 1 },
83
[PIX_FMT_MONOBLACK] = { 1 , 1 },
84
[PIX_FMT_PAL8] = { 1 , 0 },
85
[PIX_FMT_YUVJ420P] = { 1 , 1 },
86
[PIX_FMT_YUVJ422P] = { 1 , 1 },
87
[PIX_FMT_YUVJ444P] = { 1 , 1 },
88
[PIX_FMT_UYVY422] = { 1 , 1 },
89
[PIX_FMT_UYYVYY411] = { 0 , 0 },
90
[PIX_FMT_BGR8] = { 1 , 1 },
91
[PIX_FMT_BGR4] = { 0 , 1 },
92
[PIX_FMT_BGR4_BYTE] = { 1 , 1 },
93
[PIX_FMT_RGB8] = { 1 , 1 },
94
[PIX_FMT_RGB4] = { 0 , 1 },
95
[PIX_FMT_RGB4_BYTE] = { 1 , 1 },
96
[PIX_FMT_NV12] = { 1 , 1 },
97
[PIX_FMT_NV21] = { 1 , 1 },
98
[PIX_FMT_ARGB] = { 1 , 1 },
99
[PIX_FMT_RGBA] = { 1 , 1 },
100
[PIX_FMT_ABGR] = { 1 , 1 },
101
[PIX_FMT_BGRA] = { 1 , 1 },
102
[PIX_FMT_GRAY16BE] = { 1 , 1 },
103
[PIX_FMT_GRAY16LE] = { 1 , 1 },
104
[PIX_FMT_YUV440P] = { 1 , 1 },
105
[PIX_FMT_YUVJ440P] = { 1 , 1 },
106
[PIX_FMT_YUVA420P] = { 1 , 1 },
107
[PIX_FMT_RGB48BE] = { 1 , 1 },
108
[PIX_FMT_RGB48LE] = { 1 , 1 },
109
[PIX_FMT_RGB565BE] = { 1 , 1 },
110
[PIX_FMT_RGB565LE] = { 1 , 1 },
111
[PIX_FMT_RGB555BE] = { 1 , 1 },
112
[PIX_FMT_RGB555LE] = { 1 , 1 },
113
[PIX_FMT_BGR565BE] = { 1 , 1 },
114
[PIX_FMT_BGR565LE] = { 1 , 1 },
115
[PIX_FMT_BGR555BE] = { 1 , 1 },
116
[PIX_FMT_BGR555LE] = { 1 , 1 },
117
[PIX_FMT_YUV420P16LE] = { 1 , 1 },
118
[PIX_FMT_YUV420P16BE] = { 1 , 1 },
119
[PIX_FMT_YUV422P16LE] = { 1 , 1 },
120
[PIX_FMT_YUV422P16BE] = { 1 , 1 },
121
[PIX_FMT_YUV444P16LE] = { 1 , 1 },
122
[PIX_FMT_YUV444P16BE] = { 1 , 1 },
123
[PIX_FMT_RGB444LE] = { 1 , 1 },
124
[PIX_FMT_RGB444BE] = { 1 , 1 },
125
[PIX_FMT_BGR444LE] = { 1 , 1 },
126
[PIX_FMT_BGR444BE] = { 1 , 1 },
127
[PIX_FMT_Y400A] = { 1 , 0 },
128
[PIX_FMT_BGR48BE] = { 1 , 1 },
129
[PIX_FMT_BGR48LE] = { 1 , 1 },
130
[PIX_FMT_YUV420P9BE] = { 1 , 1 },
131
[PIX_FMT_YUV420P9LE] = { 1 , 1 },
132
[PIX_FMT_YUV420P10BE] = { 1 , 1 },
133
[PIX_FMT_YUV420P10LE] = { 1 , 1 },
134
[PIX_FMT_YUV422P9BE] = { 1 , 1 },
135
[PIX_FMT_YUV422P9LE] = { 1 , 1 },
136
[PIX_FMT_YUV422P10BE] = { 1 , 1 },
137
[PIX_FMT_YUV422P10LE] = { 1 , 1 },
138
[PIX_FMT_YUV444P9BE] = { 1 , 1 },
139
[PIX_FMT_YUV444P9LE] = { 1 , 1 },
140
[PIX_FMT_YUV444P10BE] = { 1 , 1 },
141
[PIX_FMT_YUV444P10LE] = { 1 , 1 },
142
[PIX_FMT_GBRP] = { 1 , 0 },
143
[PIX_FMT_GBRP9LE] = { 1 , 0 },
144
[PIX_FMT_GBRP9BE] = { 1 , 0 },
145
[PIX_FMT_GBRP10LE] = { 1 , 0 },
146
[PIX_FMT_GBRP10BE] = { 1 , 0 },
147
[PIX_FMT_GBRP16LE] = { 1 , 0 },
148
[PIX_FMT_GBRP16BE] = { 1 , 0 },
130
151
int sws_isSupportedInput(enum PixelFormat pix_fmt)
132
return isSupportedIn(pix_fmt);
153
return (unsigned)pix_fmt < PIX_FMT_NB ?
154
format_entries[pix_fmt].is_supported_in : 0;
135
#define isSupportedOut(x) ( \
136
(x)==PIX_FMT_YUV420P \
137
|| (x)==PIX_FMT_YUVA420P \
138
|| (x)==PIX_FMT_YUYV422 \
139
|| (x)==PIX_FMT_UYVY422 \
140
|| (x)==PIX_FMT_YUV444P \
141
|| (x)==PIX_FMT_YUV422P \
142
|| (x)==PIX_FMT_YUV411P \
143
|| (x)==PIX_FMT_YUVJ420P \
144
|| (x)==PIX_FMT_YUVJ422P \
145
|| (x)==PIX_FMT_YUVJ440P \
146
|| (x)==PIX_FMT_YUVJ444P \
149
|| (x)==PIX_FMT_RGB565 \
150
|| (x)==PIX_FMT_RGB555 \
151
|| (x)==PIX_FMT_RGB444 \
152
|| (x)==PIX_FMT_BGR565 \
153
|| (x)==PIX_FMT_BGR555 \
154
|| (x)==PIX_FMT_BGR444 \
155
|| (x)==PIX_FMT_RGB8 \
156
|| (x)==PIX_FMT_BGR8 \
157
|| (x)==PIX_FMT_RGB4_BYTE \
158
|| (x)==PIX_FMT_BGR4_BYTE \
159
|| (x)==PIX_FMT_RGB4 \
160
|| (x)==PIX_FMT_BGR4 \
161
|| (x)==PIX_FMT_MONOBLACK \
162
|| (x)==PIX_FMT_MONOWHITE \
163
|| (x)==PIX_FMT_NV12 \
164
|| (x)==PIX_FMT_NV21 \
165
|| (x)==PIX_FMT_GRAY16BE \
166
|| (x)==PIX_FMT_GRAY16LE \
167
|| (x)==PIX_FMT_GRAY8 \
168
|| (x)==PIX_FMT_YUV410P \
169
|| (x)==PIX_FMT_YUV440P \
170
|| (x)==PIX_FMT_YUV420P9LE \
171
|| (x)==PIX_FMT_YUV420P10LE \
172
|| (x)==PIX_FMT_YUV420P16LE \
173
|| (x)==PIX_FMT_YUV422P16LE \
174
|| (x)==PIX_FMT_YUV444P16LE \
175
|| (x)==PIX_FMT_YUV420P9BE \
176
|| (x)==PIX_FMT_YUV420P10BE \
177
|| (x)==PIX_FMT_YUV420P16BE \
178
|| (x)==PIX_FMT_YUV422P16BE \
179
|| (x)==PIX_FMT_YUV444P16BE \
182
157
int sws_isSupportedOutput(enum PixelFormat pix_fmt)
184
return isSupportedOut(pix_fmt);
159
return (unsigned)pix_fmt < PIX_FMT_NB ?
160
format_entries[pix_fmt].is_supported_out : 0;
187
163
extern const int32_t ff_yuv2rgb_coeffs[8][4];
1015
1028
// allocate pixbufs (we use dynamic allocation because otherwise we would need to
1016
1029
// allocate several megabytes to handle all possible cases)
1017
FF_ALLOC_OR_GOTO(c, c->lumPixBuf, c->vLumBufSize*2*sizeof(int16_t*), fail);
1018
FF_ALLOC_OR_GOTO(c, c->chrUPixBuf, c->vChrBufSize*2*sizeof(int16_t*), fail);
1019
FF_ALLOC_OR_GOTO(c, c->chrVPixBuf, c->vChrBufSize*2*sizeof(int16_t*), fail);
1030
FF_ALLOC_OR_GOTO(c, c->lumPixBuf, c->vLumBufSize*3*sizeof(int16_t*), fail);
1031
FF_ALLOC_OR_GOTO(c, c->chrUPixBuf, c->vChrBufSize*3*sizeof(int16_t*), fail);
1032
FF_ALLOC_OR_GOTO(c, c->chrVPixBuf, c->vChrBufSize*3*sizeof(int16_t*), fail);
1020
1033
if (CONFIG_SWSCALE_ALPHA && isALPHA(c->srcFormat) && isALPHA(c->dstFormat))
1021
FF_ALLOCZ_OR_GOTO(c, c->alpPixBuf, c->vLumBufSize*2*sizeof(int16_t*), fail);
1034
FF_ALLOCZ_OR_GOTO(c, c->alpPixBuf, c->vLumBufSize*3*sizeof(int16_t*), fail);
1022
1035
//Note we need at least one pixel more at the end because of the MMX code (just in case someone wanna replace the 4000/8000)
1023
1036
/* align at 16 bytes for AltiVec */
1024
1037
for (i=0; i<c->vLumBufSize; i++) {
1025
FF_ALLOCZ_OR_GOTO(c, c->lumPixBuf[i+c->vLumBufSize], dst_stride+1, fail);
1038
FF_ALLOCZ_OR_GOTO(c, c->lumPixBuf[i+c->vLumBufSize], dst_stride+16, fail);
1026
1039
c->lumPixBuf[i] = c->lumPixBuf[i+c->vLumBufSize];
1028
c->uv_off = dst_stride_px;
1029
c->uv_offx2 = dst_stride;
1041
// 64 / (c->dstBpc & ~7) is the same as 16 / sizeof(scaling_intermediate)
1042
c->uv_off_px = dst_stride_px + 64 / (c->dstBpc &~ 7);
1043
c->uv_off_byte = dst_stride + 16;
1030
1044
for (i=0; i<c->vChrBufSize; i++) {
1031
FF_ALLOC_OR_GOTO(c, c->chrUPixBuf[i+c->vChrBufSize], dst_stride*2+1, fail);
1045
FF_ALLOC_OR_GOTO(c, c->chrUPixBuf[i+c->vChrBufSize], dst_stride*2+32, fail);
1032
1046
c->chrUPixBuf[i] = c->chrUPixBuf[i+c->vChrBufSize];
1033
c->chrVPixBuf[i] = c->chrVPixBuf[i+c->vChrBufSize] = c->chrUPixBuf[i] + dst_stride_px;
1047
c->chrVPixBuf[i] = c->chrVPixBuf[i+c->vChrBufSize] = c->chrUPixBuf[i] + (dst_stride >> 1) + 8;
1035
1049
if (CONFIG_SWSCALE_ALPHA && c->alpPixBuf)
1036
1050
for (i=0; i<c->vLumBufSize; i++) {
1037
FF_ALLOCZ_OR_GOTO(c, c->alpPixBuf[i+c->vLumBufSize], dst_stride+1, fail);
1051
FF_ALLOCZ_OR_GOTO(c, c->alpPixBuf[i+c->vLumBufSize], dst_stride+16, fail);
1038
1052
c->alpPixBuf[i] = c->alpPixBuf[i+c->vLumBufSize];
1075
1089
else if (HAVE_ALTIVEC && cpu_flags & AV_CPU_FLAG_ALTIVEC) av_log(c, AV_LOG_INFO, "using AltiVec\n");
1076
1090
else av_log(c, AV_LOG_INFO, "using C\n");
1078
if (HAVE_MMX && cpu_flags & AV_CPU_FLAG_MMX) {
1079
if (c->canMMX2BeUsed && (flags&SWS_FAST_BILINEAR))
1080
av_log(c, AV_LOG_VERBOSE, "using FAST_BILINEAR MMX2 scaler for horizontal scaling\n");
1082
if (c->hLumFilterSize==4)
1083
av_log(c, AV_LOG_VERBOSE, "using 4-tap MMX scaler for horizontal luminance scaling\n");
1084
else if (c->hLumFilterSize==8)
1085
av_log(c, AV_LOG_VERBOSE, "using 8-tap MMX scaler for horizontal luminance scaling\n");
1087
av_log(c, AV_LOG_VERBOSE, "using n-tap MMX scaler for horizontal luminance scaling\n");
1089
if (c->hChrFilterSize==4)
1090
av_log(c, AV_LOG_VERBOSE, "using 4-tap MMX scaler for horizontal chrominance scaling\n");
1091
else if (c->hChrFilterSize==8)
1092
av_log(c, AV_LOG_VERBOSE, "using 8-tap MMX scaler for horizontal chrominance scaling\n");
1094
av_log(c, AV_LOG_VERBOSE, "using n-tap MMX scaler for horizontal chrominance scaling\n");
1098
av_log(c, AV_LOG_VERBOSE, "using x86 asm scaler for horizontal scaling\n");
1100
if (flags & SWS_FAST_BILINEAR)
1101
av_log(c, AV_LOG_VERBOSE, "using FAST_BILINEAR C scaler for horizontal scaling\n");
1103
av_log(c, AV_LOG_VERBOSE, "using C scaler for horizontal scaling\n");
1106
if (isPlanarYUV(dstFormat)) {
1107
if (c->vLumFilterSize==1)
1108
av_log(c, AV_LOG_VERBOSE, "using 1-tap %s \"scaler\" for vertical scaling (YV12 like)\n",
1109
(HAVE_MMX && cpu_flags & AV_CPU_FLAG_MMX) ? "MMX" : "C");
1111
av_log(c, AV_LOG_VERBOSE, "using n-tap %s scaler for vertical scaling (YV12 like)\n",
1112
(HAVE_MMX && cpu_flags & AV_CPU_FLAG_MMX) ? "MMX" : "C");
1114
if (c->vLumFilterSize==1 && c->vChrFilterSize==2)
1115
av_log(c, AV_LOG_VERBOSE, "using 1-tap %s \"scaler\" for vertical luminance scaling (BGR)\n"
1116
" 2-tap scaler for vertical chrominance scaling (BGR)\n",
1117
(HAVE_MMX && cpu_flags & AV_CPU_FLAG_MMX) ? "MMX" : "C");
1118
else if (c->vLumFilterSize==2 && c->vChrFilterSize==2)
1119
av_log(c, AV_LOG_VERBOSE, "using 2-tap linear %s scaler for vertical scaling (BGR)\n",
1120
(HAVE_MMX && cpu_flags & AV_CPU_FLAG_MMX) ? "MMX" : "C");
1122
av_log(c, AV_LOG_VERBOSE, "using n-tap %s scaler for vertical scaling (BGR)\n",
1123
(HAVE_MMX && cpu_flags & AV_CPU_FLAG_MMX) ? "MMX" : "C");
1126
if (dstFormat==PIX_FMT_BGR24)
1127
av_log(c, AV_LOG_VERBOSE, "using %s YV12->BGR24 converter\n",
1128
(HAVE_MMX2 && cpu_flags & AV_CPU_FLAG_MMX2) ? "MMX2" :
1129
((HAVE_MMX && cpu_flags & AV_CPU_FLAG_MMX) ? "MMX" : "C"));
1130
else if (dstFormat==PIX_FMT_RGB32)
1131
av_log(c, AV_LOG_VERBOSE, "using %s YV12->BGR32 converter\n",
1132
(HAVE_MMX && cpu_flags & AV_CPU_FLAG_MMX) ? "MMX" : "C");
1133
else if (dstFormat==PIX_FMT_BGR565)
1134
av_log(c, AV_LOG_VERBOSE, "using %s YV12->BGR16 converter\n",
1135
(HAVE_MMX && cpu_flags & AV_CPU_FLAG_MMX) ? "MMX" : "C");
1136
else if (dstFormat==PIX_FMT_BGR555)
1137
av_log(c, AV_LOG_VERBOSE, "using %s YV12->BGR15 converter\n",
1138
(HAVE_MMX && cpu_flags & AV_CPU_FLAG_MMX) ? "MMX" : "C");
1139
else if (dstFormat == PIX_FMT_RGB444BE || dstFormat == PIX_FMT_RGB444LE ||
1140
dstFormat == PIX_FMT_BGR444BE || dstFormat == PIX_FMT_BGR444LE)
1141
av_log(c, AV_LOG_VERBOSE, "using %s YV12->BGR12 converter\n",
1142
(HAVE_MMX && cpu_flags & AV_CPU_FLAG_MMX) ? "MMX" : "C");
1144
1092
av_log(c, AV_LOG_VERBOSE, "%dx%d -> %dx%d\n", srcW, srcH, dstW, dstH);
1145
1093
av_log(c, AV_LOG_DEBUG, "lum srcW=%d srcH=%d dstW=%d dstH=%d xInc=%d yInc=%d\n",
1146
1094
c->srcW, c->srcH, c->dstW, c->dstH, c->lumXInc, c->lumYInc);