summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--video/fmt-conversion.c16
-rw-r--r--video/img_format.c32
-rw-r--r--video/img_format.h15
3 files changed, 36 insertions, 27 deletions
diff --git a/video/fmt-conversion.c b/video/fmt-conversion.c
index 7d37e8ca87..b908837547 100644
--- a/video/fmt-conversion.c
+++ b/video/fmt-conversion.c
@@ -159,16 +159,22 @@ static const struct {
{IMGFMT_GBRP14_BE, PIX_FMT_GBRP14BE},
{IMGFMT_GBRP14_LE, PIX_FMT_GBRP14LE},
+ {IMGFMT_RGBA64_BE, PIX_FMT_RGBA64BE},
+ {IMGFMT_RGBA64_LE, PIX_FMT_RGBA64LE},
+ {IMGFMT_BGRA64_BE, PIX_FMT_BGRA64BE},
+ {IMGFMT_BGRA64_LE, PIX_FMT_BGRA64LE},
+
{IMGFMT_BGR0, PIX_FMT_BGR0},
{IMGFMT_0RGB, PIX_FMT_0RGB},
{IMGFMT_RGB0, PIX_FMT_RGB0},
{IMGFMT_0BGR, PIX_FMT_0BGR},
{IMGFMT_BGR0, PIX_FMT_BGR0},
-
- {IMGFMT_RGBA64_BE, PIX_FMT_RGBA64BE},
- {IMGFMT_RGBA64_LE, PIX_FMT_RGBA64LE},
- {IMGFMT_BGRA64_BE, PIX_FMT_BGRA64BE},
- {IMGFMT_BGRA64_LE, PIX_FMT_BGRA64LE},
+#else
+ {IMGFMT_BGR0, PIX_FMT_BGRA},
+ {IMGFMT_0RGB, PIX_FMT_ARGB},
+ {IMGFMT_RGB0, PIX_FMT_RGBA},
+ {IMGFMT_0BGR, PIX_FMT_ABGR},
+ {IMGFMT_BGR0, PIX_FMT_BGRA},
#endif
#if HAVE_AVCODEC_NEW_VDPAU_API
diff --git a/video/img_format.c b/video/img_format.c
index 0316261393..5e3c382df4 100644
--- a/video/img_format.c
+++ b/video/img_format.c
@@ -157,12 +157,20 @@ const char *mp_imgfmt_to_name(unsigned int fmt)
return NULL;
}
-static struct mp_imgfmt_desc get_avutil_fmt(enum PixelFormat fmt)
+struct mp_imgfmt_desc mp_imgfmt_get_desc(int mpfmt)
{
- const AVPixFmtDescriptor *pd = &av_pix_fmt_descriptors[fmt];
- int mpfmt = pixfmt2imgfmt(fmt);
- if (!pd || !mpfmt)
+ enum PixelFormat fmt = imgfmt2pixfmt(mpfmt);
+ if (fmt == PIX_FMT_NONE) {
+ const char *name = mp_imgfmt_to_name(mpfmt);
+ if (name) {
+ mp_msg(MSGT_DECVIDEO, MSGL_V,
+ "libavutil does not know image format '%s'\n", name);
+ }
return (struct mp_imgfmt_desc) {0};
+ }
+
+ const AVPixFmtDescriptor *pd = &av_pix_fmt_descriptors[fmt];
+ assert(pd);
struct mp_imgfmt_desc desc = {
.id = mpfmt,
@@ -217,6 +225,9 @@ static struct mp_imgfmt_desc get_avutil_fmt(enum PixelFormat fmt)
desc.flags |= MP_IMGFLAG_ALPHA;
#endif
+ if (mpfmt >= IMGFMT_RGB0_START && mpfmt <= IMGFMT_RGB0_END)
+ desc.flags &= ~MP_IMGFLAG_ALPHA;
+
if (desc.num_planes == pd->nb_components)
desc.flags |= MP_IMGFLAG_PLANAR;
@@ -251,19 +262,6 @@ static struct mp_imgfmt_desc get_avutil_fmt(enum PixelFormat fmt)
return desc;
}
-struct mp_imgfmt_desc mp_imgfmt_get_desc(unsigned int out_fmt)
-{
- struct mp_imgfmt_desc fmt = {0};
- enum PixelFormat avfmt = imgfmt2pixfmt(out_fmt);
- if (avfmt != PIX_FMT_NONE)
- fmt = get_avutil_fmt(avfmt);
- if (!fmt.id) {
- mp_msg(MSGT_DECVIDEO, MSGL_V, "mp_image: unknown out_fmt: 0x%X\n",
- out_fmt);
- }
- return fmt;
-}
-
// Find a format that is MP_IMGFLAG_YUV_P with the following configuration.
int mp_imgfmt_find_yuv_planar(int xs, int ys, int planes, int component_bits)
{
diff --git a/video/img_format.h b/video/img_format.h
index 4d876304a0..1cfe4465ec 100644
--- a/video/img_format.h
+++ b/video/img_format.h
@@ -78,7 +78,7 @@ struct mp_imgfmt_desc {
int8_t ys[MP_MAX_PLANES];
};
-struct mp_imgfmt_desc mp_imgfmt_get_desc(unsigned int out_fmt);
+struct mp_imgfmt_desc mp_imgfmt_get_desc(int imgfmt);
enum mp_imgfmt {
IMGFMT_NONE = 0,
@@ -176,13 +176,9 @@ enum mp_imgfmt {
// Byte accessed (low address to high address)
IMGFMT_ARGB,
- IMGFMT_0RGB, // "0" is a padding byte (as opposed to alpha)
IMGFMT_BGRA,
- IMGFMT_BGR0,
IMGFMT_ABGR,
- IMGFMT_0BGR,
IMGFMT_RGBA,
- IMGFMT_RGB0,
IMGFMT_BGR24, // 3 bytes per pixel
IMGFMT_RGB24,
IMGFMT_RGB48_LE, // 6 bytes per pixel, uint16_t channels
@@ -192,6 +188,15 @@ enum mp_imgfmt {
IMGFMT_BGRA64_LE,
IMGFMT_BGRA64_BE,
+ // Like e.g. IMGFMT_ARGB, but has a padding byte instead of alpha
+ IMGFMT_0RGB,
+ IMGFMT_BGR0,
+ IMGFMT_0BGR,
+ IMGFMT_RGB0,
+
+ IMGFMT_RGB0_START = IMGFMT_0RGB,
+ IMGFMT_RGB0_END = IMGFMT_RGB0,
+
// Accessed with bit-shifts (components ordered from LSB to MSB)
IMGFMT_RGB8, // r3 g3 b2
IMGFMT_BGR8,