summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorwm4 <wm4@nowhere>2014-04-14 20:19:44 +0200
committerwm4 <wm4@nowhere>2014-04-14 20:51:27 +0200
commit186fd0311db32a24879669620fd6a2d8e32d2931 (patch)
tree87e4b2c22619799a231bce07312ce32f14f94658
parenta7c6c4656de1938729d27fb6f02b7e46a71c35fb (diff)
downloadmpv-186fd0311db32a24879669620fd6a2d8e32d2931.tar.bz2
mpv-186fd0311db32a24879669620fd6a2d8e32d2931.tar.xz
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".
-rw-r--r--options/m_option.c6
-rw-r--r--video/img_format.c139
-rw-r--r--video/img_format.h10
3 files changed, 64 insertions, 91 deletions
diff --git a/options/m_option.c b/options/m_option.c
index 9bf2ebd132..a2f3af4177 100644
--- a/options/m_option.c
+++ b/options/m_option.c
@@ -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;
}
diff --git a/video/img_format.c b/video/img_format.c
index 96398f8600..c8f1851a43 100644
--- a/video/img_format.c
+++ b/video/img_format.c
@@ -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)
diff --git a/video/img_format.h b/video/img_format.h
index 9cf3a60f11..31c72f41be 100644
--- a/video/img_format.h
+++ b/video/img_format.h
@@ -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);