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,