On 2013-04-26 15:36:56 +0200, Hendrik Leppkes wrote:
>
> Not sure if it matters in the end, but this function is not fool proof.
>
> yuv420 == yuvj420
> nv12 == nv21
> argb == rgba == abgr == bgra
>
> and probably more.
pixel descriptors are insufficient to decide whether two pixel formats
differ only in endianness. :-(
So it's explicit tests, soon to be outdated.
Janne
---8<---
---
libavutil/pixdesc.c | 49 +++++++++++++++++++++++++++++++++++++++++++++++++
libavutil/pixdesc.h | 8 ++++++++
libavutil/version.h | 2 +-
3 files changed, 58 insertions(+), 1 deletion(-)
diff --git a/libavutil/pixdesc.c b/libavutil/pixdesc.c
index 67f9c43..029430a 100644
--- a/libavutil/pixdesc.c
+++ b/libavutil/pixdesc.c
@@ -1512,3 +1512,52 @@ int av_pix_fmt_count_planes(enum AVPixelFormat pix_fmt)
ret += planes[i];
return ret;
}
+
+
+int av_pix_fmt_equal_except_endianness(enum AVPixelFormat fmt_a,
+ enum AVPixelFormat fmt_b)
+{
+
+#define PIX_FMT_ENDIAN_TEST(be, le)
\
+ case AV_PIX_FMT_##be: return fmt_b == AV_PIX_FMT_##le;
\
+ case AV_PIX_FMT_##le: return fmt_b == AV_PIX_FMT_##be
+
+ switch(fmt_a) {
+ PIX_FMT_ENDIAN_TEST(GRAY16BE, GRAY16LE);
+ PIX_FMT_ENDIAN_TEST(RGB48BE, RGB48LE);
+ PIX_FMT_ENDIAN_TEST(RGB565BE, RGB565LE);
+ PIX_FMT_ENDIAN_TEST(RGB555BE, RGB555LE);
+ PIX_FMT_ENDIAN_TEST(RGB444BE, RGB444LE);
+ PIX_FMT_ENDIAN_TEST(BGR48BE, BGR48LE);
+ PIX_FMT_ENDIAN_TEST(BGR565BE, BGR565LE);
+ PIX_FMT_ENDIAN_TEST(BGR555BE, BGR555LE);
+ PIX_FMT_ENDIAN_TEST(BGR444BE, BGR444LE);
+
+ PIX_FMT_ENDIAN_TEST(YUV420P9BE , YUV420P9LE);
+ PIX_FMT_ENDIAN_TEST(YUV422P9BE , YUV422P9LE);
+ PIX_FMT_ENDIAN_TEST(YUV444P9BE , YUV444P9LE);
+ PIX_FMT_ENDIAN_TEST(YUV420P10BE, YUV420P10LE);
+ PIX_FMT_ENDIAN_TEST(YUV422P10BE, YUV422P10LE);
+ PIX_FMT_ENDIAN_TEST(YUV444P10BE, YUV444P10LE);
+ PIX_FMT_ENDIAN_TEST(YUV420P16BE, YUV420P16LE);
+ PIX_FMT_ENDIAN_TEST(YUV422P16BE, YUV422P16LE);
+ PIX_FMT_ENDIAN_TEST(YUV444P16BE, YUV444P16LE);
+
+ PIX_FMT_ENDIAN_TEST(GBRP9BE , GBRP9LE);
+ PIX_FMT_ENDIAN_TEST(GBRP10BE, GBRP10LE);
+ PIX_FMT_ENDIAN_TEST(GBRP16BE, GBRP16LE);
+ PIX_FMT_ENDIAN_TEST(YUVA420P9BE , YUVA420P9LE);
+ PIX_FMT_ENDIAN_TEST(YUVA422P9BE , YUVA422P9LE);
+ PIX_FMT_ENDIAN_TEST(YUVA444P9BE , YUVA444P9LE);
+ PIX_FMT_ENDIAN_TEST(YUVA420P10BE, YUVA420P10LE);
+ PIX_FMT_ENDIAN_TEST(YUVA422P10BE, YUVA422P10LE);
+ PIX_FMT_ENDIAN_TEST(YUVA444P10BE, YUVA444P10LE);
+ PIX_FMT_ENDIAN_TEST(YUVA420P16BE, YUVA420P16LE);
+ PIX_FMT_ENDIAN_TEST(YUVA422P16BE, YUVA422P16LE);
+ PIX_FMT_ENDIAN_TEST(YUVA444P16BE, YUVA444P16LE);
+
+ PIX_FMT_ENDIAN_TEST(XYZ12BE, XYZ12LE);
+ default:
+ return 0;
+ }
+}
diff --git a/libavutil/pixdesc.h b/libavutil/pixdesc.h
index ef93bfe..1db395d 100644
--- a/libavutil/pixdesc.h
+++ b/libavutil/pixdesc.h
@@ -226,4 +226,12 @@ int av_pix_fmt_get_chroma_sub_sample(enum AVPixelFormat
pix_fmt,
int av_pix_fmt_count_planes(enum AVPixelFormat pix_fmt);
+/**
+ * @return 1 if both pixel formats are equal but differ in endianness,
+ * 0 otherwise.
+ */
+int av_pix_fmt_equal_except_endianness(enum AVPixelFormat fmt_a,
+ enum AVPixelFormat fmt_b);
+
+
#endif /* AVUTIL_PIXDESC_H */
diff --git a/libavutil/version.h b/libavutil/version.h
index 6e8daa2..948a28f 100644
--- a/libavutil/version.h
+++ b/libavutil/version.h
@@ -38,7 +38,7 @@
#define LIBAVUTIL_VERSION_MAJOR 52
#define LIBAVUTIL_VERSION_MINOR 10
-#define LIBAVUTIL_VERSION_MICRO 0
+#define LIBAVUTIL_VERSION_MICRO 1
#define LIBAVUTIL_VERSION_INT AV_VERSION_INT(LIBAVUTIL_VERSION_MAJOR, \
LIBAVUTIL_VERSION_MINOR, \
--
1.8.2.1
_______________________________________________
libav-devel mailing list
[email protected]
https://lists.libav.org/mailman/listinfo/libav-devel