/* GStreamer * Copyright (C) <1999> Erik Walthinsen * Library <2002> Ronald Bultje * Copyright (C) 2007 David A. Schleef * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #ifdef HAVE_CONFIG_H # include "config.h" #endif #include #include #include "video-color.h" typedef struct { const gchar *name; GstVideoColorimetry color; } ColorimetryInfo; #define MAKE_COLORIMETRY(n,r,m,t,p) { GST_VIDEO_COLORIMETRY_ ##n, \ { GST_VIDEO_COLOR_RANGE ##r, GST_VIDEO_COLOR_MATRIX_ ##m, \ GST_VIDEO_TRANSFER_ ##t, GST_VIDEO_COLOR_PRIMARIES_ ##p } } #define GST_VIDEO_COLORIMETRY_NONAME NULL #define DEFAULT_YUV_SD 0 #define DEFAULT_YUV_HD 1 #define DEFAULT_RGB 3 #define DEFAULT_GRAY 4 #define DEFAULT_UNKNOWN 5 static const ColorimetryInfo colorimetry[] = { MAKE_COLORIMETRY (BT601, _16_235, BT601, BT709, BT470M), MAKE_COLORIMETRY (BT709, _16_235, BT709, BT709, BT709), MAKE_COLORIMETRY (SMPTE240M, _16_235, SMPTE240M, SMPTE240M, SMPTE240M), MAKE_COLORIMETRY (NONAME, _0_255, RGB, UNKNOWN, UNKNOWN), MAKE_COLORIMETRY (NONAME, _0_255, BT601, UNKNOWN, UNKNOWN), MAKE_COLORIMETRY (NONAME, _UNKNOWN, UNKNOWN, UNKNOWN, UNKNOWN), }; static const ColorimetryInfo * gst_video_get_colorimetry (const gchar * s) { gint i; for (i = 0; colorimetry[i].name; i++) { if (g_str_equal (colorimetry[i].name, s)) return &colorimetry[i]; } return NULL; } #define IS_EQUAL(ci,i) (((ci)->color.range == (i)->range) && \ ((ci)->color.matrix == (i)->matrix) && \ ((ci)->color.transfer == (i)->transfer) && \ ((ci)->color.primaries == (i)->primaries)) #define IS_UNKNOWN(ci) (IS_EQUAL (&colorimetry[DEFAULT_UNKNOWN], ci)) /** * gst_video_colorimetry_from_string * @cinfo: a #GstVideoColorimetry * @color: a colorimetry string * * Parse the colorimetry string and update @cinfo with the parsed * values. * * Returns: #TRUE if @color points to valid colorimetry info. */ gboolean gst_video_colorimetry_from_string (GstVideoColorimetry * cinfo, const gchar * color) { const ColorimetryInfo *ci; if ((ci = gst_video_get_colorimetry (color))) { *cinfo = ci->color; } else { gint r, m, t, p; if (sscanf (color, "%d:%d:%d:%d", &r, &m, &t, &p) == 4) { cinfo->range = r; cinfo->matrix = m; cinfo->transfer = t; cinfo->primaries = p; } } return TRUE; } /** * gst_video_colorimetry_to_string * @cinfo: a #GstVideoColorimetry * * Make a string representation of @cinfo. * * Returns: a string representation of @cinfo. */ gchar * gst_video_colorimetry_to_string (GstVideoColorimetry * cinfo) { gint i; for (i = 0; colorimetry[i].name; i++) { if (IS_EQUAL (&colorimetry[i], cinfo)) { return g_strdup (colorimetry[i].name); } } if (!IS_UNKNOWN (cinfo)) { return g_strdup_printf ("%d:%d:%d:%d", cinfo->range, cinfo->matrix, cinfo->transfer, cinfo->primaries); } return NULL; } /** * gst_video_colorimetry_matches: * @info: a #GstVideoInfo * @color: a colorimetry string * * Check if the colorimetry information in @info matches that of the * string @color. * * Returns: #TRUE if @color conveys the same colorimetry info as the color * information in @info. */ gboolean gst_video_colorimetry_matches (GstVideoColorimetry * cinfo, const gchar * color) { const ColorimetryInfo *ci; if ((ci = gst_video_get_colorimetry (color))) return IS_EQUAL (ci, cinfo); return FALSE; } #if 0 typedef struct { GstVideoColorPrimaries primaries; gdouble xW, yW; gdouble xR, yR; gdouble xG, yG; gdouble xB, yB; } PrimariesInfo; #define WP_C 0.31006, 0.31616 #define WP_D65 0.31271, 0.32902 static const PrimariesInfo primaries[] = { {GST_VIDEO_COLOR_PRIMARIES_UNKNOWN, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, {GST_VIDEO_COLOR_PRIMARIES_BT709, WP_D65, 0.64, 0.33, 0.30, 0.60, 0.15, 0.06}, {GST_VIDEO_COLOR_PRIMARIES_BT470M, WP_C, 0.67, 0.33, 0.21, 0.71, 0.14, 0.08}, {GST_VIDEO_COLOR_PRIMARIES_BT470BG, WP_D65, 0.64, 0.33, 0.29, 0.60, 0.15, 0.06}, {GST_VIDEO_COLOR_PRIMARIES_SMPTE170M, WP_D65, 0.63, 0.34, 0.31, 0.595, 0.155, 0.07}, {GST_VIDEO_COLOR_PRIMARIES_SMPTE240M, WP_D65, 0.63, 0.34, 0.31, 0.595, 0.155, 0.07}, {GST_VIDEO_COLOR_PRIMARIES_FILM, WP_C, 0.681, 0.319, 0.243, 0.692, 0.145, 0.049} }; #endif