videocrop: Added support for planar pixel formats > 8bits

- Added support for planar pixel formats with depths greater than 8bits
  to transform_planar implementation
- Added a whole lot of new pixel formats to the support-list

Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-good/-/merge_requests/515>
This commit is contained in:
Markus Ebner 2021-04-07 18:54:49 +02:00 committed by GStreamer Marge Bot
parent 3ba8abb056
commit e31cbce4d5
3 changed files with 60 additions and 21 deletions

View file

@ -7,14 +7,23 @@
* between both, avoiding the need of manual synchronization
*/
#define VIDEO_CROP_FORMATS_PACKED_SIMPLE "RGB, BGR, RGB16, RGB15, " \
"RGBx, xRGB, BGRx, xBGR, RGBA, ARGB, BGRA, ABGR, " \
"GRAY8, GRAY16_LE, GRAY16_BE, AYUV"
#define VIDEO_CROP_FORMATS_PACKED_COMPLEX "YVYU, YUY2, UYVY"
#define VIDEO_CROP_FORMATS_PLANAR "I420, A420, YV12, Y444, Y42B, Y41B, " \
"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"
#define VIDEO_CROP_FORMATS_SEMI_PLANAR "NV12, NV21"
/* aspectratiocrop uses videocrop. sync caps changes between both */
#define VIDEO_CROP_CAPS \
GST_VIDEO_CAPS_MAKE ("{ RGBx, xRGB, BGRx, xBGR, " \
"RGBA, ARGB, BGRA, ABGR, RGB, BGR, AYUV, YUY2, Y444, " \
"Y42B, Y41B, YVYU, UYVY, I420, YV12, RGB16, RGB15, " \
"GRAY8, NV12, NV21, GRAY16_LE, GRAY16_BE }") "; " \
"video/x-raw(ANY), " \
"width = " GST_VIDEO_SIZE_RANGE ", " \
"height = " GST_VIDEO_SIZE_RANGE ", " \
"framerate = " GST_VIDEO_FPS_RANGE
GST_VIDEO_CAPS_MAKE ("{" \
VIDEO_CROP_FORMATS_PACKED_SIMPLE "," \
VIDEO_CROP_FORMATS_PACKED_COMPLEX "," \
VIDEO_CROP_FORMATS_PLANAR "," \
VIDEO_CROP_FORMATS_SEMI_PLANAR "}")
#endif /* __GST_VIDEO_CROP_PRIVATE_H__ */

View file

@ -341,11 +341,16 @@ gst_video_crop_transform_planar (GstVideoCrop * vcrop,
guint subsampled_crop_left, subsampled_crop_top;
guint copy_width;
gint i;
gsize bytes_per_pixel;
/* plane */
plane_in = GST_VIDEO_FRAME_PLANE_DATA (in_frame, p);
plane_out = GST_VIDEO_FRAME_PLANE_DATA (out_frame, p);
/* To support > 8bit, we need to add a byte-multiplier that specifies
* how many bytes are used per pixel value */
bytes_per_pixel = GST_VIDEO_FRAME_COMP_PSTRIDE (in_frame, p);
/* apply crop top/left
* crop_top and crop_left have to be rounded down to the corresponding
* subsampling factor, since, e.g.: the first line in a subsampled plane
@ -361,8 +366,9 @@ gst_video_crop_transform_planar (GstVideoCrop * vcrop,
subsampled_crop_top) * GST_VIDEO_FRAME_PLANE_STRIDE (in_frame, p);
plane_in +=
GST_VIDEO_FORMAT_INFO_SCALE_WIDTH (format_info, p,
subsampled_crop_left);
copy_width = (guint) GST_VIDEO_FRAME_COMP_WIDTH (out_frame, p);
subsampled_crop_left) * bytes_per_pixel;
copy_width = GST_VIDEO_FRAME_COMP_WIDTH (out_frame, p) * bytes_per_pixel;
for (i = 0; i < GST_VIDEO_FRAME_COMP_HEIGHT (out_frame, p); ++i) {
memcpy (plane_out, plane_in, copy_width);
@ -821,9 +827,28 @@ gst_video_crop_set_info (GstVideoFilter * vfilter, GstCaps * in,
}
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;

View file

@ -23,7 +23,6 @@
#include <gst/video/gstvideofilter.h>
G_BEGIN_DECLS
#define GST_TYPE_VIDEO_CROP \
(gst_video_crop_get_type())
#define GST_VIDEO_CROP(obj) \
@ -34,12 +33,20 @@ G_BEGIN_DECLS
(G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_VIDEO_CROP))
#define GST_IS_VIDEO_CROP_CLASS(klass) \
(G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_VIDEO_CROP))
typedef enum {
VIDEO_CROP_PIXEL_FORMAT_PACKED_SIMPLE = 0, /* RGBx, AYUV */
VIDEO_CROP_PIXEL_FORMAT_PACKED_COMPLEX, /* UYVY, YVYU */
VIDEO_CROP_PIXEL_FORMAT_PLANAR, /* I420, YV12, Y444 */
VIDEO_CROP_PIXEL_FORMAT_SEMI_PLANAR /* NV12, NV21 */
typedef enum
{
/* RGB (+ variants), ARGB (+ variants), AYUV, GRAY */
VIDEO_CROP_PIXEL_FORMAT_PACKED_SIMPLE = 0,
/* YVYU, YUY2, UYVY */
VIDEO_CROP_PIXEL_FORMAT_PACKED_COMPLEX,
/* I420, A420, YV12, Y444, Y42B, Y41B,
* 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 */
VIDEO_CROP_PIXEL_FORMAT_PLANAR,
/* NV12, NV21 */
VIDEO_CROP_PIXEL_FORMAT_SEMI_PLANAR
} VideoCropPixelFormat;
typedef struct _GstVideoCropImageDetails GstVideoCropImageDetails;
@ -51,7 +58,7 @@ struct _GstVideoCrop
{
GstVideoFilter parent;
/*< private >*/
/*< private > */
gint prop_left;
gint prop_right;
gint prop_top;
@ -66,7 +73,7 @@ struct _GstVideoCrop
gint crop_top;
gint crop_bottom;
VideoCropPixelFormat packing;
VideoCropPixelFormat packing;
gint macro_y_off;
gboolean raw_caps;
@ -80,6 +87,4 @@ struct _GstVideoCropClass
GType gst_video_crop_get_type (void);
G_END_DECLS
#endif /* __GST_VIDEO_CROP_H__ */