diff options
-rw-r--r-- | video/filter/vf_dlopen.c | 5 | ||||
-rw-r--r-- | video/img_format.c | 38 | ||||
-rw-r--r-- | video/img_format.h | 4 |
3 files changed, 27 insertions, 20 deletions
diff --git a/video/filter/vf_dlopen.c b/video/filter/vf_dlopen.c index 1646d3fbcf..9f9cd20318 100644 --- a/video/filter/vf_dlopen.c +++ b/video/filter/vf_dlopen.c @@ -102,7 +102,7 @@ static int config(struct vf_instance *vf, vf->priv->filter.in_height = height; vf->priv->filter.in_d_width = d_width; vf->priv->filter.in_d_height = d_height; - vf->priv->filter.in_fmt = mp_imgfmt_to_name(fmt); + vf->priv->filter.in_fmt = talloc_strdup(vf, mp_imgfmt_to_name(fmt)); vf->priv->filter.out_width = width; vf->priv->filter.out_height = height; vf->priv->filter.out_d_width = d_width; @@ -142,7 +142,8 @@ static int config(struct vf_instance *vf, } } else vf->priv->outfmt = fmt; - vf->priv->filter.out_fmt = mp_imgfmt_to_name(vf->priv->outfmt); + vf->priv->filter.out_fmt = + talloc_strdup(vf, mp_imgfmt_to_name(vf->priv->outfmt)); } if (!vf->priv->outfmt) { diff --git a/video/img_format.c b/video/img_format.c index 01bf2b2b87..3802e1b58e 100644 --- a/video/img_format.c +++ b/video/img_format.c @@ -44,10 +44,6 @@ struct mp_imgfmt_entry { static const struct mp_imgfmt_entry mp_imgfmt_list[] = { // not in ffmpeg FMT("vdpau_output", IMGFMT_VDPAU_OUTPUT) - // 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) @@ -66,6 +62,7 @@ static const struct mp_imgfmt_entry mp_imgfmt_list[] = { FMT("vda", IMGFMT_VDA) FMT("vaapi", IMGFMT_VAAPI) // names below this are not preferred over the FFmpeg names + // the "none" entry makes mp_imgfmt_to_name prefer FFmpeg names FMT("none", 0) // endian-specific aliases (not in FFmpeg) FMT("rgb32", IMGFMT_RGB32) @@ -74,8 +71,8 @@ static const struct mp_imgfmt_entry mp_imgfmt_list[] = { FMT("y8", IMGFMT_Y8) FMT("420p", IMGFMT_420P) FMT("yv12", IMGFMT_420P) - FMT_ENDIAN("420p16", IMGFMT_420P16) - FMT_ENDIAN("420p10", IMGFMT_420P10) + FMT("420p16", IMGFMT_420P16) + FMT("420p10", IMGFMT_420P10) FMT("444p", IMGFMT_444P) FMT("444p9", IMGFMT_444P9) FMT("444p10", IMGFMT_444P10) @@ -93,7 +90,7 @@ char **mp_imgfmt_name_list(void) 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; + list[num++] = talloc_strdup(list, name); } return list; } @@ -117,17 +114,28 @@ int mp_imgfmt_from_name(bstr name, bool allow_hwaccel) return img_fmt; } -const char *mp_imgfmt_to_name(int fmt) +char *mp_imgfmt_to_name_buf(char *buf, size_t buf_size, int fmt) { + const char *name = NULL; const struct mp_imgfmt_entry *p = mp_imgfmt_list; for (; p->fmt; p++) { - if (p->name && p->fmt == fmt) - return p->name; + if (p->name && p->fmt == fmt) { + name = p->name; + break; + } + } + if (!name) { + const AVPixFmtDescriptor *pixdesc = av_pix_fmt_desc_get(imgfmt2pixfmt(fmt)); + if (pixdesc) + name = pixdesc->name; } - const AVPixFmtDescriptor *pixdesc = av_pix_fmt_desc_get(imgfmt2pixfmt(fmt)); - if (pixdesc && pixdesc->name) - return pixdesc->name; - return "unknown"; + if (!name) + name = "unknown"; + snprintf(buf, buf_size, "%s", name); + int len = strlen(buf); + if (len > 2 && buf[len - 2] == MP_SELECT_LE_BE('l', 'b') && buf[len - 1] == 'e') + buf[len - 2] = '\0'; + return buf; } static struct mp_imgfmt_desc mp_only_imgfmt_desc(int mpfmt) @@ -137,7 +145,6 @@ static struct mp_imgfmt_desc mp_only_imgfmt_desc(int mpfmt) return (struct mp_imgfmt_desc) { .id = mpfmt, .avformat = AV_PIX_FMT_NONE, - .name = mp_imgfmt_to_name(mpfmt), .flags = MP_IMGFLAG_BE | MP_IMGFLAG_LE | MP_IMGFLAG_RGB, }; } @@ -154,7 +161,6 @@ struct mp_imgfmt_desc mp_imgfmt_get_desc(int mpfmt) struct mp_imgfmt_desc desc = { .id = mpfmt, .avformat = fmt, - .name = mp_imgfmt_to_name(mpfmt), .chroma_xs = pd->log2_chroma_w, .chroma_ys = pd->log2_chroma_h, }; diff --git a/video/img_format.h b/video/img_format.h index 9277b0698c..64662aba08 100644 --- a/video/img_format.h +++ b/video/img_format.h @@ -71,7 +71,6 @@ struct mp_imgfmt_desc { int id; // IMGFMT_* int avformat; // AV_PIX_FMT_* (or AV_PIX_FMT_NONE) - const char *name; // e.g. "420p16" int flags; // MP_IMGFLAG_* bitfield int8_t num_planes; int8_t chroma_xs, chroma_ys; // chroma shift (i.e. log2 of chroma pixel size) @@ -335,7 +334,8 @@ static inline bool IMGFMT_IS_RGB(int fmt) (fmt) == IMGFMT_VAAPI || (fmt) == IMGFMT_VDA) int mp_imgfmt_from_name(bstr name, bool allow_hwaccel); -const char *mp_imgfmt_to_name(int fmt); +char *mp_imgfmt_to_name_buf(char *buf, size_t buf_size, int fmt); +#define mp_imgfmt_to_name(fmt) mp_imgfmt_to_name_buf((char[16]){0}, 16, (fmt)) char **mp_imgfmt_name_list(void); |