mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2025-01-13 19:05:37 +00:00
videocrop: Add support for v210
Like UYVY and similar formats this is rounding down to the start of the previous macro-pixel to not mix up the different components. Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1988>
This commit is contained in:
parent
49ec82b209
commit
3de245ed17
4 changed files with 48 additions and 5 deletions
|
@ -25258,12 +25258,12 @@
|
||||||
"long-name": "aspectratiocrop",
|
"long-name": "aspectratiocrop",
|
||||||
"pad-templates": {
|
"pad-templates": {
|
||||||
"sink": {
|
"sink": {
|
||||||
"caps": "video/x-raw:\n format: { RGB, BGR, RGB16, RGB15, RGBx, xRGB, BGRx, xBGR, RGBA, ARGB, BGRA, ABGR, GRAY8, GRAY16_LE, GRAY16_BE, AYUV, YVYU, YUY2, UYVY, 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, GBR, GBR_10BE, GBR_10LE, GBR_12BE, GBR_12LE, GBRA, GBRA_10BE, GBRA_10LE, GBRA_12BE, GBRA_12LE, NV12, NV21 }\n width: [ 1, 2147483647 ]\n height: [ 1, 2147483647 ]\n framerate: [ 0/1, 2147483647/1 ]\n\nvideo/x-raw(ANY):\n width: [ 1, 2147483647 ]\n height: [ 1, 2147483647 ]\n framerate: [ 0/1, 2147483647/1 ]\n",
|
"caps": "video/x-raw:\n format: { RGB, BGR, RGB16, RGB15, RGBx, xRGB, BGRx, xBGR, RGBA, ARGB, BGRA, ABGR, GRAY8, GRAY16_LE, GRAY16_BE, AYUV, YVYU, YUY2, UYVY, v210, 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, GBR, GBR_10BE, GBR_10LE, GBR_12BE, GBR_12LE, GBRA, GBRA_10BE, GBRA_10LE, GBRA_12BE, GBRA_12LE, NV12, NV21 }\n width: [ 1, 2147483647 ]\n height: [ 1, 2147483647 ]\n framerate: [ 0/1, 2147483647/1 ]\n\nvideo/x-raw(ANY):\n width: [ 1, 2147483647 ]\n height: [ 1, 2147483647 ]\n framerate: [ 0/1, 2147483647/1 ]\n",
|
||||||
"direction": "sink",
|
"direction": "sink",
|
||||||
"presence": "always"
|
"presence": "always"
|
||||||
},
|
},
|
||||||
"src": {
|
"src": {
|
||||||
"caps": "video/x-raw:\n format: { RGB, BGR, RGB16, RGB15, RGBx, xRGB, BGRx, xBGR, RGBA, ARGB, BGRA, ABGR, GRAY8, GRAY16_LE, GRAY16_BE, AYUV, YVYU, YUY2, UYVY, 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, GBR, GBR_10BE, GBR_10LE, GBR_12BE, GBR_12LE, GBRA, GBRA_10BE, GBRA_10LE, GBRA_12BE, GBRA_12LE, NV12, NV21 }\n width: [ 1, 2147483647 ]\n height: [ 1, 2147483647 ]\n framerate: [ 0/1, 2147483647/1 ]\n\nvideo/x-raw(ANY):\n width: [ 1, 2147483647 ]\n height: [ 1, 2147483647 ]\n framerate: [ 0/1, 2147483647/1 ]\n",
|
"caps": "video/x-raw:\n format: { RGB, BGR, RGB16, RGB15, RGBx, xRGB, BGRx, xBGR, RGBA, ARGB, BGRA, ABGR, GRAY8, GRAY16_LE, GRAY16_BE, AYUV, YVYU, YUY2, UYVY, v210, 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, GBR, GBR_10BE, GBR_10LE, GBR_12BE, GBR_12LE, GBRA, GBRA_10BE, GBRA_10LE, GBRA_12BE, GBRA_12LE, NV12, NV21 }\n width: [ 1, 2147483647 ]\n height: [ 1, 2147483647 ]\n framerate: [ 0/1, 2147483647/1 ]\n\nvideo/x-raw(ANY):\n width: [ 1, 2147483647 ]\n height: [ 1, 2147483647 ]\n framerate: [ 0/1, 2147483647/1 ]\n",
|
||||||
"direction": "src",
|
"direction": "src",
|
||||||
"presence": "always"
|
"presence": "always"
|
||||||
}
|
}
|
||||||
|
@ -25302,12 +25302,12 @@
|
||||||
"long-name": "Crop",
|
"long-name": "Crop",
|
||||||
"pad-templates": {
|
"pad-templates": {
|
||||||
"sink": {
|
"sink": {
|
||||||
"caps": "video/x-raw:\n format: { RGB, BGR, RGB16, RGB15, RGBx, xRGB, BGRx, xBGR, RGBA, ARGB, BGRA, ABGR, GRAY8, GRAY16_LE, GRAY16_BE, AYUV, YVYU, YUY2, UYVY, 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, GBR, GBR_10BE, GBR_10LE, GBR_12BE, GBR_12LE, GBRA, GBRA_10BE, GBRA_10LE, GBRA_12BE, GBRA_12LE, NV12, NV21 }\n width: [ 1, 2147483647 ]\n height: [ 1, 2147483647 ]\n framerate: [ 0/1, 2147483647/1 ]\n\nvideo/x-raw(ANY):\n width: [ 1, 2147483647 ]\n height: [ 1, 2147483647 ]\n framerate: [ 0/1, 2147483647/1 ]\n",
|
"caps": "video/x-raw:\n format: { RGB, BGR, RGB16, RGB15, RGBx, xRGB, BGRx, xBGR, RGBA, ARGB, BGRA, ABGR, GRAY8, GRAY16_LE, GRAY16_BE, AYUV, YVYU, YUY2, UYVY, v210, 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, GBR, GBR_10BE, GBR_10LE, GBR_12BE, GBR_12LE, GBRA, GBRA_10BE, GBRA_10LE, GBRA_12BE, GBRA_12LE, NV12, NV21 }\n width: [ 1, 2147483647 ]\n height: [ 1, 2147483647 ]\n framerate: [ 0/1, 2147483647/1 ]\n\nvideo/x-raw(ANY):\n width: [ 1, 2147483647 ]\n height: [ 1, 2147483647 ]\n framerate: [ 0/1, 2147483647/1 ]\n",
|
||||||
"direction": "sink",
|
"direction": "sink",
|
||||||
"presence": "always"
|
"presence": "always"
|
||||||
},
|
},
|
||||||
"src": {
|
"src": {
|
||||||
"caps": "video/x-raw:\n format: { RGB, BGR, RGB16, RGB15, RGBx, xRGB, BGRx, xBGR, RGBA, ARGB, BGRA, ABGR, GRAY8, GRAY16_LE, GRAY16_BE, AYUV, YVYU, YUY2, UYVY, 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, GBR, GBR_10BE, GBR_10LE, GBR_12BE, GBR_12LE, GBRA, GBRA_10BE, GBRA_10LE, GBRA_12BE, GBRA_12LE, NV12, NV21 }\n width: [ 1, 2147483647 ]\n height: [ 1, 2147483647 ]\n framerate: [ 0/1, 2147483647/1 ]\n\nvideo/x-raw(ANY):\n width: [ 1, 2147483647 ]\n height: [ 1, 2147483647 ]\n framerate: [ 0/1, 2147483647/1 ]\n",
|
"caps": "video/x-raw:\n format: { RGB, BGR, RGB16, RGB15, RGBx, xRGB, BGRx, xBGR, RGBA, ARGB, BGRA, ABGR, GRAY8, GRAY16_LE, GRAY16_BE, AYUV, YVYU, YUY2, UYVY, v210, 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, GBR, GBR_10BE, GBR_10LE, GBR_12BE, GBR_12LE, GBRA, GBRA_10BE, GBRA_10LE, GBRA_12BE, GBRA_12LE, NV12, NV21 }\n width: [ 1, 2147483647 ]\n height: [ 1, 2147483647 ]\n framerate: [ 0/1, 2147483647/1 ]\n\nvideo/x-raw(ANY):\n width: [ 1, 2147483647 ]\n height: [ 1, 2147483647 ]\n framerate: [ 0/1, 2147483647/1 ]\n",
|
||||||
"direction": "src",
|
"direction": "src",
|
||||||
"presence": "always"
|
"presence": "always"
|
||||||
}
|
}
|
||||||
|
|
|
@ -10,7 +10,7 @@
|
||||||
#define VIDEO_CROP_FORMATS_PACKED_SIMPLE "RGB, BGR, RGB16, RGB15, " \
|
#define VIDEO_CROP_FORMATS_PACKED_SIMPLE "RGB, BGR, RGB16, RGB15, " \
|
||||||
"RGBx, xRGB, BGRx, xBGR, RGBA, ARGB, BGRA, ABGR, " \
|
"RGBx, xRGB, BGRx, xBGR, RGBA, ARGB, BGRA, ABGR, " \
|
||||||
"GRAY8, GRAY16_LE, GRAY16_BE, AYUV"
|
"GRAY8, GRAY16_LE, GRAY16_BE, AYUV"
|
||||||
#define VIDEO_CROP_FORMATS_PACKED_COMPLEX "YVYU, YUY2, UYVY"
|
#define VIDEO_CROP_FORMATS_PACKED_COMPLEX "YVYU, YUY2, UYVY, v210"
|
||||||
#define VIDEO_CROP_FORMATS_PLANAR "I420, A420, YV12, Y444, Y42B, Y41B, " \
|
#define VIDEO_CROP_FORMATS_PLANAR "I420, A420, YV12, Y444, Y42B, Y41B, " \
|
||||||
"I420_10BE, A420_10BE, Y444_10BE, A444_10BE, I422_10BE, A422_10BE, " \
|
"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_10LE, A420_10LE, Y444_10LE, A444_10LE, I422_10LE, A422_10LE, " \
|
||||||
|
|
|
@ -293,6 +293,41 @@ gst_video_crop_transform_packed_yvyu (GstVideoCrop * vcrop,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
gst_video_crop_transform_packed_v210 (GstVideoCrop * vcrop,
|
||||||
|
GstVideoFrame * in_frame, GstVideoFrame * out_frame, gint x, gint y)
|
||||||
|
{
|
||||||
|
guint8 *in_data, *out_data;
|
||||||
|
guint i, dx;
|
||||||
|
gint width, height;
|
||||||
|
gint in_stride;
|
||||||
|
gint out_stride;
|
||||||
|
|
||||||
|
width = GST_VIDEO_FRAME_WIDTH (out_frame);
|
||||||
|
height = GST_VIDEO_FRAME_HEIGHT (out_frame);
|
||||||
|
|
||||||
|
in_data = GST_VIDEO_FRAME_PLANE_DATA (in_frame, 0);
|
||||||
|
out_data = GST_VIDEO_FRAME_PLANE_DATA (out_frame, 0);
|
||||||
|
|
||||||
|
in_stride = GST_VIDEO_FRAME_PLANE_STRIDE (in_frame, 0);
|
||||||
|
out_stride = GST_VIDEO_FRAME_PLANE_STRIDE (out_frame, 0);
|
||||||
|
|
||||||
|
in_data += vcrop->crop_top * in_stride;
|
||||||
|
|
||||||
|
/* rounding down here so we end up at the start of a macro-pixel and not
|
||||||
|
* in the middle of one */
|
||||||
|
in_data += (vcrop->crop_left / 6) * 16;
|
||||||
|
|
||||||
|
/* copy a whole set of macro-pixels */
|
||||||
|
dx = ((width + 5) / 6) * 16;
|
||||||
|
|
||||||
|
for (i = 0; i < height; ++i) {
|
||||||
|
memcpy (out_data, in_data, dx);
|
||||||
|
in_data += in_stride;
|
||||||
|
out_data += out_stride;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
gst_video_crop_transform_packed_simple (GstVideoCrop * vcrop,
|
gst_video_crop_transform_packed_simple (GstVideoCrop * vcrop,
|
||||||
GstVideoFrame * in_frame, GstVideoFrame * out_frame, gint x, gint y)
|
GstVideoFrame * in_frame, GstVideoFrame * out_frame, gint x, gint y)
|
||||||
|
@ -449,6 +484,9 @@ gst_video_crop_transform_frame (GstVideoFilter * vfilter,
|
||||||
case VIDEO_CROP_PIXEL_FORMAT_PACKED_YVYU:
|
case VIDEO_CROP_PIXEL_FORMAT_PACKED_YVYU:
|
||||||
gst_video_crop_transform_packed_yvyu (vcrop, in_frame, out_frame, x, y);
|
gst_video_crop_transform_packed_yvyu (vcrop, in_frame, out_frame, x, y);
|
||||||
break;
|
break;
|
||||||
|
case VIDEO_CROP_PIXEL_FORMAT_PACKED_v210:
|
||||||
|
gst_video_crop_transform_packed_v210 (vcrop, in_frame, out_frame, x, y);
|
||||||
|
break;
|
||||||
case VIDEO_CROP_PIXEL_FORMAT_PLANAR:
|
case VIDEO_CROP_PIXEL_FORMAT_PLANAR:
|
||||||
gst_video_crop_transform_planar (vcrop, in_frame, out_frame, x, y);
|
gst_video_crop_transform_planar (vcrop, in_frame, out_frame, x, y);
|
||||||
break;
|
break;
|
||||||
|
@ -839,6 +877,9 @@ gst_video_crop_set_info (GstVideoFilter * vfilter, GstCaps * in,
|
||||||
crop->macro_y_off = 0;
|
crop->macro_y_off = 0;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
case GST_VIDEO_FORMAT_v210:
|
||||||
|
crop->packing = VIDEO_CROP_PIXEL_FORMAT_PACKED_v210;
|
||||||
|
break;
|
||||||
case GST_VIDEO_FORMAT_I420:
|
case GST_VIDEO_FORMAT_I420:
|
||||||
case GST_VIDEO_FORMAT_I420_10BE:
|
case GST_VIDEO_FORMAT_I420_10BE:
|
||||||
case GST_VIDEO_FORMAT_I420_10LE:
|
case GST_VIDEO_FORMAT_I420_10LE:
|
||||||
|
|
|
@ -42,6 +42,8 @@ typedef enum
|
||||||
VIDEO_CROP_PIXEL_FORMAT_PACKED_SIMPLE = 0,
|
VIDEO_CROP_PIXEL_FORMAT_PACKED_SIMPLE = 0,
|
||||||
/* YVYU, YUY2, UYVY */
|
/* YVYU, YUY2, UYVY */
|
||||||
VIDEO_CROP_PIXEL_FORMAT_PACKED_YVYU,
|
VIDEO_CROP_PIXEL_FORMAT_PACKED_YVYU,
|
||||||
|
/* v210 */
|
||||||
|
VIDEO_CROP_PIXEL_FORMAT_PACKED_v210,
|
||||||
/* I420, A420, YV12, Y444, Y42B, Y41B,
|
/* I420, A420, YV12, Y444, Y42B, Y41B,
|
||||||
* I420_10BE, A420_10BE, Y444_10BE, A444_10BE, I422_10BE, A422_10BE,
|
* 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_10LE, A420_10LE, Y444_10LE, A444_10LE, I422_10LE, A422_10LE,
|
||||||
|
|
Loading…
Reference in a new issue