videoconvert: use a table for format conversion

Use a table with format conversion values so that we can also use
flags for the formats.
This commit is contained in:
Wim Taymans 2025-05-05 12:10:02 +02:00
parent 86dd937857
commit 6373827a40

View file

@ -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)
{