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;