From 637c26f61a2bd8d7b01f8b6d081d94da65f74557 Mon Sep 17 00:00:00 2001 From: "Benjamin M. Schwartz" Date: Tue, 23 Feb 2010 22:16:39 -0500 Subject: [PATCH] Add 4:2:2, 4:1:1, and 4:4:4 output support --- gst/y4m/gsty4mencode.c | 28 +++++++++++++++++++++++++--- gst/y4m/gsty4mencode.h | 1 + 2 files changed, 26 insertions(+), 3 deletions(-) diff --git a/gst/y4m/gsty4mencode.c b/gst/y4m/gsty4mencode.c index 2bdf864..27de67c 100644 --- a/gst/y4m/gsty4mencode.c +++ b/gst/y4m/gsty4mencode.c @@ -77,7 +77,7 @@ static GstStaticPadTemplate y4mencode_sink_factory = GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, - GST_STATIC_CAPS (GST_VIDEO_CAPS_YUV ("{ IYUV, I420 }")) + GST_STATIC_CAPS (GST_VIDEO_CAPS_YUV ("{ IYUV, I420, Y42B, Y41B, Y444 }")) ); @@ -150,6 +150,7 @@ gst_y4m_encode_reset (GstY4mEncode * filter) filter->width = filter->height = -1; filter->fps_num = filter->fps_den = 1; filter->par_num = filter->par_den = 1; + filter->colorspace = "unknown"; } static gboolean @@ -159,6 +160,7 @@ gst_y4m_encode_setcaps (GstPad * pad, GstCaps * vscaps) GstStructure *structure; gboolean res; gint w, h; + guint32 fourcc; const GValue *fps, *par, *interlaced; filter = GST_Y4M_ENCODE (GST_PAD_PARENT (pad)); @@ -168,6 +170,26 @@ gst_y4m_encode_setcaps (GstPad * pad, GstCaps * vscaps) res = gst_structure_get_int (structure, "width", &w); res &= gst_structure_get_int (structure, "height", &h); res &= ((fps = gst_structure_get_value (structure, "framerate")) != NULL); + res &= gst_structure_get_fourcc (structure, "format", &fourcc); + + switch (fourcc) { /* Translate fourcc to Y4M colorspace code */ + case GST_MAKE_FOURCC ('I', '4', '2', '0'): + case GST_MAKE_FOURCC ('I', 'Y', 'U', 'V'): + filter->colorspace = "420"; + break; + case GST_MAKE_FOURCC ('Y', '4', '2', 'B'): + filter->colorspace = "422"; + break; + case GST_MAKE_FOURCC ('Y', '4', '1', 'B'): + filter->colorspace = "411"; + break; + case GST_MAKE_FOURCC ('Y', '4', '4', '4'): + filter->colorspace = "444"; + break; + default: + res = FALSE; + break; + } if (!res || w <= 0 || h <= 0 || !GST_VALUE_HOLDS_FRACTION (fps)) return FALSE; @@ -214,8 +236,8 @@ gst_y4m_encode_get_stream_header (GstY4mEncode * filter) else if (filter->interlaced) interlaced = 'b'; - header = g_strdup_printf ("YUV4MPEG2 W%d H%d I%c F%d:%d A%d:%d\n", - filter->width, filter->height, interlaced, + header = g_strdup_printf ("YUV4MPEG2 C%s W%d H%d I%c F%d:%d A%d:%d\n", + filter->colorspace, filter->width, filter->height, interlaced, filter->fps_num, filter->fps_den, filter->par_num, filter->par_den); buf = gst_buffer_new (); diff --git a/gst/y4m/gsty4mencode.h b/gst/y4m/gsty4mencode.h index 02770d5..624ab37 100644 --- a/gst/y4m/gsty4mencode.h +++ b/gst/y4m/gsty4mencode.h @@ -53,6 +53,7 @@ struct _GstY4mEncode { gint par_num, par_den; gboolean interlaced; gboolean top_field_first; + const gchar *colorspace; /* state information */ gboolean header; }; -- 2.7.4