summaryrefslogtreecommitdiffstats
path: root/ext/jpeg
diff options
context:
space:
mode:
authorMichael Smith <msmith@xiph.org>2007-07-06 14:35:59 +0000
committerMichael Smith <msmith@xiph.org>2007-07-06 14:35:59 +0000
commit547688d342eb1ecc344dd50ff1f33967f61e3c81 (patch)
treefeed322a4e8465aad482df4f998f39a7c7f1107e /ext/jpeg
parent5e32a710d7e28c063424d9334a74973c7ad19b0c (diff)
ext/jpeg/gstsmokeenc.*: Remove stupidity in get/set caps functions.
Original commit message from CVS: * ext/jpeg/gstsmokeenc.c: (gst_smokeenc_init), (gst_smokeenc_setcaps), (gst_smokeenc_chain), (gst_smokeenc_change_state): * ext/jpeg/gstsmokeenc.h: Remove stupidity in get/set caps functions. Fix some refcounting problems.
Diffstat (limited to 'ext/jpeg')
-rw-r--r--ext/jpeg/gstsmokeenc.c70
-rw-r--r--ext/jpeg/gstsmokeenc.h2
2 files changed, 11 insertions, 61 deletions
diff --git a/ext/jpeg/gstsmokeenc.c b/ext/jpeg/gstsmokeenc.c
index eef8f8f4..87e4085a 100644
--- a/ext/jpeg/gstsmokeenc.c
+++ b/ext/jpeg/gstsmokeenc.c
@@ -70,7 +70,6 @@ gst_smokeenc_change_state (GstElement * element, GstStateChange transition);
static GstFlowReturn gst_smokeenc_chain (GstPad * pad, GstBuffer * buf);
static gboolean gst_smokeenc_setcaps (GstPad * pad, GstCaps * caps);
-static GstCaps *gst_smokeenc_getcaps (GstPad * pad);
static gboolean gst_smokeenc_resync (GstSmokeEnc * smokeenc);
static void gst_smokeenc_set_property (GObject * object, guint prop_id,
@@ -80,8 +79,6 @@ static void gst_smokeenc_get_property (GObject * object, guint prop_id,
static GstElementClass *parent_class = NULL;
-//static guint gst_smokeenc_signals[LAST_SIGNAL] = { 0 };
-
GType
gst_smokeenc_get_type (void)
{
@@ -179,13 +176,11 @@ gst_smokeenc_init (GstSmokeEnc * smokeenc)
gst_pad_new_from_static_template (&gst_smokeenc_sink_pad_template,
"sink");
gst_pad_set_chain_function (smokeenc->sinkpad, gst_smokeenc_chain);
- gst_pad_set_getcaps_function (smokeenc->sinkpad, gst_smokeenc_getcaps);
gst_pad_set_setcaps_function (smokeenc->sinkpad, gst_smokeenc_setcaps);
gst_element_add_pad (GST_ELEMENT (smokeenc), smokeenc->sinkpad);
smokeenc->srcpad =
gst_pad_new_from_static_template (&gst_smokeenc_src_pad_template, "src");
- gst_pad_set_getcaps_function (smokeenc->sinkpad, gst_smokeenc_getcaps);
gst_pad_use_fixed_caps (smokeenc->srcpad);
gst_element_add_pad (GST_ELEMENT (smokeenc), smokeenc->srcpad);
@@ -206,63 +201,16 @@ gst_smokeenc_finalize (GObject * object)
G_OBJECT_CLASS (parent_class)->finalize (object);
}
-static GstCaps *
-gst_smokeenc_getcaps (GstPad * pad)
-{
- GstSmokeEnc *smokeenc = GST_SMOKEENC (gst_pad_get_parent (pad));
- GstPad *otherpad;
- GstCaps *caps;
- const char *name;
- int i;
- GstStructure *structure = NULL;
-
- /* we want to proxy properties like width, height and framerate from the
- other end of the element */
- otherpad = (pad == smokeenc->srcpad) ? smokeenc->sinkpad : smokeenc->srcpad;
-
- caps = gst_pad_peer_get_caps (otherpad);
- if (caps == NULL)
- caps = gst_caps_copy (gst_pad_get_pad_template_caps (pad));
- else
- caps = gst_caps_make_writable (caps);
-
- if (pad == smokeenc->srcpad) {
- name = "video/x-smoke";
- } else {
- name = "video/x-raw-yuv";
- }
-
- for (i = 0; i < gst_caps_get_size (caps); i++) {
- structure = gst_caps_get_structure (caps, i);
-
- gst_structure_set_name (structure, name);
- gst_structure_remove_field (structure, "format");
- /* ... but for the sink pad, we only do I420 anyway, so add that */
- if (pad == smokeenc->sinkpad) {
- gst_structure_set (structure, "format", GST_TYPE_FOURCC,
- GST_STR_FOURCC ("I420"), NULL);
- }
- }
-
- gst_object_unref (smokeenc);
-
- return caps;
-}
-
static gboolean
gst_smokeenc_setcaps (GstPad * pad, GstCaps * caps)
{
GstSmokeEnc *smokeenc;
GstStructure *structure;
- GstCaps *othercaps;
const GValue *framerate;
- GstPad *otherpad;
gboolean ret;
smokeenc = GST_SMOKEENC (gst_pad_get_parent (pad));
- otherpad = (pad == smokeenc->srcpad) ? smokeenc->sinkpad : smokeenc->srcpad;
-
structure = gst_caps_get_structure (caps, 0);
framerate = gst_structure_get_value (structure, "framerate");
if (framerate) {
@@ -279,17 +227,14 @@ gst_smokeenc_setcaps (GstPad * pad, GstCaps * caps)
if ((smokeenc->width & 0x0f) != 0 || (smokeenc->height & 0x0f) != 0)
goto width_or_height_notx16;
- othercaps = gst_caps_copy (gst_pad_get_pad_template_caps (otherpad));
+ if (smokeenc->srccaps)
+ gst_caps_unref (smokeenc->srccaps);
- gst_caps_set_simple (othercaps,
+ smokeenc->srccaps = gst_caps_new_simple ("video/x-smoke",
"width", G_TYPE_INT, smokeenc->width,
"height", G_TYPE_INT, smokeenc->height,
"framerate", GST_TYPE_FRACTION, smokeenc->fps_num, smokeenc->fps_denom,
NULL);
- GST_DEBUG ("here are the caps: %" GST_PTR_FORMAT, othercaps);
-
- gst_pad_set_caps (otherpad, othercaps);
- gst_caps_unref (othercaps);
ret = gst_smokeenc_resync (smokeenc);
@@ -301,6 +246,7 @@ width_or_height_notx16:
{
GST_WARNING_OBJECT (smokeenc, "width and height must be multiples of 16"
", %dx%d not allowed", smokeenc->width, smokeenc->height);
+ gst_object_unref (smokeenc);
return FALSE;
}
}
@@ -382,7 +328,7 @@ gst_smokeenc_chain (GstPad * pad, GstBuffer * buf)
GST_BUFFER_DURATION (outbuf) =
gst_util_uint64_scale_int (GST_SECOND, smokeenc->fps_denom,
smokeenc->fps_num);
- gst_buffer_set_caps (outbuf, GST_PAD_CAPS (smokeenc->srcpad));
+ gst_buffer_set_caps (outbuf, smokeenc->srccaps);
flags = 0;
if ((smokeenc->frame % smokeenc->keyframe) == 0) {
@@ -398,8 +344,6 @@ gst_smokeenc_chain (GstPad * pad, GstBuffer * buf)
GST_BUFFER_OFFSET (outbuf) = smokeenc->frame;
GST_BUFFER_OFFSET_END (outbuf) = smokeenc->frame + 1;
- gst_buffer_set_caps (outbuf, GST_PAD_CAPS (smokeenc->srcpad));
-
ret = gst_pad_push (smokeenc->srcpad, outbuf);
smokeenc->frame++;
@@ -489,6 +433,10 @@ gst_smokeenc_change_state (GstElement * element, GstStateChange transition)
switch (transition) {
case GST_STATE_CHANGE_PAUSED_TO_READY:
+ if (enc->srccaps) {
+ gst_caps_unref (enc->srccaps);
+ enc->srccaps = NULL;
+ }
break;
default:
break;
diff --git a/ext/jpeg/gstsmokeenc.h b/ext/jpeg/gstsmokeenc.h
index 08516ff1..8a2be327 100644
--- a/ext/jpeg/gstsmokeenc.h
+++ b/ext/jpeg/gstsmokeenc.h
@@ -55,6 +55,8 @@ struct _GstSmokeEnc {
gint keyframe;
gint fps_num, fps_denom;
+ GstCaps *srccaps;
+
SmokeCodecInfo *info;
gint threshold;