mirror of
https://mirror.skon.top/https://github.com/FFmpeg/FFmpeg
synced 2026-05-01 06:13:08 +08:00
swscale/tests/sws_ops: simplify using ff_sws_enum_op_lists()
Signed-off-by: Niklas Haas <git@haasn.dev>
This commit is contained in:
@@ -27,47 +27,19 @@
|
||||
#include <fcntl.h>
|
||||
#endif
|
||||
|
||||
static int run_test(SwsContext *const ctx, AVFrame *frame,
|
||||
const AVPixFmtDescriptor *const src_desc,
|
||||
const AVPixFmtDescriptor *const dst_desc)
|
||||
static int print_ops(SwsContext *const ctx, void *opaque, SwsOpList *ops)
|
||||
{
|
||||
/* Reuse ff_fmt_from_frame() to ensure correctly sanitized metadata */
|
||||
frame->format = av_pix_fmt_desc_get_id(src_desc);
|
||||
SwsFormat src = ff_fmt_from_frame(frame, 0);
|
||||
frame->format = av_pix_fmt_desc_get_id(dst_desc);
|
||||
SwsFormat dst = ff_fmt_from_frame(frame, 0);
|
||||
bool incomplete = ff_infer_colors(&src.color, &dst.color);
|
||||
av_log(opaque, AV_LOG_INFO, "%s -> %s:\n",
|
||||
av_get_pix_fmt_name(ops->src.format),
|
||||
av_get_pix_fmt_name(ops->dst.format));
|
||||
|
||||
SwsOpList *ops = ff_sws_op_list_alloc();
|
||||
if (!ops)
|
||||
return AVERROR(ENOMEM);
|
||||
ops->src = src;
|
||||
ops->dst = dst;
|
||||
|
||||
if (ff_sws_decode_pixfmt(ops, src.format) < 0)
|
||||
goto fail;
|
||||
if (ff_sws_decode_colors(ctx, SWS_PIXEL_F32, ops, &src, &incomplete) < 0)
|
||||
goto fail;
|
||||
if (ff_sws_encode_colors(ctx, SWS_PIXEL_F32, ops, &src, &dst, &incomplete) < 0)
|
||||
goto fail;
|
||||
if (ff_sws_encode_pixfmt(ops, dst.format) < 0)
|
||||
goto fail;
|
||||
|
||||
av_log(NULL, AV_LOG_INFO, "%s -> %s:\n",
|
||||
av_get_pix_fmt_name(src.format), av_get_pix_fmt_name(dst.format));
|
||||
|
||||
ff_sws_op_list_optimize(ops);
|
||||
if (ff_sws_op_list_is_noop(ops))
|
||||
av_log(NULL, AV_LOG_INFO, " (no-op)\n");
|
||||
av_log(opaque, AV_LOG_INFO, " (no-op)\n");
|
||||
else
|
||||
ff_sws_op_list_print(NULL, AV_LOG_INFO, AV_LOG_INFO, ops);
|
||||
ff_sws_op_list_print(opaque, AV_LOG_INFO, AV_LOG_INFO, ops);
|
||||
|
||||
fail:
|
||||
/* silently skip unsupported formats */
|
||||
ff_sws_op_list_free(&ops);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void log_stdout(void *avcl, int level, const char *fmt, va_list vl)
|
||||
{
|
||||
if (level != AV_LOG_INFO) {
|
||||
@@ -79,10 +51,8 @@ static void log_stdout(void *avcl, int level, const char *fmt, va_list vl)
|
||||
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
enum AVPixelFormat src_fmt_min = 0;
|
||||
enum AVPixelFormat dst_fmt_min = 0;
|
||||
enum AVPixelFormat src_fmt_max = AV_PIX_FMT_NB - 1;
|
||||
enum AVPixelFormat dst_fmt_max = AV_PIX_FMT_NB - 1;
|
||||
enum AVPixelFormat src_fmt = AV_PIX_FMT_NONE;
|
||||
enum AVPixelFormat dst_fmt = AV_PIX_FMT_NONE;
|
||||
int ret = 1;
|
||||
|
||||
#ifdef _WIN32
|
||||
@@ -105,14 +75,14 @@ int main(int argc, char **argv)
|
||||
if (argv[i][0] != '-' || i + 1 == argc)
|
||||
goto bad_option;
|
||||
if (!strcmp(argv[i], "-src")) {
|
||||
src_fmt_min = src_fmt_max = av_get_pix_fmt(argv[i + 1]);
|
||||
if (src_fmt_min == AV_PIX_FMT_NONE) {
|
||||
src_fmt = av_get_pix_fmt(argv[i + 1]);
|
||||
if (src_fmt == AV_PIX_FMT_NONE) {
|
||||
fprintf(stderr, "invalid pixel format %s\n", argv[i + 1]);
|
||||
goto error;
|
||||
}
|
||||
} else if (!strcmp(argv[i], "-dst")) {
|
||||
dst_fmt_min = dst_fmt_max = av_get_pix_fmt(argv[i + 1]);
|
||||
if (dst_fmt_min == AV_PIX_FMT_NONE) {
|
||||
dst_fmt = av_get_pix_fmt(argv[i + 1]);
|
||||
if (dst_fmt == AV_PIX_FMT_NONE) {
|
||||
fprintf(stderr, "invalid pixel format %s\n", argv[i + 1]);
|
||||
goto error;
|
||||
}
|
||||
@@ -124,29 +94,16 @@ bad_option:
|
||||
}
|
||||
|
||||
SwsContext *ctx = sws_alloc_context();
|
||||
AVFrame *frame = av_frame_alloc();
|
||||
if (!ctx || !frame)
|
||||
if (!ctx)
|
||||
goto fail;
|
||||
frame->width = frame->height = 16;
|
||||
|
||||
av_log_set_callback(log_stdout);
|
||||
for (const AVPixFmtDescriptor *src = NULL; (src = av_pix_fmt_desc_next(src));) {
|
||||
enum AVPixelFormat src_fmt = av_pix_fmt_desc_get_id(src);
|
||||
if (src_fmt < src_fmt_min || src_fmt > src_fmt_max)
|
||||
continue;
|
||||
for (const AVPixFmtDescriptor *dst = NULL; (dst = av_pix_fmt_desc_next(dst));) {
|
||||
enum AVPixelFormat dst_fmt = av_pix_fmt_desc_get_id(dst);
|
||||
if (dst_fmt < dst_fmt_min || dst_fmt > dst_fmt_max)
|
||||
continue;
|
||||
int err = run_test(ctx, frame, src, dst);
|
||||
if (err < 0)
|
||||
goto fail;
|
||||
}
|
||||
}
|
||||
ret = ff_sws_enum_op_lists(ctx, NULL, src_fmt, dst_fmt, print_ops);
|
||||
if (ret < 0)
|
||||
goto fail;
|
||||
|
||||
ret = 0;
|
||||
fail:
|
||||
av_frame_free(&frame);
|
||||
sws_free_context(&ctx);
|
||||
return ret;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user