summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--test/ref/img_formats.txt14
-rw-r--r--video/img_format.c72
-rw-r--r--video/img_format.h4
3 files changed, 88 insertions, 2 deletions
diff --git a/test/ref/img_formats.txt b/test/ref/img_formats.txt
index f73b83bdd5..73b0efc91b 100644
--- a/test/ref/img_formats.txt
+++ b/test/ref/img_formats.txt
@@ -1039,6 +1039,20 @@ ya8: [GENERIC] ctype=uint
AVD: name=ya8 chroma=0:0 flags=0x80 [alpha]
0: p=0 st=2 o=0 sh=0 d=8
1: p=0 st=2 o=1 sh=0 d=8
+yap16: ctype=uint
+ Legacy desc: [ba][yuvp][yuv][le]
+ planes=2, chroma=0:0 align=1:1 bits=16 cbits=16
+ {2/16/[0:0] 2/16/[0:0] 0/0/[0:0] 0/0/[0:0] }
+ Regular: planes=2 compbytes=2 bitpad=0 chroma=1x1 ctype=uint
+ 0: {1}
+ 1: {4}
+yap8: ctype=uint
+ Legacy desc: [ba][yuvp][yuv][le]
+ planes=2, chroma=0:0 align=1:1 bits=8 cbits=8
+ {1/8/[0:0] 1/8/[0:0] 0/0/[0:0] 0/0/[0:0] }
+ Regular: planes=2 compbytes=1 bitpad=0 chroma=1x1 ctype=uint
+ 0: {1}
+ 1: {4}
yuv410p: [GENERIC] ctype=uint
Legacy desc: [ba][yuvp][yuv][le][be]
planes=3, chroma=2:2 align=4:4 bits=8 cbits=8
diff --git a/video/img_format.c b/video/img_format.c
index 57da094d39..a21ba6f9cb 100644
--- a/video/img_format.c
+++ b/video/img_format.c
@@ -37,6 +37,8 @@ static const struct mp_imgfmt_entry mp_imgfmt_list[] = {
// not in ffmpeg
{"vdpau_output", IMGFMT_VDPAU_OUTPUT},
{"rgb30", IMGFMT_RGB30},
+ {"yap8", IMGFMT_YAP8},
+ {"yap16", IMGFMT_YAP16},
// FFmpeg names have an annoying "_vld" suffix
{"videotoolbox", IMGFMT_VIDEOTOOLBOX},
{"vaapi", IMGFMT_VAAPI},
@@ -121,6 +123,34 @@ static struct mp_imgfmt_desc mp_only_imgfmt_desc(int mpfmt)
.plane_bits = 30,
.component_bits = 10,
};
+ case IMGFMT_YAP8:
+ return (struct mp_imgfmt_desc) {
+ .id = mpfmt,
+ .avformat = AV_PIX_FMT_NONE,
+ .flags = MP_IMGFLAG_BYTE_ALIGNED | MP_IMGFLAG_NE | MP_IMGFLAG_YUV |
+ MP_IMGFLAG_YUV_P,
+ .num_planes = 2,
+ .align_x = 1,
+ .align_y = 1,
+ .bytes = {1, 1},
+ .bpp = {8, 8},
+ .plane_bits = 8,
+ .component_bits = 8,
+ };
+ case IMGFMT_YAP16:
+ return (struct mp_imgfmt_desc) {
+ .id = mpfmt,
+ .avformat = AV_PIX_FMT_NONE,
+ .flags = MP_IMGFLAG_BYTE_ALIGNED | MP_IMGFLAG_NE | MP_IMGFLAG_YUV |
+ MP_IMGFLAG_YUV_P,
+ .num_planes = 2,
+ .align_x = 1,
+ .align_y = 1,
+ .bytes = {2, 2},
+ .bpp = {16, 16},
+ .plane_bits = 16,
+ .component_bits = 16,
+ };
}
return (struct mp_imgfmt_desc) {0};
}
@@ -336,7 +366,9 @@ enum mp_csp mp_imgfmt_get_forced_csp(int imgfmt)
enum mp_component_type mp_imgfmt_get_component_type(int imgfmt)
{
- if (imgfmt == IMGFMT_RGB30)
+ if (imgfmt == IMGFMT_RGB30 ||
+ imgfmt == IMGFMT_YAP8 ||
+ imgfmt == IMGFMT_YAP16)
return MP_COMPONENT_TYPE_UINT;
const AVPixFmtDescriptor *pixdesc =
@@ -363,6 +395,39 @@ static bool is_native_endian(const AVPixFmtDescriptor *pixdesc)
return pixdesc && (is_le != !!(pixdesc->flags & AV_PIX_FMT_FLAG_BE));
}
+static bool mp_only_regular_imgfmt(struct mp_regular_imgfmt *dst, int imgfmt)
+{
+ switch (imgfmt) {
+ case IMGFMT_YAP8:
+ *dst = (struct mp_regular_imgfmt) {
+ .component_type = MP_COMPONENT_TYPE_UINT,
+ .component_size = 1,
+ .num_planes = 2,
+ .planes = {
+ {.num_components = 1, .components = {1}},
+ {.num_components = 1, .components = {4}},
+ },
+ .chroma_w = 1,
+ .chroma_h = 1,
+ };
+ return true;
+ case IMGFMT_YAP16:
+ *dst = (struct mp_regular_imgfmt) {
+ .component_type = MP_COMPONENT_TYPE_UINT,
+ .component_size = 2,
+ .num_planes = 2,
+ .planes = {
+ {.num_components = 1, .components = {1}},
+ {.num_components = 1, .components = {4}},
+ },
+ .chroma_w = 1,
+ .chroma_h = 1,
+ };
+ return true;
+ }
+ return false;
+}
+
bool mp_get_regular_imgfmt(struct mp_regular_imgfmt *dst, int imgfmt)
{
struct mp_regular_imgfmt res = {0};
@@ -370,7 +435,10 @@ bool mp_get_regular_imgfmt(struct mp_regular_imgfmt *dst, int imgfmt)
const AVPixFmtDescriptor *pixdesc =
av_pix_fmt_desc_get(imgfmt2pixfmt(imgfmt));
- if (!pixdesc || (pixdesc->flags & AV_PIX_FMT_FLAG_BITSTREAM) ||
+ if (!pixdesc)
+ return mp_only_regular_imgfmt(dst, imgfmt);
+
+ if ((pixdesc->flags & AV_PIX_FMT_FLAG_BITSTREAM) ||
(pixdesc->flags & AV_PIX_FMT_FLAG_HWACCEL) ||
(pixdesc->flags & AV_PIX_FMT_FLAG_PAL) ||
pixdesc->nb_components < 1 ||
diff --git a/video/img_format.h b/video/img_format.h
index 2df16ef095..61d9e02107 100644
--- a/video/img_format.h
+++ b/video/img_format.h
@@ -151,6 +151,10 @@ enum mp_imgfmt {
IMGFMT_Y8,
IMGFMT_Y16,
+ // Planar gray/alpha.
+ IMGFMT_YAP8,
+ IMGFMT_YAP16,
+
// Packed YUV formats (components are byte-accessed)
IMGFMT_UYVY, // U Y0 V Y1