diff options
author | Sebastian Dröge <sebastian.droege@collabora.co.uk> | 2012-11-13 10:50:10 +0100 |
---|---|---|
committer | Sebastian Dröge <sebastian.droege@collabora.co.uk> | 2012-11-15 15:43:30 +0100 |
commit | fc13f649771497c8c040b0ff374b02da153c4b1d (patch) | |
tree | 4d3e875118c636face55523d3854cd66418fcff7 | |
parent | 5498eb8f3e49a44c6da7953b8d1bc57c3d9ca5b6 (diff) | |
download | gstreamer-plugins-base-fc13f649771497c8c040b0ff374b02da153c4b1d.tar.gz |
video: Add support for planar 10 bit YUV color formats
-rw-r--r-- | gst-libs/gst/video/video-blend.c | 34 | ||||
-rw-r--r-- | gst-libs/gst/video/video.c | 129 | ||||
-rw-r--r-- | gst-libs/gst/video/video.h | 14 |
3 files changed, 176 insertions, 1 deletions
diff --git a/gst-libs/gst/video/video-blend.c b/gst-libs/gst/video/video-blend.c index 110b562a7..2d470736e 100644 --- a/gst-libs/gst/video/video-blend.c +++ b/gst-libs/gst/video/video-blend.c @@ -231,6 +231,40 @@ fill_planes (GstBlendVideoFormatInfo * info) info->offset[1] = info->offset[2] + info->stride[1] * (GST_ROUND_UP_4 (height) / 4); break; + case GST_VIDEO_FORMAT_I420_10LE: + case GST_VIDEO_FORMAT_I420_10BE: + info->stride[0] = GST_ROUND_UP_4 (width * 2); + info->stride[1] = GST_ROUND_UP_4 (width); + info->stride[2] = info->stride[1]; + info->offset[0] = 0; + info->offset[1] = info->stride[0] * GST_ROUND_UP_2 (height); + info->offset[2] = info->offset[1] + + info->stride[1] * (GST_ROUND_UP_2 (height) / 2); + info->size = info->offset[2] + + info->stride[2] * (GST_ROUND_UP_2 (height) / 2); + break; + case GST_VIDEO_FORMAT_I422_10LE: + case GST_VIDEO_FORMAT_I422_10BE: + info->stride[0] = GST_ROUND_UP_4 (width * 2); + info->stride[1] = GST_ROUND_UP_4 (width); + info->stride[2] = info->stride[1]; + info->offset[0] = 0; + info->offset[1] = info->stride[0] * GST_ROUND_UP_2 (height); + info->offset[2] = info->offset[1] + + info->stride[1] * GST_ROUND_UP_2 (height); + info->size = info->offset[2] + info->stride[2] * GST_ROUND_UP_2 (height); + break; + case GST_VIDEO_FORMAT_Y444_10LE: + case GST_VIDEO_FORMAT_Y444_10BE: + info->stride[0] = GST_ROUND_UP_4 (width * 2); + info->stride[1] = info->stride[0]; + info->stride[2] = info->stride[0]; + info->offset[0] = 0; + info->offset[1] = info->stride[0] * height; + info->offset[2] = info->offset[1] * 2; + info->size = info->stride[0] * height * 3; + break; + case GST_VIDEO_FORMAT_UNKNOWN: default: GST_ERROR ("invalid format"); g_warning ("invalid format"); diff --git a/gst-libs/gst/video/video.c b/gst-libs/gst/video/video.c index 2ff6ab28d..712926e4f 100644 --- a/gst-libs/gst/video/video.c +++ b/gst-libs/gst/video/video.c @@ -269,6 +269,24 @@ static VideoFormat formats[] = { SUB444), {0x00000000, {GST_VIDEO_FORMAT_ENCODED, "ENCODED", "encoded video", GST_VIDEO_FORMAT_FLAG_COMPLEX, DPTH0, PSTR0, PLANE_NA, OFFS0}}, + MAKE_YUV_FORMAT (I420_10BE, "raw video", GST_MAKE_FOURCC ('D', '4', '2', '0'), + DPTH10_10_10, PSTR222, + PLANE012, OFFS0, SUB420), + MAKE_YUV_FORMAT (I420_10LE, "raw video", GST_MAKE_FOURCC ('d', '4', '2', '0'), + DPTH10_10_10, PSTR222, + PLANE012, OFFS0, SUB420), + MAKE_YUV_FORMAT (I422_10BE, "raw video", GST_MAKE_FOURCC ('D', '4', '2', '2'), + DPTH10_10_10, PSTR222, + PLANE012, OFFS0, SUB422), + MAKE_YUV_FORMAT (I422_10LE, "raw video", GST_MAKE_FOURCC ('d', '4', '2', '2'), + DPTH10_10_10, PSTR222, + PLANE012, OFFS0, SUB422), + MAKE_YUV_FORMAT (Y444_10BE, "raw video", GST_MAKE_FOURCC ('D', '4', '4', '4'), + DPTH10_10_10, PSTR222, + PLANE012, OFFS0, SUB444), + MAKE_YUV_FORMAT (Y444_10LE, "raw video", GST_MAKE_FOURCC ('d', '4', '4', '4'), + DPTH10_10_10, PSTR222, + PLANE012, OFFS0, SUB444) }; /** @@ -1101,6 +1119,18 @@ gst_video_format_from_fourcc (guint32 fourcc) return GST_VIDEO_FORMAT_IYU1; case GST_MAKE_FOURCC ('A', 'Y', '6', '4'): return GST_VIDEO_FORMAT_AYUV64; + case GST_MAKE_FOURCC ('D', '4', '2', '0'): + return GST_VIDEO_FORMAT_I420_10BE; + case GST_MAKE_FOURCC ('d', '4', '2', '0'): + return GST_VIDEO_FORMAT_I420_10LE; + case GST_MAKE_FOURCC ('D', '4', '2', '2'): + return GST_VIDEO_FORMAT_I422_10BE; + case GST_MAKE_FOURCC ('d', '4', '2', '2'): + return GST_VIDEO_FORMAT_I422_10LE; + case GST_MAKE_FOURCC ('D', '4', '4', '4'): + return GST_VIDEO_FORMAT_Y444_10BE; + case GST_MAKE_FOURCC ('d', '4', '4', '4'): + return GST_VIDEO_FORMAT_Y444_10LE; default: return GST_VIDEO_FORMAT_UNKNOWN; } @@ -1807,6 +1837,39 @@ fill_planes (GstVideoInfo * info) info->size = info->offset[2] + info->stride[2] * (GST_ROUND_UP_4 (height) / 4); break; + case GST_VIDEO_FORMAT_I420_10LE: + case GST_VIDEO_FORMAT_I420_10BE: + info->stride[0] = GST_ROUND_UP_4 (width * 2); + info->stride[1] = GST_ROUND_UP_4 (width); + info->stride[2] = info->stride[1]; + info->offset[0] = 0; + info->offset[1] = info->stride[0] * GST_ROUND_UP_2 (height); + info->offset[2] = info->offset[1] + + info->stride[1] * (GST_ROUND_UP_2 (height) / 2); + info->size = info->offset[2] + + info->stride[2] * (GST_ROUND_UP_2 (height) / 2); + break; + case GST_VIDEO_FORMAT_I422_10LE: + case GST_VIDEO_FORMAT_I422_10BE: + info->stride[0] = GST_ROUND_UP_4 (width * 2); + info->stride[1] = GST_ROUND_UP_4 (width); + info->stride[2] = info->stride[1]; + info->offset[0] = 0; + info->offset[1] = info->stride[0] * GST_ROUND_UP_2 (height); + info->offset[2] = info->offset[1] + + info->stride[1] * GST_ROUND_UP_2 (height); + info->size = info->offset[2] + info->stride[2] * GST_ROUND_UP_2 (height); + break; + case GST_VIDEO_FORMAT_Y444_10LE: + case GST_VIDEO_FORMAT_Y444_10BE: + info->stride[0] = GST_ROUND_UP_4 (width * 2); + info->stride[1] = info->stride[0]; + info->stride[2] = info->stride[0]; + info->offset[0] = 0; + info->offset[1] = info->stride[0] * height; + info->offset[2] = info->offset[1] * 2; + info->size = info->stride[0] * height * 3; + break; default: if (GST_VIDEO_FORMAT_INFO_IS_COMPLEX (info->finfo)) break; @@ -2199,6 +2262,23 @@ gst_video_format_get_row_stride (GstVideoFormat format, int component, case GST_VIDEO_FORMAT_ARGB64: case GST_VIDEO_FORMAT_AYUV64: return width * 8; + case GST_VIDEO_FORMAT_I420_10BE: + case GST_VIDEO_FORMAT_I420_10LE: + if (component == 0) { + return GST_ROUND_UP_4 (2 * width); + } else { + return GST_ROUND_UP_4 (width); + } + case GST_VIDEO_FORMAT_I422_10BE: + case GST_VIDEO_FORMAT_I422_10LE: + if (component == 0) { + return GST_ROUND_UP_4 (2 * width); + } else { + return GST_ROUND_UP_4 (width); + } + case GST_VIDEO_FORMAT_Y444_10BE: + case GST_VIDEO_FORMAT_Y444_10LE: + return GST_ROUND_UP_4 (2 * width); default: return 0; } @@ -2264,6 +2344,10 @@ gst_video_format_get_component_width (GstVideoFormat format, case GST_VIDEO_FORMAT_NV12: case GST_VIDEO_FORMAT_NV21: case GST_VIDEO_FORMAT_UYVP: + case GST_VIDEO_FORMAT_I422_10BE: + case GST_VIDEO_FORMAT_I422_10LE: + case GST_VIDEO_FORMAT_I420_10BE: + case GST_VIDEO_FORMAT_I420_10LE: if (component == 0) { return width; } else { @@ -2303,6 +2387,8 @@ gst_video_format_get_component_width (GstVideoFormat format, case GST_VIDEO_FORMAT_RGB8_PALETTED: case GST_VIDEO_FORMAT_ARGB64: case GST_VIDEO_FORMAT_AYUV64: + case GST_VIDEO_FORMAT_Y444_10BE: + case GST_VIDEO_FORMAT_Y444_10LE: case GST_VIDEO_FORMAT_r210: return width; case GST_VIDEO_FORMAT_A420: @@ -2343,6 +2429,8 @@ gst_video_format_get_component_height (GstVideoFormat format, case GST_VIDEO_FORMAT_YV12: case GST_VIDEO_FORMAT_NV12: case GST_VIDEO_FORMAT_NV21: + case GST_VIDEO_FORMAT_I420_10BE: + case GST_VIDEO_FORMAT_I420_10LE: if (component == 0) { return height; } else { @@ -2383,6 +2471,10 @@ gst_video_format_get_component_height (GstVideoFormat format, case GST_VIDEO_FORMAT_ARGB64: case GST_VIDEO_FORMAT_AYUV64: case GST_VIDEO_FORMAT_r210: + case GST_VIDEO_FORMAT_Y444_10BE: + case GST_VIDEO_FORMAT_Y444_10LE: + case GST_VIDEO_FORMAT_I422_10BE: + case GST_VIDEO_FORMAT_I422_10LE: return height; case GST_VIDEO_FORMAT_A420: if (component == 0 || component == 3) { @@ -2662,6 +2754,30 @@ gst_video_format_get_component_offset (GstVideoFormat format, if (component == 3) return 0; break; + case GST_VIDEO_FORMAT_I420_10BE: + case GST_VIDEO_FORMAT_I420_10LE: + if (component == 0) + return 0; + if (component == 1) + return GST_ROUND_UP_4 (2 * width) * GST_ROUND_UP_2 (height); + if (component == 2) { + return GST_ROUND_UP_4 (2 * width) * GST_ROUND_UP_2 (height) + + GST_ROUND_UP_4 (width) * (GST_ROUND_UP_2 (height) / 2); + } + case GST_VIDEO_FORMAT_I422_10BE: + case GST_VIDEO_FORMAT_I422_10LE: + if (component == 0) + return 0; + if (component == 1) + return GST_ROUND_UP_4 (2 * width) * GST_ROUND_UP_2 (height); + if (component == 2) { + return GST_ROUND_UP_4 (2 * width) * GST_ROUND_UP_2 (height) + + GST_ROUND_UP_4 (width) * GST_ROUND_UP_2 (height); + } + break; + case GST_VIDEO_FORMAT_Y444_10BE: + case GST_VIDEO_FORMAT_Y444_10LE: + return GST_ROUND_UP_4 (2 * width) * height * component; default: break; } @@ -2764,6 +2880,19 @@ gst_video_format_get_size (GstVideoFormat format, int width, int height) case GST_VIDEO_FORMAT_ARGB64: case GST_VIDEO_FORMAT_AYUV64: return width * 8 * height; + case GST_VIDEO_FORMAT_I420_10BE: + case GST_VIDEO_FORMAT_I420_10LE: + size = GST_ROUND_UP_4 (2 * width) * GST_ROUND_UP_2 (height); + size += GST_ROUND_UP_4 (width) * (GST_ROUND_UP_2 (height) / 2) * 2; + return size; + case GST_VIDEO_FORMAT_I422_10BE: + case GST_VIDEO_FORMAT_I422_10LE: + size = GST_ROUND_UP_4 (2 * width) * GST_ROUND_UP_2 (height); + size += GST_ROUND_UP_4 (width) * GST_ROUND_UP_2 (height) * 2; + return size; + case GST_VIDEO_FORMAT_Y444_10BE: + case GST_VIDEO_FORMAT_Y444_10LE: + return 2 * GST_ROUND_UP_4 (width) * height * 3; default: return 0; } diff --git a/gst-libs/gst/video/video.h b/gst-libs/gst/video/video.h index f88d1583c..876aab5e9 100644 --- a/gst-libs/gst/video/video.h +++ b/gst-libs/gst/video/video.h @@ -73,6 +73,12 @@ G_BEGIN_DECLS * @GST_VIDEO_FORMAT_ARGB64: rgb with alpha channel first, 16 bits per channel (Since: 0.10.33) * @GST_VIDEO_FORMAT_AYUV64: packed 4:4:4 YUV with alpha channel, 16 bits per channel (A0-Y0-U0-V0 ...) (Since: 0.10.33) * @GST_VIDEO_FORMAT_r210: packed 4:4:4 RGB, 10 bits per channel (Since: 0.10.33) + * @GST_VIDEO_FORMAT_I420_10BE: planar 4:2:0 YUV, 10 bits per channel + * @GST_VIDEO_FORMAT_I420_10LE: planar 4:2:0 YUV, 10 bits per channel + * @GST_VIDEO_FORMAT_I422_10BE: planar 4:2:2 YUV, 10 bits per channel + * @GST_VIDEO_FORMAT_I422_10LE: planar 4:2:2 YUV, 10 bits per channel + * @GST_VIDEO_FORMAT_Y444_10BE: planar 4:4:4 YUV, 10 bits per channel + * @GST_VIDEO_FORMAT_Y444_10LE: planar 4:4:4 YUV, 10 bits per channel * * Enum value describing the most common video formats. */ @@ -120,7 +126,13 @@ typedef enum { GST_VIDEO_FORMAT_ARGB64, GST_VIDEO_FORMAT_AYUV64, GST_VIDEO_FORMAT_r210, - GST_VIDEO_FORMAT_ENCODED + GST_VIDEO_FORMAT_ENCODED, + GST_VIDEO_FORMAT_I420_10BE, + GST_VIDEO_FORMAT_I420_10LE, + GST_VIDEO_FORMAT_I422_10BE, + GST_VIDEO_FORMAT_I422_10LE, + GST_VIDEO_FORMAT_Y444_10BE, + GST_VIDEO_FORMAT_Y444_10LE } GstVideoFormat; #define GST_VIDEO_BYTE1_MASK_32 "0xFF000000" |