From 7276b0f9d1ef3f1aff28f740db87e6dc4a87515e Mon Sep 17 00:00:00 2001 From: Markus Ebner Date: Wed, 7 Apr 2021 21:57:11 +0200 Subject: [PATCH] videocrop: Add support for GBR* video formats Part-of: --- gst/videocrop/gstvideocrop-private.h | 4 +- gst/videocrop/gstvideocrop.c | 126 ++++++++++++++++----------- gst/videocrop/gstvideocrop.h | 4 +- 3 files changed, 79 insertions(+), 55 deletions(-) diff --git a/gst/videocrop/gstvideocrop-private.h b/gst/videocrop/gstvideocrop-private.h index 6e52ce39d4..2c9e4ee146 100644 --- a/gst/videocrop/gstvideocrop-private.h +++ b/gst/videocrop/gstvideocrop-private.h @@ -15,7 +15,9 @@ "I420_10BE, A420_10BE, Y444_10BE, A444_10BE, I422_10BE, A422_10BE, " \ "I420_10LE, A420_10LE, Y444_10LE, A444_10LE, I422_10LE, A422_10LE, " \ "I420_12BE, Y444_12BE, I422_12BE, " \ - "I420_12LE, Y444_12LE, I422_12LE" + "I420_12LE, Y444_12LE, I422_12LE, " \ + "GBR, GBR_10BE, GBR_10LE, GBR_12BE, GBR_12LE, " \ + "GBRA, GBRA_10BE, GBRA_10LE, GBRA_12BE, GBRA_12LE" #define VIDEO_CROP_FORMATS_SEMI_PLANAR "NV12, NV21" /* aspectratiocrop uses videocrop. sync caps changes between both */ diff --git a/gst/videocrop/gstvideocrop.c b/gst/videocrop/gstvideocrop.c index 3f904c028e..1a61487fb1 100644 --- a/gst/videocrop/gstvideocrop.c +++ b/gst/videocrop/gstvideocrop.c @@ -806,59 +806,79 @@ gst_video_crop_set_info (GstVideoFilter * vfilter, GstCaps * in, if (!crop->raw_caps) goto beach; - if (GST_VIDEO_INFO_IS_RGB (in_info) - || GST_VIDEO_INFO_IS_GRAY (in_info)) { - crop->packing = VIDEO_CROP_PIXEL_FORMAT_PACKED_SIMPLE; - } else { - switch (GST_VIDEO_INFO_FORMAT (in_info)) { - case GST_VIDEO_FORMAT_AYUV: - crop->packing = VIDEO_CROP_PIXEL_FORMAT_PACKED_SIMPLE; - break; - case GST_VIDEO_FORMAT_YVYU: - case GST_VIDEO_FORMAT_YUY2: - case GST_VIDEO_FORMAT_UYVY: - crop->packing = VIDEO_CROP_PIXEL_FORMAT_PACKED_COMPLEX; - if (GST_VIDEO_INFO_FORMAT (in_info) == GST_VIDEO_FORMAT_UYVY) { - /* UYVY = 4:2:2 - [U0 Y0 V0 Y1] [U2 Y2 V2 Y3] [U4 Y4 V4 Y5] */ - crop->macro_y_off = 1; - } else { - /* YUYV = 4:2:2 - [Y0 U0 Y1 V0] [Y2 U2 Y3 V2] [Y4 U4 Y5 V4] = YUY2 */ - crop->macro_y_off = 0; - } - break; - case GST_VIDEO_FORMAT_I420: - case GST_VIDEO_FORMAT_I420_10BE: - case GST_VIDEO_FORMAT_I420_10LE: - case GST_VIDEO_FORMAT_I420_12BE: - case GST_VIDEO_FORMAT_I420_12LE: - case GST_VIDEO_FORMAT_A420: - case GST_VIDEO_FORMAT_A420_10BE: - case GST_VIDEO_FORMAT_A420_10LE: - case GST_VIDEO_FORMAT_YV12: - case GST_VIDEO_FORMAT_Y444: - case GST_VIDEO_FORMAT_Y444_10BE: - case GST_VIDEO_FORMAT_Y444_10LE: - case GST_VIDEO_FORMAT_Y444_12BE: - case GST_VIDEO_FORMAT_Y444_12LE: - case GST_VIDEO_FORMAT_A444_10BE: - case GST_VIDEO_FORMAT_A444_10LE: - case GST_VIDEO_FORMAT_Y42B: - case GST_VIDEO_FORMAT_I422_10BE: - case GST_VIDEO_FORMAT_I422_10LE: - case GST_VIDEO_FORMAT_A422_10BE: - case GST_VIDEO_FORMAT_A422_10LE: - case GST_VIDEO_FORMAT_I422_12BE: - case GST_VIDEO_FORMAT_I422_12LE: - case GST_VIDEO_FORMAT_Y41B: - crop->packing = VIDEO_CROP_PIXEL_FORMAT_PLANAR; - break; - case GST_VIDEO_FORMAT_NV12: - case GST_VIDEO_FORMAT_NV21: - crop->packing = VIDEO_CROP_PIXEL_FORMAT_SEMI_PLANAR; - break; - default: - goto unknown_format; - } + switch (GST_VIDEO_INFO_FORMAT (in_info)) { + case GST_VIDEO_FORMAT_RGB: + case GST_VIDEO_FORMAT_BGR: + case GST_VIDEO_FORMAT_RGB16: + case GST_VIDEO_FORMAT_RGB15: + case GST_VIDEO_FORMAT_RGBx: + case GST_VIDEO_FORMAT_xRGB: + case GST_VIDEO_FORMAT_BGRx: + case GST_VIDEO_FORMAT_xBGR: + case GST_VIDEO_FORMAT_RGBA: + case GST_VIDEO_FORMAT_ARGB: + case GST_VIDEO_FORMAT_BGRA: + case GST_VIDEO_FORMAT_ABGR: + case GST_VIDEO_FORMAT_GRAY8: + case GST_VIDEO_FORMAT_GRAY16_LE: + case GST_VIDEO_FORMAT_GRAY16_BE: + case GST_VIDEO_FORMAT_AYUV: + crop->packing = VIDEO_CROP_PIXEL_FORMAT_PACKED_SIMPLE; + break; + case GST_VIDEO_FORMAT_YVYU: + case GST_VIDEO_FORMAT_YUY2: + case GST_VIDEO_FORMAT_UYVY: + crop->packing = VIDEO_CROP_PIXEL_FORMAT_PACKED_COMPLEX; + if (GST_VIDEO_INFO_FORMAT (in_info) == GST_VIDEO_FORMAT_UYVY) { + /* UYVY = 4:2:2 - [U0 Y0 V0 Y1] [U2 Y2 V2 Y3] [U4 Y4 V4 Y5] */ + crop->macro_y_off = 1; + } else { + /* YUYV = 4:2:2 - [Y0 U0 Y1 V0] [Y2 U2 Y3 V2] [Y4 U4 Y5 V4] = YUY2 */ + crop->macro_y_off = 0; + } + break; + case GST_VIDEO_FORMAT_I420: + case GST_VIDEO_FORMAT_I420_10BE: + case GST_VIDEO_FORMAT_I420_10LE: + case GST_VIDEO_FORMAT_I420_12BE: + case GST_VIDEO_FORMAT_I420_12LE: + case GST_VIDEO_FORMAT_A420: + case GST_VIDEO_FORMAT_A420_10BE: + case GST_VIDEO_FORMAT_A420_10LE: + case GST_VIDEO_FORMAT_YV12: + case GST_VIDEO_FORMAT_Y444: + case GST_VIDEO_FORMAT_Y444_10BE: + case GST_VIDEO_FORMAT_Y444_10LE: + case GST_VIDEO_FORMAT_Y444_12BE: + case GST_VIDEO_FORMAT_Y444_12LE: + case GST_VIDEO_FORMAT_A444_10BE: + case GST_VIDEO_FORMAT_A444_10LE: + case GST_VIDEO_FORMAT_Y42B: + case GST_VIDEO_FORMAT_I422_10BE: + case GST_VIDEO_FORMAT_I422_10LE: + case GST_VIDEO_FORMAT_A422_10BE: + case GST_VIDEO_FORMAT_A422_10LE: + case GST_VIDEO_FORMAT_I422_12BE: + case GST_VIDEO_FORMAT_I422_12LE: + case GST_VIDEO_FORMAT_GBR: + case GST_VIDEO_FORMAT_GBR_10BE: + case GST_VIDEO_FORMAT_GBR_10LE: + case GST_VIDEO_FORMAT_GBR_12BE: + case GST_VIDEO_FORMAT_GBR_12LE: + case GST_VIDEO_FORMAT_GBRA: + case GST_VIDEO_FORMAT_GBRA_10BE: + case GST_VIDEO_FORMAT_GBRA_10LE: + case GST_VIDEO_FORMAT_GBRA_12BE: + case GST_VIDEO_FORMAT_GBRA_12LE: + case GST_VIDEO_FORMAT_Y41B: + crop->packing = VIDEO_CROP_PIXEL_FORMAT_PLANAR; + break; + case GST_VIDEO_FORMAT_NV12: + case GST_VIDEO_FORMAT_NV21: + crop->packing = VIDEO_CROP_PIXEL_FORMAT_SEMI_PLANAR; + break; + default: + goto unknown_format; } beach: diff --git a/gst/videocrop/gstvideocrop.h b/gst/videocrop/gstvideocrop.h index 85b7d2f97b..528bf18bd0 100644 --- a/gst/videocrop/gstvideocrop.h +++ b/gst/videocrop/gstvideocrop.h @@ -43,7 +43,9 @@ G_BEGIN_DECLS * I420_10BE, A420_10BE, Y444_10BE, A444_10BE, I422_10BE, A422_10BE, * I420_10LE, A420_10LE, Y444_10LE, A444_10LE, I422_10LE, A422_10LE, * I420_12BE, Y444_12BE, I422_12BE, - * I420_12LE, Y444_12LE, I422_12LE */ + * I420_12LE, Y444_12LE, I422_12LE, + * GBR, GBR_10BE, GBR_10LE, GBR_12BE, GBR_12LE, + * GBRA, GBRA_10BE, GBRA_10LE, GBRA_12BE, GBRA_12LE */ VIDEO_CROP_PIXEL_FORMAT_PLANAR, /* NV12, NV21 */ VIDEO_CROP_PIXEL_FORMAT_SEMI_PLANAR