mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-09-19 02:20:20 +00:00
ecdfb96f17
Move different video functionalities into different files
181 lines
5 KiB
C
181 lines
5 KiB
C
/* GStreamer
|
|
* Copyright (C) <1999> Erik Walthinsen <omega@cse.ogi.edu>
|
|
* Library <2002> Ronald Bultje <rbultje@ronald.bitfreak.net>
|
|
* Copyright (C) 2007 David A. Schleef <ds@schleef.org>
|
|
*
|
|
* 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 <string.h>
|
|
#include <stdio.h>
|
|
|
|
#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
|