Make swscale-test take in input the name of the input and the output

format.

Make swscale-test only perform the test from the input to the output
format rather than perform all.

Also implement swscale-test-all.sh, for performing all the tests.

Improve flexibility of the swscale-test tool, this way is simpler to
perform only a subset of tests.

Originally committed as revision 30825 to svn://svn.mplayerhq.hu/mplayer/trunk/libswscale
This commit is contained in:
Stefano Sabatini 2010-03-04 00:31:10 +00:00
parent ce7c717900
commit 3fec44c640
2 changed files with 35 additions and 18 deletions

View File

@ -0,0 +1,11 @@
#! /bin/sh
FFMPEG=../ffmpeg
input_pix_fmts=$($FFMPEG -pix_fmts | sed -ne '9,$p' | grep '^I' | cut -d" " -f2)
output_pix_fmts=$($FFMPEG -pix_fmts | sed -ne '9,$p' | grep '^.O' | cut -d" " -f2)
for input_pix_fmt in $input_pix_fmts; do
for output_pix_fmt in $output_pix_fmts; do
swscale-test $input_pix_fmt $output_pix_fmt
done
done

View File

@ -25,9 +25,12 @@
#include <stdarg.h> #include <stdarg.h>
#undef HAVE_AV_CONFIG_H #undef HAVE_AV_CONFIG_H
#include "libavutil/log.h"
#include "libavutil/mem.h" #include "libavutil/mem.h"
#include "libavutil/avutil.h" #include "libavutil/avutil.h"
#include "libavutil/lfg.h" #include "libavutil/lfg.h"
#include "libavutil/pixdesc.h"
#include "swscale.h" #include "swscale.h"
/* HACK Duplicated from swscale_internal.h. /* HACK Duplicated from swscale_internal.h.
@ -186,27 +189,16 @@ end:
return res; return res;
} }
static void selfTest(uint8_t *ref[4], int refStride[4], int w, int h) static void selfTest(uint8_t *ref[4], int refStride[4], enum PixelFormat srcFormat, enum PixelFormat dstFormat, int w, int h)
{ {
const int flags[] = { SWS_FAST_BILINEAR, const int flags[] = { SWS_FAST_BILINEAR,
SWS_BILINEAR, SWS_BICUBIC, SWS_BILINEAR, SWS_BICUBIC,
SWS_X , SWS_POINT , SWS_AREA, 0 }; SWS_X , SWS_POINT , SWS_AREA, 0 };
const int srcW = w; const int srcW = w;
const int srcH = h; const int srcH = h;
int i, j, k, res = 0;
const int dstW[] = { srcW - srcW/3, srcW, srcW + srcW/3, 0 }; const int dstW[] = { srcW - srcW/3, srcW, srcW + srcW/3, 0 };
const int dstH[] = { srcH - srcH/3, srcH, srcH + srcH/3, 0 }; const int dstH[] = { srcH - srcH/3, srcH, srcH + srcH/3, 0 };
enum PixelFormat srcFormat, dstFormat;
for (srcFormat = 0; srcFormat < PIX_FMT_NB; srcFormat++) {
if (!sws_isSupportedInput(srcFormat) || !sws_isSupportedOutput(srcFormat))
continue;
for (dstFormat = 0; dstFormat < PIX_FMT_NB; dstFormat++) {
int i, j, k;
int res = 0;
if (!sws_isSupportedInput(dstFormat) || !sws_isSupportedOutput(dstFormat))
continue;
printf("%s -> %s\n", printf("%s -> %s\n",
sws_format_name(srcFormat), sws_format_name(srcFormat),
@ -217,9 +209,7 @@ static void selfTest(uint8_t *ref[4], int refStride[4], int w, int h)
for (j = 0; dstH[j] && !res; j++) for (j = 0; dstH[j] && !res; j++)
for (k = 0; flags[k] && !res; k++) for (k = 0; flags[k] && !res; k++)
res = doTest(ref, refStride, w, h, srcFormat, dstFormat, res = doTest(ref, refStride, w, h, srcFormat, dstFormat,
srcW, srcH, dstW[i], dstH[j], flags[k]); srcW, srcH, dstW[i], dstH[j], flags[k]|SWS_PRINT_INFO);
}
}
} }
#define W 96 #define W 96
@ -235,12 +225,28 @@ int main(int argc, char **argv)
int stride[4]={W, W, W, W}; int stride[4]={W, W, W, W};
int x, y; int x, y;
struct SwsContext *sws; struct SwsContext *sws;
enum PixelFormat srcFmt, dstFmt;
AVLFG rand; AVLFG rand;
av_log_set_level(AV_LOG_INFO);
if (argc < 3) {
fprintf(stderr, "Usage: swscale-test SRC_PIX_FMT DST_PIX_FMT\n");
return -1;
}
if ((srcFmt = av_get_pix_fmt(argv[1])) == PIX_FMT_NONE) {
fprintf(stderr, "Unknown pixel input format name: '%s'\n", argv[1]);
return -1;
}
if ((dstFmt = av_get_pix_fmt(argv[2])) == PIX_FMT_NONE) {
fprintf(stderr, "Unknown pixel output format name: '%s'\n", argv[2]);
return -1;
}
if (!rgb_data || !data) if (!rgb_data || !data)
return -1; return -1;
sws= sws_getContext(W/12, H/12, PIX_FMT_RGB32, W, H, PIX_FMT_YUVA420P, SWS_BILINEAR, NULL, NULL, NULL); sws= sws_getContext(W/12, H/12, PIX_FMT_RGB32, W, H, PIX_FMT_YUVA420P,
SWS_BILINEAR|SWS_PRINT_INFO, NULL, NULL, NULL);
av_lfg_init(&rand, 1); av_lfg_init(&rand, 1);
@ -253,7 +259,7 @@ int main(int argc, char **argv)
sws_freeContext(sws); sws_freeContext(sws);
av_free(rgb_data); av_free(rgb_data);
selfTest(src, stride, W, H); selfTest(src, stride, srcFmt, dstFmt, W, H);
av_free(data); av_free(data);
return 0; return 0;