summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--video/fmt-conversion.c14
-rw-r--r--video/img_format.c3
-rw-r--r--video/img_format.h4
3 files changed, 20 insertions, 1 deletions
diff --git a/video/fmt-conversion.c b/video/fmt-conversion.c
index 5624f4aacf..68d1487283 100644
--- a/video/fmt-conversion.c
+++ b/video/fmt-conversion.c
@@ -187,6 +187,15 @@ enum AVPixelFormat imgfmt2pixfmt(int fmt)
if (fmt == IMGFMT_NONE)
return AV_PIX_FMT_NONE;
+ if (fmt >= IMGFMT_AVPIXFMT_START && fmt < IMGFMT_AVPIXFMT_END) {
+ enum AVPixelFormat pixfmt = fmt - IMGFMT_AVPIXFMT_START;
+ // Avoid duplicate format - each format must be unique.
+ int mpfmt = pixfmt2imgfmt(pixfmt);
+ if (mpfmt == fmt)
+ return pixfmt;
+ return AV_PIX_FMT_NONE;
+ }
+
for (int i = 0; conversion_map[i].fmt; i++) {
if (conversion_map[i].fmt == fmt)
return conversion_map[i].pix_fmt;
@@ -203,5 +212,10 @@ int pixfmt2imgfmt(enum AVPixelFormat pix_fmt)
if (conversion_map[i].pix_fmt == pix_fmt)
return conversion_map[i].fmt;
}
+
+ int generic = IMGFMT_AVPIXFMT_START + pix_fmt;
+ if (generic < IMGFMT_AVPIXFMT_END)
+ return generic;
+
return 0;
}
diff --git a/video/img_format.c b/video/img_format.c
index 88e758c8fe..3745378527 100644
--- a/video/img_format.c
+++ b/video/img_format.c
@@ -132,7 +132,8 @@ struct mp_imgfmt_desc mp_imgfmt_get_desc(int mpfmt)
{
enum AVPixelFormat fmt = imgfmt2pixfmt(mpfmt);
const AVPixFmtDescriptor *pd = av_pix_fmt_desc_get(fmt);
- if (!pd || fmt == AV_PIX_FMT_NONE)
+ if (!pd || pd->nb_components > 4 || fmt == AV_PIX_FMT_NONE ||
+ fmt == AV_PIX_FMT_UYYVYY411)
return mp_only_imgfmt_desc(mpfmt);
struct mp_imgfmt_desc desc = {
diff --git a/video/img_format.h b/video/img_format.h
index 1645bd3ab9..8d01b86416 100644
--- a/video/img_format.h
+++ b/video/img_format.h
@@ -260,6 +260,10 @@ enum mp_imgfmt {
IMGFMT_VAAPI,
IMGFMT_DXVA2, // IDirect3DSurface9 (NV12)
+ // Generic pass-through of AV_PIX_FMT_*. Used for formats which don't have
+ // a corresponding IMGFMT_ value.
+ IMGFMT_AVPIXFMT_START,
+ IMGFMT_AVPIXFMT_END = IMGFMT_AVPIXFMT_START + 500,
IMGFMT_END,