From: Wim Taymans Date: Tue, 23 Aug 2011 16:57:35 +0000 (+0200) Subject: video: add colorimetry info X-Git-Tag: 1.19.3~511^2~7332 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=9ad89374a39dbf2853197974c829fbdebf32fa5b;p=platform%2Fupstream%2Fgstreamer.git video: add colorimetry info Make enums for the chroma siting for easier use in the videoinfo. Make enums for the color range, color matrix, transfer function and the color primaries. Add these values to the video info structure in a Colorimetry structure. These values define the exact colors and are needed to perform correct colorspace conversion. Use a couple of predefined colorimetry specs because in practice only a few combinations are in use. Add view_id to the video frames to identify the view this frame represents in multiview video. Remove old gst_video_parse_caps_framerate, use the videoinfo for this. Port elements to new colorimetry info. Remove deprecated colorspace property from videotestsrc. --- diff --git a/ext/theora/gsttheoradec.c b/ext/theora/gsttheoradec.c index 65119e5..e5eb6d7 100644 --- a/ext/theora/gsttheoradec.c +++ b/ext/theora/gsttheoradec.c @@ -955,8 +955,24 @@ theora_handle_type_packet (GstTheoraDec * dec, ogg_packet * packet) dec->vinfo.fps_d = dec->info.fps_denominator; dec->vinfo.par_n = par_num; dec->vinfo.par_d = par_den; - dec->vinfo.chroma_site = "jpeg"; - dec->vinfo.color_matrix = "sdtv"; + + /* these values are for all versions of the colorspace specified in the + * theora info */ + dec->vinfo.chroma_site = GST_VIDEO_CHROMA_JPEG; + dec->vinfo.colorimetry.range = GST_VIDEO_COLOR_RANGE_16_235; + dec->vinfo.colorimetry.matrix = GST_VIDEO_COLOR_MATRIX_BT601; + dec->vinfo.colorimetry.transfer = GST_VIDEO_TRANSFER_BT709; + switch (dec->info.colorspace) { + case TH_CS_ITU_REC_470M: + dec->vinfo.colorimetry.primaries = GST_VIDEO_COLOR_PRIMARIES_BT470M; + break; + case TH_CS_ITU_REC_470BG: + dec->vinfo.colorimetry.primaries = GST_VIDEO_COLOR_PRIMARIES_BT470BG; + break; + default: + dec->vinfo.colorimetry.primaries = GST_VIDEO_COLOR_PRIMARIES_UNKNOWN; + break; + } caps = gst_video_info_to_caps (&dec->vinfo); gst_pad_set_caps (dec->srcpad, caps); diff --git a/gst-libs/gst/video/video.c b/gst-libs/gst/video/video.c index e714843..59314d0 100644 --- a/gst-libs/gst/video/video.c +++ b/gst-libs/gst/video/video.c @@ -608,6 +608,145 @@ gst_video_info_set_format (GstVideoInfo * info, GstVideoFormat format, fill_planes (info); } +static GstVideoChromaSite +gst_video_chroma_from_string (const gchar * s) +{ + GstVideoChromaSite res; + + if (g_str_equal (s, "jpeg")) { + res = GST_VIDEO_CHROMA_JPEG; + } else if (g_str_equal (s, "mpeg2")) { + res = GST_VIDEO_CHROMA_MPEG2; + } else if (g_str_equal (s, "dv")) { + res = GST_VIDEO_CHROMA_DV; + } else { + res = GST_VIDEO_CHROMA_NONE; + } + return res; +} + +static const gchar * +gst_video_chroma_to_string (GstVideoChromaSite site) +{ + const gchar *res; + + switch (site) { + case GST_VIDEO_CHROMA_JPEG: + res = "jpeg"; + break; + case GST_VIDEO_CHROMA_MPEG2: + res = "mpeg2"; + break; + case GST_VIDEO_CHROMA_DV: + res = "dv"; + break; + default: + res = NULL; + break; + } + return res; +} + +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 } } + +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), + {NULL,} +}; + +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)) + + +/** + * 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 { + /* FIXME, split and parse */ + cinfo->range = GST_VIDEO_COLOR_RANGE_16_235; + cinfo->matrix = GST_VIDEO_COLOR_MATRIX_BT601; + cinfo->transfer = GST_VIDEO_TRANSFER_BT709; + cinfo->primaries = GST_VIDEO_COLOR_PRIMARIES_BT709; + } + return TRUE; +} + +static void +gst_video_caps_set_colorimetry (GstCaps * caps, GstVideoColorimetry * cinfo) +{ + gint i; + + for (i = 0; colorimetry[i].name; i++) { + if (IS_EQUAL (&colorimetry[i], cinfo)) { + gst_caps_set_simple (caps, "colorimetry", G_TYPE_STRING, + colorimetry[i].name, NULL); + return; + } + } + /* FIXME, construct colorimetry */ +} + +/** + * 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; +} + /** * gst_video_info_from_caps: * @info: a #GstVideoInfo @@ -673,17 +812,11 @@ gst_video_info_from_caps (GstVideoInfo * info, const GstCaps * caps) else info->views = 1; - s = gst_structure_get_string (structure, "color-matrix"); - if (s) - info->color_matrix = s; - else - info->color_matrix = "sdtv"; + if ((s = gst_structure_get_string (structure, "chroma-site"))) + info->chroma_site = gst_video_chroma_from_string (s); - s = gst_structure_get_string (structure, "chroma-site"); - if (s) - info->chroma_site = s; - else - info->chroma_site = "mpeg2"; + if ((s = gst_structure_get_string (structure, "colorimetry"))) + gst_video_colorimetry_from_string (&info->colorimetry, s); if (gst_structure_get_fraction (structure, "pixel-aspect-ratio", &par_n, &par_d)) { @@ -750,14 +883,16 @@ gst_video_info_to_caps (GstVideoInfo * info) "height", G_TYPE_INT, info->height, "framerate", GST_TYPE_FRACTION, info->fps_n, info->fps_d, "pixel-aspect-ratio", GST_TYPE_FRACTION, info->par_n, info->par_d, NULL); + if (info->flags & GST_VIDEO_FLAG_INTERLACED) gst_caps_set_simple (caps, "interlaced", G_TYPE_BOOLEAN, TRUE, NULL); - if (info->color_matrix) - gst_caps_set_simple (caps, "color-matrix", G_TYPE_STRING, - info->color_matrix, NULL); - if (info->chroma_site) - gst_caps_set_simple (caps, "chroma-site", G_TYPE_STRING, info->chroma_site, - NULL); + + if (info->chroma_site != GST_VIDEO_CHROMA_UNKNOWN) + gst_caps_set_simple (caps, "chroma-site", G_TYPE_STRING, + gst_video_chroma_to_string (info->chroma_site), NULL); + + gst_video_caps_set_colorimetry (caps, &info->colorimetry); + if (info->views > 1) gst_caps_set_simple (caps, "views", G_TYPE_INT, info->views, NULL); @@ -1300,36 +1435,6 @@ gst_video_event_parse_still_frame (GstEvent * event, gboolean * in_still) } /** - * gst_video_parse_caps_framerate: - * @caps: pointer to a #GstCaps instance - * @fps_n: pointer to integer to hold numerator of frame rate (output) - * @fps_d: pointer to integer to hold denominator of frame rate (output) - * - * Extracts the frame rate from @caps and places the values in the locations - * pointed to by @fps_n and @fps_d. Returns TRUE if the values could be - * parsed correctly, FALSE if not. - * - * This function can be used with #GstCaps that have any media type; it - * is not limited to formats handled by #GstVideoFormat. - * - * Since: 0.10.16 - * - * Returns: TRUE if @caps was parsed correctly. - */ -gboolean -gst_video_parse_caps_framerate (GstCaps * caps, int *fps_n, int *fps_d) -{ - GstStructure *structure; - - if (!gst_caps_is_fixed (caps)) - return FALSE; - - structure = gst_caps_get_structure (caps, 0); - - return gst_structure_get_fraction (structure, "framerate", fps_n, fps_d); -} - -/** * gst_video_parse_caps_palette: * @caps: #GstCaps to parse * @@ -1356,7 +1461,7 @@ gst_video_parse_caps_palette (GstCaps * caps) if (!p_v || !GST_VALUE_HOLDS_BUFFER (p_v)) return NULL; - p = gst_buffer_ref (gst_value_get_buffer (p_v)); + p = g_value_dup_boxed (p_v); return p; } diff --git a/gst-libs/gst/video/video.h b/gst-libs/gst/video/video.h index 59e68fc..41f7fbf 100644 --- a/gst-libs/gst/video/video.h +++ b/gst-libs/gst/video/video.h @@ -324,6 +324,146 @@ typedef enum { } GstVideoFlags; /** + * GstVideoChroma: + * @GST_VIDEO_CHROMA_UNKNOWN: unknown cositing + * @GST_VIDEO_CHROMA_NONE: no cositing + * @GST_VIDEO_CHROMA_H_COSITED: chroma is horizontally cosited + * @GST_VIDEO_CHROMA_V_COSITED: chroma is vertically cosited + * @GST_VIDEO_CHROMA_ALT_LINE: choma samples are sited on alternate lines + * @GST_VIDEO_CHROMA_COSITED: chroma samples cosited with luma samples + * @GST_VIDEO_CHROMA_JPEG: jpeg style cositing, also for mpeg1 and mjpeg + * @GST_VIDEO_CHROMA_MPEG2: mpeg2 style cositing + * @GST_VIDEO_CHROMA_DV: DV style cositing + * + * Various Chroma sitings. + */ +typedef enum { + GST_VIDEO_CHROMA_UNKNOWN = 0, + GST_VIDEO_CHROMA_NONE = (1 << 0), + GST_VIDEO_CHROMA_H_COSITED = (1 << 1), + GST_VIDEO_CHROMA_V_COSITED = (1 << 2), + GST_VIDEO_CHROMA_ALT_LINE = (1 << 3), + /* some common chroma cositing */ + GST_VIDEO_CHROMA_COSITED = (GST_VIDEO_CHROMA_H_COSITED | GST_VIDEO_CHROMA_V_COSITED), + GST_VIDEO_CHROMA_JPEG = (GST_VIDEO_CHROMA_NONE), + GST_VIDEO_CHROMA_MPEG2 = (GST_VIDEO_CHROMA_H_COSITED), + GST_VIDEO_CHROMA_DV = (GST_VIDEO_CHROMA_COSITED | GST_VIDEO_CHROMA_ALT_LINE), +} GstVideoChromaSite; + +/** + * GstVideoColorRange: + * @GST_VIDEO_COLOR_RANGE_UNKNOWN: unknown range + * @GST_VIDEO_COLOR_RANGE_0_255: [0..255] for 8 bit components + * @GST_VIDEO_COLOR_RANGE_16_235: [16..235] for 8 bit components. Chroma has + * [16..240] range. + * + * Possible color range values. These constants are defined for 8 bit color + * values and can be scaled for other bit depths. + */ +typedef enum { + GST_VIDEO_COLOR_RANGE_UNKNOWN = 0, + GST_VIDEO_COLOR_RANGE_0_255, + GST_VIDEO_COLOR_RANGE_16_235 +} GstVideoColorRange; + +/** + * GstVideoColorMatrix: + * @GST_VIDEO_COLOR_MATRIX_UNKNOWN: unknown matrix + * @GST_VIDEO_COLOR_MATRIX_RGB: identity matrix + * @GST_VIDEO_COLOR_MATRIX_BT709: ITU-R BT.709 transfer matrix + * @GST_VIDEO_COLOR_MATRIX_BT601: ITU-R BT.601 transfer matrix + * @GST_VIDEO_COLOR_MATRIX_SMPTE240M: SMPTE 240M transfer matrix + * + * The color matrix is used to convert between Y'PbPr and + * non-linear RGB (R'G'B') + */ +typedef enum { + GST_VIDEO_COLOR_MATRIX_UNKNOWN = 0, + GST_VIDEO_COLOR_MATRIX_RGB, + GST_VIDEO_COLOR_MATRIX_BT709, + GST_VIDEO_COLOR_MATRIX_BT601, + GST_VIDEO_COLOR_MATRIX_SMPTE240M +} GstVideoColorMatrix; + +/** + * GstVideoTransferFunction: + * GST_VIDEO_TRANSFER_UNKNOWN: unknown transfer function + * GST_VIDEO_TRANSFER_GAMMA10: linear RGB, gamma 1.0 curve + * GST_VIDEO_TRANSFER_GAMMA18: Gamma 1.8 curve + * GST_VIDEO_TRANSFER_GAMMA20: Gamma 2.0 curve + * GST_VIDEO_TRANSFER_GAMMA22: Gamma 2.2 curve + * GST_VIDEO_TRANSFER_BT709: Gamma 2.2 curve with a linear segment in the lower + * range + * GST_VIDEO_TRANSFER_SMPTE240M: Gamma 2.2 curve with a linear segment in the + * lower range + * GST_VIDEO_TRANSFER_SRGB: Gamma 2.4 curve with a linear segment in the lower + * range + * GST_VIDEO_TRANSFER_GAMMA28: Gamma 2.8 curve + * + * The video transfer function defines the formula for converting between + * non-linear RGB (R'G'B') and linear RGB + */ +typedef enum { + GST_VIDEO_TRANSFER_UNKNOWN = 0, + GST_VIDEO_TRANSFER_GAMMA10, + GST_VIDEO_TRANSFER_GAMMA18, + GST_VIDEO_TRANSFER_GAMMA20, + GST_VIDEO_TRANSFER_GAMMA22, + GST_VIDEO_TRANSFER_BT709, + GST_VIDEO_TRANSFER_SMPTE240M, + GST_VIDEO_TRANSFER_SRGB, + GST_VIDEO_TRANSFER_GAMMA28 +} GstVideoTransferFunction; + +/** + * GstVideoColorPrimaries: + * @GST_VIDEO_COLOR_PRIMARIES_UNKNOWN: unknown color primaries + * @GST_VIDEO_COLOR_PRIMARIES_BT601: + * @GST_VIDEO_COLOR_PRIMARIES_BT470M: + * @GST_VIDEO_COLOR_PRIMARIES_BT470BG: + * @GST_VIDEO_COLOR_PRIMARIES_SMPTE170M: + * @GST_VIDEO_COLOR_PRIMARIES_SMPTE240M: + * + * The color primaries define the how to transform linear RGB values to and from + * the CIE XYZ colorspace. + */ +typedef enum { + GST_VIDEO_COLOR_PRIMARIES_UNKNOWN = 0, + GST_VIDEO_COLOR_PRIMARIES_BT709, + GST_VIDEO_COLOR_PRIMARIES_BT470M, + GST_VIDEO_COLOR_PRIMARIES_BT470BG, + GST_VIDEO_COLOR_PRIMARIES_SMPTE170M, + GST_VIDEO_COLOR_PRIMARIES_SMPTE240M +} GstVideoColorPrimaries; + +/** + * GstVideoColorimetry: + * @range: the color range. This is the valid range for the samples. + * It is used to convert the samples to Y'PbPr values. + * @matrix: the color matrix. Used to convert between Y'PbPr and + * non-linear RGB (R'G'B') + * @transfer: the transfer function. used to convert between R'G'B' and RGB + * @primaries: color primaries. used to convert between R'G'B' and CIE XYZ + * + * Structure describing the color info. + */ +typedef struct { + GstVideoColorRange range; + GstVideoColorMatrix matrix; + GstVideoTransferFunction transfer; + GstVideoColorPrimaries primaries; +} GstVideoColorimetry; + +/* predefined colorimetry */ +#define GST_VIDEO_COLORIMETRY_BT601 "bt601" +#define GST_VIDEO_COLORIMETRY_BT709 "bt709" +#define GST_VIDEO_COLORIMETRY_SMPTE240M "smpte240m" + +gboolean gst_video_colorimetry_matches (GstVideoColorimetry *cinfo, const gchar *color); +gboolean gst_video_colorimetry_from_string (GstVideoColorimetry *cinfo, const gchar *color); +gchar * gst_video_colorimetry_to_string (GstVideoColorimetry *cinfo); + +/** * GstVideoInfo: * @finfo: the format info of the video * @flags: additional video flags @@ -331,15 +471,11 @@ typedef enum { * @height: the height of the video * @views: the number of views for multiview video * @size: the default size of one frame - * @color_matrix: the color matrix. Possible values are - * "sdtv" for the standard definition color matrix (as specified in - * Rec. ITU-R BT.470-6) or "hdtv" for the high definition color - * matrix (as specified in Rec. ITU-R BT.709) - * @chroma_site: the chroma siting. Possible values are - * "mpeg2" for MPEG-2 style chroma siting (co-sited horizontally, - * halfway-sited vertically), "jpeg" for JPEG and Theora style - * chroma siting (halfway-sited both horizontally and vertically). - * Other chroma site values are possible, but uncommon. + * @chroma_site: a #GstVideoChromaSite. + * @color_range: the color range. This is the valid range for the samples. + * @color_matrix: the color matrix. Used to transform to non-linear RGB (R'G'B') + * @transfer_function: the transfer function. used to convert betwen R'G'B' and RGB + * @color_primaries: color primaries. used to convert to CIE XYZ * @palette: a buffer with palette data * @par_n: the pixel-aspect-ratio numerator * @par_d: the pixel-aspect-ratio demnominator @@ -363,8 +499,9 @@ struct _GstVideoInfo { gsize size; gint views; - const gchar *color_matrix; - const gchar *chroma_site; + GstVideoChromaSite chroma_site; + GstVideoColorimetry colorimetry; + GstBuffer *palette; gint par_n; @@ -429,6 +566,7 @@ gboolean gst_video_info_convert (GstVideoInfo *info, * @info: the #GstVideoInfo * @buffer: the mapped buffer * @meta: pointer to metadata if any + * @view_id: id of the view in multiview * @data: pointers to the plane data * * A video frame obtained from gst_video_frame_map() @@ -438,6 +576,7 @@ struct _GstVideoFrame { GstBuffer *buffer; gpointer meta; + gint view_id; gpointer data[GST_VIDEO_MAX_PLANES]; }; @@ -545,7 +684,6 @@ gboolean gst_video_calculate_display_ratio (guint * dar_n, guint display_par_n, guint display_par_d); -gboolean gst_video_parse_caps_framerate (GstCaps * caps, int *fps_n, int *fps_d); GstBuffer * gst_video_parse_caps_palette (GstCaps * caps); /* video still frame event creation and parsing */ diff --git a/gst/playback/gstsubtitleoverlay.c b/gst/playback/gstsubtitleoverlay.c index 6b9e1c8..5536caf 100644 --- a/gst/playback/gstsubtitleoverlay.c +++ b/gst/playback/gstsubtitleoverlay.c @@ -868,7 +868,6 @@ _pad_blocked_cb (GstPad * pad, GstProbeType type, gpointer type_data, video_peer = gst_pad_get_peer (self->video_sinkpad); if (video_peer) { GstCaps *video_caps; - gint fps_n, fps_d; video_caps = gst_pad_get_current_caps (video_peer); if (!video_caps) { @@ -879,12 +878,16 @@ _pad_blocked_cb (GstPad * pad, GstProbeType type, gpointer type_data, } } - if (video_caps - && gst_video_parse_caps_framerate (video_caps, &fps_n, &fps_d)) { - if (self->fps_n != fps_n || self->fps_d != fps_d) { - GST_DEBUG_OBJECT (self, "New video fps: %d/%d", fps_n, fps_d); - self->fps_n = fps_n; - self->fps_d = fps_d; + if (video_caps) { + GstVideoInfo info; + + if (gst_video_info_from_caps (&info, video_caps)) { + if (self->fps_n != info.fps_n || self->fps_d != info.fps_d) { + GST_DEBUG_OBJECT (self, "New video fps: %d/%d", info.fps_n, + info.fps_d); + self->fps_n = info.fps_n; + self->fps_d = info.fps_d; + } } } @@ -1604,21 +1607,21 @@ gst_subtitle_overlay_video_sink_setcaps (GstSubtitleOverlay * self, GstCaps * caps) { gboolean ret = TRUE; - gint fps_n, fps_d; + GstVideoInfo info; GST_DEBUG_OBJECT (self, "Setting caps: %" GST_PTR_FORMAT, caps); - if (!gst_video_parse_caps_framerate (caps, &fps_n, &fps_d)) { - GST_ERROR_OBJECT (self, "Failed to parse framerate from caps"); + if (!gst_video_info_from_caps (&info, caps)) { + GST_ERROR_OBJECT (self, "Failed to parse caps"); ret = FALSE; goto out; } GST_SUBTITLE_OVERLAY_LOCK (self); - if (self->fps_n != fps_n || self->fps_d != fps_d) { - GST_DEBUG_OBJECT (self, "New video fps: %d/%d", fps_n, fps_d); - self->fps_n = fps_n; - self->fps_d = fps_d; + if (self->fps_n != info.fps_n || self->fps_d != info.fps_d) { + GST_DEBUG_OBJECT (self, "New video fps: %d/%d", info.fps_n, info.fps_d); + self->fps_n = info.fps_n; + self->fps_d = info.fps_d; gst_subtitle_overlay_set_fps (self); } GST_SUBTITLE_OVERLAY_UNLOCK (self); diff --git a/gst/videoconvert/gstvideoconvert.c b/gst/videoconvert/gstvideoconvert.c index 937e650..d9df100 100644 --- a/gst/videoconvert/gstvideoconvert.c +++ b/gst/videoconvert/gstvideoconvert.c @@ -123,7 +123,7 @@ gst_video_convert_caps_remove_format_info (GstCaps * caps) st = gst_structure_copy (st); gst_structure_remove_fields (st, "format", "palette_data", - "color-matrix", "chroma-site", NULL); + "colorimetry", "chroma-site", NULL); gst_caps_append_structure (res, st); } @@ -203,7 +203,7 @@ gst_video_convert_set_caps (GstBaseTransform * btrans, GstCaps * incaps, if (in_info.finfo->flags & GST_VIDEO_FORMAT_FLAG_RGB) { in_spec = COLOR_SPEC_RGB; } else if (in_info.finfo->flags & GST_VIDEO_FORMAT_FLAG_YUV) { - if (in_info.color_matrix && g_str_equal (in_info.color_matrix, "hdtv")) + if (in_info.colorimetry.matrix == GST_VIDEO_COLOR_MATRIX_BT709) in_spec = COLOR_SPEC_YUV_BT709; else in_spec = COLOR_SPEC_YUV_BT470_6; @@ -218,7 +218,7 @@ gst_video_convert_set_caps (GstBaseTransform * btrans, GstCaps * incaps, if (out_info.finfo->flags & GST_VIDEO_FORMAT_FLAG_RGB) { out_spec = COLOR_SPEC_RGB; } else if (out_info.finfo->flags & GST_VIDEO_FORMAT_FLAG_YUV) { - if (out_info.color_matrix && g_str_equal (out_info.color_matrix, "hdtv")) + if (out_info.colorimetry.matrix == GST_VIDEO_COLOR_MATRIX_BT709) out_spec = COLOR_SPEC_YUV_BT709; else out_spec = COLOR_SPEC_YUV_BT470_6; diff --git a/gst/videotestsrc/gstvideotestsrc.c b/gst/videotestsrc/gstvideotestsrc.c index f473f94..895f976 100644 --- a/gst/videotestsrc/gstvideotestsrc.c +++ b/gst/videotestsrc/gstvideotestsrc.c @@ -60,7 +60,6 @@ enum PROP_PATTERN, PROP_TIMESTAMP_OFFSET, PROP_IS_LIVE, - PROP_COLOR_SPEC, PROP_K0, PROP_KX, PROP_KY, @@ -147,24 +146,6 @@ gst_video_test_src_pattern_get_type (void) return video_test_src_pattern_type; } -#define GST_TYPE_VIDEO_TEST_SRC_COLOR_SPEC (gst_video_test_src_color_spec_get_type ()) -static GType -gst_video_test_src_color_spec_get_type (void) -{ - static GType video_test_src_color_spec_type = 0; - static const GEnumValue color_spec_types[] = { - {GST_VIDEO_TEST_SRC_BT601, "ITU-R Rec. BT.601", "bt601"}, - {GST_VIDEO_TEST_SRC_BT709, "ITU-R Rec. BT.709", "bt709"}, - {0, NULL, NULL} - }; - - if (!video_test_src_color_spec_type) { - video_test_src_color_spec_type = - g_enum_register_static ("GstVideoTestSrcColorSpec", color_spec_types); - } - return video_test_src_color_spec_type; -} - static void gst_video_test_src_class_init (GstVideoTestSrcClass * klass) { @@ -194,13 +175,6 @@ gst_video_test_src_class_init (GstVideoTestSrcClass * klass) g_param_spec_boolean ("is-live", "Is Live", "Whether to act as a live source", DEFAULT_IS_LIVE, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); - g_object_class_install_property (gobject_class, PROP_COLOR_SPEC, - g_param_spec_enum ("colorspec", "Color Specification", - "Generate video in the given color specification (Deprecated: " - "use a caps filter with video/x-raw-yuv,color-matrix=\"sdtv\" or " - "\"hdtv\" instead)", - GST_TYPE_VIDEO_TEST_SRC_COLOR_SPEC, - DEFAULT_COLOR_SPEC, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (gobject_class, PROP_K0, g_param_spec_int ("k0", "Zoneplate zero order phase", "Zoneplate zero order phase, for generating plain fields or phase offsets", @@ -340,8 +314,8 @@ gst_video_test_src_src_fixate (GstBaseSrc * bsrc, GstCaps * caps) if (gst_structure_has_field (structure, "pixel-aspect-ratio")) gst_structure_fixate_field_nearest_fraction (structure, "pixel-aspect-ratio", 1, 1); - if (gst_structure_has_field (structure, "color-matrix")) - gst_structure_fixate_field_string (structure, "color-matrix", "sdtv"); + if (gst_structure_has_field (structure, "colorimetry")) + gst_structure_fixate_field_string (structure, "colorimetry", "bt601"); if (gst_structure_has_field (structure, "chroma-site")) gst_structure_fixate_field_string (structure, "chroma-site", "mpeg2"); @@ -444,8 +418,6 @@ gst_video_test_src_set_property (GObject * object, guint prop_id, case PROP_IS_LIVE: gst_base_src_set_live (GST_BASE_SRC (src), g_value_get_boolean (value)); break; - case PROP_COLOR_SPEC: - break; case PROP_K0: src->k0 = g_value_get_int (value); break; @@ -511,8 +483,6 @@ gst_video_test_src_get_property (GObject * object, guint prop_id, case PROP_IS_LIVE: g_value_set_boolean (value, gst_base_src_is_live (GST_BASE_SRC (src))); break; - case PROP_COLOR_SPEC: - break; case PROP_K0: g_value_set_int (value, src->k0); break; @@ -564,23 +534,6 @@ gst_video_test_src_get_property (GObject * object, guint prop_id, } } -static GstVideoTestSrcColorSpec -to_color_spec (const gchar * csp) -{ - if (csp) { - if (strcmp (csp, "sdtv") == 0) { - return GST_VIDEO_TEST_SRC_BT601; - } else if (strcmp (csp, "hdtv") == 0) { - return GST_VIDEO_TEST_SRC_BT709; - } else { - GST_DEBUG ("unknown color-matrix"); - return GST_VIDEO_TEST_SRC_UNKNOWN; - } - } else { - return GST_VIDEO_TEST_SRC_BT601; - } -} - /* threadsafe because this gets called as the plugin is loaded */ static GstCaps * gst_video_test_src_getcaps (GstBaseSrc * bsrc, GstCaps * filter) @@ -614,11 +567,12 @@ gst_video_test_src_getcaps (GstBaseSrc * bsrc, GstCaps * filter) static gboolean gst_video_test_src_parse_caps (const GstCaps * caps, gint * width, gint * height, gint * fps_n, gint * fps_d, - const gchar ** color_matrix) + GstVideoColorimetry * colorimetry) { const GstStructure *structure; GstPadLinkReturn ret; const GValue *framerate; + const gchar *csp; GST_DEBUG ("parsing caps"); @@ -634,7 +588,8 @@ gst_video_test_src_parse_caps (const GstCaps * caps, } else goto no_framerate; - *color_matrix = gst_structure_get_string (structure, "color-matrix"); + if ((csp = gst_structure_get_string (structure, "colorimetry"))) + gst_video_colorimetry_from_string (colorimetry, csp); return ret; @@ -693,7 +648,7 @@ gst_video_test_src_setcaps (GstBaseSrc * bsrc, GstCaps * caps) } else if (gst_structure_has_name (structure, "video/x-raw-bayer")) { if (!gst_video_test_src_parse_caps (caps, &info.width, &info.height, - &info.fps_n, &info.fps_d, &info.color_matrix)) + &info.fps_n, &info.fps_d, &info.colorimetry)) goto parse_failed; info.size = @@ -704,7 +659,6 @@ gst_video_test_src_setcaps (GstBaseSrc * bsrc, GstCaps * caps) goto unknown_format; /* looks ok here */ - videotestsrc->color_spec = to_color_spec (info.color_matrix); videotestsrc->format = format; videotestsrc->info = info; diff --git a/gst/videotestsrc/gstvideotestsrc.h b/gst/videotestsrc/gstvideotestsrc.h index 31673f8..30d4904 100644 --- a/gst/videotestsrc/gstvideotestsrc.h +++ b/gst/videotestsrc/gstvideotestsrc.h @@ -106,19 +106,6 @@ typedef enum { GST_VIDEO_TEST_SRC_BAR } GstVideoTestSrcPattern; -/** - * GstVideoTestSrcColorSpec: - * @GST_VIDEO_TEST_SRC_BT601: ITU-R Rec. BT.601/BT.470 (SD) - * @GST_VIDEO_TEST_SRC_BT709: ITU-R Rec. BT.709 (HD) - * - * The color specification to use. - */ -typedef enum { - GST_VIDEO_TEST_SRC_UNKNOWN, - GST_VIDEO_TEST_SRC_BT601, - GST_VIDEO_TEST_SRC_BT709 -} GstVideoTestSrcColorSpec; - typedef struct _GstVideoTestSrc GstVideoTestSrc; typedef struct _GstVideoTestSrcClass GstVideoTestSrcClass; @@ -135,9 +122,6 @@ struct _GstVideoTestSrc { /* type of output */ GstVideoTestSrcPattern pattern_type; - /* Color spec of output */ - GstVideoTestSrcColorSpec color_spec; - /* video state */ GstVideoInfo info; diff --git a/gst/videotestsrc/videotestsrc.c b/gst/videotestsrc/videotestsrc.c index be5dd46..184352a 100644 --- a/gst/videotestsrc/videotestsrc.c +++ b/gst/videotestsrc/videotestsrc.c @@ -407,13 +407,13 @@ paint_get_structure (struct format_list_struct * format) g_value_init (&value_list, GST_TYPE_LIST); g_value_init (&value, G_TYPE_STRING); - g_value_set_static_string (&value, "sdtv"); + g_value_set_static_string (&value, "bt601"); gst_value_list_append_value (&value_list, &value); - g_value_set_static_string (&value, "hdtv"); + g_value_set_static_string (&value, "bt709"); gst_value_list_append_value (&value_list, &value); - gst_structure_set_value (structure, "color-matrix", &value_list); + gst_structure_set_value (structure, "colorimetry", &value_list); g_value_reset (&value_list); if (strcmp (format->format, "AYUV") && @@ -430,8 +430,8 @@ paint_get_structure (struct format_list_struct * format) } g_value_unset (&value_list); } - } break; + } case VTS_BAYER: structure = gst_structure_new ("video/x-raw-bayer", "format", G_TYPE_STRING, format->format, NULL); @@ -508,7 +508,7 @@ videotestsrc_setup_paintinfo (GstVideoTestSrc * v, paintinfo * p, int w, int h) { int a, r, g, b; - if (v->color_spec == GST_VIDEO_TEST_SRC_BT601) { + if (v->info.colorimetry.matrix == GST_VIDEO_COLOR_MATRIX_BT601) { p->colors = vts_colors_bt601_ycbcr_100; } else { p->colors = vts_colors_bt709_ycbcr_100; @@ -537,7 +537,7 @@ videotestsrc_setup_paintinfo (GstVideoTestSrc * v, paintinfo * p, int w, int h) p->foreground_color.R = r; p->foreground_color.G = g; p->foreground_color.B = b; - if (v->color_spec == GST_VIDEO_TEST_SRC_BT601) { + if (v->info.colorimetry.matrix == GST_VIDEO_COLOR_MATRIX_BT601) { p->foreground_color.Y = RGB_TO_Y_CCIR (r, g, b); p->foreground_color.U = RGB_TO_U_CCIR (r, g, b, 0); p->foreground_color.V = RGB_TO_V_CCIR (r, g, b, 0); @@ -556,7 +556,7 @@ videotestsrc_setup_paintinfo (GstVideoTestSrc * v, paintinfo * p, int w, int h) p->background_color.R = r; p->background_color.G = g; p->background_color.B = b; - if (v->color_spec == GST_VIDEO_TEST_SRC_BT601) { + if (v->info.colorimetry.matrix == GST_VIDEO_COLOR_MATRIX_BT601) { p->background_color.Y = RGB_TO_Y_CCIR (r, g, b); p->background_color.U = RGB_TO_U_CCIR (r, g, b, 0); p->background_color.V = RGB_TO_V_CCIR (r, g, b, 0); @@ -751,7 +751,7 @@ gst_video_test_src_smpte75 (GstVideoTestSrc * v, GstVideoFrame * frame) int w = frame->info.width, h = frame->info.height; videotestsrc_setup_paintinfo (v, p, w, h); - if (v->color_spec == GST_VIDEO_TEST_SRC_BT601) { + if (v->info.colorimetry.matrix == GST_VIDEO_COLOR_MATRIX_BT601) { p->colors = vts_colors_bt601_ycbcr_75; } else { p->colors = vts_colors_bt709_ycbcr_75;