diff options
author | Marton Balint <cus@passwd.hu> | 2024-02-12 00:12:35 +0100 |
---|---|---|
committer | Marton Balint <cus@passwd.hu> | 2024-02-18 10:54:22 +0100 |
commit | 65c9c52a5aa9f6a0651b7f3302c8f140b3a322e5 (patch) | |
tree | 457ab8b2da2d989c7aaebe4f0b66e749ed7d317e | |
parent | 242901f7c2742c61af61df8d925a7aa125b30aba (diff) | |
download | ffmpeg-65c9c52a5aa9f6a0651b7f3302c8f140b3a322e5.tar.gz |
avutil/tests/channel_layout: add tests for av_channel_order_retype
Signed-off-by: Marton Balint <cus@passwd.hu>
-rw-r--r-- | libavutil/tests/channel_layout.c | 63 | ||||
-rw-r--r-- | tests/ref/fate/channel_layout | 27 |
2 files changed, 90 insertions, 0 deletions
diff --git a/libavutil/tests/channel_layout.c b/libavutil/tests/channel_layout.c index c537e7e710..23bb6009fb 100644 --- a/libavutil/tests/channel_layout.c +++ b/libavutil/tests/channel_layout.c @@ -24,7 +24,9 @@ #include "libavutil/bprint.h" #include "libavutil/channel_layout.h" +#include "libavutil/error.h" #include "libavutil/internal.h" +#include "libavutil/macros.h" #include "libavutil/mem.h" #define BPRINT_ARGS1(bp, ...) (bp), __VA_ARGS__ @@ -112,6 +114,53 @@ static void channel_layout_from_string(AVChannelLayout *layout, av_bprintf(bp, "fail"); } +static const char* channel_order_names[] = {"UNSPEC", "NATIVE", "CUSTOM", "AMBI"}; + +static void describe_type(AVBPrint *bp, AVChannelLayout *layout) +{ + if (layout->order >= 0 && layout->order < FF_ARRAY_ELEMS(channel_order_names)) { + av_bprintf(bp, "%-6s (", channel_order_names[layout->order]); + av_channel_layout_describe_bprint(layout, bp); + av_bprintf(bp, ")"); + } else { + av_bprintf(bp, "???"); + } +} + +static const char *channel_layout_retype(AVChannelLayout *layout, AVBPrint *bp, const char *channel_layout) +{ + av_channel_layout_uninit(layout); + av_bprint_clear(bp); + if (!av_channel_layout_from_string(layout, channel_layout) && + av_channel_layout_check(layout)) { + describe_type(bp, layout); + for (int i = 0; i < FF_CHANNEL_ORDER_NB; i++) { + int ret; + AVChannelLayout copy = {0}; + av_bprintf(bp, "\n "); + if (av_channel_layout_copy(©, layout) < 0) + return "nomem"; + ret = av_channel_layout_retype(©, i, 0); + if (ret < 0 && (copy.order != layout->order || av_channel_layout_compare(©, layout))) + av_bprintf(bp, "failed to keep existing layout on failure"); + if (ret >= 0 && copy.order != i) + av_bprintf(bp, "returned success but did not change order"); + if (ret == AVERROR(ENOSYS)) { + av_bprintf(bp, " != %s", channel_order_names[i]); + } else if (ret < 0) { + av_bprintf(bp, "FAIL"); + } else { + av_bprintf(bp, " %s ", ret ? "~~" : "=="); + describe_type(bp, ©); + } + av_channel_layout_uninit(©); + } + } else { + av_bprintf(bp, "fail"); + } + return bp->str; +} + #define CHANNEL_NAME(x) \ channel_name(&bp, (x)); @@ -435,6 +484,20 @@ int main(void) av_channel_layout_uninit(&layout); av_channel_layout_uninit(&layout2); + + printf("\nTesting av_channel_layout_retype\n"); + { + const char* layouts[] = { + "FL@Boo", + "stereo", + "FR+FL", + "ambisonic 2+stereo", + "2C", + NULL + }; + for (int i = 0; layouts[i]; i++) + printf("With \"%s\": %s\n", layouts[i], channel_layout_retype(&layout, &bp, layouts[i])); + } av_bprint_finalize(&bp, NULL); return 0; diff --git a/tests/ref/fate/channel_layout b/tests/ref/fate/channel_layout index ab9bee947b..1d1f1cb082 100644 --- a/tests/ref/fate/channel_layout +++ b/tests/ref/fate/channel_layout @@ -185,3 +185,30 @@ On "ambisonic 2+stereo" layout with 11: -1 Testing av_channel_layout_subset On "ambisonic 2+stereo" layout with AV_CH_LAYOUT_STEREO: 0x3 On "ambisonic 2+stereo" layout with AV_CH_LAYOUT_QUAD: 0x3 + +Testing av_channel_layout_retype +With "FL@Boo": CUSTOM (1 channels (FL@Boo)) + ~~ UNSPEC (1 channels) + ~~ NATIVE (1 channels (FL)) + == CUSTOM (1 channels (FL@Boo)) + != AMBI +With "stereo": NATIVE (stereo) + ~~ UNSPEC (2 channels) + == NATIVE (stereo) + == CUSTOM (2 channels (FL+FR)) + != AMBI +With "FR+FL": CUSTOM (2 channels (FR+FL)) + ~~ UNSPEC (2 channels) + != NATIVE + == CUSTOM (2 channels (FR+FL)) + != AMBI +With "ambisonic 2+stereo": AMBI (ambisonic 2+stereo) + ~~ UNSPEC (11 channels) + != NATIVE + == CUSTOM (ambisonic 2+2 channels (FL+FR)) + == AMBI (ambisonic 2+stereo) +With "2C": UNSPEC (2 channels) + == UNSPEC (2 channels) + != NATIVE + == CUSTOM (2 channels (USR768+USR768)) + != AMBI |