diff options
author | Benjamin M. Schwartz <bens@alum.mit.edu> | 2010-02-23 22:16:39 -0500 |
---|---|---|
committer | Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> | 2010-04-30 13:50:08 +0200 |
commit | c3dc498278a389a7a22f9f9e66d975438ef16793 (patch) | |
tree | 4c9401e479844cbd800703e7bf85a27a801f1eee | |
parent | 6bf7f5cfd3d7bf5e9bd923bad948fa45ca795d72 (diff) |
y4menc: add 4:2:2, 4:1:1, and 4:4:4 output support
Fixes #610902.
-rw-r--r-- | gst/y4m/gsty4mencode.c | 28 | ||||
-rw-r--r-- | 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 e8975ef42..aba6ab785 100644 --- a/gst/y4m/gsty4mencode.c +++ b/gst/y4m/gsty4mencode.c @@ -70,7 +70,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 }")) ); @@ -146,6 +146,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 @@ -155,6 +156,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)); @@ -164,6 +166,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; @@ -210,8 +232,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 02770d510..624ab37ac 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; }; |