X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=gst-libs%2Fgst%2Fvideo%2Fvideo-info.c;h=93bede5178967be8ae1c233b5f1380eeadc7e904;hb=1b4ae195f72665dc21f133ee656333a025f67bb0;hp=93aa0248416e7d54bf39980e483835beea1a5018;hpb=ea063721d269068ece8023b52a680762b65abfbe;p=platform%2Fupstream%2Fgstreamer.git diff --git a/gst-libs/gst/video/video-info.c b/gst-libs/gst/video/video-info.c index 93aa024..93bede5 100644 --- a/gst-libs/gst/video/video-info.c +++ b/gst-libs/gst/video/video-info.c @@ -117,7 +117,7 @@ static gboolean fill_planes (GstVideoInfo * info, /** * gst_video_info_init: - * @info: a #GstVideoInfo + * @info: (out caller-allocates): a #GstVideoInfo * * Initialize @info with default values. */ @@ -153,7 +153,7 @@ gst_video_info_init (GstVideoInfo * info) #define DEFAULT_YUV_UHD 5 static const GstVideoColorimetry default_color[] = { - MAKE_COLORIMETRY (_16_235, BT601, BT709, SMPTE170M), + MAKE_COLORIMETRY (_16_235, BT601, BT601, SMPTE170M), MAKE_COLORIMETRY (_16_235, BT709, BT709, BT709), MAKE_COLORIMETRY (_0_255, RGB, SRGB, BT709), MAKE_COLORIMETRY (_0_255, BT601, UNKNOWN, UNKNOWN), @@ -385,7 +385,7 @@ gst_video_field_order_from_string (const gchar * order) /** * gst_video_info_from_caps: - * @info: a #GstVideoInfo + * @info: (out caller-allocates): #GstVideoInfo * @caps: a #GstCaps * * Parse @caps and update @info. @@ -508,7 +508,7 @@ gst_video_info_from_caps (GstVideoInfo * info, const GstCaps * caps) } if ((s = gst_structure_get_string (structure, "chroma-site"))) - info->chroma_site = gst_video_chroma_from_string (s); + info->chroma_site = gst_video_chroma_site_from_string (s); else info->chroma_site = GST_VIDEO_CHROMA_SITE_UNKNOWN; @@ -641,7 +641,7 @@ gst_video_info_is_equal (const GstVideoInfo * info, const GstVideoInfo * other) * Returns: a new #GstCaps containing the info of @info. */ GstCaps * -gst_video_info_to_caps (GstVideoInfo * info) +gst_video_info_to_caps (const GstVideoInfo * info) { GstCaps *caps; const gchar *format; @@ -686,14 +686,14 @@ gst_video_info_to_caps (GstVideoInfo * info) if (GST_VIDEO_INFO_MULTIVIEW_MODE (info) != GST_VIDEO_MULTIVIEW_MODE_NONE) { const gchar *caps_str = NULL; + GstVideoMultiviewFlags multiview_flags = + GST_VIDEO_INFO_MULTIVIEW_FLAGS (info); /* If the half-aspect flag is set, applying it into the PAR of the * resulting caps now seems safe, and helps with automatic behaviour * in elements that aren't explicitly multiview aware */ - if (GST_VIDEO_INFO_MULTIVIEW_FLAGS (info) & - GST_VIDEO_MULTIVIEW_FLAGS_HALF_ASPECT) { - GST_VIDEO_INFO_MULTIVIEW_FLAGS (info) &= - ~GST_VIDEO_MULTIVIEW_FLAGS_HALF_ASPECT; + if (multiview_flags & GST_VIDEO_MULTIVIEW_FLAGS_HALF_ASPECT) { + multiview_flags &= ~GST_VIDEO_MULTIVIEW_FLAGS_HALF_ASPECT; switch (GST_VIDEO_INFO_MULTIVIEW_MODE (info)) { case GST_VIDEO_MULTIVIEW_MODE_SIDE_BY_SIDE: case GST_VIDEO_MULTIVIEW_MODE_SIDE_BY_SIDE_QUINCUNX: @@ -716,16 +716,25 @@ gst_video_info_to_caps (GstVideoInfo * info) if (caps_str != NULL) { gst_caps_set_simple (caps, "multiview-mode", G_TYPE_STRING, caps_str, "multiview-flags", GST_TYPE_VIDEO_MULTIVIEW_FLAGSET, - GST_VIDEO_INFO_MULTIVIEW_FLAGS (info), GST_FLAG_SET_MASK_EXACT, NULL); + multiview_flags, GST_FLAG_SET_MASK_EXACT, NULL); } } gst_caps_set_simple (caps, "pixel-aspect-ratio", GST_TYPE_FRACTION, par_n, par_d, NULL); - if (info->chroma_site != GST_VIDEO_CHROMA_SITE_UNKNOWN) - gst_caps_set_simple (caps, "chroma-site", G_TYPE_STRING, - gst_video_chroma_to_string (info->chroma_site), NULL); + if (info->chroma_site != GST_VIDEO_CHROMA_SITE_UNKNOWN) { + gchar *chroma_site = gst_video_chroma_site_to_string (info->chroma_site); + + if (!chroma_site) { + GST_WARNING ("Couldn't convert chroma-site 0x%x to string", + info->chroma_site); + } else { + gst_caps_set_simple (caps, + "chroma-site", G_TYPE_STRING, chroma_site, NULL); + g_free (chroma_site); + } + } /* make sure we set the RGB matrix for RGB formats */ colorimetry = info->colorimetry; @@ -789,6 +798,7 @@ fill_planes (GstVideoInfo * info, gsize plane_size[GST_VIDEO_MAX_PLANES]) case GST_VIDEO_FORMAT_RGBA: case GST_VIDEO_FORMAT_BGRx: case GST_VIDEO_FORMAT_BGRA: + case GST_VIDEO_FORMAT_SR32: case GST_VIDEO_FORMAT_xRGB: case GST_VIDEO_FORMAT_ARGB: case GST_VIDEO_FORMAT_xBGR: @@ -838,6 +848,7 @@ fill_planes (GstVideoInfo * info, gsize plane_size[GST_VIDEO_MAX_PLANES]) break; case GST_VIDEO_FORMAT_GRAY16_BE: case GST_VIDEO_FORMAT_GRAY16_LE: + case GST_VIDEO_FORMAT_INVZ: info->stride[0] = GST_ROUND_UP_4 (width * 2); info->offset[0] = 0; info->size = info->stride[0] * height; @@ -862,12 +873,19 @@ fill_planes (GstVideoInfo * info, gsize plane_size[GST_VIDEO_MAX_PLANES]) break; case GST_VIDEO_FORMAT_ARGB64: case GST_VIDEO_FORMAT_AYUV64: + case GST_VIDEO_FORMAT_Y412_BE: + case GST_VIDEO_FORMAT_Y412_LE: info->stride[0] = width * 8; info->offset[0] = 0; info->size = info->stride[0] * height; break; case GST_VIDEO_FORMAT_I420: + case GST_VIDEO_FORMAT_S420: case GST_VIDEO_FORMAT_YV12: /* same as I420, but plane 1+2 swapped */ +#ifdef TIZEN_PROFILE_TV + case GST_VIDEO_FORMAT_STV0: + case GST_VIDEO_FORMAT_STV1: +#endif 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]; @@ -901,6 +919,8 @@ fill_planes (GstVideoInfo * info, gsize plane_size[GST_VIDEO_MAX_PLANES]) break; case GST_VIDEO_FORMAT_Y444: case GST_VIDEO_FORMAT_GBR: + case GST_VIDEO_FORMAT_RGBP: + case GST_VIDEO_FORMAT_BGRP: info->stride[0] = GST_ROUND_UP_4 (width); info->stride[1] = info->stride[0]; info->stride[2] = info->stride[0]; @@ -921,15 +941,34 @@ fill_planes (GstVideoInfo * info, gsize plane_size[GST_VIDEO_MAX_PLANES]) info->size = info->stride[0] * height * 4; break; case GST_VIDEO_FORMAT_NV12: +#ifdef TIZEN_FEATURE_VIDEO_MODIFICATION + case GST_VIDEO_FORMAT_SN12: + case GST_VIDEO_FORMAT_ST12: + case GST_VIDEO_FORMAT_SN21: +#endif 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); +#ifdef TIZEN_FEATURE_VIDEO_MODIFICATION + info->size = info->stride[0] * GST_ROUND_UP_2 (height) * 3 / 2; +#else cr_h = GST_ROUND_UP_2 (height) / 2; if (GST_VIDEO_INFO_IS_INTERLACED (info)) cr_h = GST_ROUND_UP_2 (cr_h); info->size = info->offset[1] + info->stride[0] * cr_h; +#endif + break; + case GST_VIDEO_FORMAT_AV12: + 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] * 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); break; case GST_VIDEO_FORMAT_NV16: case GST_VIDEO_FORMAT_NV61: @@ -1043,8 +1082,27 @@ fill_planes (GstVideoInfo * info, gsize plane_size[GST_VIDEO_MAX_PLANES]) info->offset[0] = 0; info->offset[1] = GST_ROUND_UP_128 (width) * GST_ROUND_UP_32 (height); info->size = info->offset[1] + - GST_ROUND_UP_128 (width) * GST_ROUND_UP_64 (height) / 2; + GST_ROUND_UP_128 (width) * (GST_ROUND_UP_64 (height) / 2); + break; + case GST_VIDEO_FORMAT_NV12_4L4: + case GST_VIDEO_FORMAT_NV12_32L32: + { + gint ws = GST_VIDEO_FORMAT_INFO_TILE_WS (info->finfo); + gint hs = GST_VIDEO_FORMAT_INFO_TILE_HS (info->finfo); + info->stride[0] = + GST_VIDEO_TILE_MAKE_STRIDE (GST_ROUND_UP_N (width, 1 << ws) >> ws, + GST_ROUND_UP_N (height, 1 << hs) >> hs); + info->stride[1] = + GST_VIDEO_TILE_MAKE_STRIDE (GST_ROUND_UP_N (width, 1 << ws) >> ws, + GST_ROUND_UP_N (height, 1 << (hs + 1)) >> (hs + 1)); + info->offset[0] = 0; + info->offset[1] = + GST_ROUND_UP_N (width, 1 << ws) * GST_ROUND_UP_N (height, 1 << hs); + info->size = info->offset[1] + + GST_ROUND_UP_N (width, 1 << ws) * + (GST_ROUND_UP_N (height, 1 << (hs + 1)) / 2); break; + } case GST_VIDEO_FORMAT_A420_10LE: case GST_VIDEO_FORMAT_A420_10BE: info->stride[0] = GST_ROUND_UP_4 (width * 2); @@ -1135,6 +1193,9 @@ fill_planes (GstVideoInfo * info, gsize plane_size[GST_VIDEO_MAX_PLANES]) case GST_VIDEO_FORMAT_ENCODED: break; case GST_VIDEO_FORMAT_UNKNOWN: +#ifdef TIZEN_FEATURE_VIDEO_MODIFICATION + default: +#endif GST_ERROR ("invalid format"); g_warning ("invalid format"); return FALSE; @@ -1144,13 +1205,13 @@ fill_planes (GstVideoInfo * info, gsize plane_size[GST_VIDEO_MAX_PLANES]) if (plane_size) { for (i = 0; i < GST_VIDEO_MAX_PLANES; i++) { if (i < GST_VIDEO_INFO_N_PLANES (info)) { - gint comps[GST_VIDEO_MAX_COMPONENTS]; + gint comp[GST_VIDEO_MAX_COMPONENTS]; guint plane_height; /* Convert plane index to component index */ - gst_video_format_info_component (info->finfo, i, comps); + gst_video_format_info_component (info->finfo, i, comp); plane_height = - GST_VIDEO_FORMAT_INFO_SCALE_HEIGHT (info->finfo, comps[0], + GST_VIDEO_FORMAT_INFO_SCALE_HEIGHT (info->finfo, comp[0], GST_VIDEO_INFO_FIELD_HEIGHT (info)); plane_size[i] = plane_height * GST_VIDEO_INFO_PLANE_STRIDE (info, i); } else { @@ -1178,7 +1239,7 @@ fill_planes (GstVideoInfo * info, gsize plane_size[GST_VIDEO_MAX_PLANES]) * Returns: TRUE if the conversion was successful. */ gboolean -gst_video_info_convert (GstVideoInfo * info, +gst_video_info_convert (const GstVideoInfo * info, GstFormat src_format, gint64 src_value, GstFormat dest_format, gint64 * dest_value) { @@ -1294,6 +1355,9 @@ done: * @align: alignment parameters * @plane_size: (out) (allow-none): array used to store the plane sizes * + * Extra padding will be added to the right side when stride alignment padding + * is required and @align will be updated with the new padding values. + * * This variant of gst_video_info_align() provides the updated size, in bytes, * of each video plane after the alignment, including all horizontal and vertical * paddings. @@ -1332,11 +1396,14 @@ gst_video_info_align_full (GstVideoInfo * info, GstVideoAlignment * align, GST_LOG ("left padding %u", align->padding_left); aligned = TRUE; for (i = 0; i < n_planes; i++) { + gint comp[GST_VIDEO_MAX_COMPONENTS]; gint hedge; /* this is the amount of pixels to add as left padding */ - hedge = GST_VIDEO_FORMAT_INFO_SCALE_WIDTH (vinfo, i, align->padding_left); - hedge *= GST_VIDEO_FORMAT_INFO_PSTRIDE (vinfo, i); + gst_video_format_info_component (vinfo, i, comp); + hedge = GST_VIDEO_FORMAT_INFO_SCALE_WIDTH (vinfo, comp[0], + align->padding_left); + hedge *= GST_VIDEO_FORMAT_INFO_PSTRIDE (vinfo, comp[0]); GST_LOG ("plane %d, padding %d, alignment %u", i, hedge, align->stride_align[i]); @@ -1384,25 +1451,20 @@ gst_video_info_align_full (GstVideoInfo * info, GstVideoAlignment * align, info->height = height; for (i = 0; i < n_planes; i++) { - gint vedge, hedge, comp; - - /* Find the component for this plane, FIXME, we assume the plane number and - * component number is the same for now, for scaling the dimensions this is - * currently true for all formats but it might not be when adding new - * formats. We might need to add a plane subsamling in the format info to - * make this more generic or maybe use a plane -> component mapping. */ - comp = i; + gint comp[GST_VIDEO_MAX_COMPONENTS]; + gint vedge, hedge; + gst_video_format_info_component (info->finfo, i, comp); hedge = - GST_VIDEO_FORMAT_INFO_SCALE_WIDTH (vinfo, comp, align->padding_left); + GST_VIDEO_FORMAT_INFO_SCALE_WIDTH (vinfo, comp[0], align->padding_left); vedge = - GST_VIDEO_FORMAT_INFO_SCALE_HEIGHT (vinfo, comp, align->padding_top); + GST_VIDEO_FORMAT_INFO_SCALE_HEIGHT (vinfo, comp[0], align->padding_top); GST_DEBUG ("plane %d: comp: %d, hedge %d vedge %d align %d stride %d", i, - comp, hedge, vedge, align->stride_align[i], info->stride[i]); + comp[0], hedge, vedge, align->stride_align[i], info->stride[i]); info->offset[i] += (vedge * info->stride[i]) + - (hedge * GST_VIDEO_FORMAT_INFO_PSTRIDE (vinfo, comp)); + (hedge * GST_VIDEO_FORMAT_INFO_PSTRIDE (vinfo, comp[0])); } return TRUE;