From 6373827a401106af1cfa6c20bb1cc06a8636d15a Mon Sep 17 00:00:00 2001 From: Wim Taymans Date: Mon, 5 May 2025 12:10:02 +0200 Subject: [PATCH] videoconvert: use a table for format conversion Use a table with format conversion values so that we can also use flags for the formats. --- .../videoconvert/videoconvert-ffmpeg.c | 292 ++++++++---------- 1 file changed, 126 insertions(+), 166 deletions(-) diff --git a/spa/plugins/videoconvert/videoconvert-ffmpeg.c b/spa/plugins/videoconvert/videoconvert-ffmpeg.c index 0a2511324..580105a91 100644 --- a/spa/plugins/videoconvert/videoconvert-ffmpeg.c +++ b/spa/plugins/videoconvert/videoconvert-ffmpeg.c @@ -267,6 +267,132 @@ static void emit_info(struct impl *this, bool full) } } +struct format_info { + enum AVPixelFormat pix_fmt; + uint32_t format; +#define FORMAT_DSP (1<<0) +#define FORMAT_COMMON (1<<1) + uint32_t flags; +}; + +static struct format_info format_info[] = +{ +#if defined AV_PIX_FMT_AYUV + { AV_PIX_FMT_AYUV, SPA_VIDEO_FORMAT_AYUV, FORMAT_DSP | FORMAT_COMMON }, +#else + { AV_PIX_FMT_YUV444P, SPA_VIDEO_FORMAT_Y444, FORMAT_DSP | FORMAT_COMMON }, +#endif + { AV_PIX_FMT_RGBA, SPA_VIDEO_FORMAT_RGBA, FORMAT_DSP | FORMAT_COMMON }, + + { AV_PIX_FMT_YUYV422, SPA_VIDEO_FORMAT_YUY2, FORMAT_COMMON }, + { AV_PIX_FMT_UYVY422, SPA_VIDEO_FORMAT_UYVY, FORMAT_COMMON }, + { AV_PIX_FMT_YVYU422, SPA_VIDEO_FORMAT_YVYU, FORMAT_COMMON }, + { AV_PIX_FMT_YUV420P, SPA_VIDEO_FORMAT_I420, FORMAT_COMMON }, + + //{ AV_PIX_FMT_BGR0, SPA_VIDEO_FORMAT_BGRx }, + //{ AV_PIX_FMT_BGRA, SPA_VIDEO_FORMAT_BGRA }, + //{ AV_PIX_FMT_ARGB, SPA_VIDEO_FORMAT_ARGB }, + //{ AV_PIX_FMT_ABGR, SPA_VIDEO_FORMAT_ABGR }, + + //{ AV_PIX_FMT_NONE, SPA_VIDEO_FORMAT_YV12 }, + + //{ AV_PIX_FMT_RGB0, SPA_VIDEO_FORMAT_RGBx }, + //{ AV_PIX_FMT_0RGB, SPA_VIDEO_FORMAT_xRGB }, + //{ AV_PIX_FMT_0BGR, SPA_VIDEO_FORMAT_xBGR }, + + //{ AV_PIX_FMT_RGB24, SPA_VIDEO_FORMAT_RGB }, + //{ AV_PIX_FMT_BGR24, SPA_VIDEO_FORMAT_BGR }, + //{ AV_PIX_FMT_YUV411P, SPA_VIDEO_FORMAT_Y41B }, + //{ AV_PIX_FMT_YUV422P, SPA_VIDEO_FORMAT_Y42B }, + + //{ AV_PIX_FMT_NONE, SPA_VIDEO_FORMAT_v210 }, + //{ AV_PIX_FMT_NONE, SPA_VIDEO_FORMAT_v216 }, + + //{ AV_PIX_FMT_NV12, SPA_VIDEO_FORMAT_NV12 }, + //{ AV_PIX_FMT_NV21, SPA_VIDEO_FORMAT_NV21 }, + //{ AV_PIX_FMT_GRAY8, SPA_VIDEO_FORMAT_GRAY8 }, + //{ AV_PIX_FMT_GRAY16BE, SPA_VIDEO_FORMAT_GRAY16_BE }, + //{ AV_PIX_FMT_GRAY16LE, SPA_VIDEO_FORMAT_GRAY16_LE }, + //{ AV_PIX_FMT_NONE, SPA_VIDEO_FORMAT_v308 }, + //{ AV_PIX_FMT_RGB565, SPA_VIDEO_FORMAT_RGB16 }, + //{ AV_PIX_FMT_NONE, SPA_VIDEO_FORMAT_BGR16 }, + //{ AV_PIX_FMT_RGB555, SPA_VIDEO_FORMAT_RGB15 }, + //{ AV_PIX_FMT_NONE, SPA_VIDEO_FORMAT_BGR15 }, + //{ AV_PIX_FMT_NONE, SPA_VIDEO_FORMAT_UYVP }, + //{ AV_PIX_FMT_YUVA420P, SPA_VIDEO_FORMAT_A420 }, + //{ AV_PIX_FMT_PAL8, SPA_VIDEO_FORMAT_RGB8P }, + //{ AV_PIX_FMT_YUV410P, SPA_VIDEO_FORMAT_YUV9 }, + + //{ AV_PIX_FMT_NONE, SPA_VIDEO_FORMAT_YVU9 }, + //{ AV_PIX_FMT_NONE, SPA_VIDEO_FORMAT_IYU1 }, + //{ AV_PIX_FMT_NONE, SPA_VIDEO_FORMAT_ARGB64 }, + //{ AV_PIX_FMT_NONE, SPA_VIDEO_FORMAT_AYUV64 }, + //{ AV_PIX_FMT_NONE, SPA_VIDEO_FORMAT_r210 }, + + //{ AV_PIX_FMT_YUV420P10BE, SPA_VIDEO_FORMAT_I420_10BE }, + //{ AV_PIX_FMT_YUV420P10LE, SPA_VIDEO_FORMAT_I420_10LE }, + //{ AV_PIX_FMT_YUV422P10BE, SPA_VIDEO_FORMAT_I422_10BE }, + //{ AV_PIX_FMT_YUV422P10LE, SPA_VIDEO_FORMAT_I422_10LE }, + //{ AV_PIX_FMT_YUV444P10BE, SPA_VIDEO_FORMAT_Y444_10BE }, + //{ AV_PIX_FMT_YUV444P10LE, SPA_VIDEO_FORMAT_Y444_10LE }, + //{ AV_PIX_FMT_GBRP, SPA_VIDEO_FORMAT_GBR }, + //{ AV_PIX_FMT_GBRP10BE, SPA_VIDEO_FORMAT_GBR_10BE }, + //{ AV_PIX_FMT_GBRP10LE, SPA_VIDEO_FORMAT_GBR_10LE }, + + //{ AV_PIX_FMT_NONE, SPA_VIDEO_FORMAT_NV16 }, + //{ AV_PIX_FMT_NONE, SPA_VIDEO_FORMAT_NV24 }, + //{ AV_PIX_FMT_NONE, SPA_VIDEO_FORMAT_NV12_64Z32 }, + + //{ AV_PIX_FMT_YUVA420P10BE, SPA_VIDEO_FORMAT_A420_10BE }, + //{ AV_PIX_FMT_YUVA420P10LE, SPA_VIDEO_FORMAT_A420_10LE }, + //{ AV_PIX_FMT_YUVA422P10BE, SPA_VIDEO_FORMAT_A422_10BE }, + //{ AV_PIX_FMT_YUVA422P10LE, SPA_VIDEO_FORMAT_A422_10LE }, + //{ AV_PIX_FMT_YUVA444P10BE, SPA_VIDEO_FORMAT_A444_10BE }, + //{ AV_PIX_FMT_YUVA444P10LE, SPA_VIDEO_FORMAT_A444_10LE }, + + //{ AV_PIX_FMT_NONE, SPA_VIDEO_FORMAT_NV61 }, + //{ AV_PIX_FMT_NONE, SPA_VIDEO_FORMAT_P010_10BE }, + //{ AV_PIX_FMT_NONE, SPA_VIDEO_FORMAT_P010_10LE }, + //{ AV_PIX_FMT_NONE, SPA_VIDEO_FORMAT_IYU2 }, + //{ AV_PIX_FMT_NONE, SPA_VIDEO_FORMAT_VYUY }, + + //{ AV_PIX_FMT_GBRAP, SPA_VIDEO_FORMAT_GBRA }, + //{ AV_PIX_FMT_GBRAP10BE, SPA_VIDEO_FORMAT_GBRA_10BE }, + //{ AV_PIX_FMT_GBRAP10LE, SPA_VIDEO_FORMAT_GBRA_10LE }, + //{ AV_PIX_FMT_GBRP12BE, SPA_VIDEO_FORMAT_GBR_12BE }, + //{ AV_PIX_FMT_GBRP12LE, SPA_VIDEO_FORMAT_GBR_12LE }, + //{ AV_PIX_FMT_GBRAP12BE, SPA_VIDEO_FORMAT_GBRA_12BE }, + //{ AV_PIX_FMT_GBRAP12LE, SPA_VIDEO_FORMAT_GBRA_12LE }, + //{ AV_PIX_FMT_YUV420P12BE, SPA_VIDEO_FORMAT_I420_12BE }, + //{ AV_PIX_FMT_YUV420P12LE, SPA_VIDEO_FORMAT_I420_12LE }, + //{ AV_PIX_FMT_YUV422P12BE, SPA_VIDEO_FORMAT_I422_12BE }, + //{ AV_PIX_FMT_YUV422P12LE, SPA_VIDEO_FORMAT_I422_12LE }, + //{ AV_PIX_FMT_YUV444P12BE, SPA_VIDEO_FORMAT_Y444_12BE }, + //{ AV_PIX_FMT_YUV444P12LE, SPA_VIDEO_FORMAT_Y444_12LE }, + + //{ AV_PIX_FMT_NONE, SPA_VIDEO_FORMAT_RGBA_F16 }, + //{ AV_PIX_FMT_NONE, SPA_VIDEO_FORMAT_RGBA_F32 }, + + //{ AV_PIX_FMT_X2RGB10LE, SPA_VIDEO_FORMAT_xRGB_210LE }, + //{ AV_PIX_FMT_X2BGR10LE, SPA_VIDEO_FORMAT_xBGR_210LE }, + + //{ AV_PIX_FMT_NONE, SPA_VIDEO_FORMAT_RGBx_102LE }, + //{ AV_PIX_FMT_NONE, SPA_VIDEO_FORMAT_BGRx_102LE }, + //{ AV_PIX_FMT_NONE, SPA_VIDEO_FORMAT_ARGB_210LE }, + //{ AV_PIX_FMT_NONE, SPA_VIDEO_FORMAT_ABGR_210LE }, + //{ AV_PIX_FMT_NONE, SPA_VIDEO_FORMAT_RGBA_102LE }, + //{ AV_PIX_FMT_NONE, SPA_VIDEO_FORMAT_BGRA_102LE }, +}; + +static enum AVPixelFormat format_to_pix_fmt(uint32_t format) +{ + SPA_FOR_EACH_ELEMENT_VAR(format_info, i) { + if (i->format == format) + return i->pix_fmt; + } + return AV_PIX_FMT_NONE; +} + static int init_port(struct impl *this, enum spa_direction direction, uint32_t port_id, bool is_dsp, bool is_monitor, bool is_control) { @@ -666,172 +792,6 @@ static int impl_node_set_param(void *object, uint32_t id, uint32_t flags, return 0; } -static enum AVPixelFormat format_to_pix_fmt(uint32_t format) -{ - switch (format) { - case SPA_VIDEO_FORMAT_I420: - return AV_PIX_FMT_YUV420P; - case SPA_VIDEO_FORMAT_YV12: - break; - case SPA_VIDEO_FORMAT_YUY2: - return AV_PIX_FMT_YUYV422; - case SPA_VIDEO_FORMAT_UYVY: - return AV_PIX_FMT_UYVY422; - case SPA_VIDEO_FORMAT_AYUV: - break; - case SPA_VIDEO_FORMAT_RGBx: - return AV_PIX_FMT_RGB0; - case SPA_VIDEO_FORMAT_BGRx: - return AV_PIX_FMT_BGR0; - case SPA_VIDEO_FORMAT_xRGB: - return AV_PIX_FMT_0RGB; - case SPA_VIDEO_FORMAT_xBGR: - return AV_PIX_FMT_0BGR; - case SPA_VIDEO_FORMAT_RGBA: - return AV_PIX_FMT_RGBA; - case SPA_VIDEO_FORMAT_BGRA: - return AV_PIX_FMT_BGRA; - case SPA_VIDEO_FORMAT_ARGB: - return AV_PIX_FMT_ARGB; - case SPA_VIDEO_FORMAT_ABGR: - return AV_PIX_FMT_ABGR; - case SPA_VIDEO_FORMAT_RGB: - return AV_PIX_FMT_RGB24; - case SPA_VIDEO_FORMAT_BGR: - return AV_PIX_FMT_BGR24; - case SPA_VIDEO_FORMAT_Y41B: - return AV_PIX_FMT_YUV411P; - case SPA_VIDEO_FORMAT_Y42B: - return AV_PIX_FMT_YUV422P; - case SPA_VIDEO_FORMAT_YVYU: - return AV_PIX_FMT_YVYU422; - case SPA_VIDEO_FORMAT_Y444: - return AV_PIX_FMT_YUV444P; - case SPA_VIDEO_FORMAT_v210: - case SPA_VIDEO_FORMAT_v216: - break; - case SPA_VIDEO_FORMAT_NV12: - return AV_PIX_FMT_NV12; - case SPA_VIDEO_FORMAT_NV21: - return AV_PIX_FMT_NV21; - case SPA_VIDEO_FORMAT_GRAY8: - return AV_PIX_FMT_GRAY8; - case SPA_VIDEO_FORMAT_GRAY16_BE: - return AV_PIX_FMT_GRAY16BE; - case SPA_VIDEO_FORMAT_GRAY16_LE: - return AV_PIX_FMT_GRAY16LE; - case SPA_VIDEO_FORMAT_v308: - break; - case SPA_VIDEO_FORMAT_RGB16: - return AV_PIX_FMT_RGB565; - case SPA_VIDEO_FORMAT_BGR16: - break; - case SPA_VIDEO_FORMAT_RGB15: - return AV_PIX_FMT_RGB555; - case SPA_VIDEO_FORMAT_BGR15: - case SPA_VIDEO_FORMAT_UYVP: - break; - case SPA_VIDEO_FORMAT_A420: - return AV_PIX_FMT_YUVA420P; - case SPA_VIDEO_FORMAT_RGB8P: - return AV_PIX_FMT_PAL8; - case SPA_VIDEO_FORMAT_YUV9: - return AV_PIX_FMT_YUV410P; - case SPA_VIDEO_FORMAT_YVU9: - case SPA_VIDEO_FORMAT_IYU1: - case SPA_VIDEO_FORMAT_ARGB64: - case SPA_VIDEO_FORMAT_AYUV64: - case SPA_VIDEO_FORMAT_r210: - break; - case SPA_VIDEO_FORMAT_I420_10BE: - return AV_PIX_FMT_YUV420P10BE; - case SPA_VIDEO_FORMAT_I420_10LE: - return AV_PIX_FMT_YUV420P10LE; - case SPA_VIDEO_FORMAT_I422_10BE: - return AV_PIX_FMT_YUV422P10BE; - case SPA_VIDEO_FORMAT_I422_10LE: - return AV_PIX_FMT_YUV422P10LE; - case SPA_VIDEO_FORMAT_Y444_10BE: - return AV_PIX_FMT_YUV444P10BE; - case SPA_VIDEO_FORMAT_Y444_10LE: - return AV_PIX_FMT_YUV444P10LE; - case SPA_VIDEO_FORMAT_GBR: - return AV_PIX_FMT_GBRP; - case SPA_VIDEO_FORMAT_GBR_10BE: - return AV_PIX_FMT_GBRP10BE; - case SPA_VIDEO_FORMAT_GBR_10LE: - return AV_PIX_FMT_GBRP10LE; - case SPA_VIDEO_FORMAT_NV16: - case SPA_VIDEO_FORMAT_NV24: - case SPA_VIDEO_FORMAT_NV12_64Z32: - break; - case SPA_VIDEO_FORMAT_A420_10BE: - return AV_PIX_FMT_YUVA420P10BE; - case SPA_VIDEO_FORMAT_A420_10LE: - return AV_PIX_FMT_YUVA420P10LE; - case SPA_VIDEO_FORMAT_A422_10BE: - return AV_PIX_FMT_YUVA422P10BE; - case SPA_VIDEO_FORMAT_A422_10LE: - return AV_PIX_FMT_YUVA422P10LE; - case SPA_VIDEO_FORMAT_A444_10BE: - return AV_PIX_FMT_YUVA444P10BE; - case SPA_VIDEO_FORMAT_A444_10LE: - return AV_PIX_FMT_YUVA444P10LE; - case SPA_VIDEO_FORMAT_NV61: - case SPA_VIDEO_FORMAT_P010_10BE: - case SPA_VIDEO_FORMAT_P010_10LE: - case SPA_VIDEO_FORMAT_IYU2: - case SPA_VIDEO_FORMAT_VYUY: - break; - case SPA_VIDEO_FORMAT_GBRA: - return AV_PIX_FMT_GBRAP; - case SPA_VIDEO_FORMAT_GBRA_10BE: - return AV_PIX_FMT_GBRAP10BE; - case SPA_VIDEO_FORMAT_GBRA_10LE: - return AV_PIX_FMT_GBRAP10LE; - case SPA_VIDEO_FORMAT_GBR_12BE: - return AV_PIX_FMT_GBRP12BE; - case SPA_VIDEO_FORMAT_GBR_12LE: - return AV_PIX_FMT_GBRP12LE; - case SPA_VIDEO_FORMAT_GBRA_12BE: - return AV_PIX_FMT_GBRAP12BE; - case SPA_VIDEO_FORMAT_GBRA_12LE: - return AV_PIX_FMT_GBRAP12LE; - case SPA_VIDEO_FORMAT_I420_12BE: - return AV_PIX_FMT_YUV420P12BE; - case SPA_VIDEO_FORMAT_I420_12LE: - return AV_PIX_FMT_YUV420P12LE; - case SPA_VIDEO_FORMAT_I422_12BE: - return AV_PIX_FMT_YUV422P12BE; - case SPA_VIDEO_FORMAT_I422_12LE: - return AV_PIX_FMT_YUV422P12LE; - case SPA_VIDEO_FORMAT_Y444_12BE: - return AV_PIX_FMT_YUV444P12BE; - case SPA_VIDEO_FORMAT_Y444_12LE: - return AV_PIX_FMT_YUV444P12LE; - - case SPA_VIDEO_FORMAT_RGBA_F16: - case SPA_VIDEO_FORMAT_RGBA_F32: - break; - - case SPA_VIDEO_FORMAT_xRGB_210LE: - return AV_PIX_FMT_X2RGB10LE; - case SPA_VIDEO_FORMAT_xBGR_210LE: - return AV_PIX_FMT_X2BGR10LE; - - case SPA_VIDEO_FORMAT_RGBx_102LE: - case SPA_VIDEO_FORMAT_BGRx_102LE: - case SPA_VIDEO_FORMAT_ARGB_210LE: - case SPA_VIDEO_FORMAT_ABGR_210LE: - case SPA_VIDEO_FORMAT_RGBA_102LE: - case SPA_VIDEO_FORMAT_BGRA_102LE: - break; - default: - break; - } - return AV_PIX_FMT_NONE; -} - static int get_format(struct dir *dir, uint32_t *format, struct spa_rectangle *size, struct spa_fraction *framerate) {