Commit 73016d29 authored by Ramiro Polla's avatar Ramiro Polla

swscale-test: scale from reference to source only once for each algorithm

Originally committed as revision 31777 to svn://svn.mplayerhq.hu/mplayer/trunk/libswscale
parent be1c5d35
...@@ -72,29 +72,21 @@ static uint64_t getSSD(uint8_t *src1, uint8_t *src2, int stride1, int stride2, i ...@@ -72,29 +72,21 @@ static uint64_t getSSD(uint8_t *src1, uint8_t *src2, int stride1, int stride2, i
// test by ref -> src -> dst -> out & compare out against ref // test by ref -> src -> dst -> out & compare out against ref
// ref & out are YV12 // ref & out are YV12
static int doTest(uint8_t *ref[4], int refStride[4], int w, int h, static int doTest(uint8_t *ref[4], int refStride[4], int w, int h,
uint8_t *src[4], int srcStride[4],
enum PixelFormat srcFormat, enum PixelFormat dstFormat, enum PixelFormat srcFormat, enum PixelFormat dstFormat,
int srcW, int srcH, int dstW, int dstH, int flags) int srcW, int srcH, int dstW, int dstH, int flags)
{ {
uint8_t *src[4] = {0};
uint8_t *dst[4] = {0}; uint8_t *dst[4] = {0};
uint8_t *out[4] = {0}; uint8_t *out[4] = {0};
int srcStride[4], dstStride[4]; int dstStride[4];
int i; int i;
uint64_t ssdY, ssdU=0, ssdV=0, ssdA=0; uint64_t ssdY, ssdU=0, ssdV=0, ssdA=0;
struct SwsContext *srcContext = NULL, *dstContext = NULL, struct SwsContext *dstContext = NULL, *outContext = NULL;
*outContext = NULL;
int res; int res;
res = 0; res = 0;
for (i=0; i<4; i++) { for (i=0; i<4; i++) {
// avoid stride % bpp != 0 // avoid stride % bpp != 0
if (srcFormat==PIX_FMT_RGB24 || srcFormat==PIX_FMT_BGR24)
srcStride[i]= srcW*3;
else if (srcFormat==PIX_FMT_RGB48BE || srcFormat==PIX_FMT_RGB48LE)
srcStride[i]= srcW*6;
else
srcStride[i]= srcW*4;
if (dstFormat==PIX_FMT_RGB24 || dstFormat==PIX_FMT_BGR24) if (dstFormat==PIX_FMT_RGB24 || dstFormat==PIX_FMT_BGR24)
dstStride[i]= dstW*3; dstStride[i]= dstW*3;
else if (dstFormat==PIX_FMT_RGB48BE || dstFormat==PIX_FMT_RGB48LE) else if (dstFormat==PIX_FMT_RGB48BE || dstFormat==PIX_FMT_RGB48LE)
...@@ -108,10 +100,9 @@ static int doTest(uint8_t *ref[4], int refStride[4], int w, int h, ...@@ -108,10 +100,9 @@ static int doTest(uint8_t *ref[4], int refStride[4], int w, int h,
* allocated with av_malloc). */ * allocated with av_malloc). */
/* An extra 16 bytes is being allocated because some scalers may write /* An extra 16 bytes is being allocated because some scalers may write
* out of bounds. */ * out of bounds. */
src[i]= av_mallocz(srcStride[i]*srcH+16);
dst[i]= av_mallocz(dstStride[i]*dstH+16); dst[i]= av_mallocz(dstStride[i]*dstH+16);
out[i]= av_mallocz(refStride[i]*h); out[i]= av_mallocz(refStride[i]*h);
if (!src[i] || !dst[i] || !out[i]) { if (!dst[i] || !out[i]) {
perror("Malloc"); perror("Malloc");
res = -1; res = -1;
...@@ -119,15 +110,6 @@ static int doTest(uint8_t *ref[4], int refStride[4], int w, int h, ...@@ -119,15 +110,6 @@ static int doTest(uint8_t *ref[4], int refStride[4], int w, int h,
} }
} }
srcContext= sws_getContext(w, h, PIX_FMT_YUVA420P, srcW, srcH, srcFormat, flags, NULL, NULL, NULL);
if (!srcContext) {
fprintf(stderr, "Failed to get %s ---> %s\n",
av_pix_fmt_descriptors[PIX_FMT_YUVA420P].name,
av_pix_fmt_descriptors[srcFormat].name);
res = -1;
goto end;
}
dstContext= sws_getContext(srcW, srcH, srcFormat, dstW, dstH, dstFormat, flags, NULL, NULL, NULL); dstContext= sws_getContext(srcW, srcH, srcFormat, dstW, dstH, dstFormat, flags, NULL, NULL, NULL);
if (!dstContext) { if (!dstContext) {
fprintf(stderr, "Failed to get %s ---> %s\n", fprintf(stderr, "Failed to get %s ---> %s\n",
...@@ -155,7 +137,6 @@ static int doTest(uint8_t *ref[4], int refStride[4], int w, int h, ...@@ -155,7 +137,6 @@ static int doTest(uint8_t *ref[4], int refStride[4], int w, int h,
flags); flags);
fflush(stdout); fflush(stdout);
sws_scale(srcContext, ref, refStride, 0, h , src, srcStride);
sws_scale(dstContext, src, srcStride, 0, srcH, dst, dstStride); sws_scale(dstContext, src, srcStride, 0, srcH, dst, dstStride);
sws_scale(outContext, dst, dstStride, 0, dstH, out, refStride); sws_scale(outContext, dst, dstStride, 0, dstH, out, refStride);
...@@ -178,12 +159,10 @@ static int doTest(uint8_t *ref[4], int refStride[4], int w, int h, ...@@ -178,12 +159,10 @@ static int doTest(uint8_t *ref[4], int refStride[4], int w, int h,
end: end:
sws_freeContext(srcContext);
sws_freeContext(dstContext); sws_freeContext(dstContext);
sws_freeContext(outContext); sws_freeContext(outContext);
for (i=0; i<4; i++) { for (i=0; i<4; i++) {
av_free(src[i]);
av_free(dst[i]); av_free(dst[i]);
av_free(out[i]); av_free(out[i]);
} }
...@@ -218,11 +197,46 @@ static void selfTest(uint8_t *ref[4], int refStride[4], int w, int h) ...@@ -218,11 +197,46 @@ static void selfTest(uint8_t *ref[4], int refStride[4], int w, int h)
av_pix_fmt_descriptors[dstFormat].name); av_pix_fmt_descriptors[dstFormat].name);
fflush(stdout); fflush(stdout);
for (k = 0; flags[k] && !res; k++) for (k = 0; flags[k] && !res; k++) {
struct SwsContext *srcContext = NULL;
uint8_t *src[4] = {0};
int srcStride[4];
int p;
for (p = 0; p < 4; p++) {
if (srcFormat == PIX_FMT_RGB24 ||
srcFormat == PIX_FMT_BGR24)
srcStride[p] = srcW*3;
else if (srcFormat==PIX_FMT_RGB48BE ||
srcFormat==PIX_FMT_RGB48LE)
srcStride[p] = srcW*6;
else
srcStride[p] = srcW*4;
src[p] = av_mallocz(srcStride[p]*srcH+16);
if (!src[p]) {
perror("Malloc");
return;
}
}
srcContext = sws_getContext(w, h, PIX_FMT_YUVA420P, srcW, srcH,
srcFormat, flags[k], NULL, NULL, NULL);
if (!srcContext) {
fprintf(stderr, "Failed to get %s ---> %s\n",
av_pix_fmt_descriptors[PIX_FMT_YUVA420P].name,
av_pix_fmt_descriptors[srcFormat].name);
return;
}
sws_scale(srcContext, ref, refStride, 0, h, src, srcStride);
for (i = 0; dstW[i] && !res; i++) for (i = 0; dstW[i] && !res; i++)
for (j = 0; dstH[j] && !res; j++) for (j = 0; dstH[j] && !res; j++)
res = doTest(ref, refStride, w, h, srcFormat, dstFormat, res = doTest(ref, refStride, w, h, src, srcStride,
srcFormat, dstFormat,
srcW, srcH, dstW[i], dstH[j], flags[k]); srcW, srcH, dstW[i], dstH[j], flags[k]);
sws_freeContext(srcContext);
for (p = 0; p < 4; p++)
av_free(src[p]);
}
} }
} }
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment