/**
* gst_video_info_init:
- * @info: a #GstVideoInfo
+ * @info: (out caller-allocates): a #GstVideoInfo
*
* Initialize @info with default values.
*/
#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),
/**
* gst_video_info_from_caps:
- * @info: a #GstVideoInfo
+ * @info: (out caller-allocates): #GstVideoInfo
* @caps: a #GstCaps
*
* Parse @caps and update @info.
}
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;
* 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;
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:
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;
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:
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;
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];
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];
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:
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);
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;
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 {
* 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)
{
* @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.
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]);
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;