summaryrefslogtreecommitdiffstats
path: root/ext
diff options
context:
space:
mode:
Diffstat (limited to 'ext')
-rw-r--r--ext/divx/gstdivxdec.c91
-rw-r--r--ext/divx/gstdivxdec.h2
-rw-r--r--ext/divx/gstdivxenc.c181
-rw-r--r--ext/faac/gstfaac.c205
-rw-r--r--ext/mpeg2enc/gstmpeg2enc.cc138
-rw-r--r--ext/mpeg2enc/gstmpeg2encoder.cc14
-rw-r--r--ext/mpeg2enc/gstmpeg2encpicturereader.cc11
7 files changed, 307 insertions, 335 deletions
diff --git a/ext/divx/gstdivxdec.c b/ext/divx/gstdivxdec.c
index c68d12dc..c2cd6324 100644
--- a/ext/divx/gstdivxdec.c
+++ b/ext/divx/gstdivxdec.c
@@ -33,47 +33,30 @@ GstElementDetails gst_divxdec_details = {
"Ronald Bultje <rbultje@ronald.bitfreak.net>"
};
-GST_PAD_TEMPLATE_FACTORY(sink_template,
+static GstStaticPadTemplate sink_template =
+GST_STATIC_PAD_TEMPLATE (
"sink",
GST_PAD_SINK,
GST_PAD_ALWAYS,
- GST_CAPS_NEW(
- "divxdec_sink",
- "video/x-divx",
- "divxversion", GST_PROPS_INT_RANGE(3, 5),
- "width", GST_PROPS_INT_RANGE(0, G_MAXINT),
- "height", GST_PROPS_INT_RANGE(0, G_MAXINT),
- "framerate", GST_PROPS_FLOAT_RANGE(0, G_MAXFLOAT)
+ GST_STATIC_CAPS (
+ "video/x-divx, "
+ "divxversion = (int) [ 3, 5 ], "
+ "width = (int) [ 16, 4096 ], "
+ "height = (int) [ 16, 4096 ], "
+ "framerate = (double) [ 0, MAX ]"
)
-)
+);
-GST_PAD_TEMPLATE_FACTORY(src_template,
+static GstStaticPadTemplate src_template =
+GST_STATIC_PAD_TEMPLATE (
"src",
GST_PAD_SRC,
GST_PAD_ALWAYS,
- gst_caps_new(
- "divxdec_src",
- "video/x-raw-yuv",
- GST_VIDEO_YUV_PAD_TEMPLATE_PROPS(
- GST_PROPS_LIST(
- GST_PROPS_FOURCC(GST_MAKE_FOURCC('I','4','2','0')),
- GST_PROPS_FOURCC(GST_MAKE_FOURCC('Y','U','Y','2')),
- GST_PROPS_FOURCC(GST_MAKE_FOURCC('Y','V','1','2')),
- GST_PROPS_FOURCC(GST_MAKE_FOURCC('U','Y','V','Y'))
- )
- )
- ),
- gst_caps_new(
- "divxdec_src_rgb1",
- "video/x-raw-rgb",
- GST_VIDEO_RGB_PAD_TEMPLATE_PROPS_24_32
- ),
- gst_caps_new(
- "divxdec_src_rgb2",
- "video/x-raw-rgb",
- GST_VIDEO_RGB_PAD_TEMPLATE_PROPS_15_16
+ GST_STATIC_CAPS (
+ GST_VIDEO_YUV_PAD_TEMPLATE_CAPS ("{ I420, YUY2, YV12, UYVY }")
+ /* FIXME: 15/16/24/32bpp RGB */
)
-)
+);
/* DivxDec signals and args */
@@ -95,8 +78,8 @@ static void gst_divxdec_dispose (GObject *object);
static void gst_divxdec_chain (GstPad *pad,
GstData *data);
static GstPadLinkReturn gst_divxdec_connect (GstPad *pad,
- GstCaps *vscapslist);
-static GstPadLinkReturn gst_divxdec_negotiate (GstDivxDec *divxdec);
+ const GstCaps *vscapslist);
+static GstPadLinkReturn gst_divxdec_negotiate (GstDivxDec *divxdec);
static GstElementClass *parent_class = NULL;
/* static guint gst_divxdec_signals[LAST_SIGNAL] = { 0 }; */
@@ -163,9 +146,9 @@ gst_divxdec_base_init (GstDivxDecClass *klass)
GstElementClass *element_class = GST_ELEMENT_CLASS (klass);
gst_element_class_add_pad_template (element_class,
- GST_PAD_TEMPLATE_GET (sink_template));
+ gst_static_pad_template_get (&sink_template));
gst_element_class_add_pad_template (element_class,
- GST_PAD_TEMPLATE_GET (src_template));
+ gst_static_pad_template_get (&src_template));
gst_element_class_set_details (element_class, &gst_divxdec_details);
}
@@ -187,7 +170,7 @@ gst_divxdec_init (GstDivxDec *divxdec)
{
/* create the sink pad */
divxdec->sinkpad = gst_pad_new_from_template(
- GST_PAD_TEMPLATE_GET(sink_template),
+ gst_static_pad_template_get (&sink_template),
"sink");
gst_element_add_pad(GST_ELEMENT(divxdec), divxdec->sinkpad);
@@ -196,7 +179,7 @@ gst_divxdec_init (GstDivxDec *divxdec)
/* create the src pad */
divxdec->srcpad = gst_pad_new_from_template(
- GST_PAD_TEMPLATE_GET(src_template),
+ gst_static_pad_template_get (&src_template),
"src");
gst_element_add_pad(GST_ELEMENT(divxdec), divxdec->srcpad);
@@ -344,6 +327,8 @@ gst_divxdec_negotiate (GstDivxDec *divxdec)
GST_MAKE_FOURCC('I','4','2','0'), 0 },
{ GST_MAKE_FOURCC('Y','V','1','2'), 12, 12,
GST_MAKE_FOURCC('Y','V','1','2'), 0 },
+#if 0
+ /* FIXME: someone fix RGB here please */
{ GST_MAKE_FOURCC('R','G','B',' '), 32, 32,
#if (G_BYTE_ORDER == G_BIG_ENDIAN)
GST_MAKE_FOURCC('A','B','G','R'), 32 },
@@ -360,6 +345,7 @@ gst_divxdec_negotiate (GstDivxDec *divxdec)
3, 16 },
{ GST_MAKE_FOURCC('R','G','B',' '), 15, 16,
0, 16 },
+#endif
{ 0, 0, 0, 0, 0 }
};
gint i;
@@ -367,6 +353,7 @@ gst_divxdec_negotiate (GstDivxDec *divxdec)
for (i = 0; fmt_list[i].fourcc != 0; i++) {
divxdec->csp = fmt_list[i].csp;
+#if 0
/* try making a caps to set on the other side */
if (fmt_list[i].fourcc == GST_MAKE_FOURCC('R','G','B',' ')) {
guint32 r_mask = 0, b_mask = 0, g_mask = 0;
@@ -401,13 +388,14 @@ gst_divxdec_negotiate (GstDivxDec *divxdec)
"green_mask", GST_PROPS_INT(g_mask),
"blue_mask", GST_PROPS_INT(b_mask));
} else {
- caps = GST_CAPS_NEW("divxdec_src_pad_yuv",
- "video/x-raw-yuv",
- "width", GST_PROPS_INT(divxdec->width),
- "height", GST_PROPS_INT(divxdec->height),
- "framerate", GST_PROPS_FLOAT(divxdec->fps),
- "format", GST_PROPS_FOURCC(fmt_list[i].fourcc));
- }
+#endif
+ caps = gst_caps_new_simple ("video/x-raw-yuv",
+ "width", G_TYPE_INT, divxdec->width,
+ "height", G_TYPE_INT, divxdec->height,
+ "framerate", G_TYPE_DOUBLE, divxdec->fps,
+ "format", GST_TYPE_FOURCC, fmt_list[i].fourcc,
+ NULL);
+ /*}*/
if ((ret = gst_pad_try_set_caps(divxdec->srcpad, caps)) > 0) {
divxdec->csp = fmt_list[i].csp;
@@ -426,10 +414,11 @@ gst_divxdec_negotiate (GstDivxDec *divxdec)
static GstPadLinkReturn
-gst_divxdec_connect (GstPad *pad,
- GstCaps *vscaps)
+gst_divxdec_connect (GstPad *pad,
+ const GstCaps *caps)
{
GstDivxDec *divxdec;
+ GstStructure *structure = gst_caps_get_structure (caps, 0);
divxdec = GST_DIVXDEC(gst_pad_get_parent (pad));
@@ -439,14 +428,14 @@ gst_divxdec_connect (GstPad *pad,
}
/* we are not going to act on variable caps */
- if (!GST_CAPS_IS_FIXED(vscaps))
+ if (!gst_caps_is_fixed(caps))
return GST_PAD_LINK_DELAYED;
/* if we get here, we know the input is divx. we
* only need to bother with the output colorspace */
- gst_caps_get_int(vscaps, "width", &divxdec->width);
- gst_caps_get_int(vscaps, "height", &divxdec->height);
- gst_caps_get_float(vscaps, "framerate", &divxdec->fps);
+ gst_structure_get_int(structure, "width", &divxdec->width);
+ gst_structure_get_int(structure, "height", &divxdec->height);
+ gst_structure_get_double(structure, "framerate", &divxdec->fps);
return gst_divxdec_negotiate(divxdec);
}
diff --git a/ext/divx/gstdivxdec.h b/ext/divx/gstdivxdec.h
index 9f1da3ff..f181a08a 100644
--- a/ext/divx/gstdivxdec.h
+++ b/ext/divx/gstdivxdec.h
@@ -55,7 +55,7 @@ struct _GstDivxDec {
guint32 csp;
int bitcnt, bpp;
int width, height;
- float fps;
+ gdouble fps;
};
struct _GstDivxDecClass {
diff --git a/ext/divx/gstdivxenc.c b/ext/divx/gstdivxenc.c
index ba9c0351..ea9c56f4 100644
--- a/ext/divx/gstdivxenc.c
+++ b/ext/divx/gstdivxenc.c
@@ -34,48 +34,30 @@ GstElementDetails gst_divxenc_details = {
"Ronald Bultje <rbultje@ronald.bitfreak.net>"
};
-GST_PAD_TEMPLATE_FACTORY(sink_template,
+static GstStaticPadTemplate sink_template =
+GST_STATIC_PAD_TEMPLATE (
"sink",
GST_PAD_SINK,
GST_PAD_ALWAYS,
- gst_caps_new(
- "divxdec_src",
- "video/x-raw-yuv",
- GST_VIDEO_YUV_PAD_TEMPLATE_PROPS(
- GST_PROPS_LIST(
- GST_PROPS_FOURCC(GST_MAKE_FOURCC('R','G','B',' ')),
- GST_PROPS_FOURCC(GST_MAKE_FOURCC('I','4','2','0')),
- GST_PROPS_FOURCC(GST_MAKE_FOURCC('Y','U','Y','2')),
- GST_PROPS_FOURCC(GST_MAKE_FOURCC('Y','V','1','2')),
- GST_PROPS_FOURCC(GST_MAKE_FOURCC('U','Y','V','Y'))
- )
- )
- ),
- gst_caps_new(
- "divxdec_src_rgb1",
- "video/x-raw-rgb",
- GST_VIDEO_RGB_PAD_TEMPLATE_PROPS_24_32
- ),
- gst_caps_new(
- "divxdec_src_rgb2",
- "video/x-raw-rgb",
- GST_VIDEO_RGB_PAD_TEMPLATE_PROPS_15_16
+ GST_STATIC_CAPS (
+ GST_VIDEO_YUV_PAD_TEMPLATE_CAPS ("{ I420, YUY2, YV12, YVYU, UYVY }")
+ /* FIXME: 15/16/24/32bpp RGB */
)
-)
+);
-GST_PAD_TEMPLATE_FACTORY(src_template,
+static GstStaticPadTemplate src_template =
+GST_STATIC_PAD_TEMPLATE (
"src",
GST_PAD_SRC,
GST_PAD_ALWAYS,
- GST_CAPS_NEW(
- "divxenc_sink",
- "video/x-divx",
- "divxversion", GST_PROPS_INT(5),
- "width", GST_PROPS_INT_RANGE(0, G_MAXINT),
- "height", GST_PROPS_INT_RANGE(0, G_MAXINT),
- "framerate", GST_PROPS_FLOAT_RANGE(0, G_MAXFLOAT)
+ GST_STATIC_CAPS (
+ "video/x-divx, "
+ "divxversion = (int) 5, "
+ "width = (int) [ 16, 4096 ], "
+ "height = (int) [ 16, 4096 ], "
+ "framerate = (double) [ 0, MAX ]"
)
-)
+);
/* DivxEnc signals and args */
@@ -100,7 +82,7 @@ static void gst_divxenc_dispose (GObject *object);
static void gst_divxenc_chain (GstPad *pad,
GstData *data);
static GstPadLinkReturn gst_divxenc_connect (GstPad *pad,
- GstCaps *vscapslist);
+ const GstCaps *vscapslist);
/* properties */
static void gst_divxenc_set_property (GObject *object,
@@ -181,9 +163,9 @@ gst_divxenc_base_init (GstDivxEncClass *klass)
GstElementClass *element_class = GST_ELEMENT_CLASS (klass);
gst_element_class_add_pad_template (element_class,
- GST_PAD_TEMPLATE_GET (sink_template));
+ gst_static_pad_template_get (&sink_template));
gst_element_class_add_pad_template (element_class,
- GST_PAD_TEMPLATE_GET (src_template));
+ gst_static_pad_template_get (&src_template));
gst_element_class_set_details (element_class, &gst_divxenc_details);
}
@@ -239,7 +221,7 @@ gst_divxenc_init (GstDivxEnc *divxenc)
{
/* create the sink pad */
divxenc->sinkpad = gst_pad_new_from_template(
- GST_PAD_TEMPLATE_GET(sink_template),
+ gst_static_pad_template_get (&sink_template),
"sink");
gst_element_add_pad(GST_ELEMENT(divxenc), divxenc->sinkpad);
@@ -248,7 +230,7 @@ gst_divxenc_init (GstDivxEnc *divxenc)
/* create the src pad */
divxenc->srcpad = gst_pad_new_from_template(
- GST_PAD_TEMPLATE_GET(src_template),
+ gst_static_pad_template_get (&src_template),
"src");
gst_element_add_pad(GST_ELEMENT(divxenc), divxenc->srcpad);
@@ -397,11 +379,16 @@ gst_divxenc_chain (GstPad *pad,
static GstPadLinkReturn
-gst_divxenc_connect (GstPad *pad,
- GstCaps *vscaps)
+gst_divxenc_connect (GstPad *pad,
+ const GstCaps *caps)
{
GstDivxEnc *divxenc;
- GstCaps *caps;
+ GstStructure *structure = gst_caps_get_structure (caps, 0);
+ gint w,h;
+ gdouble fps;
+ guint32 fourcc;
+ guint32 divx_cs;
+ gint bitcnt = 0;
divxenc = GST_DIVXENC(gst_pad_get_parent (pad));
@@ -409,36 +396,32 @@ gst_divxenc_connect (GstPad *pad,
gst_divxenc_unset(divxenc);
/* we are not going to act on variable caps */
- if (!GST_CAPS_IS_FIXED(vscaps))
+ if (!gst_caps_is_fixed(caps))
return GST_PAD_LINK_DELAYED;
- for (caps = vscaps; caps != NULL; caps = caps->next) {
- gint w,h,d;
- gfloat fps;
- guint32 fourcc;
- guint32 divx_cs;
- gint bitcnt = 0;
- gst_caps_get_int(caps, "width", &w);
- gst_caps_get_int(caps, "height", &h);
- gst_caps_get_float(caps, "framerate", &fps);
- gst_caps_get_fourcc_int(caps, "format", &fourcc);
-
- switch (fourcc) {
- case GST_MAKE_FOURCC('I','4','2','0'):
- divx_cs = GST_MAKE_FOURCC('I','4','2','0');
- break;
- case GST_MAKE_FOURCC('Y','U','Y','2'):
- divx_cs = GST_MAKE_FOURCC('Y','U','Y','2');
- break;
- case GST_MAKE_FOURCC('Y','V','1','2'):
- divx_cs = GST_MAKE_FOURCC('Y','V','1','2');
- break;
- case GST_MAKE_FOURCC('Y','V','Y','U'):
- divx_cs = GST_MAKE_FOURCC('Y','V','Y','U');
- break;
- case GST_MAKE_FOURCC('U','Y','V','Y'):
- divx_cs = GST_MAKE_FOURCC('U','Y','V','Y');
- break;
+ gst_structure_get_int(structure, "width", &w);
+ gst_structure_get_int(structure, "height", &h);
+ gst_structure_get_double(structure, "framerate", &fps);
+ gst_structure_get_fourcc(structure, "format", &fourcc);
+
+ switch (fourcc) {
+ case GST_MAKE_FOURCC('I','4','2','0'):
+ divx_cs = GST_MAKE_FOURCC('I','4','2','0');
+ break;
+ case GST_MAKE_FOURCC('Y','U','Y','2'):
+ divx_cs = GST_MAKE_FOURCC('Y','U','Y','2');
+ break;
+ case GST_MAKE_FOURCC('Y','V','1','2'):
+ divx_cs = GST_MAKE_FOURCC('Y','V','1','2');
+ break;
+ case GST_MAKE_FOURCC('Y','V','Y','U'):
+ divx_cs = GST_MAKE_FOURCC('Y','V','Y','U');
+ break;
+ case GST_MAKE_FOURCC('U','Y','V','Y'):
+ divx_cs = GST_MAKE_FOURCC('U','Y','V','Y');
+ break;
+#if 0
+ /* someone fix RGB please */
case GST_MAKE_FOURCC('R','G','B',' '):
gst_caps_get_int(caps, "depth", &d);
switch (d) {
@@ -450,43 +433,35 @@ gst_divxenc_connect (GstPad *pad,
divx_cs = 0;
bitcnt = 32;
break;
- default:
- goto trynext;
- }
- break;
- default:
- goto trynext;
- }
-
- divxenc->csp = divx_cs;
- divxenc->bitcnt = bitcnt;
- divxenc->width = w;
- divxenc->height = h;
- divxenc->fps = fps;
-
- /* try it */
- if (gst_divxenc_setup(divxenc)) {
- GstPadLinkReturn ret;
- GstCaps *new_caps;
-
- new_caps = GST_CAPS_NEW("divxenc_src_caps",
- "video/x-divx",
- "divxversion", GST_PROPS_INT(5),
- "width", GST_PROPS_INT(w),
- "height", GST_PROPS_INT(h),
- "framerate", GST_PROPS_FLOAT(fps));
-
- ret = gst_pad_try_set_caps(divxenc->srcpad, new_caps);
-
- if (ret <= 0) {
- gst_divxenc_unset(divxenc);
- }
+#endif
+ default:
+ return GST_PAD_LINK_REFUSED;
+ }
- return ret;
+ divxenc->csp = divx_cs;
+ divxenc->bitcnt = bitcnt;
+ divxenc->width = w;
+ divxenc->height = h;
+ divxenc->fps = fps;
+
+ /* try it */
+ if (gst_divxenc_setup(divxenc)) {
+ GstPadLinkReturn ret;
+ GstCaps *new_caps;
+
+ new_caps = gst_caps_new_simple ("video/x-divx",
+ "divxversion", G_TYPE_INT, 5,
+ "width", G_TYPE_INT, w,
+ "height", G_TYPE_INT, h,
+ "framerate", G_TYPE_DOUBLE, fps,
+ NULL);
+
+ ret = gst_pad_try_set_caps(divxenc->srcpad, new_caps);
+ if (ret <= 0) {
+ gst_divxenc_unset(divxenc);
}
-trynext:
- continue;
+ return ret;
}
/* if we got here - it's not good */
diff --git a/ext/faac/gstfaac.c b/ext/faac/gstfaac.c
index be4c56cb..b5e4f9f6 100644
--- a/ext/faac/gstfaac.c
+++ b/ext/faac/gstfaac.c
@@ -23,54 +23,44 @@
#include "gstfaac.h"
-GST_PAD_TEMPLATE_FACTORY (src_template,
+static GstStaticPadTemplate src_template =
+GST_STATIC_PAD_TEMPLATE (
"src",
GST_PAD_SRC,
GST_PAD_ALWAYS,
- GST_CAPS_NEW (
- "faac_mpeg_templ",
- "audio/mpeg",
- "systemstream", GST_PROPS_BOOLEAN (FALSE),
- "mpegversion", GST_PROPS_LIST (
- GST_PROPS_INT (4), /* we prefer 4 */
- GST_PROPS_INT (2)
- ),
- "channels", GST_PROPS_INT_RANGE (1, 6),
- "samplerate", GST_PROPS_INT_RANGE (8000, 96000)
+ GST_STATIC_CAPS (
+ "audio/mpeg, "
+ "mpegversion = (int) { 4, 2 }, "
+ "channels = (int) [ 1, 6 ], "
+ "rate = (int) [ 8000, 96000 ]"
)
);
-GST_PAD_TEMPLATE_FACTORY (sink_template,
+static GstStaticPadTemplate sink_template =
+GST_STATIC_PAD_TEMPLATE (
"sink",
GST_PAD_SINK,
GST_PAD_ALWAYS,
- GST_CAPS_NEW (
- "faac_int16_templ",
- "audio/x-raw-int",
- "endianness", GST_PROPS_INT (G_BYTE_ORDER),
- "signed", GST_PROPS_BOOLEAN (TRUE),
- "width", GST_PROPS_INT (16),
- "depth", GST_PROPS_INT (16),
- "rate", GST_PROPS_INT_RANGE (8000, 96000),
- "channels", GST_PROPS_INT_RANGE (1, 6)
- ),
- GST_CAPS_NEW (
- "faac_int24_templ",
- "audio/x-raw-int",
- "endianness", GST_PROPS_INT (G_BYTE_ORDER),
- "signed", GST_PROPS_BOOLEAN (TRUE),
- "width", GST_PROPS_INT (32),
- "depth", GST_PROPS_INT (24),
- "rate", GST_PROPS_INT_RANGE (8000, 96000),
- "channels", GST_PROPS_INT_RANGE (1, 6)
- ),
- GST_CAPS_NEW (
- "faac_float_templ",
- "audio/x-raw-float",
- "endianness", GST_PROPS_INT (G_BYTE_ORDER),
- "depth", GST_PROPS_INT (32), /* float */
- "rate", GST_PROPS_INT_RANGE (8000, 96000),
- "channels", GST_PROPS_INT_RANGE (1, 6)
+ GST_STATIC_CAPS (
+ "audio/x-raw-int, "
+ "endianness = (int) BYTE_ORDER, "
+ "signed = (boolean) TRUE, "
+ "width = (int) 16, "
+ "depth = (int) 16, "
+ "rate = (int) [ 8000, 96000 ], "
+ "channels = (int) [ 1, 6]; "
+ "audio/x-raw-int, "
+ "endianness = (int) BYTE_ORDER, "
+ "signed = (boolean) TRUE, "
+ "width = (int) 32, "
+ "depth = (int) 24, "
+ "rate = (int) [ 8000, 96000], "
+ "channels = (int) [ 1, 6]; "
+ "audio/x-raw-float, "
+ "endianness = (int) BYTE_ORDER, "
+ "depth = (int) 32, " /* sizeof (gfloat) */
+ "rate = (int) [ 8000, 96000], "
+ "channels = (int) [ 1, 6]"
)
);
@@ -99,10 +89,10 @@ static void gst_faac_get_property (GObject *object,
static GstPadLinkReturn
gst_faac_sinkconnect (GstPad *pad,
- GstCaps *caps);
+ const GstCaps *caps);
static GstPadLinkReturn
gst_faac_srcconnect (GstPad *pad,
- GstCaps *caps);
+ const GstCaps *caps);
static void gst_faac_chain (GstPad *pad,
GstData *data);
static GstElementStateReturn
@@ -149,9 +139,9 @@ gst_faac_base_init (GstFaacClass *klass)
GstElementClass *element_class = GST_ELEMENT_CLASS (klass);
gst_element_class_add_pad_template (element_class,
- GST_PAD_TEMPLATE_GET (src_template));
+ gst_static_pad_template_get (&src_template));
gst_element_class_add_pad_template (element_class,
- GST_PAD_TEMPLATE_GET (sink_template));
+ gst_static_pad_template_get (&sink_template));
gst_element_class_set_details (element_class, &gst_faac_details);
}
@@ -245,13 +235,13 @@ gst_faac_init (GstFaac *faac)
GST_FLAG_SET (faac, GST_ELEMENT_EVENT_AWARE);
faac->sinkpad = gst_pad_new_from_template (
- GST_PAD_TEMPLATE_GET (sink_template), "sink");
+ gst_static_pad_template_get (&sink_template), "sink");
gst_element_add_pad (GST_ELEMENT (faac), faac->sinkpad);
gst_pad_set_chain_function (faac->sinkpad, gst_faac_chain);
gst_pad_set_link_function (faac->sinkpad, gst_faac_sinkconnect);
faac->srcpad = gst_pad_new_from_template (
- GST_PAD_TEMPLATE_GET (src_template), "src");
+ gst_static_pad_template_get (&src_template), "src");
gst_element_add_pad (GST_ELEMENT (faac), faac->srcpad);
gst_pad_set_link_function (faac->srcpad, gst_faac_srcconnect);
@@ -264,12 +254,16 @@ gst_faac_init (GstFaac *faac)
}
static GstPadLinkReturn
-gst_faac_sinkconnect (GstPad *pad,
- GstCaps *caps)
+gst_faac_sinkconnect (GstPad *pad,
+ const GstCaps *caps)
{
GstFaac *faac = GST_FAAC (gst_pad_get_parent (pad));
+ GstStructure *structure = gst_caps_get_structure (caps, 0);
+ faacEncHandle *handle;
+ gint channels, samplerate, depth;
+ gulong samples, bytes, fmt = 0, bps = 0;
- if (!GST_CAPS_IS_FIXED (caps))
+ if (!gst_caps_is_fixed (caps))
return GST_PAD_LINK_DELAYED;
if (faac->handle) {
@@ -281,66 +275,58 @@ gst_faac_sinkconnect (GstPad *pad,
faac->cache = NULL;
}
- for (; caps != NULL; caps = caps->next) {
- faacEncHandle *handle;
- gint channels, samplerate, depth;
- gulong samples, bytes, fmt = 0, bps = 0;
+ gst_structure_get_int (structure, "channels", &channels);
+ gst_structure_get_int (structure, "rate", &samplerate);
+ gst_structure_get_int (structure, "depth", &depth);
- gst_caps_get (caps, "channels", &channels,
- "rate", &samplerate,
- "depth", &depth, NULL);
+ /* open a new handle to the encoder */
+ if (!(handle = faacEncOpen (samplerate, channels,
+ &samples, &bytes)))
+ return GST_PAD_LINK_REFUSED;
- /* open a new handle to the encoder */
- if (!(handle = faacEncOpen (samplerate, channels,
- &samples, &bytes)))
- continue;
-
- switch (depth) {
- case 16:
- fmt = FAAC_INPUT_16BIT;
- bps = 2;
- break;
- case 24:
- fmt = FAAC_INPUT_32BIT; /* 24-in-32, actually */
- bps = 4;
- break;
- case 32:
- fmt = FAAC_INPUT_FLOAT; /* see template, this is right */
- bps = 4;
- break;
- }
-
- if (!fmt) {
- faacEncClose (handle);
- continue;
- }
+ switch (depth) {
+ case 16:
+ fmt = FAAC_INPUT_16BIT;
+ bps = 2;
+ break;
+ case 24:
+ fmt = FAAC_INPUT_32BIT; /* 24-in-32, actually */
+ bps = 4;
+ break;
+ case 32:
+ fmt = FAAC_INPUT_FLOAT; /* see template, this is right */
+ bps = 4;
+ break;
+ }
- faac->format = fmt;
- faac->bps = bps;
- faac->handle = handle;
- faac->bytes = bytes;
- faac->samples = samples;
- faac->channels = channels;
- faac->samplerate = samplerate;
-
- /* if the other side was already set-up, redo that */
- if (GST_PAD_CAPS (faac->srcpad))
- return gst_faac_srcconnect (faac->srcpad,
- gst_pad_get_allowed_caps (faac->srcpad));
-
- /* else, that'll be done later */
- return GST_PAD_LINK_OK;
+ if (!fmt) {
+ faacEncClose (handle);
+ return GST_PAD_LINK_REFUSED;
}
- return GST_PAD_LINK_REFUSED;
+ faac->format = fmt;
+ faac->bps = bps;
+ faac->handle = handle;
+ faac->bytes = bytes;
+ faac->samples = samples;
+ faac->channels = channels;
+ faac->samplerate = samplerate;
+
+ /* if the other side was already set-up, redo that */
+ if (GST_PAD_CAPS (faac->srcpad))
+ return gst_faac_srcconnect (faac->srcpad,
+ gst_pad_get_caps (GST_PAD_PEER (faac->srcpad)));
+
+ /* else, that'll be done later */
+ return GST_PAD_LINK_OK;
}
static GstPadLinkReturn
-gst_faac_srcconnect (GstPad *pad,
- GstCaps *caps)
+gst_faac_srcconnect (GstPad *pad,
+ const GstCaps *caps)
{
GstFaac *faac = GST_FAAC (gst_pad_get_parent (pad));
- GstCaps *t;
+ gint n;
if (!faac->handle ||
(faac->samplerate == -1 || faac->channels == -1)) {
@@ -348,20 +334,22 @@ gst_faac_srcconnect (GstPad *pad,
}
/* we do samplerate/channels ourselves */
- for (t = caps; t != NULL; t = t->next) {
- gst_props_remove_entry_by_name (t->properties, "rate");
- gst_props_remove_entry_by_name (t->properties, "channels");
+ for (n = 0; n < gst_caps_get_size (caps); n++) {
+ GstStructure *structure = gst_caps_get_structure (caps, n);
+ gst_structure_remove_field (structure, "rate");
+ gst_structure_remove_field (structure, "channels");
}
/* go through list */
caps = gst_caps_normalize (caps);
- for ( ; caps != NULL; caps = caps->next) {
+ for (n = 0; n < gst_caps_get_size (caps); n++) {
+ GstStructure *structure = gst_caps_get_structure (caps, n);
faacEncConfiguration *conf;
gint mpegversion = 0;
GstCaps *newcaps;
GstPadLinkReturn ret;
- gst_caps_get_int (caps, "mpegversion", &mpegversion);
+ gst_structure_get_int (structure, "mpegversion", &mpegversion);
/* new conf */
conf = faacEncGetCurrentConfiguration (faac->handle);
@@ -388,12 +376,11 @@ gst_faac_srcconnect (GstPad *pad,
continue;
}
- newcaps = GST_CAPS_NEW ("faac_mpeg_caps",
- "audio/mpeg",
- "systemstream", GST_PROPS_BOOLEAN (FALSE),
- "mpegversion", GST_PROPS_INT (mpegversion),
- "channels", GST_PROPS_INT (faac->channels),
- "rate", GST_PROPS_INT (faac->samplerate));
+ newcaps = gst_caps_new_simple ("audio/mpeg",
+ "mpegversion", G_TYPE_INT, mpegversion,
+ "channels", G_TYPE_INT, faac->channels,
+ "rate", G_TYPE_INT, faac->samplerate,
+ NULL);
ret = gst_pad_try_set_caps (faac->srcpad, newcaps);
switch (ret) {
diff --git a/ext/mpeg2enc/gstmpeg2enc.cc b/ext/mpeg2enc/gstmpeg2enc.cc
index ecf101a3..71a41ade 100644
--- a/ext/mpeg2enc/gstmpeg2enc.cc
+++ b/ext/mpeg2enc/gstmpeg2enc.cc
@@ -25,52 +25,76 @@
#include "gstmpeg2enc.hh"
-GST_PAD_TEMPLATE_FACTORY (sink_templ,
- "sink",
- GST_PAD_SINK,
- GST_PAD_ALWAYS,
- GST_CAPS_NEW (
- "mpeg2enc_sink",
- "video/x-raw-yuv",
- "format", GST_PROPS_FOURCC (GST_MAKE_FOURCC ('I','4','2','0')),
- "width", GST_PROPS_INT_RANGE (16, 4096),
- "height", GST_PROPS_INT_RANGE (16, 4096),
- "framerate", GST_PROPS_LIST (
- GST_PROPS_FLOAT (24/1.001),
- GST_PROPS_FLOAT (24.),
- GST_PROPS_FLOAT (25.),
- GST_PROPS_FLOAT (30/1.001),
- GST_PROPS_FLOAT (30.),
- GST_PROPS_FLOAT (50.),
- GST_PROPS_FLOAT (60/1.001),
- GST_PROPS_FLOAT (60.)
- )
- )
-)
+/*
+ * We can't use fractions in static pad templates, so
+ * we do something manual...
+ */
+static void
+add_fps (GstCaps *caps)
+{
+ GstStructure *structure = gst_caps_get_structure (caps, 0);
+ GValue list = { 0 }, fps = { 0 };
+ gdouble fpss[] = { 24.0/1.001, 24.0, 25.0,
+ 30.0/1.001, 30.0, 50.0,
+ 60.0/1.001, 60.0, 0 };
+ guint n;
+
+ g_value_init (&list, GST_TYPE_LIST);
+ g_value_init (&fps, G_TYPE_DOUBLE);
+ for (n = 0; fpss[n] != 0; n++) {
+ g_value_set_double (&fps, fpss[n]);
+ gst_value_list_append_value (&list, &fps);
+ }
+ gst_structure_set_value (structure, "framerate", &list);
+ g_value_unset (&list);
+ g_value_unset (&fps);
+}
-GST_PAD_TEMPLATE_FACTORY (src_templ,
- "src",
- GST_PAD_SRC,
- GST_PAD_ALWAYS,
- GST_CAPS_NEW (
- "mpeg2enc_src",
- "video/mpeg",
- "systemstream", GST_PROPS_BOOLEAN (FALSE),
- "mpegversion", GST_PROPS_INT_RANGE (1, 2),
- "width", GST_PROPS_INT_RANGE (16, 4096),
- "height", GST_PROPS_INT_RANGE (16, 4096),
- "framerate", GST_PROPS_LIST (
- GST_PROPS_FLOAT (24/1.001),
- GST_PROPS_FLOAT (24.),
- GST_PROPS_FLOAT (25.),
- GST_PROPS_FLOAT (30/1.001),
- GST_PROPS_FLOAT (30.),
- GST_PROPS_FLOAT (50.),
- GST_PROPS_FLOAT (60/1.001),
- GST_PROPS_FLOAT (60.)
- )
- )
-)
+static GstPadTemplate *
+sink_templ (void)
+{
+ static GstPadTemplate *templ = NULL;
+
+ if (!templ) {
+ GstCaps *caps;
+
+ caps = gst_caps_new_simple ("video/x-raw-yuv",
+ "format", GST_TYPE_FOURCC,
+ GST_MAKE_FOURCC ('I','4','2','0'),
+ "width", GST_TYPE_INT_RANGE, 16, 4096,
+ "height", GST_TYPE_INT_RANGE, 16, 4096,
+ NULL);
+ add_fps (caps);
+
+ templ = gst_pad_template_new ("sink", GST_PAD_SINK,
+ GST_PAD_ALWAYS, caps);
+ }
+
+ return templ;
+}
+
+static GstPadTemplate *
+src_templ (void)
+{
+ static GstPadTemplate *templ = NULL;
+
+ if (!templ) {
+ GstCaps *caps;
+
+ caps = gst_caps_new_simple ("video/mpeg",
+ "systemstream", G_TYPE_BOOLEAN, FALSE,
+ "mpegversion", GST_TYPE_INT_RANGE, 1, 2,
+ "width", GST_TYPE_INT_RANGE, 16, 4096,
+ "height", GST_TYPE_INT_RANGE, 16, 4096,
+ NULL);
+ add_fps (caps);
+
+ templ = gst_pad_template_new ("sink", GST_PAD_SINK,
+ GST_PAD_ALWAYS, caps);
+ }
+
+ return templ;
+}
static void gst_mpeg2enc_base_init (GstMpeg2encClass *klass);
static void gst_mpeg2enc_class_init (GstMpeg2encClass *klass);
@@ -81,10 +105,9 @@ static void gst_mpeg2enc_loop (GstElement *element);
static GstPadLinkReturn
gst_mpeg2enc_sink_link (GstPad *pad,
- GstCaps *caps);
+ const GstCaps *caps);
static GstCaps *
- gst_mpeg2enc_src_getcaps (GstPad *pad,
- GstCaps *caps);
+ gst_mpeg2enc_src_getcaps (GstPad *pad);
static GstElementStateReturn
gst_mpeg2enc_change_state (GstElement *element);
@@ -140,10 +163,8 @@ gst_mpeg2enc_base_init (GstMpeg2encClass *klass)
};
GstElementClass *element_class = GST_ELEMENT_CLASS (klass);
- gst_element_class_add_pad_template (element_class,
- GST_PAD_TEMPLATE_GET (src_templ));
- gst_element_class_add_pad_template (element_class,
- GST_PAD_TEMPLATE_GET (sink_templ));
+ gst_element_class_add_pad_template (element_class, src_templ ());
+ gst_element_class_add_pad_template (element_class, sink_templ ());
gst_element_class_set_details (element_class,
&gst_mpeg2enc_details);
}
@@ -235,12 +256,12 @@ gst_mpeg2enc_loop (GstElement *element)
}
static GstPadLinkReturn
-gst_mpeg2enc_sink_link (GstPad *pad,
- GstCaps *caps)
+gst_mpeg2enc_sink_link (GstPad *pad,
+ const GstCaps *caps)
{
GstMpeg2enc *enc = GST_MPEG2ENC (gst_pad_get_parent (pad));
- if (!GST_CAPS_IS_FIXED (caps))
+ if (!gst_caps_is_fixed (caps))
return GST_PAD_LINK_DELAYED;
if (enc->encoder) {
@@ -252,8 +273,7 @@ gst_mpeg2enc_sink_link (GstPad *pad,
}
static GstCaps *
-gst_mpeg2enc_src_getcaps (GstPad *pad,
- GstCaps *caps)
+gst_mpeg2enc_src_getcaps (GstPad *pad)
{
GstMpeg2enc *enc = GST_MPEG2ENC (gst_pad_get_parent (pad));
@@ -261,8 +281,8 @@ gst_mpeg2enc_src_getcaps (GstPad *pad,
return enc->encoder->getFormat ();
}
- return gst_caps_ref (gst_pad_template_get_caps (
- gst_element_get_pad_template (gst_pad_get_parent (pad), "src")));
+ return (GstCaps* ) gst_pad_template_get_caps (
+ gst_element_get_pad_template (gst_pad_get_parent (pad), "src"));
}
static void
diff --git a/ext/mpeg2enc/gstmpeg2encoder.cc b/ext/mpeg2enc/gstmpeg2encoder.cc
index e0952db1..b1c2b8ef 100644
--- a/ext/mpeg2enc/gstmpeg2encoder.cc
+++ b/ext/mpeg2enc/gstmpeg2encoder.cc
@@ -85,11 +85,11 @@ GstMpeg2Encoder::getFormat ()
{
gdouble fps = Y4M_RATIO_DBL (mpeg_framerate (options.frame_rate));
- return GST_CAPS_NEW ("mpeg2enc_src",
- "video/mpeg",
- "systemstream", GST_PROPS_BOOLEAN (FALSE),
- "mpegversion", GST_PROPS_INT (options.mpeg),
- "width", GST_PROPS_INT (options.in_img_width),
- "height", GST_PROPS_INT (options.in_img_height),
- "framerate", GST_PROPS_FLOAT (fps));
+ return gst_caps_new_simple ("video/mpeg",
+ "systemstream", G_TYPE_BOOLEAN, FALSE,
+ "mpegversion", G_TYPE_INT, options.mpeg,
+ "width", G_TYPE_INT, options.in_img_width,
+ "height", G_TYPE_INT, options.in_img_height,
+ "framerate", G_TYPE_DOUBLE, fps,
+ NULL);
}
diff --git a/ext/mpeg2enc/gstmpeg2encpicturereader.cc b/ext/mpeg2enc/gstmpeg2encpicturereader.cc
index 226acc8d..1c8e9f4c 100644
--- a/ext/mpeg2enc/gstmpeg2encpicturereader.cc
+++ b/ext/mpeg2enc/gstmpeg2encpicturereader.cc
@@ -42,7 +42,7 @@ GstMpeg2EncPictureReader::GstMpeg2EncPictureReader (GstPad *in_pad,
GstMpeg2EncPictureReader::~GstMpeg2EncPictureReader ()
{
- gst_caps_unref (caps);
+ gst_caps_free (caps);
}
/*
@@ -52,12 +52,13 @@ GstMpeg2EncPictureReader::~GstMpeg2EncPictureReader ()
void
GstMpeg2EncPictureReader::StreamPictureParams (MPEG2EncInVidParams &strm)
{
+ GstStructure *structure = gst_caps_get_structure (caps, 0);
gint width, height;
- gfloat fps;
+ gdouble fps;
- gst_caps_get (caps, "width", &width,
- "height", &height,
- "framerate", &fps, NULL);
+ gst_structure_get_int (structure, "width", &width);
+ gst_structure_get_int (structure, "height", &height);
+ gst_structure_get_double (structure, "framerate", &fps);
strm.horizontal_size = width;
strm.vertical_size = height;