1
0
mirror of https://github.com/mpv-player/mpv synced 2025-03-25 04:38:01 +00:00

video: change image format names, prefer mostly FFmpeg names

The most user visible change is that "420p" is now displayed as
"yuv420p". This is what FFmpeg uses (almost), and is also less confusing
since "420p" is often confused with "420 pixels vertical resolution".

In general, we return the FFmpeg pixel format name. We still use our own
old mechanism to keep a list of exceptions to provide compatibility for
a while.

Also, never return NULL for image format names. If the format is unset
(0/IMGFMT_NONE), return "none". If the format has no name (probably
never happens, FFmpeg seems to guarantee that a name is set), return
"unknown".
This commit is contained in:
wm4 2014-04-14 20:19:44 +02:00
parent a7c6c4656d
commit 186fd0311d
3 changed files with 64 additions and 91 deletions

View File

@ -1924,9 +1924,11 @@ static int parse_imgfmt(struct mp_log *log, const m_option_t *opt,
if (!bstrcmp0(param, "help")) {
mp_info(log, "Available formats:");
for (int i = 0; mp_imgfmt_list[i].name; i++)
mp_info(log, " %s", mp_imgfmt_list[i].name);
char **list = mp_imgfmt_name_list();
for (int i = 0; list[i]; i++)
mp_info(log, " %s", list[i]);
mp_info(log, "\n");
talloc_free(list);
return M_OPT_EXIT - 1;
}

View File

@ -36,95 +36,71 @@
{string "le", MP_CONCAT(id, _LE)}, \
{string "be", MP_CONCAT(id, _BE)}, \
struct mp_imgfmt_entry mp_imgfmt_list[] = {
FMT("y8", IMGFMT_Y8)
FMT_ENDIAN("y16", IMGFMT_Y16)
FMT("ya8", IMGFMT_YA8)
FMT("yuyv", IMGFMT_YUYV)
FMT("uyvy", IMGFMT_UYVY)
FMT("nv12", IMGFMT_NV12)
FMT("nv21", IMGFMT_NV21)
FMT("444p", IMGFMT_444P)
FMT("422p", IMGFMT_422P)
FMT("440p", IMGFMT_440P)
FMT("420p", IMGFMT_420P)
FMT("411p", IMGFMT_411P)
FMT("410p", IMGFMT_410P)
FMT_ENDIAN("444p16", IMGFMT_444P16)
FMT_ENDIAN("444p14", IMGFMT_444P14)
FMT_ENDIAN("444p12", IMGFMT_444P12)
FMT_ENDIAN("444p10", IMGFMT_444P10)
FMT_ENDIAN("444p9", IMGFMT_444P9)
FMT_ENDIAN("422p16", IMGFMT_422P16)
FMT_ENDIAN("422p14", IMGFMT_422P14)
FMT_ENDIAN("422p12", IMGFMT_422P12)
FMT_ENDIAN("422p10", IMGFMT_422P10)
FMT_ENDIAN("422p9", IMGFMT_422P9)
FMT_ENDIAN("420p16", IMGFMT_420P16)
FMT_ENDIAN("420p14", IMGFMT_420P14)
FMT_ENDIAN("420p12", IMGFMT_420P12)
FMT_ENDIAN("420p10", IMGFMT_420P10)
FMT_ENDIAN("420p9", IMGFMT_420P9)
FMT("444ap", IMGFMT_444AP)
FMT("422ap", IMGFMT_422AP)
FMT("420ap", IMGFMT_420AP)
FMT_ENDIAN("444ap9", IMGFMT_444AP9)
FMT_ENDIAN("444ap10", IMGFMT_444AP10)
FMT_ENDIAN("444ap16", IMGFMT_444AP16)
FMT_ENDIAN("422ap9", IMGFMT_422AP9)
FMT_ENDIAN("422ap10", IMGFMT_422AP10)
FMT_ENDIAN("422ap16", IMGFMT_422AP16)
FMT_ENDIAN("420ap9", IMGFMT_420AP9)
FMT_ENDIAN("420ap10", IMGFMT_420AP10)
FMT_ENDIAN("420ap16", IMGFMT_420AP16)
FMT("argb", IMGFMT_ARGB)
FMT("0rgb", IMGFMT_0RGB)
FMT("bgra", IMGFMT_BGRA)
FMT("bgr0", IMGFMT_BGR0)
FMT("abgr", IMGFMT_ABGR)
FMT("0bgr", IMGFMT_0BGR)
FMT("rgba", IMGFMT_RGBA)
FMT("rgb0", IMGFMT_RGB0)
FMT("rgb32", IMGFMT_RGB32)
FMT("bgr32", IMGFMT_BGR32)
FMT("bgr24", IMGFMT_BGR24)
FMT("rgb24", IMGFMT_RGB24)
FMT_ENDIAN("rgb48", IMGFMT_RGB48)
FMT_ENDIAN("rgba64", IMGFMT_RGBA64)
FMT_ENDIAN("bgra64", IMGFMT_BGRA64)
FMT("rgb8", IMGFMT_RGB8)
FMT("bgr8", IMGFMT_BGR8)
FMT("rgb4_byte", IMGFMT_RGB4_BYTE)
FMT("bgr4_byte", IMGFMT_BGR4_BYTE)
FMT("rgb4", IMGFMT_RGB4)
FMT("bgr4", IMGFMT_BGR4)
FMT("mono", IMGFMT_MONO)
FMT("mono_w", IMGFMT_MONO_W)
struct mp_imgfmt_entry {
const char *name;
int fmt;
};
static const struct mp_imgfmt_entry mp_imgfmt_list[] = {
// these formats are pretty common, and the "le"/"be" suffixes enforced
// by FFmpeg are annoying
FMT("yuv420p10", IMGFMT_420P10)
FMT("yuv420p16", IMGFMT_420P16)
// these names are weirdly different from FFmpeg's
FMT_ENDIAN("rgb12", IMGFMT_RGB12)
FMT_ENDIAN("rgb15", IMGFMT_RGB15)
FMT_ENDIAN("rgb16", IMGFMT_RGB16)
FMT_ENDIAN("bgr12", IMGFMT_BGR12)
FMT_ENDIAN("bgr15", IMGFMT_BGR15)
FMT_ENDIAN("bgr16", IMGFMT_BGR16)
FMT("pal8", IMGFMT_PAL8)
FMT("gbrp", IMGFMT_GBRP)
FMT_ENDIAN("gbrp9", IMGFMT_GBRP9)
FMT_ENDIAN("gbrp10", IMGFMT_GBRP10)
FMT_ENDIAN("gbrp12", IMGFMT_GBRP12)
FMT_ENDIAN("gbrp14", IMGFMT_GBRP14)
FMT_ENDIAN("gbrp16", IMGFMT_GBRP16)
FMT_ENDIAN("xyz12", IMGFMT_XYZ12)
FMT("vdpau", IMGFMT_VDPAU)
// the MPlayer derived names have components in reverse order
FMT("rgb8", IMGFMT_RGB8)
FMT("bgr8", IMGFMT_BGR8)
FMT("rgb4_byte", IMGFMT_RGB4_BYTE)
FMT("bgr4_byte", IMGFMT_BGR4_BYTE)
FMT("rgb4", IMGFMT_RGB4)
FMT("bgr4", IMGFMT_BGR4)
// FFmpeg names have an annoying "_vld" suffix
FMT("vda", IMGFMT_VDA)
FMT("vaapi", IMGFMT_VAAPI)
// names below this are not preferred over the FFmpeg names
FMT("none", 0)
// endian-specific aliases (not in FFmpeg)
FMT("rgb32", IMGFMT_RGB32)
FMT("bgr32", IMGFMT_BGR32)
// old names we keep around
FMT("y8", IMGFMT_Y8)
FMT("420p", IMGFMT_420P)
FMT("yv12", IMGFMT_420P)
FMT_ENDIAN("420p16", IMGFMT_420P16)
FMT_ENDIAN("420p10", IMGFMT_420P10)
FMT("444p", IMGFMT_444P)
FMT("444p9", IMGFMT_444P9)
FMT("444p10", IMGFMT_444P10)
FMT("422p", IMGFMT_422P)
FMT("422p9", IMGFMT_422P9)
FMT("422p10", IMGFMT_422P10)
{0}
};
char **mp_imgfmt_name_list(void)
{
int count = IMGFMT_END - IMGFMT_START;
char **list = talloc_zero_array(NULL, char *, count + 1);
int num = 0;
for (int n = IMGFMT_START; n < IMGFMT_END; n++) {
const char *name = mp_imgfmt_to_name(n);
if (strcmp(name, "none") != 0 && strcmp(name, "unknown") != 0)
list[num++] = (char *)name;
}
return list;
}
int mp_imgfmt_from_name(bstr name, bool allow_hwaccel)
{
int img_fmt = 0;
for(struct mp_imgfmt_entry *p = mp_imgfmt_list; p->name; ++p) {
if(bstr_equals0(name, p->name)) {
for (const struct mp_imgfmt_entry *p = mp_imgfmt_list; p->name; ++p) {
if (bstr_equals0(name, p->name)) {
img_fmt = p->fmt;
break;
}
@ -134,8 +110,6 @@ int mp_imgfmt_from_name(bstr name, bool allow_hwaccel)
img_fmt = pixfmt2imgfmt(av_get_pix_fmt(t));
talloc_free(t);
}
if (!img_fmt && bstr_equals0(name, "yv12"))
img_fmt = IMGFMT_420P; // old alias for UI
if (!allow_hwaccel && IMGFMT_IS_HWACCEL(img_fmt))
return 0;
return img_fmt;
@ -143,12 +117,15 @@ int mp_imgfmt_from_name(bstr name, bool allow_hwaccel)
const char *mp_imgfmt_to_name(int fmt)
{
struct mp_imgfmt_entry *p = mp_imgfmt_list;
for(; p->name; ++p) {
if(p->fmt == fmt)
const struct mp_imgfmt_entry *p = mp_imgfmt_list;
for (; p->fmt; p++) {
if (p->name && p->fmt == fmt)
return p->name;
}
return NULL;
const AVPixFmtDescriptor *pixdesc = av_pix_fmt_desc_get(imgfmt2pixfmt(fmt));
if (pixdesc && pixdesc->name)
return pixdesc->name;
return "unknown";
}
struct mp_imgfmt_desc mp_imgfmt_get_desc(int mpfmt)

View File

@ -332,17 +332,11 @@ static inline bool IMGFMT_IS_RGB(int fmt)
#define IMGFMT_IS_HWACCEL(fmt) \
((fmt) == IMGFMT_VDPAU || (fmt) == IMGFMT_VAAPI || (fmt) == IMGFMT_VDA)
struct mp_imgfmt_entry {
const char *name;
int fmt;
};
extern struct mp_imgfmt_entry mp_imgfmt_list[];
int mp_imgfmt_from_name(bstr name, bool allow_hwaccel);
const char *mp_imgfmt_to_name(int fmt);
char **mp_imgfmt_name_list(void);
#define vo_format_name mp_imgfmt_to_name
int mp_imgfmt_find_yuv_planar(int xs, int ys, int planes, int component_bits);