From a71ec17cf0f966335fe6904399202722460c182d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Cerveau?= Date: Tue, 2 Feb 2021 11:02:02 +0100 Subject: [PATCH] jpeg2000parse, openjpeg: add support for YCrCb 4:1:1 sampling Add YCrCb 4:1:1 support in openjpeg elements and fix in jpeg2000parse the YCrCb 4:1:0 support Part-of: --- docs/plugins/gst_plugins_cache.json | 6 ++-- ext/openjpeg/gstopenjpegenc.c | 3 ++ .../gst/codecparsers/gstjpeg2000sampling.c | 6 ++-- .../gst/codecparsers/gstjpeg2000sampling.h | 30 ++++++++++++------- gst/videoparsers/gstjpeg2000parse.c | 9 ++++-- 5 files changed, 37 insertions(+), 17 deletions(-) diff --git a/docs/plugins/gst_plugins_cache.json b/docs/plugins/gst_plugins_cache.json index 36ec431293..78a0b8973b 100644 --- a/docs/plugins/gst_plugins_cache.json +++ b/docs/plugins/gst_plugins_cache.json @@ -217678,7 +217678,7 @@ "long-name": "OpenJPEG JPEG2000 decoder", "pad-templates": { "sink": { - "caps": "image/x-j2c:\n sampling: { (string)RGB, (string)BGR, (string)RGBA, (string)BGRA, (string)YCbCr-4:4:4, (string)YCbCr-4:2:2, (string)YCbCr-4:2:0, (string)YCbCr-4:1:1, (string)GRAYSCALE, (string)YCbCrA-4:4:4:4 }\nimage/x-jpc:\n sampling: { (string)RGB, (string)BGR, (string)RGBA, (string)BGRA, (string)YCbCr-4:4:4, (string)YCbCr-4:2:2, (string)YCbCr-4:2:0, (string)YCbCr-4:1:1, (string)GRAYSCALE, (string)YCbCrA-4:4:4:4 }\nimage/jp2:\n", + "caps": "image/x-j2c:\n sampling: { (string)RGB, (string)BGR, (string)RGBA, (string)BGRA, (string)YCbCr-4:4:4, (string)YCbCr-4:2:2, (string)YCbCr-4:2:0, (string)YCbCr-4:1:1, (string)YCbCr-4:1:0, (string)GRAYSCALE, (string)YCbCrA-4:4:4:4 }\nimage/x-jpc:\n sampling: { (string)RGB, (string)BGR, (string)RGBA, (string)BGRA, (string)YCbCr-4:4:4, (string)YCbCr-4:2:2, (string)YCbCr-4:2:0, (string)YCbCr-4:1:1, (string)YCbCr-4:1:0, (string)GRAYSCALE, (string)YCbCrA-4:4:4:4 }\nimage/jp2:\n", "direction": "sink", "presence": "always" }, @@ -217729,7 +217729,7 @@ "presence": "always" }, "src": { - "caps": "image/x-j2c:\n width: [ 1, 2147483647 ]\n height: [ 1, 2147483647 ]\n num-components: [ 1, 4 ]\n num-stripes: [ 1, 2147483647 ]\n sampling: { (string)RGB, (string)BGR, (string)RGBA, (string)BGRA, (string)YCbCr-4:4:4, (string)YCbCr-4:2:2, (string)YCbCr-4:2:0, (string)YCbCr-4:1:1, (string)GRAYSCALE, (string)YCbCrA-4:4:4:4 }\n colorspace: { (string)sRGB, (string)sYUV, (string)GRAY }\nimage/x-jpc:\n width: [ 1, 2147483647 ]\n height: [ 1, 2147483647 ]\n num-components: [ 1, 4 ]\n sampling: { (string)RGB, (string)BGR, (string)RGBA, (string)BGRA, (string)YCbCr-4:4:4, (string)YCbCr-4:2:2, (string)YCbCr-4:2:0, (string)YCbCr-4:1:1, (string)GRAYSCALE, (string)YCbCrA-4:4:4:4 }\n colorspace: { (string)sRGB, (string)sYUV, (string)GRAY }\nimage/jp2:\n width: [ 1, 2147483647 ]\n height: [ 1, 2147483647 ]\n", + "caps": "image/x-j2c:\n width: [ 1, 2147483647 ]\n height: [ 1, 2147483647 ]\n num-components: [ 1, 4 ]\n num-stripes: [ 1, 2147483647 ]\n sampling: { (string)RGB, (string)BGR, (string)RGBA, (string)BGRA, (string)YCbCr-4:4:4, (string)YCbCr-4:2:2, (string)YCbCr-4:2:0, (string)YCbCr-4:1:1, (string)YCbCr-4:1:0, (string)GRAYSCALE, (string)YCbCrA-4:4:4:4 }\n colorspace: { (string)sRGB, (string)sYUV, (string)GRAY }\nimage/x-jpc:\n width: [ 1, 2147483647 ]\n height: [ 1, 2147483647 ]\n num-components: [ 1, 4 ]\n sampling: { (string)RGB, (string)BGR, (string)RGBA, (string)BGRA, (string)YCbCr-4:4:4, (string)YCbCr-4:2:2, (string)YCbCr-4:2:0, (string)YCbCr-4:1:1, (string)YCbCr-4:1:0, (string)GRAYSCALE, (string)YCbCrA-4:4:4:4 }\n colorspace: { (string)sRGB, (string)sYUV, (string)GRAY }\nimage/jp2:\n width: [ 1, 2147483647 ]\n height: [ 1, 2147483647 ]\n", "direction": "src", "presence": "always" } @@ -225949,7 +225949,7 @@ "presence": "always" }, "src": { - "caps": "image/x-jpc:\n width: [ 1, 2147483647 ]\n height: [ 1, 2147483647 ]\n sampling: { (string)RGB, (string)BGR, (string)RGBA, (string)BGRA, (string)YCbCr-4:4:4, (string)YCbCr-4:2:2, (string)YCbCr-4:2:0, (string)YCbCr-4:1:1, (string)GRAYSCALE, (string)YCbCrA-4:4:4:4 }\n colorspace: { (string)sRGB, (string)sYUV, (string)GRAY }\n profile: [ 0, 49151 ]\n parsed: true\nimage/x-j2c:\n width: [ 1, 2147483647 ]\n height: [ 1, 2147483647 ]\n sampling: { (string)RGB, (string)BGR, (string)RGBA, (string)BGRA, (string)YCbCr-4:4:4, (string)YCbCr-4:2:2, (string)YCbCr-4:2:0, (string)YCbCr-4:1:1, (string)GRAYSCALE, (string)YCbCrA-4:4:4:4 }\n colorspace: { (string)sRGB, (string)sYUV, (string)GRAY }\n profile: [ 0, 49151 ]\n parsed: true\n", + "caps": "image/x-jpc:\n width: [ 1, 2147483647 ]\n height: [ 1, 2147483647 ]\n sampling: { (string)RGB, (string)BGR, (string)RGBA, (string)BGRA, (string)YCbCr-4:4:4, (string)YCbCr-4:2:2, (string)YCbCr-4:2:0, (string)YCbCr-4:1:1, (string)YCbCr-4:1:0, (string)GRAYSCALE, (string)YCbCrA-4:4:4:4 }\n colorspace: { (string)sRGB, (string)sYUV, (string)GRAY }\n profile: [ 0, 49151 ]\n parsed: true\nimage/x-j2c:\n width: [ 1, 2147483647 ]\n height: [ 1, 2147483647 ]\n sampling: { (string)RGB, (string)BGR, (string)RGBA, (string)BGRA, (string)YCbCr-4:4:4, (string)YCbCr-4:2:2, (string)YCbCr-4:2:0, (string)YCbCr-4:1:1, (string)YCbCr-4:1:0, (string)GRAYSCALE, (string)YCbCrA-4:4:4:4 }\n colorspace: { (string)sRGB, (string)sYUV, (string)GRAY }\n profile: [ 0, 49151 ]\n parsed: true\n", "direction": "src", "presence": "always" } diff --git a/ext/openjpeg/gstopenjpegenc.c b/ext/openjpeg/gstopenjpegenc.c index 2bd5f82f65..f129e56ef6 100644 --- a/ext/openjpeg/gstopenjpegenc.c +++ b/ext/openjpeg/gstopenjpegenc.c @@ -722,6 +722,9 @@ gst_openjpeg_enc_set_format (GstVideoEncoder * encoder, case GST_VIDEO_FORMAT_YUV9: sampling = GST_JPEG2000_SAMPLING_YBR410; break; + case GST_VIDEO_FORMAT_Y41B: + sampling = GST_JPEG2000_SAMPLING_YBR411; + break; case GST_VIDEO_FORMAT_I420_10LE: case GST_VIDEO_FORMAT_I420_10BE: case GST_VIDEO_FORMAT_I420: diff --git a/gst-libs/gst/codecparsers/gstjpeg2000sampling.c b/gst-libs/gst/codecparsers/gstjpeg2000sampling.c index 526a7ecce0..c1e76f0fce 100644 --- a/gst-libs/gst/codecparsers/gstjpeg2000sampling.c +++ b/gst-libs/gst/codecparsers/gstjpeg2000sampling.c @@ -42,6 +42,7 @@ static const gchar *gst_jpeg2000_sampling_strings[] = { "YCbCr-4:1:0", "GRAYSCALE", "YCbCrA-4:4:4:4", + "YCbCr-4:1:1", }; /* convert string to GstJPEG2000Sampling enum */ @@ -86,8 +87,9 @@ gst_jpeg2000_sampling_is_yuv (GstJPEG2000Sampling sampling) return sampling == GST_JPEG2000_SAMPLING_YBRA4444_EXT || sampling == GST_JPEG2000_SAMPLING_YBR444 || sampling == GST_JPEG2000_SAMPLING_YBR422 || - sampling == GST_JPEG2000_SAMPLING_YBR420 - || sampling == GST_JPEG2000_SAMPLING_YBR410; + sampling == GST_JPEG2000_SAMPLING_YBR420 || + sampling == GST_JPEG2000_SAMPLING_YBR411 || + sampling == GST_JPEG2000_SAMPLING_YBR410; } /* check if @sampling is in GRAYSCALE color space */ diff --git a/gst-libs/gst/codecparsers/gstjpeg2000sampling.h b/gst-libs/gst/codecparsers/gstjpeg2000sampling.h index 5fa0810004..4b5bea5a3c 100644 --- a/gst-libs/gst/codecparsers/gstjpeg2000sampling.h +++ b/gst-libs/gst/codecparsers/gstjpeg2000sampling.h @@ -30,17 +30,26 @@ * Note: sampling extensions that are not listed in the RFC are signified by an _EXT at the end of the enum * * @GST_JPEG2000_SAMPLING_NONE: no sampling - * @GST_JPEG2000_SAMPLING_RGB: standard Red, Green, Blue color space. - * @GST_JPEG2000_SAMPLING_BGR: standard Blue, Green, Red color space. - * @GST_JPEG2000_SAMPLING_RGBA: standard Red, Green, Blue, Alpha color space. - * @GST_JPEG2000_SAMPLING_BGRA: standard Blue, Green, Red, Alpha color space. - * @GST_JPEG2000_SAMPLING_YCbCr-4:4:4: standard YCbCr color space; no subsampling. - * @GST_JPEG2000_SAMPLING_YCbCr-4:2:2: standard YCbCr color space; Cb and Cr are subsampled horizontally by 1/2. - * @GST_JPEG2000_SAMPLING_YCbCr-4:2:0: standard YCbCr color space; Cb and Cr are subsampled horizontally and vertically by 1/2. - * @GST_JPEG2000_SAMPLING_YCbCr-4:1:1: standard YCbCr color space; Cb and Cr are subsampled vertically by 1/4. + * @GST_JPEG2000_SAMPLING_RGB: standard Red, Green, Blue color space. + * @GST_JPEG2000_SAMPLING_BGR: standard Blue, Green, Red color space. + * @GST_JPEG2000_SAMPLING_RGBA: standard Red, Green, Blue, Alpha color space. + * @GST_JPEG2000_SAMPLING_BGRA: standard Blue, Green, Red, Alpha color space. + * @GST_JPEG2000_SAMPLING_YBR444: standard YCbCr color space; no subsampling. + * @GST_JPEG2000_SAMPLING_YBR422: standard YCbCr color space; Cb and Cr are subsampled horizontally by 1/2. + * @GST_JPEG2000_SAMPLING_YBR420: standard YCbCr color space; Cb and Cr are subsampled horizontally and vertically by 1/2. + * @GST_JPEG2000_SAMPLING_YBR411: standard YCbCr color space; Cb and Cr are subsampled vertically by 1/4 (Since: 1.20). + * @GST_JPEG2000_SAMPLING_YBR410: standard YCbCr color space; Cb and Cr are subsampled vertically by 1/4 alternating the Cb and Cr component. * @GST_JPEG2000_SAMPLING_GRAYSCALE: basically, a single component image of just multilevels of grey. * @GST_JPEG2000_SAMPLING_YBRA4444_EXT: standard YCbCr color space, alpha channel, no subsampling, */ + +/** + * GST_JPEG2000_SAMPLING_YBR411: + * + * standard YCbCr color space; Cb and Cr are subsampled vertically by 1/4 + * + * Since: 1.20 + */ typedef enum { GST_JPEG2000_SAMPLING_NONE, @@ -53,11 +62,12 @@ typedef enum GST_JPEG2000_SAMPLING_YBR420, GST_JPEG2000_SAMPLING_YBR410, GST_JPEG2000_SAMPLING_GRAYSCALE, - GST_JPEG2000_SAMPLING_YBRA4444_EXT + GST_JPEG2000_SAMPLING_YBRA4444_EXT, + GST_JPEG2000_SAMPLING_YBR411 } GstJPEG2000Sampling; /* GST_JPEG2000_SAMPLING_LIST: sampling strings in list form, for use in caps */ -#define GST_JPEG2000_SAMPLING_LIST "sampling = (string) {\"RGB\", \"BGR\", \"RGBA\", \"BGRA\", \"YCbCr-4:4:4\", \"YCbCr-4:2:2\", \"YCbCr-4:2:0\", \"YCbCr-4:1:1\", \"GRAYSCALE\" , \"YCbCrA-4:4:4:4\"}" +#define GST_JPEG2000_SAMPLING_LIST "sampling = (string) {\"RGB\", \"BGR\", \"RGBA\", \"BGRA\", \"YCbCr-4:4:4\", \"YCbCr-4:2:2\", \"YCbCr-4:2:0\", \"YCbCr-4:1:1\", \"YCbCr-4:1:0\", \"GRAYSCALE\" , \"YCbCrA-4:4:4:4\"}" GST_CODEC_PARSERS_API const gchar *gst_jpeg2000_sampling_to_string (GstJPEG2000Sampling sampling); diff --git a/gst/videoparsers/gstjpeg2000parse.c b/gst/videoparsers/gstjpeg2000parse.c index 3ba035831a..bf3f3810ae 100644 --- a/gst/videoparsers/gstjpeg2000parse.c +++ b/gst/videoparsers/gstjpeg2000parse.c @@ -69,9 +69,12 @@ gst_jpeg2000_parse_get_subsampling (guint16 compno, } else if (sampling == GST_JPEG2000_SAMPLING_YBR420) { *dx = 2; *dy = 2; + } else if (sampling == GST_JPEG2000_SAMPLING_YBR411) { + *dx = 4; + *dy = 1; } else if (sampling == GST_JPEG2000_SAMPLING_YBR410) { *dx = 4; - *dy = 2; + *dy = 4; } } } @@ -648,7 +651,9 @@ gst_jpeg2000_parse_handle_frame (GstBaseParse * parse, parsed_sampling = GST_JPEG2000_SAMPLING_YBR444; } else if (dx[1] == 2 && dy[1] == 2) { parsed_sampling = GST_JPEG2000_SAMPLING_YBR420; - } else if (dx[1] == 4 && dy[1] == 2) { + } else if (dx[1] == 4 && dy[1] == 1) { + parsed_sampling = GST_JPEG2000_SAMPLING_YBR411; + } else if (dx[1] == 4 && dy[1] == 4) { parsed_sampling = GST_JPEG2000_SAMPLING_YBR410; } else if (dx[1] == 2 && dy[1] == 1) { parsed_sampling = GST_JPEG2000_SAMPLING_YBR422;