From ddce68a5c286a0050334c2b991443ae8363a5961 Mon Sep 17 00:00:00 2001 From: Wim Taymans Date: Mon, 4 Jul 2011 10:19:13 +0200 Subject: [PATCH] video: More video helper library improvements Make a new GstVideoFormatinfo structure that contains the specific information related to a format such as the number of planes, components, subsampling, pixel stride etc. The result is that we are now able to introduce the concept of components again in the API. Use tables to specify the formats and its properties. Use macros to get information about the video format description. Move code to set strides, offsets and size into one function. Remove methods that are not handled with the structures. Add methods to retrieve pointers and strides to the components in the video. --- ext/pango/gstbasetextoverlay.c | 28 +- ext/pango/gsttextrender.c | 7 +- ext/theora/gsttheoradec.c | 21 +- ext/theora/gsttheoraenc.c | 13 +- gst-libs/gst/video/gstmetavideo.c | 2 +- gst-libs/gst/video/gstmetavideo.h | 2 +- gst-libs/gst/video/video.c | 1409 +++++++--------------------- gst-libs/gst/video/video.h | 176 +++- gst/videoconvert/gstvideoconvert.c | 63 +- gst/videoconvert/gstvideoconvert.h | 1 + gst/videoconvert/videoconvert.c | 29 +- gst/videoscale/gstvideoscale.c | 29 +- gst/videotestsrc/videotestsrc.c | 196 ++-- sys/ximage/ximagepool.c | 12 +- sys/xvimage/xvimagepool.c | 13 +- 15 files changed, 691 insertions(+), 1310 deletions(-) diff --git a/ext/pango/gstbasetextoverlay.c b/ext/pango/gstbasetextoverlay.c index 098ee5640c..7df78f4112 100644 --- a/ext/pango/gstbasetextoverlay.c +++ b/ext/pango/gstbasetextoverlay.c @@ -764,9 +764,9 @@ gst_base_text_overlay_setcaps (GstBaseTextOverlay * overlay, GstCaps * caps) goto invalid_caps; overlay->info = info; - overlay->format = info.format; - overlay->width = info.width; - overlay->height = info.height; + overlay->format = GST_VIDEO_INFO_FORMAT (&info); + overlay->width = GST_VIDEO_INFO_WIDTH (&info); + overlay->height = GST_VIDEO_INFO_HEIGHT (&info); ret = gst_pad_push_event (overlay->srcpad, gst_event_new_caps (caps)); @@ -1465,16 +1465,12 @@ gst_base_text_overlay_shade_packed_Y (GstBaseTextOverlay * overlay, GstVideoFrame * dest, gint x0, gint x1, gint y0, gint y1) { gint i, j; - guint dest_stride, pixel_stride, component_offset; + guint dest_stride, pixel_stride; guint8 *dest_ptr; - dest_stride = dest->info.stride[0]; - dest_ptr = dest->data[0]; - - pixel_stride = gst_video_format_get_pixel_stride (dest->info.format, 0); - component_offset = - gst_video_format_get_component_offset (dest->info.format, 0, - overlay->width, overlay->height); + dest_stride = GST_VIDEO_FRAME_COMP_STRIDE (dest, 0); + dest_ptr = GST_VIDEO_FRAME_COMP_DATA (dest, 0); + pixel_stride = GST_VIDEO_FRAME_COMP_PSTRIDE (dest, 0); x0 = CLAMP (x0 - BOX_XPAD, 0, overlay->width); x1 = CLAMP (x1 + BOX_XPAD, 0, overlay->width); @@ -1483,21 +1479,21 @@ gst_base_text_overlay_shade_packed_Y (GstBaseTextOverlay * overlay, y1 = CLAMP (y1 + BOX_YPAD, 0, overlay->height); if (x0 != 0) - x0 = gst_video_format_get_component_width (overlay->format, 0, x0); + x0 = GST_VIDEO_FORMAT_INFO_SCALE_WIDTH (dest->info.finfo, 0, x0); if (x1 != 0) - x1 = gst_video_format_get_component_width (overlay->format, 0, x1); + x1 = GST_VIDEO_FORMAT_INFO_SCALE_WIDTH (dest->info.finfo, 0, x1); if (y0 != 0) - y0 = gst_video_format_get_component_height (overlay->format, 0, y0); + y0 = GST_VIDEO_FORMAT_INFO_SCALE_HEIGHT (dest->info.finfo, 0, y0); if (y1 != 0) - y1 = gst_video_format_get_component_height (overlay->format, 0, y1); + y1 = GST_VIDEO_FORMAT_INFO_SCALE_HEIGHT (dest->info.finfo, 0, y1); for (i = y0; i < y1; i++) { for (j = x0; j < x1; j++) { gint y; gint y_pos; - y_pos = (i * dest_stride) + j * pixel_stride + component_offset; + y_pos = (i * dest_stride) + j * pixel_stride; y = dest_ptr[y_pos] + overlay->shading_value; dest_ptr[y_pos] = CLAMP (y, 0, 255); diff --git a/ext/pango/gsttextrender.c b/ext/pango/gsttextrender.c index e012dc2c54..01e453cc9f 100644 --- a/ext/pango/gsttextrender.c +++ b/ext/pango/gsttextrender.c @@ -329,6 +329,7 @@ gst_text_render_check_argb (GstTextRender * render) for (i = 0; i < n; i++) { GstStructure *s; GstVideoFormat vformat; + const GstVideoFormatInfo *info; const gchar *fmt; s = gst_caps_get_structure (peer_caps, i); @@ -340,7 +341,11 @@ gst_text_render_check_argb (GstTextRender * render) continue; vformat = gst_video_format_from_string (fmt); - render->use_ARGB = gst_video_format_has_alpha (vformat); + info = gst_video_format_get_info (vformat); + if (info == NULL) + continue; + + render->use_ARGB = GST_VIDEO_FORMAT_INFO_HAS_ALPHA (info); } gst_caps_unref (peer_caps); } diff --git a/ext/theora/gsttheoradec.c b/ext/theora/gsttheoradec.c index f28ecb2c15..0ec3bf9f71 100644 --- a/ext/theora/gsttheoradec.c +++ b/ext/theora/gsttheoradec.c @@ -1111,7 +1111,7 @@ theora_handle_image (GstTheoraDec * dec, th_ycbcr_buffer buf, GstBuffer ** out) gint width, height, stride; gint pic_width, pic_height; GstFlowReturn result; - int i, plane; + int i, comp; guint8 *dest, *src; GstVideoFrame frame; GstMetaVideoCrop *crop; @@ -1163,27 +1163,24 @@ theora_handle_image (GstTheoraDec * dec, th_ycbcr_buffer buf, GstBuffer ** out) } } - for (plane = 0; plane < 3; plane++) { + for (comp = 0; comp < 3; comp++) { width = - gst_video_format_get_component_width (frame.info.format, plane, - pic_width); + GST_VIDEO_FORMAT_INFO_SCALE_WIDTH (frame.info.finfo, comp, pic_width); height = - gst_video_format_get_component_height (frame.info.format, plane, - pic_height); + GST_VIDEO_FORMAT_INFO_SCALE_HEIGHT (frame.info.finfo, comp, pic_height); + stride = GST_VIDEO_FRAME_COMP_STRIDE (&frame, comp); + dest = GST_VIDEO_FRAME_COMP_DATA (&frame, comp); - stride = GST_VIDEO_FRAME_STRIDE (&frame, plane); - dest = GST_VIDEO_FRAME_DATA (&frame, plane); - - src = buf[plane].data; + src = buf[comp].data; src += ((height == pic_height) ? offset_y : offset_y / 2) - * buf[plane].stride; + * buf[comp].stride; src += (width == pic_width) ? offset_x : offset_x / 2; for (i = 0; i < height; i++) { memcpy (dest, src, width); dest += stride; - src += buf[plane].stride; + src += buf[comp].stride; } } gst_video_frame_unmap (&frame); diff --git a/ext/theora/gsttheoraenc.c b/ext/theora/gsttheoraenc.c index 9aec0e98cd..ed9c62ebef 100644 --- a/ext/theora/gsttheoraenc.c +++ b/ext/theora/gsttheoraenc.c @@ -668,7 +668,7 @@ theora_enc_sink_setcaps (GstTheoraEnc * enc, GstCaps * caps) enc->info.pic_width = info.width; enc->info.pic_height = info.height; - switch (info.format) { + switch (GST_VIDEO_INFO_FORMAT (&info)) { case GST_VIDEO_FORMAT_I420: enc->info.pixel_fmt = TH_PF_420; break; @@ -1023,13 +1023,10 @@ theora_enc_init_buffer (th_ycbcr_buffer buf, th_info * info, * is perfectly ok, even though it does not strictly look ok. */ for (i = 0; i < 3; i++) { - buf[i].width = - gst_video_format_get_component_width (format, i, info->frame_width); - buf[i].height = - gst_video_format_get_component_height (format, i, info->frame_height); - - buf[i].data = GST_VIDEO_FRAME_DATA (frame, i); - buf[i].stride = GST_VIDEO_FRAME_STRIDE (frame, i); + buf[i].width = GST_VIDEO_FRAME_COMP_WIDTH (frame, i); + buf[i].height = GST_VIDEO_FRAME_COMP_HEIGHT (frame, i); + buf[i].data = GST_VIDEO_FRAME_COMP_DATA (frame, i); + buf[i].stride = GST_VIDEO_FRAME_COMP_STRIDE (frame, i); } } diff --git a/gst-libs/gst/video/gstmetavideo.c b/gst-libs/gst/video/gstmetavideo.c index be36a2ec0e..ca2625b742 100644 --- a/gst-libs/gst/video/gstmetavideo.c +++ b/gst-libs/gst/video/gstmetavideo.c @@ -61,7 +61,7 @@ gst_buffer_add_meta_video (GstBuffer * buffer, GstVideoFlags flags, gst_video_info_set_format (&info, format, width, height); meta = gst_buffer_add_meta_video_full (buffer, flags, format, width, height, - info.n_planes, info.offset, info.stride); + info.finfo->n_planes, info.offset, info.stride); return meta; } diff --git a/gst-libs/gst/video/gstmetavideo.h b/gst-libs/gst/video/gstmetavideo.h index 04f9244e1f..e88b0b5874 100644 --- a/gst-libs/gst/video/gstmetavideo.h +++ b/gst-libs/gst/video/gstmetavideo.h @@ -47,7 +47,7 @@ typedef struct _GstMetaVideoCrop GstMetaVideoCrop; * Extra buffer metadata describing image properties */ struct _GstMetaVideo { - GstMeta meta; + GstMeta meta; GstBuffer *buffer; diff --git a/gst-libs/gst/video/video.c b/gst-libs/gst/video/video.c index 4685a91f0c..acea673dcd 100644 --- a/gst-libs/gst/video/video.c +++ b/gst-libs/gst/video/video.c @@ -28,103 +28,166 @@ #include "video.h" #include "gstmetavideo.h" -static int get_size (GstVideoFormat format, int width, int height); -static int get_stride (GstVideoFormat format, int plane, int width); static int fill_planes (GstVideoInfo * info); -typedef enum -{ - VIDEO_FLAG_YUV = (1 << 0), - VIDEO_FLAG_RGB = (1 << 1), - VIDEO_FLAG_GRAY = (1 << 2), - VIDEO_FLAG_ALPHA = (1 << 3) -} VideoFlags; - typedef struct { - const gchar *fmt; - GstVideoFormat format; guint32 fourcc; - VideoFlags flags; - guint n_comp; - guint depth[GST_VIDEO_MAX_PLANES]; - guint n_planes; + GstVideoFormatInfo info; } VideoFormat; -#define COMP0 0, { 0, 0, 0, 0 } -#define COMP8 1, { 8, 0, 0, 0 } -#define COMP888 3, { 8, 8, 8, 0 } -#define COMP8888 4, { 8, 8, 8, 8 } -#define COMP10_10_10 3, { 10, 10, 10, 0 } -#define COMP16 1, { 16, 0, 0, 0 } -#define COMP16_16_16 3, { 16, 16, 16, 0 } -#define COMP16_16_16_16 4, { 16, 16, 16, 16 } -#define COMP555 3, { 5, 5, 5, 0 } -#define COMP565 3, { 5, 6, 5, 0 } +/* depths */ +#define DPTH0 0, { 0, 0, 0, 0 } +#define DPTH8 1, { 8, 0, 0, 0 } +#define DPTH888 3, { 8, 8, 8, 0 } +#define DPTH8888 4, { 8, 8, 8, 8 } +#define DPTH10_10_10 3, { 10, 10, 10, 0 } +#define DPTH16 1, { 16, 0, 0, 0 } +#define DPTH16_16_16 3, { 16, 16, 16, 0 } +#define DPTH16_16_16_16 4, { 16, 16, 16, 16 } +#define DPTH555 3, { 5, 5, 5, 0 } +#define DPTH565 3, { 5, 6, 5, 0 } -#define MAKE_YUV_FORMAT(name, fourcc, comp) \ - { G_STRINGIFY(name), GST_VIDEO_FORMAT_ ##name, fourcc, VIDEO_FLAG_YUV, comp } -#define MAKE_YUVA_FORMAT(name, fourcc, comp) \ - { G_STRINGIFY(name), GST_VIDEO_FORMAT_ ##name, fourcc, VIDEO_FLAG_YUV | VIDEO_FLAG_ALPHA, comp } +/* pixel strides */ +#define PSTR0 { 0, 0, 0, 0 } +#define PSTR1 { 1, 0, 0, 0 } +#define PSTR111 { 1, 1, 1, 0 } +#define PSTR1111 { 1, 1, 1, 1 } +#define PSTR122 { 1, 2, 2, 0 } +#define PSTR2 { 2, 0, 0, 0 } +#define PSTR222 { 2, 2, 2, 0 } +#define PSTR244 { 2, 4, 4, 0 } +#define PSTR444 { 4, 4, 4, 0 } +#define PSTR4444 { 4, 4, 4, 4 } +#define PSTR333 { 3, 3, 3, 0 } +#define PSTR488 { 4, 8, 8, 0 } +#define PSTR8888 { 8, 8, 8, 8 } -#define MAKE_RGB_FORMAT(name, comp) \ - { G_STRINGIFY(name), GST_VIDEO_FORMAT_ ##name, 0x00000000, VIDEO_FLAG_RGB, comp } -#define MAKE_RGBA_FORMAT(name, comp) \ - { G_STRINGIFY(name), GST_VIDEO_FORMAT_ ##name, 0x00000000, VIDEO_FLAG_RGB | VIDEO_FLAG_ALPHA, comp } +/* planes */ +#define PLANE_NA 0, { 0, 0, 0, 0 } +#define PLANE0 1, { 0, 0, 0, 0 } +#define PLANE011 2, { 0, 1, 1, 0 } +#define PLANE012 3, { 0, 1, 2, 0 } +#define PLANE0123 4, { 0, 1, 2, 3 } +#define PLANE021 3, { 0, 2, 1, 0 } -#define MAKE_GRAY_FORMAT(name, comp) \ - { G_STRINGIFY(name), GST_VIDEO_FORMAT_ ##name, 0x00000000, VIDEO_FLAG_GRAY, comp } +/* offsets */ +#define OFFS0 { 0, 0, 0, 0 } +#define OFFS013 { 0, 1, 3, 0 } +#define OFFS102 { 1, 0, 2, 0 } +#define OFFS1230 { 1, 2, 3, 0 } +#define OFFS012 { 0, 1, 2, 0 } +#define OFFS210 { 2, 1, 0, 0 } +#define OFFS123 { 1, 2, 3, 0 } +#define OFFS321 { 3, 2, 1, 0 } +#define OFFS0123 { 0, 1, 2, 3 } +#define OFFS2103 { 2, 1, 0, 3 } +#define OFFS3210 { 3, 2, 1, 0 } +#define OFFS031 { 0, 3, 1, 0 } +#define OFFS026 { 0, 2, 6, 0 } +#define OFFS001 { 0, 0, 1, 0 } +#define OFFS010 { 0, 1, 0, 0 } +#define OFFS104 { 1, 0, 4, 0 } +#define OFFS2460 { 2, 4, 6, 0 } + +/* subsampling */ +#define SUB410 { 0, 2, 2, 0 }, { 0, 2, 2, 0 } +#define SUB411 { 0, 2, 2, 0 }, { 0, 0, 0, 0 } +#define SUB420 { 0, 1, 1, 0 }, { 0, 1, 1, 0 } +#define SUB422 { 0, 1, 1, 0 }, { 0, 0, 0, 0 } +#define SUB4 { 0, 0, 0, 0 }, { 0, 0, 0, 0 } +#define SUB444 { 0, 0, 0, 0 }, { 0, 0, 0, 0 } +#define SUB4444 { 0, 0, 0, 0 }, { 0, 0, 0, 0 } +#define SUB4204 { 0, 1, 1, 0 }, { 0, 1, 1, 0 } + +#define MAKE_YUV_FORMAT(name, fourcc, depth, pstride, plane, offs, sub ) \ + { fourcc, {GST_VIDEO_FORMAT_ ##name, G_STRINGIFY(name), GST_VIDEO_FORMAT_FLAG_YUV, depth, pstride, plane, offs, sub } } +#define MAKE_YUVA_FORMAT(name, fourcc, depth, pstride, plane, offs, sub) \ + { fourcc, {GST_VIDEO_FORMAT_ ##name, G_STRINGIFY(name), GST_VIDEO_FORMAT_FLAG_YUV | GST_VIDEO_FORMAT_FLAG_ALPHA, depth, pstride, plane, offs, sub } } + +#define MAKE_RGB_FORMAT(name, depth, pstride, plane, offs, sub) \ + { 0x00000000, {GST_VIDEO_FORMAT_ ##name, G_STRINGIFY(name), GST_VIDEO_FORMAT_FLAG_RGB, depth, pstride, plane, offs, sub } } +#define MAKE_RGBA_FORMAT(name, depth, pstride, plane, offs, sub) \ + { 0x00000000, {GST_VIDEO_FORMAT_ ##name, G_STRINGIFY(name), GST_VIDEO_FORMAT_FLAG_RGB | GST_VIDEO_FORMAT_FLAG_ALPHA, depth, pstride, plane, offs, sub } } + +#define MAKE_GRAY_FORMAT(name, depth, pstride, plane, offs, sub) \ + { 0x00000000, {GST_VIDEO_FORMAT_ ##name, G_STRINGIFY(name), GST_VIDEO_FORMAT_FLAG_GRAY, depth, pstride, plane, offs, sub } } static VideoFormat formats[] = { - {"UNKNOWN", GST_VIDEO_FORMAT_UNKNOWN, 0x00000000, 0, COMP0}, + {0x00000000, {GST_VIDEO_FORMAT_UNKNOWN, "UNKNOWN", 0, DPTH0, PSTR0, PLANE_NA, + OFFS0}}, - MAKE_YUV_FORMAT (I420, GST_MAKE_FOURCC ('I', '4', '2', '0'), COMP888), - MAKE_YUV_FORMAT (YV12, GST_MAKE_FOURCC ('Y', 'V', '1', '2'), COMP888), - MAKE_YUV_FORMAT (YUY2, GST_MAKE_FOURCC ('Y', 'U', 'Y', '2'), COMP888), - MAKE_YUV_FORMAT (UYVY, GST_MAKE_FOURCC ('U', 'Y', 'V', 'Y'), COMP888), - MAKE_YUVA_FORMAT (AYUV, GST_MAKE_FOURCC ('A', 'Y', 'U', 'V'), COMP8888), - MAKE_RGB_FORMAT (RGBx, COMP888), - MAKE_RGB_FORMAT (BGRx, COMP888), - MAKE_RGB_FORMAT (xRGB, COMP888), - MAKE_RGB_FORMAT (xBGR, COMP888), - MAKE_RGBA_FORMAT (RGBA, COMP8888), - MAKE_RGBA_FORMAT (BGRA, COMP8888), - MAKE_RGBA_FORMAT (ARGB, COMP8888), - MAKE_RGBA_FORMAT (ABGR, COMP8888), - MAKE_RGB_FORMAT (RGB, COMP888), - MAKE_RGB_FORMAT (BGR, COMP888), + MAKE_YUV_FORMAT (I420, GST_MAKE_FOURCC ('I', '4', '2', '0'), DPTH888, PSTR111, + PLANE012, OFFS0, SUB420), + MAKE_YUV_FORMAT (YV12, GST_MAKE_FOURCC ('Y', 'V', '1', '2'), DPTH888, PSTR111, + PLANE021, OFFS0, SUB420), + MAKE_YUV_FORMAT (YUY2, GST_MAKE_FOURCC ('Y', 'U', 'Y', '2'), DPTH888, PSTR244, + PLANE0, OFFS013, SUB422), + MAKE_YUV_FORMAT (UYVY, GST_MAKE_FOURCC ('U', 'Y', 'V', 'Y'), DPTH888, PSTR244, + PLANE0, OFFS102, SUB422), + MAKE_YUVA_FORMAT (AYUV, GST_MAKE_FOURCC ('A', 'Y', 'U', 'V'), DPTH8888, + PSTR4444, PLANE0, OFFS1230, SUB4444), + MAKE_RGB_FORMAT (RGBx, DPTH888, PSTR444, PLANE0, OFFS012, SUB444), + MAKE_RGB_FORMAT (BGRx, DPTH888, PSTR444, PLANE0, OFFS210, SUB444), + MAKE_RGB_FORMAT (xRGB, DPTH888, PSTR444, PLANE0, OFFS123, SUB444), + MAKE_RGB_FORMAT (xBGR, DPTH888, PSTR444, PLANE0, OFFS321, SUB444), + MAKE_RGBA_FORMAT (RGBA, DPTH8888, PSTR4444, PLANE0, OFFS0123, SUB4444), + MAKE_RGBA_FORMAT (BGRA, DPTH8888, PSTR4444, PLANE0, OFFS2103, SUB4444), + MAKE_RGBA_FORMAT (ARGB, DPTH8888, PSTR4444, PLANE0, OFFS1230, SUB4444), + MAKE_RGBA_FORMAT (ABGR, DPTH8888, PSTR4444, PLANE0, OFFS3210, SUB4444), + MAKE_RGB_FORMAT (RGB, DPTH888, PSTR333, PLANE0, OFFS012, SUB444), + MAKE_RGB_FORMAT (BGR, DPTH888, PSTR333, PLANE0, OFFS210, SUB444), - MAKE_YUV_FORMAT (Y41B, GST_MAKE_FOURCC ('Y', '4', '1', 'B'), COMP888), - MAKE_YUV_FORMAT (Y42B, GST_MAKE_FOURCC ('Y', '4', '2', 'B'), COMP888), - MAKE_YUV_FORMAT (YVYU, GST_MAKE_FOURCC ('Y', 'V', 'Y', 'U'), COMP888), - MAKE_YUV_FORMAT (Y444, GST_MAKE_FOURCC ('Y', '4', '4', '4'), COMP888), - MAKE_YUV_FORMAT (v210, GST_MAKE_FOURCC ('v', '2', '1', '0'), COMP10_10_10), - MAKE_YUV_FORMAT (v216, GST_MAKE_FOURCC ('v', '2', '1', '6'), COMP16_16_16), - MAKE_YUV_FORMAT (NV12, GST_MAKE_FOURCC ('N', 'V', '1', '2'), COMP888), - MAKE_YUV_FORMAT (NV21, GST_MAKE_FOURCC ('N', 'V', '2', '1'), COMP888), + MAKE_YUV_FORMAT (Y41B, GST_MAKE_FOURCC ('Y', '4', '1', 'B'), DPTH888, PSTR111, + PLANE012, OFFS0, SUB411), + MAKE_YUV_FORMAT (Y42B, GST_MAKE_FOURCC ('Y', '4', '2', 'B'), DPTH888, PSTR111, + PLANE012, OFFS0, SUB422), + MAKE_YUV_FORMAT (YVYU, GST_MAKE_FOURCC ('Y', 'V', 'Y', 'U'), DPTH888, PSTR244, + PLANE0, OFFS031, SUB422), + MAKE_YUV_FORMAT (Y444, GST_MAKE_FOURCC ('Y', '4', '4', '4'), DPTH888, PSTR111, + PLANE012, OFFS0, SUB444), + MAKE_YUV_FORMAT (v210, GST_MAKE_FOURCC ('v', '2', '1', '0'), DPTH10_10_10, + PSTR0, PLANE0, OFFS0, SUB422), + MAKE_YUV_FORMAT (v216, GST_MAKE_FOURCC ('v', '2', '1', '6'), DPTH16_16_16, + PSTR488, PLANE0, OFFS026, SUB422), + MAKE_YUV_FORMAT (NV12, GST_MAKE_FOURCC ('N', 'V', '1', '2'), DPTH888, PSTR122, + PLANE011, OFFS001, SUB420), + MAKE_YUV_FORMAT (NV21, GST_MAKE_FOURCC ('N', 'V', '2', '1'), DPTH888, PSTR122, + PLANE011, OFFS010, SUB420), - MAKE_GRAY_FORMAT (GRAY8, COMP8), - MAKE_GRAY_FORMAT (GRAY16_BE, COMP16), - MAKE_GRAY_FORMAT (GRAY16_LE, COMP16), + MAKE_GRAY_FORMAT (GRAY8, DPTH8, PSTR1, PLANE0, OFFS0, SUB4), + MAKE_GRAY_FORMAT (GRAY16_BE, DPTH16, PSTR2, PLANE0, OFFS0, SUB4), + MAKE_GRAY_FORMAT (GRAY16_LE, DPTH16, PSTR2, PLANE0, OFFS0, SUB4), - MAKE_YUV_FORMAT (v308, GST_MAKE_FOURCC ('v', '3', '0', '8'), COMP888), - MAKE_YUV_FORMAT (Y800, GST_MAKE_FOURCC ('Y', '8', '0', '0'), COMP8), - MAKE_YUV_FORMAT (Y16, GST_MAKE_FOURCC ('Y', '1', '6', ' '), COMP16), + MAKE_YUV_FORMAT (v308, GST_MAKE_FOURCC ('v', '3', '0', '8'), DPTH888, PSTR333, + PLANE0, OFFS012, SUB444), + MAKE_YUV_FORMAT (Y800, GST_MAKE_FOURCC ('Y', '8', '0', '0'), DPTH8, PSTR1, + PLANE0, OFFS0, SUB4), + MAKE_YUV_FORMAT (Y16, GST_MAKE_FOURCC ('Y', '1', '6', ' '), DPTH16, PSTR2, + PLANE0, OFFS0, SUB4), - MAKE_RGB_FORMAT (RGB16, COMP565), - MAKE_RGB_FORMAT (BGR16, COMP565), - MAKE_RGB_FORMAT (RGB15, COMP555), - MAKE_RGB_FORMAT (BGR15, COMP555), + MAKE_RGB_FORMAT (RGB16, DPTH565, PSTR222, PLANE0, OFFS0, SUB444), + MAKE_RGB_FORMAT (BGR16, DPTH565, PSTR222, PLANE0, OFFS0, SUB444), + MAKE_RGB_FORMAT (RGB15, DPTH555, PSTR222, PLANE0, OFFS0, SUB444), + MAKE_RGB_FORMAT (BGR15, DPTH555, PSTR222, PLANE0, OFFS0, SUB444), - MAKE_YUV_FORMAT (UYVP, GST_MAKE_FOURCC ('U', 'Y', 'V', 'P'), COMP10_10_10), - MAKE_YUVA_FORMAT (A420, GST_MAKE_FOURCC ('A', '4', '2', '0'), COMP888), - MAKE_RGBA_FORMAT (RGB8_PALETTED, COMP8888), - MAKE_YUV_FORMAT (YUV9, GST_MAKE_FOURCC ('Y', 'U', 'V', '9'), COMP888), - MAKE_YUV_FORMAT (YVU9, GST_MAKE_FOURCC ('Y', 'V', 'U', '9'), COMP888), - MAKE_YUV_FORMAT (IYU1, GST_MAKE_FOURCC ('I', 'Y', 'U', '1'), COMP888), - MAKE_RGBA_FORMAT (ARGB64, COMP16_16_16_16), - MAKE_YUVA_FORMAT (AYUV64, 0x00000000, COMP16_16_16_16), - MAKE_YUV_FORMAT (r210, GST_MAKE_FOURCC ('r', '2', '1', '0'), COMP10_10_10), + MAKE_YUV_FORMAT (UYVP, GST_MAKE_FOURCC ('U', 'Y', 'V', 'P'), DPTH10_10_10, + PSTR0, PLANE0, OFFS0, SUB422), + MAKE_YUVA_FORMAT (A420, GST_MAKE_FOURCC ('A', '4', '2', '0'), DPTH8888, + PSTR1111, PLANE0123, OFFS0, SUB4204), + MAKE_RGBA_FORMAT (RGB8_PALETTED, DPTH8888, PSTR1111, PLANE0, OFFS0, SUB4444), + MAKE_YUV_FORMAT (YUV9, GST_MAKE_FOURCC ('Y', 'U', 'V', '9'), DPTH888, PSTR111, + PLANE012, OFFS0, SUB410), + MAKE_YUV_FORMAT (YVU9, GST_MAKE_FOURCC ('Y', 'V', 'U', '9'), DPTH888, PSTR111, + PLANE021, OFFS0, SUB410), + MAKE_YUV_FORMAT (IYU1, GST_MAKE_FOURCC ('I', 'Y', 'U', '1'), DPTH888, PSTR0, + PLANE0, OFFS104, SUB411), + MAKE_RGBA_FORMAT (ARGB64, DPTH16_16_16_16, PSTR8888, PLANE0, OFFS2460, + SUB444), + MAKE_YUVA_FORMAT (AYUV64, 0x00000000, DPTH16_16_16_16, PSTR8888, PLANE0, + OFFS2460, SUB444), + MAKE_YUV_FORMAT (r210, GST_MAKE_FOURCC ('r', '2', '1', '0'), DPTH10_10_10, + PSTR444, PLANE0, OFFS0, SUB444), }; /** @@ -291,6 +354,22 @@ gst_video_format_from_rgb16_masks (int red_mask, int green_mask, int blue_mask) return GST_VIDEO_FORMAT_UNKNOWN; } +/** + * gst_video_format_from_masks: + * @depth: the amount of bits used for a pixel + * @bpp: the amount of bits used to store a pixel. This value is bigger than + * @depth + * @endianness: the endianness of the masks + * @red_mask: the red mask + * @green_mask: the green mask + * @blue_mask: the blue mask + * @alpha_mask: the optional alpha mask + * + * Find the #GstVideoFormat for the given parameters. + * + * Returns: a #GstVideoFormat or GST_VIDEO_FORMAT_UNKNOWN when the parameters to + * not specify a known format. + */ GstVideoFormat gst_video_format_from_masks (gint depth, gint bpp, gint endianness, gint red_mask, gint green_mask, gint blue_mask, gint alpha_mask) @@ -408,14 +487,23 @@ gst_video_format_from_fourcc (guint32 fourcc) } } +/** + * gst_video_format_from_string: + * @format: a format string + * + * Convert the @format string to its #GstVideoFormat. + * + * Returns: the #GstVideoFormat for @format or GST_VIDEO_FORMAT_UNKNOWN when the + * string is not a known format. + */ GstVideoFormat gst_video_format_from_string (const gchar * format) { guint i; for (i = 0; i < G_N_ELEMENTS (formats); i++) { - if (strcmp (formats[i].fmt, format) == 0) - return formats[i].format; + if (strcmp (GST_VIDEO_FORMAT_INFO_NAME (&formats[i].info), format) == 0) + return GST_VIDEO_FORMAT_INFO_FORMAT (&formats[i].info); } return GST_VIDEO_FORMAT_UNKNOWN; } @@ -452,234 +540,24 @@ gst_video_format_to_string (GstVideoFormat format) if (format >= G_N_ELEMENTS (formats)) return NULL; - return formats[format].fmt; + return GST_VIDEO_FORMAT_INFO_NAME (&formats[format].info); } /** - * gst_video_format_is_rgb: + * gst_video_format_get_info: * @format: a #GstVideoFormat * - * Determine whether the video format is an RGB format. + * Get the #GstVideoFormatInfo for @format * - * Since: 0.10.16 - * - * Returns: TRUE if @format represents RGB video + * Returns: The #GstVideoFormatInfo for @format. */ -gboolean -gst_video_format_is_rgb (GstVideoFormat format) +const GstVideoFormatInfo * +gst_video_format_get_info (GstVideoFormat format) { - g_return_val_if_fail (format != GST_VIDEO_FORMAT_UNKNOWN, FALSE); + g_return_val_if_fail (format != GST_VIDEO_FORMAT_UNKNOWN, NULL); + g_return_val_if_fail (format < G_N_ELEMENTS (formats), NULL); - if (format >= G_N_ELEMENTS (formats)) - return FALSE; - - return (formats[format].flags & VIDEO_FLAG_RGB) != 0; -} - -/** - * gst_video_format_is_yuv: - * @format: a #GstVideoFormat - * - * Determine whether the video format is a YUV format. - * - * Since: 0.10.16 - * - * Returns: TRUE if @format represents YUV video - */ -gboolean -gst_video_format_is_yuv (GstVideoFormat format) -{ - g_return_val_if_fail (format != GST_VIDEO_FORMAT_UNKNOWN, FALSE); - - if (format >= G_N_ELEMENTS (formats)) - return FALSE; - - return (formats[format].flags & VIDEO_FLAG_YUV) != 0; -} - -/** - * gst_video_format_is_gray: - * @format: a #GstVideoFormat - * - * Determine whether the video format is a grayscale format. - * - * Since: 0.10.29 - * - * Returns: TRUE if @format represents grayscale video - */ -gboolean -gst_video_format_is_gray (GstVideoFormat format) -{ - g_return_val_if_fail (format != GST_VIDEO_FORMAT_UNKNOWN, FALSE); - - if (format >= G_N_ELEMENTS (formats)) - return FALSE; - - return (formats[format].flags & VIDEO_FLAG_GRAY) != 0; -} - -/** - * gst_video_format_has_alpha: - * @format: a #GstVideoFormat - * - * Returns TRUE or FALSE depending on if the video format provides an - * alpha channel. - * - * Since: 0.10.16 - * - * Returns: TRUE if @format has an alpha channel - */ -gboolean -gst_video_format_has_alpha (GstVideoFormat format) -{ - g_return_val_if_fail (format != GST_VIDEO_FORMAT_UNKNOWN, FALSE); - - if (format >= G_N_ELEMENTS (formats)) - return FALSE; - - return (formats[format].flags & VIDEO_FLAG_ALPHA) != 0; -} - -/** - * gst_video_format_get_n_components: - * @format: a #GstVideoFormat - * - * Get the number of components for @format. - * - * Returns: the number of components for @format. - */ -int -gst_video_format_get_n_components (GstVideoFormat format) -{ - g_return_val_if_fail (format != GST_VIDEO_FORMAT_UNKNOWN, 0); - - if (format >= G_N_ELEMENTS (formats)) - return 0; - - return formats[format].n_comp; -} - -/** - * gst_video_format_get_component_depth: - * @format: a #GstVideoFormat - * @component: the video component (e.g. 0 for 'R' in RGB) - * - * Returns the number of bits used to encode an individual pixel of - * a given @component. Typically this is 8, although higher and lower - * values are possible for some formats. - * - * Since: 0.10.33 - * - * Returns: depth of component - */ -int -gst_video_format_get_component_depth (GstVideoFormat format, int component) -{ - g_return_val_if_fail (format != GST_VIDEO_FORMAT_UNKNOWN, 0); - g_return_val_if_fail (component < GST_VIDEO_MAX_PLANES, 0); - - if (format >= G_N_ELEMENTS (formats)) - return FALSE; - - return formats[format].depth[component]; -} - -/** - * gst_video_format_get_pixel_stride: - * @format: a #GstVideoFormat - * @component: the component index - * - * Calculates the pixel stride (number of bytes from one pixel to the - * pixel to its immediate left) for the video component with an index - * of @component. See @gst_video_format_get_row_stride for a description - * of the component index. - * - * Since: 0.10.16 - * - * Returns: pixel stride of component @component - */ -int -gst_video_format_get_pixel_stride (GstVideoFormat format, int component) -{ - g_return_val_if_fail (format != GST_VIDEO_FORMAT_UNKNOWN, 0); - g_return_val_if_fail (component >= 0 && component <= 3, 0); - - switch (format) { - case GST_VIDEO_FORMAT_I420: - case GST_VIDEO_FORMAT_YV12: - case GST_VIDEO_FORMAT_Y41B: - case GST_VIDEO_FORMAT_Y42B: - case GST_VIDEO_FORMAT_Y444: - case GST_VIDEO_FORMAT_A420: - case GST_VIDEO_FORMAT_YUV9: - case GST_VIDEO_FORMAT_YVU9: - return 1; - case GST_VIDEO_FORMAT_YUY2: - case GST_VIDEO_FORMAT_YVYU: - case GST_VIDEO_FORMAT_UYVY: - if (component == 0) { - return 2; - } else { - return 4; - } - case GST_VIDEO_FORMAT_IYU1: - /* doesn't make much sense for IYU1 because it's 1 or 3 - * for luma depending on position */ - return 0; - case GST_VIDEO_FORMAT_AYUV: - case GST_VIDEO_FORMAT_RGBx: - case GST_VIDEO_FORMAT_BGRx: - case GST_VIDEO_FORMAT_xRGB: - case GST_VIDEO_FORMAT_xBGR: - case GST_VIDEO_FORMAT_RGBA: - case GST_VIDEO_FORMAT_BGRA: - case GST_VIDEO_FORMAT_ARGB: - case GST_VIDEO_FORMAT_ABGR: - case GST_VIDEO_FORMAT_r210: - return 4; - case GST_VIDEO_FORMAT_RGB16: - case GST_VIDEO_FORMAT_BGR16: - case GST_VIDEO_FORMAT_RGB15: - case GST_VIDEO_FORMAT_BGR15: - return 2; - case GST_VIDEO_FORMAT_RGB: - case GST_VIDEO_FORMAT_BGR: - case GST_VIDEO_FORMAT_v308: - return 3; - case GST_VIDEO_FORMAT_v210: - /* v210 is packed at the bit level, so pixel stride doesn't make sense */ - return 0; - case GST_VIDEO_FORMAT_v216: - if (component == 0) { - return 4; - } else { - return 8; - } - case GST_VIDEO_FORMAT_NV12: - case GST_VIDEO_FORMAT_NV21: - if (component == 0) { - return 1; - } else { - return 2; - } - case GST_VIDEO_FORMAT_GRAY8: - case GST_VIDEO_FORMAT_Y800: - return 1; - case GST_VIDEO_FORMAT_GRAY16_BE: - case GST_VIDEO_FORMAT_GRAY16_LE: - case GST_VIDEO_FORMAT_Y16: - return 2; - case GST_VIDEO_FORMAT_UYVP: - /* UYVP is packed at the bit level, so pixel stride doesn't make sense */ - return 0; - case GST_VIDEO_FORMAT_RGB8_PALETTED: - return 1; - case GST_VIDEO_FORMAT_ARGB64: - case GST_VIDEO_FORMAT_AYUV64: - return 8; - default: - return 0; - } + return &formats[format].info; } /** @@ -709,23 +587,19 @@ void gst_video_info_set_format (GstVideoInfo * info, GstVideoFormat format, guint width, guint height) { - gint i; + const GstVideoFormatInfo *finfo; g_return_if_fail (info != NULL); g_return_if_fail (format != GST_VIDEO_FORMAT_UNKNOWN); + finfo = &formats[format].info; + info->flags = 0; - info->format = format; + info->finfo = finfo; info->width = width; info->height = height; - info->n_planes = formats[format].n_planes; - info->size = get_size (format, info->width, info->height); fill_planes (info); - - for (i = 0; i < info->n_planes; i++) { - info->stride[i] = get_stride (format, i, info->width); - } } /** @@ -752,6 +626,8 @@ gst_video_info_from_caps (GstVideoInfo * info, const GstCaps * caps) g_return_val_if_fail (caps != NULL, FALSE); g_return_val_if_fail (gst_caps_is_fixed (caps), FALSE); + GST_DEBUG ("parsing caps %" GST_PTR_FORMAT, caps); + structure = gst_caps_get_structure (caps, 0); if (!gst_structure_has_name (structure, "video/x-raw")) @@ -811,22 +687,27 @@ gst_video_info_from_caps (GstVideoInfo * info, const GstCaps * caps) /* ERROR */ wrong_name: { + GST_ERROR ("wrong name, expected video/x-raw"); return FALSE; } no_format: { + GST_ERROR ("no format given"); return FALSE; } unknown_format: { + GST_ERROR ("unknown format given"); return FALSE; } no_width: { + GST_ERROR ("no width property given"); return FALSE; } no_height: { + GST_ERROR ("no height property given"); return FALSE; } } @@ -846,9 +727,10 @@ gst_video_info_to_caps (GstVideoInfo * info) const gchar *format; g_return_val_if_fail (info != NULL, NULL); - g_return_val_if_fail (info->format != GST_VIDEO_FORMAT_UNKNOWN, NULL); + g_return_val_if_fail (info->finfo != NULL, NULL); + g_return_val_if_fail (info->finfo->format != GST_VIDEO_FORMAT_UNKNOWN, NULL); - format = gst_video_format_to_string (info->format); + format = gst_video_format_to_string (info->finfo->format); g_return_val_if_fail (format != NULL, NULL); caps = gst_caps_new_simple ("video/x-raw", @@ -901,12 +783,11 @@ gst_video_frame_map (GstVideoFrame * frame, GstVideoInfo * info, if (meta) { frame->info.flags = meta->flags; - frame->info.format = meta->format; + frame->info.finfo = &formats[meta->format].info; frame->info.width = meta->width; frame->info.height = meta->height; - frame->info.n_planes = meta->n_planes; - for (i = 0; i < info->n_planes; i++) { + for (i = 0; i < info->finfo->n_planes; i++) { frame->data[i] = gst_meta_video_map (meta, i, &frame->info.stride[i], flags); } @@ -921,7 +802,7 @@ gst_video_frame_map (GstVideoFrame * frame, GstVideoInfo * info, goto invalid_size; /* set up pointers */ - for (i = 0; i < info->n_planes; i++) { + for (i = 0; i < info->finfo->n_planes; i++) { frame->data[i] = data + info->offset[i]; } } @@ -930,6 +811,7 @@ gst_video_frame_map (GstVideoFrame * frame, GstVideoInfo * info, /* ERRORS */ invalid_size: { + GST_ERROR ("invalid buffer size"); gst_buffer_unmap (buffer, data, size); return FALSE; } @@ -954,7 +836,7 @@ gst_video_frame_unmap (GstVideoFrame * frame) meta = frame->meta; if (meta) { - for (i = 0; i < frame->info.n_planes; i++) { + for (i = 0; i < frame->info.finfo->n_planes; i++) { gst_meta_video_unmap (meta, i, frame->data[i]); } } else { @@ -985,11 +867,11 @@ gst_video_frame_copy (GstVideoFrame * dest, const GstVideoFrame * src) sinfo = &src->info; dinfo = &dest->info; - g_return_val_if_fail (dinfo->format == sinfo->format, FALSE); + g_return_val_if_fail (dinfo->finfo->format == sinfo->finfo->format, FALSE); g_return_val_if_fail (dinfo->width == sinfo->width && dinfo->height == sinfo->height, FALSE); - n_planes = dinfo->n_planes; + n_planes = dinfo->finfo->n_planes; for (i = 0; i < n_planes; i++) { guint w, h, j; @@ -1003,7 +885,7 @@ gst_video_frame_copy (GstVideoFrame * dest, const GstVideoFrame * src) ds = dinfo->stride[i]; w = MIN (ABS (ss), ABS (ds)); - h = gst_video_format_get_component_height (dinfo->format, i, dinfo->height); + h = GST_VIDEO_FRAME_COMP_HEIGHT (dest, i); GST_DEBUG ("w %d h %d", w, h); @@ -1016,585 +898,22 @@ gst_video_frame_copy (GstVideoFrame * dest, const GstVideoFrame * src) return TRUE; } -/** - * get_stride: - * @format: a #GstVideoFormat - * @component: the component index - * @width: the width of video - * - * Calculates the row stride (number of bytes from one row of pixels to - * the next) for the video component with an index of @component. For - * YUV video, Y, U, and V have component indices of 0, 1, and 2, - * respectively. For RGB video, R, G, and B have component indicies of - * 0, 1, and 2, respectively. Alpha channels, if present, have a component - * index of 3. The @width parameter always represents the width of the - * video, not the component. - * - * Since: 0.10.16 - * - * Returns: row stride of component @component - */ -static int -get_stride (GstVideoFormat format, int plane, int width) -{ - switch (format) { - case GST_VIDEO_FORMAT_I420: - case GST_VIDEO_FORMAT_YV12: - if (plane == 0) { - return GST_ROUND_UP_4 (width); - } else { - return GST_ROUND_UP_4 (GST_ROUND_UP_2 (width) / 2); - } - case GST_VIDEO_FORMAT_YUY2: - case GST_VIDEO_FORMAT_YVYU: - case GST_VIDEO_FORMAT_UYVY: - return GST_ROUND_UP_4 (width * 2); - case GST_VIDEO_FORMAT_AYUV: - case GST_VIDEO_FORMAT_RGBx: - case GST_VIDEO_FORMAT_BGRx: - case GST_VIDEO_FORMAT_xRGB: - case GST_VIDEO_FORMAT_xBGR: - case GST_VIDEO_FORMAT_RGBA: - case GST_VIDEO_FORMAT_BGRA: - case GST_VIDEO_FORMAT_ARGB: - case GST_VIDEO_FORMAT_ABGR: - case GST_VIDEO_FORMAT_r210: - return width * 4; - case GST_VIDEO_FORMAT_RGB16: - case GST_VIDEO_FORMAT_BGR16: - case GST_VIDEO_FORMAT_RGB15: - case GST_VIDEO_FORMAT_BGR15: - return GST_ROUND_UP_4 (width * 2); - case GST_VIDEO_FORMAT_RGB: - case GST_VIDEO_FORMAT_BGR: - case GST_VIDEO_FORMAT_v308: - return GST_ROUND_UP_4 (width * 3); - case GST_VIDEO_FORMAT_Y41B: - if (plane == 0) { - return GST_ROUND_UP_4 (width); - } else { - return GST_ROUND_UP_16 (width) / 4; - } - case GST_VIDEO_FORMAT_Y42B: - if (plane == 0) { - return GST_ROUND_UP_4 (width); - } else { - return GST_ROUND_UP_8 (width) / 2; - } - case GST_VIDEO_FORMAT_Y444: - return GST_ROUND_UP_4 (width); - case GST_VIDEO_FORMAT_v210: - return ((width + 47) / 48) * 128; - case GST_VIDEO_FORMAT_v216: - return GST_ROUND_UP_8 (width * 4); - case GST_VIDEO_FORMAT_NV12: - case GST_VIDEO_FORMAT_NV21: - return GST_ROUND_UP_4 (width); - case GST_VIDEO_FORMAT_GRAY8: - case GST_VIDEO_FORMAT_Y800: - return GST_ROUND_UP_4 (width); - case GST_VIDEO_FORMAT_GRAY16_BE: - case GST_VIDEO_FORMAT_GRAY16_LE: - case GST_VIDEO_FORMAT_Y16: - return GST_ROUND_UP_4 (width * 2); - case GST_VIDEO_FORMAT_UYVP: - return GST_ROUND_UP_4 ((width * 2 * 5 + 3) / 4); - case GST_VIDEO_FORMAT_A420: - if (plane == 0 || plane == 3) { - return GST_ROUND_UP_4 (width); - } else { - return GST_ROUND_UP_4 (GST_ROUND_UP_2 (width) / 2); - } - case GST_VIDEO_FORMAT_RGB8_PALETTED: - return GST_ROUND_UP_4 (width); - case GST_VIDEO_FORMAT_YUV9: - case GST_VIDEO_FORMAT_YVU9: - if (plane == 0) { - return GST_ROUND_UP_4 (width); - } else { - return GST_ROUND_UP_4 (GST_ROUND_UP_4 (width) / 4); - } - case GST_VIDEO_FORMAT_IYU1: - return GST_ROUND_UP_4 (GST_ROUND_UP_4 (width) + - GST_ROUND_UP_4 (width) / 2); - case GST_VIDEO_FORMAT_ARGB64: - case GST_VIDEO_FORMAT_AYUV64: - return width * 8; - default: - return 0; - } -} - -/** - * gst_video_format_get_component_width: - * @format: a #GstVideoFormat - * @component: the component index - * @width: the width of video - * - * Calculates the width of the component. See - * @gst_video_format_get_row_stride for a description - * of the component index. - * - * Since: 0.10.16 - * - * Returns: width of component @component - */ -int -gst_video_format_get_component_width (GstVideoFormat format, - int component, int width) -{ - g_return_val_if_fail (format != GST_VIDEO_FORMAT_UNKNOWN, 0); - g_return_val_if_fail (component >= 0 && component <= 3, 0); - g_return_val_if_fail (width > 0, 0); - - switch (format) { - case GST_VIDEO_FORMAT_I420: - case GST_VIDEO_FORMAT_YV12: - case GST_VIDEO_FORMAT_YUY2: - case GST_VIDEO_FORMAT_YVYU: - case GST_VIDEO_FORMAT_UYVY: - case GST_VIDEO_FORMAT_Y42B: - case GST_VIDEO_FORMAT_v210: - case GST_VIDEO_FORMAT_v216: - case GST_VIDEO_FORMAT_NV12: - case GST_VIDEO_FORMAT_NV21: - case GST_VIDEO_FORMAT_UYVP: - if (component == 0) { - return width; - } else { - return GST_ROUND_UP_2 (width) / 2; - } - case GST_VIDEO_FORMAT_Y41B: - case GST_VIDEO_FORMAT_YUV9: - case GST_VIDEO_FORMAT_YVU9: - case GST_VIDEO_FORMAT_IYU1: - if (component == 0) { - return width; - } else { - return GST_ROUND_UP_4 (width) / 4; - } - case GST_VIDEO_FORMAT_AYUV: - case GST_VIDEO_FORMAT_RGBx: - case GST_VIDEO_FORMAT_BGRx: - case GST_VIDEO_FORMAT_xRGB: - case GST_VIDEO_FORMAT_xBGR: - case GST_VIDEO_FORMAT_RGBA: - case GST_VIDEO_FORMAT_BGRA: - case GST_VIDEO_FORMAT_ARGB: - case GST_VIDEO_FORMAT_ABGR: - case GST_VIDEO_FORMAT_RGB: - case GST_VIDEO_FORMAT_BGR: - case GST_VIDEO_FORMAT_RGB16: - case GST_VIDEO_FORMAT_BGR16: - case GST_VIDEO_FORMAT_RGB15: - case GST_VIDEO_FORMAT_BGR15: - case GST_VIDEO_FORMAT_Y444: - case GST_VIDEO_FORMAT_v308: - case GST_VIDEO_FORMAT_GRAY8: - case GST_VIDEO_FORMAT_GRAY16_BE: - case GST_VIDEO_FORMAT_GRAY16_LE: - case GST_VIDEO_FORMAT_Y800: - case GST_VIDEO_FORMAT_Y16: - case GST_VIDEO_FORMAT_RGB8_PALETTED: - case GST_VIDEO_FORMAT_ARGB64: - case GST_VIDEO_FORMAT_AYUV64: - case GST_VIDEO_FORMAT_r210: - return width; - case GST_VIDEO_FORMAT_A420: - if (component == 0 || component == 3) { - return width; - } else { - return GST_ROUND_UP_2 (width) / 2; - } - default: - return 0; - } -} - -/** - * gst_video_format_get_component_height: - * @format: a #GstVideoFormat - * @component: the component index - * @height: the height of video - * - * Calculates the height of the component. See - * @gst_video_format_get_row_stride for a description - * of the component index. - * - * Since: 0.10.16 - * - * Returns: height of component @component - */ -int -gst_video_format_get_component_height (GstVideoFormat format, - int component, int height) -{ - g_return_val_if_fail (format != GST_VIDEO_FORMAT_UNKNOWN, 0); - g_return_val_if_fail (component >= 0 && component <= 3, 0); - g_return_val_if_fail (height > 0, 0); - - switch (format) { - case GST_VIDEO_FORMAT_I420: - case GST_VIDEO_FORMAT_YV12: - case GST_VIDEO_FORMAT_NV12: - case GST_VIDEO_FORMAT_NV21: - if (component == 0) { - return height; - } else { - return GST_ROUND_UP_2 (height) / 2; - } - case GST_VIDEO_FORMAT_Y41B: - case GST_VIDEO_FORMAT_Y42B: - case GST_VIDEO_FORMAT_YUY2: - case GST_VIDEO_FORMAT_YVYU: - case GST_VIDEO_FORMAT_UYVY: - case GST_VIDEO_FORMAT_AYUV: - case GST_VIDEO_FORMAT_RGBx: - case GST_VIDEO_FORMAT_BGRx: - case GST_VIDEO_FORMAT_xRGB: - case GST_VIDEO_FORMAT_xBGR: - case GST_VIDEO_FORMAT_RGBA: - case GST_VIDEO_FORMAT_BGRA: - case GST_VIDEO_FORMAT_ARGB: - case GST_VIDEO_FORMAT_ABGR: - case GST_VIDEO_FORMAT_RGB: - case GST_VIDEO_FORMAT_BGR: - case GST_VIDEO_FORMAT_RGB16: - case GST_VIDEO_FORMAT_BGR16: - case GST_VIDEO_FORMAT_RGB15: - case GST_VIDEO_FORMAT_BGR15: - case GST_VIDEO_FORMAT_Y444: - case GST_VIDEO_FORMAT_v210: - case GST_VIDEO_FORMAT_v216: - case GST_VIDEO_FORMAT_v308: - case GST_VIDEO_FORMAT_GRAY8: - case GST_VIDEO_FORMAT_GRAY16_BE: - case GST_VIDEO_FORMAT_GRAY16_LE: - case GST_VIDEO_FORMAT_Y800: - case GST_VIDEO_FORMAT_Y16: - case GST_VIDEO_FORMAT_UYVP: - case GST_VIDEO_FORMAT_RGB8_PALETTED: - case GST_VIDEO_FORMAT_IYU1: - case GST_VIDEO_FORMAT_ARGB64: - case GST_VIDEO_FORMAT_AYUV64: - case GST_VIDEO_FORMAT_r210: - return height; - case GST_VIDEO_FORMAT_A420: - if (component == 0 || component == 3) { - return height; - } else { - return GST_ROUND_UP_2 (height) / 2; - } - case GST_VIDEO_FORMAT_YUV9: - case GST_VIDEO_FORMAT_YVU9: - if (component == 0) { - return height; - } else { - return GST_ROUND_UP_4 (height) / 4; - } - default: - return 0; - } -} - -/** - * gst_video_format_get_component_offset: - * @format: a #GstVideoFormat - * @component: the component index - * @width: the width of video - * @height: the height of video - * - * Calculates the offset (in bytes) of the first pixel of the component - * with index @component. For packed formats, this will typically be a - * small integer (0, 1, 2, 3). For planar formats, this will be a - * (relatively) large offset to the beginning of the second or third - * component planes. See @gst_video_format_get_row_stride for a description - * of the component index. - * - * Since: 0.10.16 - * - * Returns: offset of component @component - */ -int -gst_video_format_get_component_offset (GstVideoFormat format, - int component, int width, int height) -{ - g_return_val_if_fail (format != GST_VIDEO_FORMAT_UNKNOWN, 0); - g_return_val_if_fail (component >= 0 && component <= 3, 0); - g_return_val_if_fail ((!gst_video_format_is_yuv (format)) || (width > 0 - && height > 0), 0); - - switch (format) { - case GST_VIDEO_FORMAT_I420: - if (component == 0) - return 0; - if (component == 1) - return GST_ROUND_UP_4 (width) * GST_ROUND_UP_2 (height); - if (component == 2) { - return GST_ROUND_UP_4 (width) * GST_ROUND_UP_2 (height) + - GST_ROUND_UP_4 (GST_ROUND_UP_2 (width) / 2) * - (GST_ROUND_UP_2 (height) / 2); - } - break; - case GST_VIDEO_FORMAT_YV12: /* same as I420, but components 1+2 swapped */ - if (component == 0) - return 0; - if (component == 2) - return GST_ROUND_UP_4 (width) * GST_ROUND_UP_2 (height); - if (component == 1) { - return GST_ROUND_UP_4 (width) * GST_ROUND_UP_2 (height) + - GST_ROUND_UP_4 (GST_ROUND_UP_2 (width) / 2) * - (GST_ROUND_UP_2 (height) / 2); - } - break; - case GST_VIDEO_FORMAT_YUY2: - if (component == 0) - return 0; - if (component == 1) - return 1; - if (component == 2) - return 3; - break; - case GST_VIDEO_FORMAT_YVYU: - if (component == 0) - return 0; - if (component == 1) - return 3; - if (component == 2) - return 1; - break; - case GST_VIDEO_FORMAT_UYVY: - if (component == 0) - return 1; - if (component == 1) - return 0; - if (component == 2) - return 2; - break; - case GST_VIDEO_FORMAT_AYUV: - if (component == 0) - return 1; - if (component == 1) - return 2; - if (component == 2) - return 3; - if (component == 3) - return 0; - break; - case GST_VIDEO_FORMAT_RGBx: - case GST_VIDEO_FORMAT_RGBA: - if (component == 0) - return 0; - if (component == 1) - return 1; - if (component == 2) - return 2; - if (component == 3) - return 3; - break; - case GST_VIDEO_FORMAT_BGRx: - case GST_VIDEO_FORMAT_BGRA: - if (component == 0) - return 2; - if (component == 1) - return 1; - if (component == 2) - return 0; - if (component == 3) - return 3; - break; - case GST_VIDEO_FORMAT_xRGB: - case GST_VIDEO_FORMAT_ARGB: - if (component == 0) - return 1; - if (component == 1) - return 2; - if (component == 2) - return 3; - if (component == 3) - return 0; - break; - case GST_VIDEO_FORMAT_xBGR: - case GST_VIDEO_FORMAT_ABGR: - if (component == 0) - return 3; - if (component == 1) - return 2; - if (component == 2) - return 1; - if (component == 3) - return 0; - break; - case GST_VIDEO_FORMAT_RGB: - case GST_VIDEO_FORMAT_v308: - if (component == 0) - return 0; - if (component == 1) - return 1; - if (component == 2) - return 2; - break; - case GST_VIDEO_FORMAT_BGR: - if (component == 0) - return 2; - if (component == 1) - return 1; - if (component == 2) - return 0; - break; - case GST_VIDEO_FORMAT_Y41B: - if (component == 0) - return 0; - if (component == 1) - return GST_ROUND_UP_4 (width) * height; - if (component == 2) - return (GST_ROUND_UP_4 (width) + - (GST_ROUND_UP_16 (width) / 4)) * height; - break; - case GST_VIDEO_FORMAT_Y42B: - if (component == 0) - return 0; - if (component == 1) - return GST_ROUND_UP_4 (width) * height; - if (component == 2) - return (GST_ROUND_UP_4 (width) + (GST_ROUND_UP_8 (width) / 2)) * height; - break; - case GST_VIDEO_FORMAT_Y444: - return GST_ROUND_UP_4 (width) * height * component; - case GST_VIDEO_FORMAT_v210: - case GST_VIDEO_FORMAT_r210: - /* v210 is bit-packed, so this doesn't make sense */ - return 0; - case GST_VIDEO_FORMAT_v216: - if (component == 0) - return 0; - if (component == 1) - return 2; - if (component == 2) - return 6; - break; - case GST_VIDEO_FORMAT_NV12: - if (component == 0) - return 0; - if (component == 1) - return GST_ROUND_UP_4 (width) * GST_ROUND_UP_2 (height); - if (component == 2) - return GST_ROUND_UP_4 (width) * GST_ROUND_UP_2 (height) + 1; - break; - case GST_VIDEO_FORMAT_NV21: - if (component == 0) - return 0; - if (component == 1) - return GST_ROUND_UP_4 (width) * GST_ROUND_UP_2 (height) + 1; - if (component == 2) - return GST_ROUND_UP_4 (width) * GST_ROUND_UP_2 (height); - break; - case GST_VIDEO_FORMAT_GRAY8: - case GST_VIDEO_FORMAT_GRAY16_BE: - case GST_VIDEO_FORMAT_GRAY16_LE: - case GST_VIDEO_FORMAT_Y800: - case GST_VIDEO_FORMAT_Y16: - return 0; - case GST_VIDEO_FORMAT_UYVP: - /* UYVP is bit-packed, so this doesn't make sense */ - return 0; - case GST_VIDEO_FORMAT_A420: - if (component == 0) - return 0; - if (component == 1) - return GST_ROUND_UP_4 (width) * GST_ROUND_UP_2 (height); - if (component == 2) { - return GST_ROUND_UP_4 (width) * GST_ROUND_UP_2 (height) + - GST_ROUND_UP_4 (GST_ROUND_UP_2 (width) / 2) * - (GST_ROUND_UP_2 (height) / 2); - } - if (component == 3) { - return GST_ROUND_UP_4 (width) * GST_ROUND_UP_2 (height) + - 2 * GST_ROUND_UP_4 (GST_ROUND_UP_2 (width) / 2) * - (GST_ROUND_UP_2 (height) / 2); - } - break; - case GST_VIDEO_FORMAT_RGB8_PALETTED: - return 0; - case GST_VIDEO_FORMAT_YUV9: - if (component == 0) - return 0; - if (component == 1) - return GST_ROUND_UP_4 (width) * height; - if (component == 2) { - return GST_ROUND_UP_4 (width) * height + - GST_ROUND_UP_4 (GST_ROUND_UP_4 (width) / 4) * - (GST_ROUND_UP_4 (height) / 4); - } - break; - case GST_VIDEO_FORMAT_YVU9: - if (component == 0) - return 0; - if (component == 1) { - return GST_ROUND_UP_4 (width) * height + - GST_ROUND_UP_4 (GST_ROUND_UP_4 (width) / 4) * - (GST_ROUND_UP_4 (height) / 4); - } - if (component == 2) - return GST_ROUND_UP_4 (width) * height; - break; - case GST_VIDEO_FORMAT_IYU1: - if (component == 0) - return 1; - if (component == 1) - return 0; - if (component == 2) - return 4; - break; - case GST_VIDEO_FORMAT_ARGB64: - case GST_VIDEO_FORMAT_AYUV64: - if (component == 0) - return 2; - if (component == 1) - return 4; - if (component == 2) - return 6; - if (component == 3) - return 0; - break; - default: - break; - } - GST_WARNING ("unhandled format %d or component %d", format, component); - return 0; -} - -/** - * get_plane_offset: - * @format: a #GstVideoFormat - * @plane: the plane index - * @width: the width of video - * @height: the height of video - * - * Calculates the offset (in bytes) of the first pixel of the plane - * with index @plane. For packed formats, this will typically be 0. - * For planar formats, this will be a (relatively) large offset to the - * beginning of the second or third plane planes. - * See @gst_video_format_get_row_stride for a description - * of the plane index. - * - * Since: 0.10.16 - * - * Returns: offset of plane @plane - */ static int fill_planes (GstVideoInfo * info) { - int width; - int height; + gint width, height; width = info->width; height = info->height; - switch (info->format) { + switch (info->finfo->format) { case GST_VIDEO_FORMAT_YUY2: case GST_VIDEO_FORMAT_YVYU: case GST_VIDEO_FORMAT_UYVY: + info->stride[0] = GST_ROUND_UP_4 (width * 2); + info->offset[0] = 0; + info->size = info->stride[0] * height; + break; case GST_VIDEO_FORMAT_AYUV: case GST_VIDEO_FORMAT_RGBx: case GST_VIDEO_FORMAT_RGBA: @@ -1604,196 +923,171 @@ fill_planes (GstVideoInfo * info) case GST_VIDEO_FORMAT_ARGB: case GST_VIDEO_FORMAT_xBGR: case GST_VIDEO_FORMAT_ABGR: - case GST_VIDEO_FORMAT_RGB: - case GST_VIDEO_FORMAT_v308: - case GST_VIDEO_FORMAT_BGR: - case GST_VIDEO_FORMAT_v210: case GST_VIDEO_FORMAT_r210: - case GST_VIDEO_FORMAT_v216: - case GST_VIDEO_FORMAT_GRAY8: - case GST_VIDEO_FORMAT_GRAY16_BE: - case GST_VIDEO_FORMAT_GRAY16_LE: - case GST_VIDEO_FORMAT_Y800: - case GST_VIDEO_FORMAT_Y16: - case GST_VIDEO_FORMAT_UYVP: - case GST_VIDEO_FORMAT_RGB8_PALETTED: - case GST_VIDEO_FORMAT_IYU1: - case GST_VIDEO_FORMAT_ARGB64: - case GST_VIDEO_FORMAT_AYUV64: - info->n_planes = 1; + info->stride[0] = width * 4; info->offset[0] = 0; + info->size = info->stride[0] * height; break; - case GST_VIDEO_FORMAT_I420: - info->n_planes = 3; - info->offset[0] = 0; - info->offset[1] = GST_ROUND_UP_4 (width) * GST_ROUND_UP_2 (height); - info->offset[2] = info->offset[1] + - GST_ROUND_UP_4 (GST_ROUND_UP_2 (width) / 2) * - (GST_ROUND_UP_2 (height) / 2); - break; - case GST_VIDEO_FORMAT_YV12: /* same as I420, but plane 1+2 swapped */ - info->n_planes = 3; - info->offset[0] = 0; - info->offset[2] = GST_ROUND_UP_4 (width) * GST_ROUND_UP_2 (height); - info->offset[1] = info->offset[2] + - GST_ROUND_UP_4 (GST_ROUND_UP_2 (width) / 2) * - (GST_ROUND_UP_2 (height) / 2); - break; - case GST_VIDEO_FORMAT_Y41B: - info->n_planes = 3; - info->offset[0] = 0; - info->offset[1] = GST_ROUND_UP_4 (width) * height; - info->offset[2] = (GST_ROUND_UP_4 (width) + - (GST_ROUND_UP_16 (width) / 4)) * height; - break; - case GST_VIDEO_FORMAT_Y42B: - info->n_planes = 3; - info->offset[0] = 0; - info->offset[1] = GST_ROUND_UP_4 (width) * height; - info->offset[2] = - (GST_ROUND_UP_4 (width) + (GST_ROUND_UP_8 (width) / 2)) * height; - break; - case GST_VIDEO_FORMAT_Y444: - info->n_planes = 3; - info->offset[0] = 0; - info->offset[1] = GST_ROUND_UP_4 (width) * height; - info->offset[2] = GST_ROUND_UP_4 (width) * height * 2; - break; - case GST_VIDEO_FORMAT_NV12: - case GST_VIDEO_FORMAT_NV21: - info->n_planes = 2; - info->offset[0] = 0; - info->offset[1] = GST_ROUND_UP_4 (width) * GST_ROUND_UP_2 (height); - break; - case GST_VIDEO_FORMAT_A420: - info->n_planes = 4; - info->offset[0] = 0; - info->offset[1] = GST_ROUND_UP_4 (width) * GST_ROUND_UP_2 (height); - info->offset[2] = info->offset[1] + - GST_ROUND_UP_4 (GST_ROUND_UP_2 (width) / 2) * - (GST_ROUND_UP_2 (height) / 2); - info->offset[3] = info->offset[2] + - GST_ROUND_UP_4 (GST_ROUND_UP_2 (width) / 2) * - (GST_ROUND_UP_2 (height) / 2); - break; - case GST_VIDEO_FORMAT_YUV9: - info->n_planes = 3; - info->offset[0] = 0; - info->offset[1] = GST_ROUND_UP_4 (width) * height; - info->offset[2] = info->offset[1] + - GST_ROUND_UP_4 (GST_ROUND_UP_4 (width) / 4) * - (GST_ROUND_UP_4 (height) / 4); - break; - case GST_VIDEO_FORMAT_YVU9: - info->n_planes = 3; - info->offset[0] = 0; - info->offset[2] = GST_ROUND_UP_4 (width) * height; - info->offset[1] = info->offset[2] + - GST_ROUND_UP_4 (GST_ROUND_UP_4 (width) / 4) * - (GST_ROUND_UP_4 (height) / 4); - break; - default: - GST_WARNING ("unhandled format %d", info->format); - break; - } - return 0; -} - -/** - * get_size: - * @format: a #GstVideoFormat - * @width: the width of video - * @height: the height of video - * - * Calculates the total number of bytes in the raw video format. This - * number should be used when allocating a buffer for raw video. - * - * Returns: size (in bytes) of raw video format - */ -static int -get_size (GstVideoFormat format, int width, int height) -{ - int size; - - g_return_val_if_fail (format != GST_VIDEO_FORMAT_UNKNOWN, 0); - g_return_val_if_fail (width > 0 && height > 0, 0); - - switch (format) { - case GST_VIDEO_FORMAT_I420: - case GST_VIDEO_FORMAT_YV12: - size = GST_ROUND_UP_4 (width) * GST_ROUND_UP_2 (height); - size += GST_ROUND_UP_4 (GST_ROUND_UP_2 (width) / 2) * - (GST_ROUND_UP_2 (height) / 2) * 2; - return size; - case GST_VIDEO_FORMAT_IYU1: - return GST_ROUND_UP_4 (GST_ROUND_UP_4 (width) + - GST_ROUND_UP_4 (width) / 2) * height; - case GST_VIDEO_FORMAT_YUY2: - case GST_VIDEO_FORMAT_YVYU: - case GST_VIDEO_FORMAT_UYVY: - return GST_ROUND_UP_4 (width * 2) * height; - case GST_VIDEO_FORMAT_AYUV: - case GST_VIDEO_FORMAT_RGBx: - case GST_VIDEO_FORMAT_BGRx: - case GST_VIDEO_FORMAT_xRGB: - case GST_VIDEO_FORMAT_xBGR: - case GST_VIDEO_FORMAT_RGBA: - case GST_VIDEO_FORMAT_BGRA: - case GST_VIDEO_FORMAT_ARGB: - case GST_VIDEO_FORMAT_ABGR: - case GST_VIDEO_FORMAT_r210: - return width * 4 * height; case GST_VIDEO_FORMAT_RGB16: case GST_VIDEO_FORMAT_BGR16: case GST_VIDEO_FORMAT_RGB15: case GST_VIDEO_FORMAT_BGR15: - return GST_ROUND_UP_4 (width * 2) * height; + info->stride[0] = GST_ROUND_UP_4 (width * 2); + info->offset[0] = 0; + info->size = info->stride[0] * height; + break; case GST_VIDEO_FORMAT_RGB: case GST_VIDEO_FORMAT_BGR: case GST_VIDEO_FORMAT_v308: - return GST_ROUND_UP_4 (width * 3) * height; - case GST_VIDEO_FORMAT_Y41B: - /* simplification of ROUNDUP4(w)*h + 2*((ROUNDUP16(w)/4)*h */ - return (GST_ROUND_UP_4 (width) + (GST_ROUND_UP_16 (width) / 2)) * height; - case GST_VIDEO_FORMAT_Y42B: - /* simplification of ROUNDUP4(w)*h + 2*(ROUNDUP8(w)/2)*h */ - return (GST_ROUND_UP_4 (width) + GST_ROUND_UP_8 (width)) * height; - case GST_VIDEO_FORMAT_Y444: - return GST_ROUND_UP_4 (width) * height * 3; + info->stride[0] = GST_ROUND_UP_4 (width * 3); + info->offset[0] = 0; + info->size = info->stride[0] * height; + break; case GST_VIDEO_FORMAT_v210: - return ((width + 47) / 48) * 128 * height; + info->stride[0] = ((width + 47) / 48) * 128; + info->offset[0] = 0; + info->size = info->stride[0] * height; + break; case GST_VIDEO_FORMAT_v216: - return GST_ROUND_UP_8 (width * 4) * height; - case GST_VIDEO_FORMAT_NV12: - case GST_VIDEO_FORMAT_NV21: - return GST_ROUND_UP_4 (width) * GST_ROUND_UP_2 (height) * 3 / 2; + info->stride[0] = GST_ROUND_UP_8 (width * 4); + info->offset[0] = 0; + info->size = info->stride[0] * height; + break; case GST_VIDEO_FORMAT_GRAY8: case GST_VIDEO_FORMAT_Y800: - case GST_VIDEO_FORMAT_RGB8_PALETTED: - return GST_ROUND_UP_4 (width) * height; + info->stride[0] = GST_ROUND_UP_4 (width); + info->offset[0] = 0; + info->size = info->stride[0] * height; + break; case GST_VIDEO_FORMAT_GRAY16_BE: case GST_VIDEO_FORMAT_GRAY16_LE: case GST_VIDEO_FORMAT_Y16: - return GST_ROUND_UP_4 (width * 2) * height; + info->stride[0] = GST_ROUND_UP_4 (width * 2); + info->offset[0] = 0; + info->size = info->stride[0] * height; + break; case GST_VIDEO_FORMAT_UYVP: - return GST_ROUND_UP_4 ((width * 2 * 5 + 3) / 4) * height; - case GST_VIDEO_FORMAT_A420: - size = 2 * GST_ROUND_UP_4 (width) * GST_ROUND_UP_2 (height); - size += GST_ROUND_UP_4 (GST_ROUND_UP_2 (width) / 2) * - (GST_ROUND_UP_2 (height) / 2) * 2; - return size; - case GST_VIDEO_FORMAT_YUV9: - case GST_VIDEO_FORMAT_YVU9: - size = GST_ROUND_UP_4 (width) * height; - size += GST_ROUND_UP_4 (GST_ROUND_UP_4 (width) / 4) * - (GST_ROUND_UP_4 (height) / 4) * 2; - return size; + info->stride[0] = GST_ROUND_UP_4 ((width * 2 * 5 + 3) / 4); + info->offset[0] = 0; + info->size = info->stride[0] * height; + break; + case GST_VIDEO_FORMAT_RGB8_PALETTED: + info->stride[0] = GST_ROUND_UP_4 (width); + info->offset[0] = 0; + info->size = info->stride[0] * height; + break; + case GST_VIDEO_FORMAT_IYU1: + info->stride[0] = GST_ROUND_UP_4 (GST_ROUND_UP_4 (width) + + GST_ROUND_UP_4 (width) / 2); + info->offset[0] = 0; + info->size = info->stride[0] * height; + break; case GST_VIDEO_FORMAT_ARGB64: case GST_VIDEO_FORMAT_AYUV64: - return width * 8 * height; - default: - return 0; + info->stride[0] = width * 8; + info->offset[0] = 0; + info->size = info->stride[0] * height; + break; + case GST_VIDEO_FORMAT_I420: + info->stride[0] = GST_ROUND_UP_4 (width); + info->stride[1] = GST_ROUND_UP_4 (GST_ROUND_UP_2 (width) / 2); + 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_YV12: /* same as I420, but plane 1+2 swapped */ + info->stride[0] = GST_ROUND_UP_4 (width); + info->stride[1] = GST_ROUND_UP_4 (GST_ROUND_UP_2 (width) / 2); + info->stride[2] = info->stride[1]; + info->offset[0] = 0; + info->offset[2] = info->stride[0] * GST_ROUND_UP_2 (height); + info->offset[1] = info->offset[2] + + info->stride[1] * (GST_ROUND_UP_2 (height) / 2); + info->size = info->offset[1] + + info->stride[2] * (GST_ROUND_UP_2 (height) / 2); + break; + case GST_VIDEO_FORMAT_Y41B: + info->stride[0] = GST_ROUND_UP_4 (width); + info->stride[1] = GST_ROUND_UP_16 (width) / 4; + info->stride[2] = info->stride[1]; + info->offset[0] = 0; + info->offset[1] = info->stride[0] * height; + info->offset[2] = info->offset[1] + info->stride[1] * height; + /* simplification of ROUNDUP4(w)*h + 2*((ROUNDUP16(w)/4)*h */ + info->size = (info->stride[0] + (GST_ROUND_UP_16 (width) / 2)) * height; + break; + case GST_VIDEO_FORMAT_Y42B: + info->stride[0] = GST_ROUND_UP_4 (width); + info->stride[1] = GST_ROUND_UP_8 (width) / 2; + info->stride[2] = info->stride[1]; + info->offset[0] = 0; + info->offset[1] = info->stride[0] * height; + info->offset[2] = info->offset[1] + info->stride[1] * height; + /* simplification of ROUNDUP4(w)*h + 2*(ROUNDUP8(w)/2)*h */ + info->size = (info->stride[0] + GST_ROUND_UP_8 (width)) * height; + break; + case GST_VIDEO_FORMAT_Y444: + info->stride[0] = GST_ROUND_UP_4 (width); + 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_NV12: + case GST_VIDEO_FORMAT_NV21: + info->stride[0] = GST_ROUND_UP_4 (width); + info->stride[1] = info->stride[0]; + info->offset[0] = 0; + info->offset[1] = info->stride[0] * GST_ROUND_UP_2 (height); + info->size = info->stride[0] * GST_ROUND_UP_2 (height) * 3 / 2; + break; + case GST_VIDEO_FORMAT_A420: + info->stride[0] = GST_ROUND_UP_4 (width); + info->stride[1] = GST_ROUND_UP_4 (GST_ROUND_UP_2 (width) / 2); + info->stride[2] = info->stride[1]; + info->stride[3] = info->stride[0]; + 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->offset[3] = info->offset[2] + + info->stride[2] * (GST_ROUND_UP_2 (height) / 2); + info->size = info->offset[3] + info->stride[0]; + break; + case GST_VIDEO_FORMAT_YUV9: + info->stride[0] = GST_ROUND_UP_4 (width); + info->stride[1] = GST_ROUND_UP_4 (GST_ROUND_UP_4 (width) / 4); + info->stride[2] = info->stride[1]; + info->offset[0] = 0; + info->offset[1] = info->stride[0] * height; + info->offset[2] = info->offset[1] + + info->stride[1] * (GST_ROUND_UP_4 (height) / 4); + info->size = info->offset[2] + + info->stride[2] * (GST_ROUND_UP_4 (height) / 4); + break; + case GST_VIDEO_FORMAT_YVU9: + info->stride[0] = GST_ROUND_UP_4 (width); + info->stride[1] = GST_ROUND_UP_4 (GST_ROUND_UP_4 (width) / 4); + info->stride[2] = info->stride[1]; + info->offset[0] = 0; + info->offset[2] = info->stride[0] * height; + info->offset[1] = info->offset[2] + + info->stride[1] * (GST_ROUND_UP_4 (height) / 4); + info->size = info->offset[2] + + info->stride[2] * (GST_ROUND_UP_4 (height) / 4); + break; + case GST_VIDEO_FORMAT_UNKNOWN: + GST_ERROR ("invalid format"); + g_warning ("invalid format"); + break; } + return 0; } /** @@ -1822,7 +1116,8 @@ gst_video_info_convert (GstVideoInfo * info, int size, fps_n, fps_d; g_return_val_if_fail (info != NULL, 0); - g_return_val_if_fail (info->format != GST_VIDEO_FORMAT_UNKNOWN, 0); + g_return_val_if_fail (info->finfo != NULL, 0); + g_return_val_if_fail (info->finfo->format != GST_VIDEO_FORMAT_UNKNOWN, 0); g_return_val_if_fail (info->size > 0, 0); size = info->size; diff --git a/gst-libs/gst/video/video.h b/gst-libs/gst/video/video.h index 9445ed4c90..e10da946ae 100644 --- a/gst-libs/gst/video/video.h +++ b/gst-libs/gst/video/video.h @@ -121,6 +121,76 @@ typedef enum { GST_VIDEO_FORMAT_r210 } GstVideoFormat; +#define GST_VIDEO_MAX_PLANES 4 +#define GST_VIDEO_MAX_COMPONENTS 4 + +typedef struct _GstVideoFormatInfo GstVideoFormatInfo; + +typedef enum +{ + GST_VIDEO_FORMAT_FLAG_YUV = (1 << 0), + GST_VIDEO_FORMAT_FLAG_RGB = (1 << 1), + GST_VIDEO_FORMAT_FLAG_GRAY = (1 << 2), + GST_VIDEO_FORMAT_FLAG_ALPHA = (1 << 3) +} GstVideoFormatFlags; + +#define GST_VIDEO_SUB_SCALE(scale,val) (-((-(val))>>(scale))) + +/** + * GstVideoFormatInfo: + * @format: #GstVideoFormat + * @name: string representation of the format + * @flags: #GstVideoFormatFlags + * @n_components: the number of components in the video format + * @depth: the depth for each component + * @pixel_stride: the pixel stride of each component. This is the amount of + * bytes to the pixel immediately to the right. + * @n_planes: the number of planes for this format + * @plane: the plane number where this component can be found + * @offset: the offset in the plane where the first pixel can be + * found. + * @w_sub: subsampling factor of the width + * @h_sub: subsampling factor of the height + */ +struct _GstVideoFormatInfo { + GstVideoFormat format; + const gchar *name; + GstVideoFormatFlags flags; + guint n_components; + guint depth[GST_VIDEO_MAX_COMPONENTS]; + gint pixel_stride[GST_VIDEO_MAX_COMPONENTS]; + guint n_planes; + guint plane[GST_VIDEO_MAX_COMPONENTS]; + guint offset[GST_VIDEO_MAX_COMPONENTS]; + guint w_sub[GST_VIDEO_MAX_COMPONENTS]; + guint h_sub[GST_VIDEO_MAX_COMPONENTS]; +}; + +#define GST_VIDEO_FORMAT_INFO_FORMAT(info) ((info)->format) +#define GST_VIDEO_FORMAT_INFO_NAME(info) ((info)->name) +#define GST_VIDEO_FORMAT_INFO_FLAGS(info) ((info)->flags) + +#define GST_VIDEO_FORMAT_INFO_IS_YUV(info) ((info)->flags & GST_VIDEO_FORMAT_FLAG_YUV) +#define GST_VIDEO_FORMAT_INFO_IS_RGB(info) ((info)->flags & GST_VIDEO_FORMAT_FLAG_RGB) +#define GST_VIDEO_FORMAT_INFO_IS_GRAY(info) ((info)->flags & GST_VIDEO_FORMAT_FLAG_GRAY) +#define GST_VIDEO_FORMAT_INFO_HAS_ALPHA(info) ((info)->flags & GST_VIDEO_FORMAT_FLAG_ALPHA) + +#define GST_VIDEO_FORMAT_INFO_N_COMPONENTS(info) ((info)->n_components) +#define GST_VIDEO_FORMAT_INFO_DEPTH(info,c) ((info)->depth[c]) +#define GST_VIDEO_FORMAT_INFO_PSTRIDE(info,c) ((info)->pixel_stride[c]) +#define GST_VIDEO_FORMAT_INFO_N_PLANES(info) ((info)->n_planes) +#define GST_VIDEO_FORMAT_INFO_PLANE(info,c) ((info)->plane[c]) +#define GST_VIDEO_FORMAT_INFO_OFFSET(info,c) ((info)->offset[c]) +#define GST_VIDEO_FORMAT_INFO_W_SUB(info,c) ((info)->w_sub[c]) +#define GST_VIDEO_FORMAT_INFO_H_SUB(info,c) ((info)->h_sub[c]) + +#define GST_VIDEO_FORMAT_INFO_SCALE_WIDTH(info,c,w) GST_VIDEO_SUB_SCALE ((info)->w_sub[(c)],(w)) +#define GST_VIDEO_FORMAT_INFO_SCALE_HEIGHT(info,c,h) GST_VIDEO_SUB_SCALE ((info)->h_sub[(c)],(h)) + +#define GST_VIDEO_FORMAT_INFO_DATA(info,planes,comp) \ + (((guint8*)(planes)[info->plane[comp]]) + info->offset[comp]) +#define GST_VIDEO_FORMAT_INFO_STRIDE(info,strides,comp) ((strides)[info->plane[comp]]) + /* format properties */ GstVideoFormat gst_video_format_from_masks (gint depth, gint bpp, gint endianness, gint red_mask, gint green_mask, @@ -132,16 +202,8 @@ GstVideoFormat gst_video_format_from_string (const gchar *format) G_GNU guint32 gst_video_format_to_fourcc (GstVideoFormat format) G_GNUC_CONST; const gchar * gst_video_format_to_string (GstVideoFormat format) G_GNUC_CONST; -gboolean gst_video_format_is_rgb (GstVideoFormat format) G_GNUC_CONST; -gboolean gst_video_format_is_yuv (GstVideoFormat format) G_GNUC_CONST; -gboolean gst_video_format_is_gray (GstVideoFormat format) G_GNUC_CONST; -gboolean gst_video_format_has_alpha (GstVideoFormat format) G_GNUC_CONST; - -int gst_video_format_get_n_components (GstVideoFormat format) G_GNUC_CONST; -int gst_video_format_get_component_depth (GstVideoFormat format, - int component) G_GNUC_CONST; -int gst_video_format_get_pixel_stride (GstVideoFormat format, - int component) G_GNUC_CONST; +const GstVideoFormatInfo * + gst_video_format_get_info (GstVideoFormat format) G_GNUC_CONST; typedef struct _GstVideoInfo GstVideoInfo; typedef struct _GstVideoFrame GstVideoFrame; @@ -168,8 +230,6 @@ typedef enum { GST_VIDEO_FLAG_PROGRESSIVE = (1 << 5) } GstVideoFlags; -#define GST_VIDEO_MAX_PLANES 4 - /** * GstVideoInfo: * @flags: additional video flags @@ -190,33 +250,51 @@ typedef enum { * @par_d: the pixel-aspect-ratio demnominator * @fps_n: the framerate numerator * @fps_d: the framerate demnominator - * @n_planes: the number of planes in the image * @offset: offsets of the planes * @stride: strides of the planes * * Extra buffer metadata describing image properties */ struct _GstVideoInfo { - GstVideoFormat format; - GstVideoFlags flags; - gint width; - gint height; - guint size; + const GstVideoFormatInfo *finfo; + GstVideoFlags flags; + gint width; + gint height; + guint size; - const gchar *color_matrix; - const gchar *chroma_site; - GstBuffer *palette; + const gchar *color_matrix; + const gchar *chroma_site; + GstBuffer *palette; - gint par_n; - gint par_d; - gint fps_n; - gint fps_d; + gint par_n; + gint par_d; + gint fps_n; + gint fps_d; - guint n_planes; - gsize offset[GST_VIDEO_MAX_PLANES]; - gint stride[GST_VIDEO_MAX_PLANES]; + gsize offset[GST_VIDEO_MAX_PLANES]; + gint stride[GST_VIDEO_MAX_PLANES]; }; +/* general info */ +#define GST_VIDEO_INFO_FORMAT(i) (GST_VIDEO_FORMAT_INFO_FORMAT((i)->finfo)) +#define GST_VIDEO_INFO_NAME(i) (GST_VIDEO_FORMAT_INFO_NAME((i)->finfo)) +#define GST_VIDEO_INFO_WIDTH(i) ((i)->width) +#define GST_VIDEO_INFO_HEIGHT(i) ((i)->height) +#define GST_VIDEO_INFO_SIZE(i) ((i)->size) + +/* dealing with planes */ +#define GST_VIDEO_INFO_N_PLANES(i) (GST_VIDEO_FORMAT_INFO_N_PLANES((i)->finfo)) +#define GST_VIDEO_INFO_PLANE_OFFSET(i,p) ((i)->offset[p]) +#define GST_VIDEO_INFO_PLANE_STRIDE(i,p) ((i)->stride[p]) + +/* dealing with components */ +#define GST_VIDEO_INFO_N_COMPONENTS(i) GST_VIDEO_FORMAT_INFO_N_COMPONENTS((i)->finfo) +#define GST_VIDEO_INFO_COMP_DATA(i,d,c) GST_VIDEO_FORMAT_INFO_DATA((i)->finfo,d,c) +#define GST_VIDEO_INFO_COMP_STRIDE(i,c) GST_VIDEO_FORMAT_INFO_STRIDE((i)->finfo,(i)->stride,c) +#define GST_VIDEO_INFO_COMP_WIDTH(i,c) GST_VIDEO_FORMAT_INFO_SCALE_WIDTH((i)->finfo,c,(i)->width) +#define GST_VIDEO_INFO_COMP_HEIGHT(i,c) GST_VIDEO_FORMAT_INFO_SCALE_HEIGHT((i)->finfo,c,(i)->height) +#define GST_VIDEO_INFO_COMP_PSTRIDE(i,c) GST_VIDEO_FORMAT_INFO_PSTRIDE((i)->finfo,c) + void gst_video_info_init (GstVideoInfo *info); void gst_video_info_set_format (GstVideoInfo *info, GstVideoFormat format, @@ -236,6 +314,7 @@ gboolean gst_video_info_convert (GstVideoInfo *info, * GstVideoFrame: * @info: the #GstVideoInfo * @buffer: the mapped buffer + * @meta: pointer to metadata if any * @data: pointers to the plane data * * A video frame obtained from gst_video_frame_map() @@ -246,18 +325,33 @@ struct _GstVideoFrame { GstBuffer *buffer; gpointer meta; - guint8 *data[GST_VIDEO_MAX_PLANES]; + gpointer data[GST_VIDEO_MAX_PLANES]; }; -#define GST_VIDEO_FRAME_DATA(f,c) ((f)->data[c]) -#define GST_VIDEO_FRAME_STRIDE(f,c) ((f)->info.stride[c]) +gboolean gst_video_frame_map (GstVideoFrame *frame, GstVideoInfo *info, + GstBuffer *buffer, GstMapFlags flags); +void gst_video_frame_unmap (GstVideoFrame *frame); -gboolean gst_video_frame_map (GstVideoFrame *frame, GstVideoInfo *info, - GstBuffer *buffer, GstMapFlags flags); -void gst_video_frame_unmap (GstVideoFrame *frame); +gboolean gst_video_frame_copy (GstVideoFrame *dest, const GstVideoFrame *src); -gboolean gst_video_frame_copy (GstVideoFrame *dest, const GstVideoFrame *src); +/* general info */ +#define GST_VIDEO_FRAME_FORMAT(f) (GST_VIDEO_INFO_FORMAT(&(f)->info)) +#define GST_VIDEO_FRAME_WIDTH(f) (GST_VIDEO_INFO_WIDTH(&(f)->info)) +#define GST_VIDEO_FRAME_HEIGHT(f) (GST_VIDEO_INFO_HEIGHT(&(f)->info)) +/* dealing with planes */ +#define GST_VIDEO_FRAME_N_PLANES(f) (GST_VIDEO_INFO_N_PLANES(&(f)->info)) +#define GST_VIDEO_FRAME_PLANE_DATA(f,p) ((f)->data[p]) +#define GST_VIDEO_FRAME_PLANE_OFFSET(f,p) (GST_VIDEO_INFO_PLANE_OFFSET(&(f)->info,p)) +#define GST_VIDEO_FRAME_PLANE_STRIDE(f,p) (GST_VIDEO_INFO_PLANE_STRIDE(&(f)->info,p)) + +/* dealing with components */ +#define GST_VIDEO_FRAME_N_COMPONENTS(f) GST_VIDEO_INFO_N_COMPONENTS(&(f)->info) +#define GST_VIDEO_FRAME_COMP_DATA(f,c) GST_VIDEO_INFO_COMP_DATA(&(f)->info,(f)->data,c) +#define GST_VIDEO_FRAME_COMP_STRIDE(f,c) GST_VIDEO_INFO_COMP_STRIDE(&(f)->info,c) +#define GST_VIDEO_FRAME_COMP_WIDTH(f,c) GST_VIDEO_INFO_COMP_WIDTH(&(f)->info,c) +#define GST_VIDEO_FRAME_COMP_HEIGHT(f,c) GST_VIDEO_INFO_COMP_HEIGHT(&(f)->info,c) +#define GST_VIDEO_FRAME_COMP_PSTRIDE(f,c) GST_VIDEO_INFO_COMP_PSTRIDE(&(f)->info,c) #define GST_VIDEO_SIZE_RANGE "(int) [ 1, max ]" #define GST_VIDEO_FPS_RANGE "(fraction) [ 0, max ]" @@ -338,18 +432,6 @@ gboolean gst_video_calculate_display_ratio (guint * dar_n, gboolean gst_video_parse_caps_framerate (GstCaps * caps, int *fps_n, int *fps_d); GstBuffer * gst_video_parse_caps_palette (GstCaps * caps); -int gst_video_format_get_component_width (GstVideoFormat format, - int component, - int width) G_GNUC_CONST; - -int gst_video_format_get_component_height (GstVideoFormat format, - int component, - int height) G_GNUC_CONST; -int gst_video_format_get_component_offset (GstVideoFormat format, - int component, - int width, - int height); - /* video still frame event creation and parsing */ GstEvent * gst_video_event_new_still_frame (gboolean in_still); diff --git a/gst/videoconvert/gstvideoconvert.c b/gst/videoconvert/gstvideoconvert.c index 8f8bfafab1..2fad4b0864 100644 --- a/gst/videoconvert/gstvideoconvert.c +++ b/gst/videoconvert/gstvideoconvert.c @@ -198,9 +198,9 @@ gst_video_convert_set_caps (GstBaseTransform * btrans, GstCaps * incaps, if (!gst_video_info_from_caps (&in_info, incaps)) goto invalid_caps; - if (gst_video_format_is_rgb (in_info.format)) { + if (in_info.finfo->flags & GST_VIDEO_FORMAT_FLAG_RGB) { in_spec = COLOR_SPEC_RGB; - } else if (gst_video_format_is_yuv (in_info.format)) { + } else if (in_info.finfo->flags & GST_VIDEO_FORMAT_FLAG_YUV) { if (in_info.color_matrix && g_str_equal (in_info.color_matrix, "hdtv")) in_spec = COLOR_SPEC_YUV_BT709; else @@ -213,9 +213,9 @@ gst_video_convert_set_caps (GstBaseTransform * btrans, GstCaps * incaps, if (!gst_video_info_from_caps (&out_info, outcaps)) goto invalid_caps; - if (gst_video_format_is_rgb (out_info.format)) { + if (out_info.finfo->flags & GST_VIDEO_FORMAT_FLAG_RGB) { out_spec = COLOR_SPEC_RGB; - } else if (gst_video_format_is_yuv (out_info.format)) { + } else if (out_info.finfo->flags & GST_VIDEO_FORMAT_FLAG_YUV) { if (out_info.color_matrix && g_str_equal (out_info.color_matrix, "hdtv")) out_spec = COLOR_SPEC_YUV_BT709; else @@ -246,18 +246,21 @@ gst_video_convert_set_caps (GstBaseTransform * btrans, GstCaps * incaps, interlaced = (in_info.flags & GST_VIDEO_FLAG_INTERLACED) != 0; space->convert = - videoconvert_convert_new (out_info.format, out_spec, in_info.format, - in_spec, in_info.width, in_info.height); + videoconvert_convert_new (GST_VIDEO_INFO_FORMAT (&out_info), out_spec, + GST_VIDEO_INFO_FORMAT (&in_info), in_spec, in_info.width, in_info.height); if (space->convert == NULL) goto no_convert; videoconvert_convert_set_interlaced (space->convert, interlaced); /* palette, only for from data */ - if (space->from_info.format == GST_VIDEO_FORMAT_RGB8_PALETTED && - space->to_info.format == GST_VIDEO_FORMAT_RGB8_PALETTED) { + if (GST_VIDEO_INFO_FORMAT (&space->from_info) == + GST_VIDEO_FORMAT_RGB8_PALETTED + && GST_VIDEO_INFO_FORMAT (&space->to_info) == + GST_VIDEO_FORMAT_RGB8_PALETTED) { goto format_mismatch; - } else if (space->from_info.format == GST_VIDEO_FORMAT_RGB8_PALETTED) { + } else if (GST_VIDEO_INFO_FORMAT (&space->from_info) == + GST_VIDEO_FORMAT_RGB8_PALETTED) { GstBuffer *palette; guint32 *data; @@ -274,7 +277,8 @@ gst_video_convert_set_caps (GstBaseTransform * btrans, GstCaps * incaps, gst_buffer_unmap (palette, data, -1); gst_buffer_unref (palette); - } else if (space->to_info.format == GST_VIDEO_FORMAT_RGB8_PALETTED) { + } else if (GST_VIDEO_INFO_FORMAT (&space->to_info) == + GST_VIDEO_FORMAT_RGB8_PALETTED) { const guint32 *palette; GstBuffer *p_buf; @@ -286,8 +290,10 @@ gst_video_convert_set_caps (GstBaseTransform * btrans, GstCaps * incaps, gst_buffer_unref (p_buf); } - GST_DEBUG ("reconfigured %d %d", space->from_info.format, - space->to_info.format); + GST_DEBUG ("reconfigured %d %d", GST_VIDEO_INFO_FORMAT (&space->from_info), + GST_VIDEO_INFO_FORMAT (&space->to_info)); + + space->negotiated = TRUE; return TRUE; @@ -295,29 +301,26 @@ gst_video_convert_set_caps (GstBaseTransform * btrans, GstCaps * incaps, invalid_caps: { GST_ERROR_OBJECT (space, "invalid caps"); - space->from_info.format = GST_VIDEO_FORMAT_UNKNOWN; - space->to_info.format = GST_VIDEO_FORMAT_UNKNOWN; - return FALSE; + goto error_done; } format_mismatch: { GST_ERROR_OBJECT (space, "input and output formats do not match"); - space->from_info.format = GST_VIDEO_FORMAT_UNKNOWN; - space->to_info.format = GST_VIDEO_FORMAT_UNKNOWN; - return FALSE; + goto error_done; } no_convert: { GST_ERROR_OBJECT (space, "could not create converter"); - space->from_info.format = GST_VIDEO_FORMAT_UNKNOWN; - space->to_info.format = GST_VIDEO_FORMAT_UNKNOWN; - return FALSE; + goto error_done; } invalid_palette: { GST_ERROR_OBJECT (space, "invalid palette"); - space->from_info.format = GST_VIDEO_FORMAT_UNKNOWN; - space->to_info.format = GST_VIDEO_FORMAT_UNKNOWN; + goto error_done; + } +error_done: + { + space->negotiated = FALSE; return FALSE; } } @@ -381,8 +384,7 @@ gst_video_convert_class_init (GstVideoConvertClass * klass) static void gst_video_convert_init (GstVideoConvert * space) { - space->from_info.format = GST_VIDEO_FORMAT_UNKNOWN; - space->to_info.format = GST_VIDEO_FORMAT_UNKNOWN; + space->negotiated = FALSE; } void @@ -447,11 +449,10 @@ gst_video_convert_transform (GstBaseTransform * btrans, GstBuffer * inbuf, space = GST_VIDEO_CONVERT_CAST (btrans); - GST_DEBUG ("from %d -> to %d", space->from_info.format, - space->to_info.format); + GST_DEBUG ("from %s -> to %s", GST_VIDEO_INFO_NAME (&space->from_info), + GST_VIDEO_INFO_NAME (&space->to_info)); - if (G_UNLIKELY (space->from_info.format == GST_VIDEO_FORMAT_UNKNOWN || - space->to_info.format == GST_VIDEO_FORMAT_UNKNOWN)) + if (G_UNLIKELY (!space->negotiated)) goto unknown_format; videoconvert_convert_set_dither (space->convert, space->dither); @@ -468,8 +469,8 @@ gst_video_convert_transform (GstBaseTransform * btrans, GstBuffer * inbuf, gst_video_frame_unmap (&in_frame); /* baseclass copies timestamps */ - GST_DEBUG ("from %d -> to %d done", space->from_info.format, - space->to_info.format); + GST_DEBUG ("from %s -> to %s done", GST_VIDEO_INFO_NAME (&space->from_info), + GST_VIDEO_INFO_NAME (&space->to_info)); return GST_FLOW_OK; diff --git a/gst/videoconvert/gstvideoconvert.h b/gst/videoconvert/gstvideoconvert.h index 21cfc40455..abd827052f 100644 --- a/gst/videoconvert/gstvideoconvert.h +++ b/gst/videoconvert/gstvideoconvert.h @@ -49,6 +49,7 @@ struct _GstVideoConvert { GstVideoInfo from_info; GstVideoInfo to_info; + gboolean negotiated; ColorSpaceColorSpec from_spec; ColorSpaceColorSpec to_spec; diff --git a/gst/videoconvert/videoconvert.c b/gst/videoconvert/videoconvert.c index 77190b6d40..690d4e0ae5 100644 --- a/gst/videoconvert/videoconvert.c +++ b/gst/videoconvert/videoconvert.c @@ -42,27 +42,31 @@ videoconvert_convert_new (GstVideoFormat to_format, ColorSpaceColorSpec to_spec, GstVideoFormat from_format, ColorSpaceColorSpec from_spec, int width, int height) { + const GstVideoFormatInfo *to_info, *from_info; VideoConvert *convert; int i; - g_return_val_if_fail (!gst_video_format_is_rgb (to_format) + from_info = gst_video_format_get_info (from_format); + to_info = gst_video_format_get_info (to_format); + + g_return_val_if_fail (!GST_VIDEO_FORMAT_INFO_IS_RGB (to_info) || to_spec == COLOR_SPEC_RGB, NULL); - g_return_val_if_fail (!gst_video_format_is_yuv (to_format) + g_return_val_if_fail (!GST_VIDEO_FORMAT_INFO_IS_YUV (to_info) || to_spec == COLOR_SPEC_YUV_BT709 || to_spec == COLOR_SPEC_YUV_BT470_6, NULL); - g_return_val_if_fail (gst_video_format_is_rgb (to_format) - || gst_video_format_is_yuv (to_format) - || (gst_video_format_is_gray (to_format) && + g_return_val_if_fail (GST_VIDEO_FORMAT_INFO_IS_RGB (to_info) + || GST_VIDEO_FORMAT_INFO_IS_YUV (to_info) + || (GST_VIDEO_FORMAT_INFO_IS_GRAY (to_info) && to_spec == COLOR_SPEC_GRAY), NULL); - g_return_val_if_fail (!gst_video_format_is_rgb (from_format) + g_return_val_if_fail (!GST_VIDEO_FORMAT_INFO_IS_RGB (from_info) || from_spec == COLOR_SPEC_RGB, NULL); - g_return_val_if_fail (!gst_video_format_is_yuv (from_format) + g_return_val_if_fail (!GST_VIDEO_FORMAT_INFO_IS_YUV (from_info) || from_spec == COLOR_SPEC_YUV_BT709 || from_spec == COLOR_SPEC_YUV_BT470_6, NULL); - g_return_val_if_fail (gst_video_format_is_rgb (from_format) - || gst_video_format_is_yuv (from_format) - || (gst_video_format_is_gray (from_format) && + g_return_val_if_fail (GST_VIDEO_FORMAT_INFO_IS_RGB (from_info) + || GST_VIDEO_FORMAT_INFO_IS_YUV (from_info) + || (GST_VIDEO_FORMAT_INFO_IS_GRAY (from_info) && from_spec == COLOR_SPEC_GRAY), NULL); convert = g_malloc (sizeof (VideoConvert)); @@ -77,8 +81,7 @@ videoconvert_convert_new (GstVideoFormat to_format, ColorSpaceColorSpec to_spec, convert->convert = videoconvert_convert_generic; convert->dither16 = videoconvert_dither_none; - if (gst_video_format_get_component_depth (to_format, 0) > 8 || - gst_video_format_get_component_depth (from_format, 0) > 8) { + if (to_info->depth[0] > 8 || from_info->depth[0] > 8) { convert->use_16bit = TRUE; } else { convert->use_16bit = FALSE; @@ -179,7 +182,7 @@ videoconvert_convert_convert (VideoConvert * convert, #define FRAME_GET_STRIDE(dir, comp) \ ((dir)->info.stride[comp]) #define FRAME_GET_LINE(dir, comp, line) \ - ((dir)->data[comp] + FRAME_GET_STRIDE (dir, comp) * (line)) + (((guint8*)(dir)->data[comp]) + FRAME_GET_STRIDE (dir, comp) * (line)) static void getline_I420 (VideoConvert * convert, guint8 * dest, const GstVideoFrame * src, diff --git a/gst/videoscale/gstvideoscale.c b/gst/videoscale/gstvideoscale.c index 3d03b67fe4..e806e3b845 100644 --- a/gst/videoscale/gstvideoscale.c +++ b/gst/videoscale/gstvideoscale.c @@ -903,20 +903,16 @@ gst_video_scale_setup_vs_image (VSImage * image, GstVideoFrame * frame, GstVideoFormat format; gint width, height; - format = frame->info.format; - width = frame->info.width; - height = frame->info.height; + format = GST_VIDEO_FRAME_FORMAT (frame); + width = GST_VIDEO_FRAME_WIDTH (frame); + height = GST_VIDEO_FRAME_HEIGHT (frame); - image->real_width = - gst_video_format_get_component_width (format, component, width); - image->real_height = - gst_video_format_get_component_height (format, component, height); - image->width = - gst_video_format_get_component_width (format, component, MAX (1, - width - b_w)); - image->height = - gst_video_format_get_component_height (format, component, MAX (1, - height - b_h)); + image->real_width = GST_VIDEO_FRAME_COMP_WIDTH (frame, component); + image->real_height = GST_VIDEO_FRAME_COMP_HEIGHT (frame, component); + image->width = GST_VIDEO_FORMAT_INFO_SCALE_WIDTH (frame->info.finfo, + component, MAX (1, width - b_w)); + image->height = GST_VIDEO_FORMAT_INFO_SCALE_HEIGHT (frame->info.finfo, + component, MAX (1, height - b_h)); image->border_top = (image->real_height - image->height) / 2; image->border_bottom = image->real_height - image->height - image->border_top; @@ -940,8 +936,7 @@ gst_video_scale_setup_vs_image (VSImage * image, GstVideoFrame * frame, image->pixels = image->real_pixels + image->border_top * image->stride + - image->border_left * gst_video_format_get_pixel_stride (format, - component); + image->border_left * GST_VIDEO_FRAME_COMP_PSTRIDE (frame, component); } static const guint8 * @@ -1025,7 +1020,7 @@ gst_video_scale_transform (GstBaseTransform * trans, GstBuffer * in, add_borders = videoscale->add_borders; GST_OBJECT_UNLOCK (videoscale); - format = videoscale->from_info.format; + format = GST_VIDEO_INFO_FORMAT (&videoscale->from_info); black = _get_black_for_format (format); if (videoscale->from_info.width == 1) { @@ -1039,7 +1034,7 @@ gst_video_scale_transform (GstBaseTransform * trans, GstBuffer * in, gst_video_frame_map (&in_frame, &videoscale->from_info, in, GST_MAP_READ); gst_video_frame_map (&out_frame, &videoscale->to_info, out, GST_MAP_WRITE); - for (i = 0; i < in_frame.info.n_planes; i++) { + for (i = 0; i < GST_VIDEO_FRAME_N_PLANES (&in_frame); i++) { gst_video_scale_setup_vs_image (&src[i], &in_frame, i, 0, 0); gst_video_scale_setup_vs_image (&dest[i], &out_frame, i, videoscale->borders_w, videoscale->borders_h); diff --git a/gst/videotestsrc/videotestsrc.c b/gst/videotestsrc/videotestsrc.c index c39ac9eb88..be5dd465ee 100644 --- a/gst/videotestsrc/videotestsrc.c +++ b/gst/videotestsrc/videotestsrc.c @@ -1562,22 +1562,22 @@ paint_tmpline_AYUV (paintinfo * p, int x, int w) static void paint_setup_I420 (paintinfo * p, GstVideoFrame * frame) { - p->yp = GST_VIDEO_FRAME_DATA (frame, 0); - p->ystride = GST_VIDEO_FRAME_STRIDE (frame, 0); - p->up = GST_VIDEO_FRAME_DATA (frame, 1); - p->ustride = GST_VIDEO_FRAME_STRIDE (frame, 1); - p->vp = GST_VIDEO_FRAME_DATA (frame, 2); - p->vstride = GST_VIDEO_FRAME_STRIDE (frame, 2); + p->yp = GST_VIDEO_FRAME_PLANE_DATA (frame, 0); + p->ystride = GST_VIDEO_FRAME_PLANE_STRIDE (frame, 0); + p->up = GST_VIDEO_FRAME_PLANE_DATA (frame, 1); + p->ustride = GST_VIDEO_FRAME_PLANE_STRIDE (frame, 1); + p->vp = GST_VIDEO_FRAME_PLANE_DATA (frame, 2); + p->vstride = GST_VIDEO_FRAME_PLANE_STRIDE (frame, 2); p->size = frame->info.size; } static void paint_setup_NV12 (paintinfo * p, GstVideoFrame * frame) { - p->yp = GST_VIDEO_FRAME_DATA (frame, 0); - p->ystride = GST_VIDEO_FRAME_STRIDE (frame, 0); - p->up = GST_VIDEO_FRAME_DATA (frame, 1); - p->ustride = GST_VIDEO_FRAME_STRIDE (frame, 1); + p->yp = GST_VIDEO_FRAME_PLANE_DATA (frame, 0); + p->ystride = GST_VIDEO_FRAME_PLANE_STRIDE (frame, 0); + p->up = GST_VIDEO_FRAME_PLANE_DATA (frame, 1); + p->ustride = GST_VIDEO_FRAME_PLANE_STRIDE (frame, 1); p->vp = p->up + 1; p->vstride = p->ustride; p->size = frame->info.size; @@ -1586,10 +1586,10 @@ paint_setup_NV12 (paintinfo * p, GstVideoFrame * frame) static void paint_setup_NV21 (paintinfo * p, GstVideoFrame * frame) { - p->yp = GST_VIDEO_FRAME_DATA (frame, 0); - p->ystride = GST_VIDEO_FRAME_STRIDE (frame, 0); - p->vp = GST_VIDEO_FRAME_DATA (frame, 1); - p->vstride = GST_VIDEO_FRAME_STRIDE (frame, 1); + p->yp = GST_VIDEO_FRAME_PLANE_DATA (frame, 0); + p->ystride = GST_VIDEO_FRAME_PLANE_STRIDE (frame, 0); + p->vp = GST_VIDEO_FRAME_PLANE_DATA (frame, 1); + p->vstride = GST_VIDEO_FRAME_PLANE_STRIDE (frame, 1); p->up = p->vp + 1; p->ustride = p->vstride; p->size = frame->info.size; @@ -1653,22 +1653,22 @@ convert_hline_NV21 (paintinfo * p, int y) static void paint_setup_YV12 (paintinfo * p, GstVideoFrame * frame) { - p->yp = GST_VIDEO_FRAME_DATA (frame, 0); - p->ystride = GST_VIDEO_FRAME_STRIDE (frame, 0); - p->up = GST_VIDEO_FRAME_DATA (frame, 1); - p->ustride = GST_VIDEO_FRAME_STRIDE (frame, 1); - p->vp = GST_VIDEO_FRAME_DATA (frame, 2); - p->vstride = GST_VIDEO_FRAME_STRIDE (frame, 2); + p->yp = GST_VIDEO_FRAME_PLANE_DATA (frame, 0); + p->ystride = GST_VIDEO_FRAME_PLANE_STRIDE (frame, 0); + p->up = GST_VIDEO_FRAME_PLANE_DATA (frame, 1); + p->ustride = GST_VIDEO_FRAME_PLANE_STRIDE (frame, 1); + p->vp = GST_VIDEO_FRAME_PLANE_DATA (frame, 2); + p->vstride = GST_VIDEO_FRAME_PLANE_STRIDE (frame, 2); p->size = frame->info.size; } static void paint_setup_v308 (paintinfo * p, GstVideoFrame * frame) { - p->yp = GST_VIDEO_FRAME_DATA (frame, 0); + p->yp = GST_VIDEO_FRAME_PLANE_DATA (frame, 0); p->up = p->yp + 1; p->vp = p->yp + 2; - p->ystride = GST_VIDEO_FRAME_STRIDE (frame, 0); + p->ystride = GST_VIDEO_FRAME_PLANE_STRIDE (frame, 0); p->ustride = p->ystride; p->vstride = p->ystride; p->size = frame->info.size; @@ -1677,11 +1677,11 @@ paint_setup_v308 (paintinfo * p, GstVideoFrame * frame) static void paint_setup_AYUV (paintinfo * p, GstVideoFrame * frame) { - p->ap = GST_VIDEO_FRAME_DATA (frame, 0); + p->ap = GST_VIDEO_FRAME_PLANE_DATA (frame, 0); p->yp = p->ap + 1; p->up = p->ap + 2; p->vp = p->ap + 3; - p->astride = GST_VIDEO_FRAME_STRIDE (frame, 0); + p->astride = GST_VIDEO_FRAME_PLANE_STRIDE (frame, 0); p->ystride = p->astride;; p->ustride = p->astride; p->vstride = p->astride; @@ -1704,11 +1704,11 @@ paint_setup_v410 (paintinfo * p, GstVideoFrame * frame) static void paint_setup_v216 (paintinfo * p, GstVideoFrame * frame) { - p->ap = GST_VIDEO_FRAME_DATA (frame, 0); + p->ap = GST_VIDEO_FRAME_PLANE_DATA (frame, 0); p->yp = p->ap + 2; p->up = p->ap + 0; p->vp = p->ap + 4; - p->astride = GST_VIDEO_FRAME_STRIDE (frame, 0); + p->astride = GST_VIDEO_FRAME_PLANE_STRIDE (frame, 0); p->ystride = p->astride;; p->ustride = p->astride; p->vstride = p->astride; @@ -1718,11 +1718,11 @@ paint_setup_v216 (paintinfo * p, GstVideoFrame * frame) static void paint_setup_v210 (paintinfo * p, GstVideoFrame * frame) { - p->ap = GST_VIDEO_FRAME_DATA (frame, 0); + p->ap = GST_VIDEO_FRAME_PLANE_DATA (frame, 0); p->yp = p->ap; p->up = p->ap; p->vp = p->ap; - p->astride = GST_VIDEO_FRAME_STRIDE (frame, 0); + p->astride = GST_VIDEO_FRAME_PLANE_STRIDE (frame, 0); p->ystride = p->astride;; p->ustride = p->astride; p->vstride = p->astride; @@ -1732,11 +1732,11 @@ paint_setup_v210 (paintinfo * p, GstVideoFrame * frame) static void paint_setup_UYVP (paintinfo * p, GstVideoFrame * frame) { - p->ap = GST_VIDEO_FRAME_DATA (frame, 0); + p->ap = GST_VIDEO_FRAME_PLANE_DATA (frame, 0); p->yp = p->ap; p->up = p->ap; p->vp = p->ap; - p->astride = GST_VIDEO_FRAME_STRIDE (frame, 0); + p->astride = GST_VIDEO_FRAME_PLANE_STRIDE (frame, 0); p->ystride = p->astride;; p->ustride = p->astride; p->vstride = p->astride; @@ -1746,10 +1746,10 @@ paint_setup_UYVP (paintinfo * p, GstVideoFrame * frame) static void paint_setup_YUY2 (paintinfo * p, GstVideoFrame * frame) { - p->yp = GST_VIDEO_FRAME_DATA (frame, 0); + p->yp = GST_VIDEO_FRAME_PLANE_DATA (frame, 0); p->up = p->yp + 1; p->vp = p->yp + 3; - p->ystride = GST_VIDEO_FRAME_STRIDE (frame, 0); + p->ystride = GST_VIDEO_FRAME_PLANE_STRIDE (frame, 0); p->ustride = p->ystride; p->vstride = p->ystride; p->size = frame->info.size; @@ -1758,10 +1758,10 @@ paint_setup_YUY2 (paintinfo * p, GstVideoFrame * frame) static void paint_setup_UYVY (paintinfo * p, GstVideoFrame * frame) { - p->up = GST_VIDEO_FRAME_DATA (frame, 0); + p->up = GST_VIDEO_FRAME_PLANE_DATA (frame, 0); p->yp = p->up + 1; p->vp = p->up + 2; - p->ystride = GST_VIDEO_FRAME_STRIDE (frame, 0); + p->ystride = GST_VIDEO_FRAME_PLANE_STRIDE (frame, 0); p->ustride = p->ystride; p->vstride = p->ystride; p->size = frame->info.size; @@ -1770,10 +1770,10 @@ paint_setup_UYVY (paintinfo * p, GstVideoFrame * frame) static void paint_setup_YVYU (paintinfo * p, GstVideoFrame * frame) { - p->yp = GST_VIDEO_FRAME_DATA (frame, 0); + p->yp = GST_VIDEO_FRAME_PLANE_DATA (frame, 0); p->up = p->yp + 3; p->vp = p->yp + 1; - p->ystride = GST_VIDEO_FRAME_STRIDE (frame, 0); + p->ystride = GST_VIDEO_FRAME_PLANE_STRIDE (frame, 0); p->ustride = p->ystride; p->vstride = p->ystride; p->size = frame->info.size; @@ -1782,11 +1782,11 @@ paint_setup_YVYU (paintinfo * p, GstVideoFrame * frame) static void paint_setup_AY64 (paintinfo * p, GstVideoFrame * frame) { - p->ap = GST_VIDEO_FRAME_DATA (frame, 0); + p->ap = GST_VIDEO_FRAME_PLANE_DATA (frame, 0); p->yp = p->ap + 2; p->up = p->ap + 4; p->vp = p->ap + 6; - p->astride = GST_VIDEO_FRAME_STRIDE (frame, 0); + p->astride = GST_VIDEO_FRAME_PLANE_STRIDE (frame, 0); p->ystride = p->astride; p->ustride = p->astride; p->vstride = p->astride; @@ -1977,10 +1977,10 @@ static void paint_setup_IYU2 (paintinfo * p, GstVideoFrame * frame) { /* untested */ - p->up = GST_VIDEO_FRAME_DATA (frame, 0); + p->up = GST_VIDEO_FRAME_PLANE_DATA (frame, 0); p->yp = p->up + 1; p->vp = p->up + 2; - p->ystride = GST_VIDEO_FRAME_STRIDE (frame, 0); + p->ystride = GST_VIDEO_FRAME_PLANE_STRIDE (frame, 0); p->ustride = p->ystride; p->vstride = p->ystride; p->size = frame->info.size; @@ -2006,12 +2006,12 @@ convert_hline_IYU2 (paintinfo * p, int y) static void paint_setup_Y41B (paintinfo * p, GstVideoFrame * frame) { - p->yp = GST_VIDEO_FRAME_DATA (frame, 0); - p->up = GST_VIDEO_FRAME_DATA (frame, 1); - p->vp = GST_VIDEO_FRAME_DATA (frame, 2); - p->ystride = GST_VIDEO_FRAME_STRIDE (frame, 0); - p->ustride = GST_VIDEO_FRAME_STRIDE (frame, 1); - p->vstride = GST_VIDEO_FRAME_STRIDE (frame, 2); + p->yp = GST_VIDEO_FRAME_PLANE_DATA (frame, 0); + p->up = GST_VIDEO_FRAME_PLANE_DATA (frame, 1); + p->vp = GST_VIDEO_FRAME_PLANE_DATA (frame, 2); + p->ystride = GST_VIDEO_FRAME_PLANE_STRIDE (frame, 0); + p->ustride = GST_VIDEO_FRAME_PLANE_STRIDE (frame, 1); + p->vstride = GST_VIDEO_FRAME_PLANE_STRIDE (frame, 2); p->size = frame->info.size; } @@ -2038,12 +2038,12 @@ convert_hline_Y41B (paintinfo * p, int y) static void paint_setup_Y42B (paintinfo * p, GstVideoFrame * frame) { - p->yp = GST_VIDEO_FRAME_DATA (frame, 0); - p->up = GST_VIDEO_FRAME_DATA (frame, 1); - p->vp = GST_VIDEO_FRAME_DATA (frame, 2); - p->ystride = GST_VIDEO_FRAME_STRIDE (frame, 0); - p->ustride = GST_VIDEO_FRAME_STRIDE (frame, 1); - p->vstride = GST_VIDEO_FRAME_STRIDE (frame, 2); + p->yp = GST_VIDEO_FRAME_PLANE_DATA (frame, 0); + p->up = GST_VIDEO_FRAME_PLANE_DATA (frame, 1); + p->vp = GST_VIDEO_FRAME_PLANE_DATA (frame, 2); + p->ystride = GST_VIDEO_FRAME_PLANE_STRIDE (frame, 0); + p->ustride = GST_VIDEO_FRAME_PLANE_STRIDE (frame, 1); + p->vstride = GST_VIDEO_FRAME_PLANE_STRIDE (frame, 2); p->size = frame->info.size; } @@ -2068,12 +2068,12 @@ convert_hline_Y42B (paintinfo * p, int y) static void paint_setup_Y444 (paintinfo * p, GstVideoFrame * frame) { - p->yp = GST_VIDEO_FRAME_DATA (frame, 0); - p->up = GST_VIDEO_FRAME_DATA (frame, 1); - p->vp = GST_VIDEO_FRAME_DATA (frame, 2); - p->ystride = GST_VIDEO_FRAME_STRIDE (frame, 0); - p->ustride = GST_VIDEO_FRAME_STRIDE (frame, 1); - p->vstride = GST_VIDEO_FRAME_STRIDE (frame, 2); + p->yp = GST_VIDEO_FRAME_PLANE_DATA (frame, 0); + p->up = GST_VIDEO_FRAME_PLANE_DATA (frame, 1); + p->vp = GST_VIDEO_FRAME_PLANE_DATA (frame, 2); + p->ystride = GST_VIDEO_FRAME_PLANE_STRIDE (frame, 0); + p->ustride = GST_VIDEO_FRAME_PLANE_STRIDE (frame, 1); + p->vstride = GST_VIDEO_FRAME_PLANE_STRIDE (frame, 2); p->size = frame->info.size; } @@ -2097,8 +2097,8 @@ static void paint_setup_Y800 (paintinfo * p, GstVideoFrame * frame) { /* untested */ - p->yp = GST_VIDEO_FRAME_DATA (frame, 0); - p->ystride = GST_VIDEO_FRAME_STRIDE (frame, 0); + p->yp = GST_VIDEO_FRAME_PLANE_DATA (frame, 0); + p->ystride = GST_VIDEO_FRAME_PLANE_STRIDE (frame, 0); p->size = frame->info.size; } @@ -2117,24 +2117,24 @@ convert_hline_Y800 (paintinfo * p, int y) static void paint_setup_YVU9 (paintinfo * p, GstVideoFrame * frame) { - p->yp = GST_VIDEO_FRAME_DATA (frame, 0); - p->up = GST_VIDEO_FRAME_DATA (frame, 1); - p->vp = GST_VIDEO_FRAME_DATA (frame, 2); - p->ystride = GST_VIDEO_FRAME_STRIDE (frame, 0); - p->ustride = GST_VIDEO_FRAME_STRIDE (frame, 1); - p->vstride = GST_VIDEO_FRAME_STRIDE (frame, 2); + p->yp = GST_VIDEO_FRAME_PLANE_DATA (frame, 0); + p->up = GST_VIDEO_FRAME_PLANE_DATA (frame, 1); + p->vp = GST_VIDEO_FRAME_PLANE_DATA (frame, 2); + p->ystride = GST_VIDEO_FRAME_PLANE_STRIDE (frame, 0); + p->ustride = GST_VIDEO_FRAME_PLANE_STRIDE (frame, 1); + p->vstride = GST_VIDEO_FRAME_PLANE_STRIDE (frame, 2); p->size = frame->info.size; } static void paint_setup_YUV9 (paintinfo * p, GstVideoFrame * frame) { - p->yp = GST_VIDEO_FRAME_DATA (frame, 0); - p->up = GST_VIDEO_FRAME_DATA (frame, 1); - p->vp = GST_VIDEO_FRAME_DATA (frame, 2); - p->ystride = GST_VIDEO_FRAME_STRIDE (frame, 0); - p->ustride = GST_VIDEO_FRAME_STRIDE (frame, 1); - p->vstride = GST_VIDEO_FRAME_STRIDE (frame, 2); + p->yp = GST_VIDEO_FRAME_PLANE_DATA (frame, 0); + p->up = GST_VIDEO_FRAME_PLANE_DATA (frame, 1); + p->vp = GST_VIDEO_FRAME_PLANE_DATA (frame, 2); + p->ystride = GST_VIDEO_FRAME_PLANE_STRIDE (frame, 0); + p->ustride = GST_VIDEO_FRAME_PLANE_STRIDE (frame, 1); + p->vstride = GST_VIDEO_FRAME_PLANE_STRIDE (frame, 2); p->size = frame->info.size; } @@ -2185,11 +2185,11 @@ paint_setup_BGRA8888 (paintinfo * p, GstVideoFrame * frame) static void paint_setup_xRGB8888 (paintinfo * p, GstVideoFrame * frame) { - p->ap = GST_VIDEO_FRAME_DATA (frame, 0); + p->ap = GST_VIDEO_FRAME_PLANE_DATA (frame, 0); p->yp = p->ap + 1; p->up = p->ap + 2; p->vp = p->ap + 3; - p->astride = GST_VIDEO_FRAME_STRIDE (frame, 0); + p->astride = GST_VIDEO_FRAME_PLANE_STRIDE (frame, 0); p->ystride = p->astride; p->ustride = p->astride; p->vstride = p->astride; @@ -2199,11 +2199,11 @@ paint_setup_xRGB8888 (paintinfo * p, GstVideoFrame * frame) static void paint_setup_xBGR8888 (paintinfo * p, GstVideoFrame * frame) { - p->ap = GST_VIDEO_FRAME_DATA (frame, 0); + p->ap = GST_VIDEO_FRAME_PLANE_DATA (frame, 0); p->yp = p->ap + 3; p->up = p->ap + 2; p->vp = p->ap + 1; - p->astride = GST_VIDEO_FRAME_STRIDE (frame, 0); + p->astride = GST_VIDEO_FRAME_PLANE_STRIDE (frame, 0); p->ystride = p->astride; p->ustride = p->astride; p->vstride = p->astride; @@ -2213,11 +2213,11 @@ paint_setup_xBGR8888 (paintinfo * p, GstVideoFrame * frame) static void paint_setup_RGBx8888 (paintinfo * p, GstVideoFrame * frame) { - p->yp = GST_VIDEO_FRAME_DATA (frame, 0); + p->yp = GST_VIDEO_FRAME_PLANE_DATA (frame, 0); p->up = p->yp + 1; p->vp = p->yp + 2; p->ap = p->yp + 3; - p->astride = GST_VIDEO_FRAME_STRIDE (frame, 0); + p->astride = GST_VIDEO_FRAME_PLANE_STRIDE (frame, 0); p->ystride = p->astride; p->ustride = p->astride; p->vstride = p->astride; @@ -2227,11 +2227,11 @@ paint_setup_RGBx8888 (paintinfo * p, GstVideoFrame * frame) static void paint_setup_BGRx8888 (paintinfo * p, GstVideoFrame * frame) { - p->vp = GST_VIDEO_FRAME_DATA (frame, 0); + p->vp = GST_VIDEO_FRAME_PLANE_DATA (frame, 0); p->up = p->vp + 1; p->yp = p->vp + 2; p->ap = p->vp + 3; - p->astride = GST_VIDEO_FRAME_STRIDE (frame, 0); + p->astride = GST_VIDEO_FRAME_PLANE_STRIDE (frame, 0); p->ystride = p->astride; p->ustride = p->astride; p->vstride = p->astride; @@ -2241,10 +2241,10 @@ paint_setup_BGRx8888 (paintinfo * p, GstVideoFrame * frame) static void paint_setup_RGB888 (paintinfo * p, GstVideoFrame * frame) { - p->yp = GST_VIDEO_FRAME_DATA (frame, 0); + p->yp = GST_VIDEO_FRAME_PLANE_DATA (frame, 0); p->up = p->yp + 1; p->vp = p->yp + 2; - p->ystride = GST_VIDEO_FRAME_STRIDE (frame, 0); + p->ystride = GST_VIDEO_FRAME_PLANE_STRIDE (frame, 0); p->ustride = p->ystride; p->vstride = p->ystride; p->size = frame->info.size; @@ -2253,10 +2253,10 @@ paint_setup_RGB888 (paintinfo * p, GstVideoFrame * frame) static void paint_setup_BGR888 (paintinfo * p, GstVideoFrame * frame) { - p->vp = GST_VIDEO_FRAME_DATA (frame, 0); + p->vp = GST_VIDEO_FRAME_PLANE_DATA (frame, 0); p->up = p->vp + 1; p->yp = p->vp + 2; - p->ystride = GST_VIDEO_FRAME_STRIDE (frame, 0); + p->ystride = GST_VIDEO_FRAME_PLANE_STRIDE (frame, 0); p->ustride = p->ystride; p->vstride = p->ystride; p->size = frame->info.size; @@ -2265,11 +2265,11 @@ paint_setup_BGR888 (paintinfo * p, GstVideoFrame * frame) static void paint_setup_ARGB64 (paintinfo * p, GstVideoFrame * frame) { - p->ap = GST_VIDEO_FRAME_DATA (frame, 0); + p->ap = GST_VIDEO_FRAME_PLANE_DATA (frame, 0); p->yp = p->ap + 2; p->up = p->ap + 4; p->yp = p->ap + 6; - p->astride = GST_VIDEO_FRAME_STRIDE (frame, 0); + p->astride = GST_VIDEO_FRAME_PLANE_STRIDE (frame, 0); p->ystride = p->astride; p->ustride = p->astride; p->vstride = p->astride; @@ -2349,8 +2349,8 @@ convert_hline_str3 (paintinfo * p, int y) static void paint_setup_RGB565 (paintinfo * p, GstVideoFrame * frame) { - p->yp = GST_VIDEO_FRAME_DATA (frame, 0); - p->ystride = GST_VIDEO_FRAME_STRIDE (frame, 0); + p->yp = GST_VIDEO_FRAME_PLANE_DATA (frame, 0); + p->ystride = GST_VIDEO_FRAME_PLANE_STRIDE (frame, 0); p->ustride = p->ystride; p->vstride = p->ystride; p->size = frame->info.size; @@ -2395,8 +2395,8 @@ convert_hline_xRGB1555 (paintinfo * p, int y) static void paint_setup_xRGB1555 (paintinfo * p, GstVideoFrame * frame) { - p->yp = GST_VIDEO_FRAME_DATA (frame, 0); - p->ystride = GST_VIDEO_FRAME_STRIDE (frame, 0); + p->yp = GST_VIDEO_FRAME_PLANE_DATA (frame, 0); + p->ystride = GST_VIDEO_FRAME_PLANE_STRIDE (frame, 0); p->ustride = p->ystride; p->vstride = p->ystride; p->size = frame->info.size; @@ -2406,7 +2406,7 @@ paint_setup_xRGB1555 (paintinfo * p, GstVideoFrame * frame) static void paint_setup_bayer_bggr (paintinfo * p, GstVideoFrame * frame) { - p->yp = GST_VIDEO_FRAME_DATA (frame, 0); + p->yp = GST_VIDEO_FRAME_PLANE_DATA (frame, 0); p->ystride = GST_ROUND_UP_4 (p->width); p->ustride = GST_ROUND_UP_4 (p->width); p->vstride = GST_ROUND_UP_4 (p->width); @@ -2418,7 +2418,7 @@ paint_setup_bayer_bggr (paintinfo * p, GstVideoFrame * frame) static void paint_setup_bayer_rggb (paintinfo * p, GstVideoFrame * frame) { - p->yp = GST_VIDEO_FRAME_DATA (frame, 0); + p->yp = GST_VIDEO_FRAME_PLANE_DATA (frame, 0); p->ystride = GST_ROUND_UP_4 (p->width); p->ustride = GST_ROUND_UP_4 (p->width); p->vstride = GST_ROUND_UP_4 (p->width); @@ -2430,7 +2430,7 @@ paint_setup_bayer_rggb (paintinfo * p, GstVideoFrame * frame) static void paint_setup_bayer_grbg (paintinfo * p, GstVideoFrame * frame) { - p->yp = GST_VIDEO_FRAME_DATA (frame, 0); + p->yp = GST_VIDEO_FRAME_PLANE_DATA (frame, 0); p->ystride = GST_ROUND_UP_4 (p->width); p->ustride = GST_ROUND_UP_4 (p->width); p->vstride = GST_ROUND_UP_4 (p->width); @@ -2442,7 +2442,7 @@ paint_setup_bayer_grbg (paintinfo * p, GstVideoFrame * frame) static void paint_setup_bayer_gbrg (paintinfo * p, GstVideoFrame * frame) { - p->yp = GST_VIDEO_FRAME_DATA (frame, 0); + p->yp = GST_VIDEO_FRAME_PLANE_DATA (frame, 0); p->ystride = GST_ROUND_UP_4 (p->width); p->ustride = GST_ROUND_UP_4 (p->width); p->vstride = GST_ROUND_UP_4 (p->width); @@ -2482,8 +2482,8 @@ convert_hline_bayer (paintinfo * p, int y) static void paint_setup_GRAY8 (paintinfo * p, GstVideoFrame * frame) { - p->yp = GST_VIDEO_FRAME_DATA (frame, 0); - p->ystride = GST_VIDEO_FRAME_STRIDE (frame, 0); + p->yp = GST_VIDEO_FRAME_PLANE_DATA (frame, 0); + p->ystride = GST_VIDEO_FRAME_PLANE_STRIDE (frame, 0); p->size = frame->info.size; } @@ -2503,8 +2503,8 @@ convert_hline_GRAY8 (paintinfo * p, int y) static void paint_setup_GRAY16 (paintinfo * p, GstVideoFrame * frame) { - p->yp = GST_VIDEO_FRAME_DATA (frame, 0); - p->ystride = GST_VIDEO_FRAME_STRIDE (frame, 0); + p->yp = GST_VIDEO_FRAME_PLANE_DATA (frame, 0); + p->ystride = GST_VIDEO_FRAME_PLANE_STRIDE (frame, 0); p->size = frame->info.size; } diff --git a/sys/ximage/ximagepool.c b/sys/ximage/ximagepool.c index 21068ca861..2752831a99 100644 --- a/sys/ximage/ximagepool.c +++ b/sys/ximage/ximagepool.c @@ -508,21 +508,25 @@ ximage_buffer_pool_alloc (GstBufferPool * pool, GstBuffer ** buffer, { GstXImageBufferPool *xpool = GST_XIMAGE_BUFFER_POOL_CAST (pool); GstXImageBufferPoolPrivate *priv = xpool->priv; + GstVideoInfo *info; GstBuffer *ximage; GstMetaXImage *meta; + info = &priv->info; + ximage = gst_buffer_new (); meta = - gst_buffer_add_meta_ximage (ximage, xpool->sink, priv->info.width, - priv->info.height); + gst_buffer_add_meta_ximage (ximage, xpool->sink, + GST_VIDEO_INFO_WIDTH (info), GST_VIDEO_INFO_HEIGHT (info)); if (meta == NULL) { gst_buffer_unref (ximage); goto no_buffer; } if (priv->add_metavideo) { + GST_DEBUG_OBJECT (pool, "adding GstMetaVideo"); /* these are just the defaults for now */ - gst_buffer_add_meta_video (ximage, 0, priv->info.format, priv->info.width, - priv->info.height); + gst_buffer_add_meta_video (ximage, 0, GST_VIDEO_INFO_FORMAT (info), + GST_VIDEO_INFO_WIDTH (info), GST_VIDEO_INFO_HEIGHT (info)); } *buffer = ximage; diff --git a/sys/xvimage/xvimagepool.c b/sys/xvimage/xvimagepool.c index 40f294c951..a95a490dea 100644 --- a/sys/xvimage/xvimagepool.c +++ b/sys/xvimage/xvimagepool.c @@ -555,22 +555,27 @@ xvimage_buffer_pool_alloc (GstBufferPool * pool, GstBuffer ** buffer, { GstXvImageBufferPool *xvpool = GST_XVIMAGE_BUFFER_POOL_CAST (pool); GstXvImageBufferPoolPrivate *priv = xvpool->priv; + GstVideoInfo *info; GstBuffer *xvimage; GstMetaXvImage *meta; + info = &priv->info; + xvimage = gst_buffer_new (); meta = - gst_buffer_add_meta_xvimage (xvimage, xvpool->sink, priv->info.width, - priv->info.height, priv->im_format); + gst_buffer_add_meta_xvimage (xvimage, xvpool->sink, + GST_VIDEO_INFO_WIDTH (info), GST_VIDEO_INFO_HEIGHT (info), + priv->im_format); if (meta == NULL) { gst_buffer_unref (xvimage); goto no_buffer; } if (priv->add_metavideo) { + GST_DEBUG_OBJECT (pool, "adding GstMetaVideo"); /* these are just the defaults for now */ - gst_buffer_add_meta_video (xvimage, 0, priv->info.format, priv->info.width, - priv->info.height); + gst_buffer_add_meta_video (xvimage, 0, GST_VIDEO_INFO_FORMAT (info), + GST_VIDEO_INFO_WIDTH (info), GST_VIDEO_INFO_HEIGHT (info)); } *buffer = xvimage;