Mercurial > mplayer.hg
comparison libswscale/swscale-example.c @ 28978:3aa3a63b8a83
Also test the alpha channel in swscale-example
author | sdrik |
---|---|
date | Fri, 20 Mar 2009 14:17:20 +0000 |
parents | 9ae8c54007f5 |
children | a73861318395 |
comparison
equal
deleted
inserted
replaced
28977:6601bf7365d5 | 28978:3aa3a63b8a83 |
---|---|
47 return ssd; | 47 return ssd; |
48 } | 48 } |
49 | 49 |
50 // test by ref -> src -> dst -> out & compare out against ref | 50 // test by ref -> src -> dst -> out & compare out against ref |
51 // ref & out are YV12 | 51 // ref & out are YV12 |
52 static int doTest(uint8_t *ref[3], int refStride[3], int w, int h, int srcFormat, int dstFormat, | 52 static int doTest(uint8_t *ref[4], int refStride[4], int w, int h, int srcFormat, int dstFormat, |
53 int srcW, int srcH, int dstW, int dstH, int flags){ | 53 int srcW, int srcH, int dstW, int dstH, int flags){ |
54 uint8_t *src[3]; | 54 uint8_t *src[4]; |
55 uint8_t *dst[3]; | 55 uint8_t *dst[4]; |
56 uint8_t *out[3]; | 56 uint8_t *out[4]; |
57 int srcStride[3], dstStride[3]; | 57 int srcStride[4], dstStride[4]; |
58 int i; | 58 int i; |
59 uint64_t ssdY, ssdU, ssdV; | 59 uint64_t ssdY, ssdU, ssdV, ssdA=0; |
60 struct SwsContext *srcContext = NULL, *dstContext = NULL, | 60 struct SwsContext *srcContext = NULL, *dstContext = NULL, |
61 *outContext = NULL; | 61 *outContext = NULL; |
62 int res; | 62 int res; |
63 | 63 |
64 res = 0; | 64 res = 0; |
65 for (i=0; i<3; i++){ | 65 for (i=0; i<4; i++){ |
66 // avoid stride % bpp != 0 | 66 // avoid stride % bpp != 0 |
67 if (srcFormat==PIX_FMT_RGB24 || srcFormat==PIX_FMT_BGR24) | 67 if (srcFormat==PIX_FMT_RGB24 || srcFormat==PIX_FMT_BGR24) |
68 srcStride[i]= srcW*3; | 68 srcStride[i]= srcW*3; |
69 else | 69 else |
70 srcStride[i]= srcW*4; | 70 srcStride[i]= srcW*4; |
83 | 83 |
84 goto end; | 84 goto end; |
85 } | 85 } |
86 } | 86 } |
87 | 87 |
88 srcContext= sws_getContext(w, h, PIX_FMT_YUV420P, srcW, srcH, srcFormat, flags, NULL, NULL, NULL); | 88 srcContext= sws_getContext(w, h, PIX_FMT_YUVA420P, srcW, srcH, srcFormat, flags, NULL, NULL, NULL); |
89 if (!srcContext) { | 89 if (!srcContext) { |
90 fprintf(stderr, "Failed to get %s ---> %s\n", | 90 fprintf(stderr, "Failed to get %s ---> %s\n", |
91 sws_format_name(PIX_FMT_YUV420P), | 91 sws_format_name(PIX_FMT_YUVA420P), |
92 sws_format_name(srcFormat)); | 92 sws_format_name(srcFormat)); |
93 res = -1; | 93 res = -1; |
94 | 94 |
95 goto end; | 95 goto end; |
96 } | 96 } |
101 sws_format_name(dstFormat)); | 101 sws_format_name(dstFormat)); |
102 res = -1; | 102 res = -1; |
103 | 103 |
104 goto end; | 104 goto end; |
105 } | 105 } |
106 outContext= sws_getContext(dstW, dstH, dstFormat, w, h, PIX_FMT_YUV420P, flags, NULL, NULL, NULL); | 106 outContext= sws_getContext(dstW, dstH, dstFormat, w, h, PIX_FMT_YUVA420P, flags, NULL, NULL, NULL); |
107 if (!outContext) { | 107 if (!outContext) { |
108 fprintf(stderr, "Failed to get %s ---> %s\n", | 108 fprintf(stderr, "Failed to get %s ---> %s\n", |
109 sws_format_name(dstFormat), | 109 sws_format_name(dstFormat), |
110 sws_format_name(PIX_FMT_YUV420P)); | 110 sws_format_name(PIX_FMT_YUVA420P)); |
111 res = -1; | 111 res = -1; |
112 | 112 |
113 goto end; | 113 goto end; |
114 } | 114 } |
115 // printf("test %X %X %X -> %X %X %X\n", (int)ref[0], (int)ref[1], (int)ref[2], | 115 // printf("test %X %X %X -> %X %X %X\n", (int)ref[0], (int)ref[1], (int)ref[2], |
120 sws_scale(outContext, dst, dstStride, 0, dstH, out, refStride); | 120 sws_scale(outContext, dst, dstStride, 0, dstH, out, refStride); |
121 | 121 |
122 ssdY= getSSD(ref[0], out[0], refStride[0], refStride[0], w, h); | 122 ssdY= getSSD(ref[0], out[0], refStride[0], refStride[0], w, h); |
123 ssdU= getSSD(ref[1], out[1], refStride[1], refStride[1], (w+1)>>1, (h+1)>>1); | 123 ssdU= getSSD(ref[1], out[1], refStride[1], refStride[1], (w+1)>>1, (h+1)>>1); |
124 ssdV= getSSD(ref[2], out[2], refStride[2], refStride[2], (w+1)>>1, (h+1)>>1); | 124 ssdV= getSSD(ref[2], out[2], refStride[2], refStride[2], (w+1)>>1, (h+1)>>1); |
125 if (isALPHA(srcFormat) && isALPHA(dstFormat)) | |
126 ssdA= getSSD(ref[3], out[3], refStride[3], refStride[3], w, h); | |
125 | 127 |
126 if (srcFormat == PIX_FMT_GRAY8 || dstFormat==PIX_FMT_GRAY8) ssdU=ssdV=0; //FIXME check that output is really gray | 128 if (srcFormat == PIX_FMT_GRAY8 || dstFormat==PIX_FMT_GRAY8) ssdU=ssdV=0; //FIXME check that output is really gray |
127 | 129 |
128 ssdY/= w*h; | 130 ssdY/= w*h; |
129 ssdU/= w*h/4; | 131 ssdU/= w*h/4; |
130 ssdV/= w*h/4; | 132 ssdV/= w*h/4; |
131 | 133 ssdA/= w*h; |
132 printf(" %s %dx%d -> %s %4dx%4d flags=%2d SSD=%5lld,%5lld,%5lld\n", | 134 |
135 printf(" %s %dx%d -> %s %4dx%4d flags=%2d SSD=%5lld,%5lld,%5lld,%5lld\n", | |
133 sws_format_name(srcFormat), srcW, srcH, | 136 sws_format_name(srcFormat), srcW, srcH, |
134 sws_format_name(dstFormat), dstW, dstH, | 137 sws_format_name(dstFormat), dstW, dstH, |
135 flags, ssdY, ssdU, ssdV); | 138 flags, ssdY, ssdU, ssdV, ssdA); |
136 fflush(stdout); | 139 fflush(stdout); |
137 | 140 |
138 end: | 141 end: |
139 | 142 |
140 sws_freeContext(srcContext); | 143 sws_freeContext(srcContext); |
141 sws_freeContext(dstContext); | 144 sws_freeContext(dstContext); |
142 sws_freeContext(outContext); | 145 sws_freeContext(outContext); |
143 | 146 |
144 for (i=0; i<3; i++){ | 147 for (i=0; i<4; i++){ |
145 free(src[i]); | 148 free(src[i]); |
146 free(dst[i]); | 149 free(dst[i]); |
147 free(out[i]); | 150 free(out[i]); |
148 } | 151 } |
149 | 152 |
150 return res; | 153 return res; |
151 } | 154 } |
152 | 155 |
153 static void selfTest(uint8_t *src[3], int stride[3], int w, int h){ | 156 static void selfTest(uint8_t *src[4], int stride[4], int w, int h){ |
154 enum PixelFormat srcFormat, dstFormat; | 157 enum PixelFormat srcFormat, dstFormat; |
155 int srcW, srcH, dstW, dstH; | 158 int srcW, srcH, dstW, dstH; |
156 int flags; | 159 int flags; |
157 | 160 |
158 for (srcFormat = 0; srcFormat < PIX_FMT_NB; srcFormat++) { | 161 for (srcFormat = 0; srcFormat < PIX_FMT_NB; srcFormat++) { |
188 | 191 |
189 int main(int argc, char **argv){ | 192 int main(int argc, char **argv){ |
190 uint8_t *rgb_data = malloc (W*H*4); | 193 uint8_t *rgb_data = malloc (W*H*4); |
191 uint8_t *rgb_src[3]= {rgb_data, NULL, NULL}; | 194 uint8_t *rgb_src[3]= {rgb_data, NULL, NULL}; |
192 int rgb_stride[3]={4*W, 0, 0}; | 195 int rgb_stride[3]={4*W, 0, 0}; |
193 uint8_t *data = malloc (3*W*H); | 196 uint8_t *data = malloc (4*W*H); |
194 uint8_t *src[3]= {data, data+W*H, data+W*H*2}; | 197 uint8_t *src[4]= {data, data+W*H, data+W*H*2, data+W*H*3}; |
195 int stride[3]={W, W, W}; | 198 int stride[4]={W, W, W, W}; |
196 int x, y; | 199 int x, y; |
197 struct SwsContext *sws; | 200 struct SwsContext *sws; |
198 AVLFG rand; | 201 AVLFG rand; |
199 | 202 |
200 sws= sws_getContext(W/12, H/12, PIX_FMT_RGB32, W, H, PIX_FMT_YUV420P, 2, NULL, NULL, NULL); | 203 sws= sws_getContext(W/12, H/12, PIX_FMT_RGB32, W, H, PIX_FMT_YUVA420P, 2, NULL, NULL, NULL); |
201 | 204 |
202 av_lfg_init(&rand, 1); | 205 av_lfg_init(&rand, 1); |
203 | 206 |
204 for (y=0; y<H; y++){ | 207 for (y=0; y<H; y++){ |
205 for (x=0; x<W*4; x++){ | 208 for (x=0; x<W*4; x++){ |