mirror of
https://gitlab.freedesktop.org/pipewire/pipewire.git
synced 2025-10-31 22:25:38 -04:00
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:
parent
86dd937857
commit
6373827a40
1 changed files with 126 additions and 166 deletions
|
|
@ -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)
|
||||
{
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue