summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBenjamin M. Schwartz <bens@alum.mit.edu>2010-02-23 22:16:39 -0500
committerMark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>2010-04-30 13:50:08 +0200
commitc3dc498278a389a7a22f9f9e66d975438ef16793 (patch)
tree4c9401e479844cbd800703e7bf85a27a801f1eee
parent6bf7f5cfd3d7bf5e9bd923bad948fa45ca795d72 (diff)
y4menc: add 4:2:2, 4:1:1, and 4:4:4 output support
Fixes #610902.
-rw-r--r--gst/y4m/gsty4mencode.c28
-rw-r--r--gst/y4m/gsty4mencode.h1
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;
};