summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMarcel Holtmann <marcel@holtmann.org>2007-08-26 13:12:47 +0000
committerMarcel Holtmann <marcel@holtmann.org>2007-08-26 13:12:47 +0000
commit0551d4b78641ad4cc286d3e69c3268a27f5e9647 (patch)
treefd687ceabdce74e47acba51311507b1f66528081
parentc82412ad9e399b9b6391ef73c24f36ff83983e9d (diff)
Add mode property to the encoder
-rw-r--r--audio/gstsbcenc.c73
-rw-r--r--audio/gstsbcenc.h2
2 files changed, 74 insertions, 1 deletions
diff --git a/audio/gstsbcenc.c b/audio/gstsbcenc.c
index 86a66270..7f94fc2a 100644
--- a/audio/gstsbcenc.c
+++ b/audio/gstsbcenc.c
@@ -32,6 +32,31 @@
GST_DEBUG_CATEGORY_STATIC(sbc_enc_debug);
#define GST_CAT_DEFAULT sbc_enc_debug
+#define GST_TYPE_SBC_MODE (gst_sbc_mode_get_type())
+
+static GType gst_sbc_mode_get_type(void)
+{
+ static GType sbc_mode_type = 0;
+ static GEnumValue sbc_modes[] = {
+ { 0, "Auto", "auto" },
+ { 1, "Mono", "mono" },
+ { 2, "Dual Channel", "dual" },
+ { 3, "Stereo", "stereo" },
+ { 4, "Joint Stereo", "joint" },
+ { -1, NULL, NULL}
+ };
+
+ if (!sbc_mode_type)
+ sbc_mode_type = g_enum_register_static("GstSbcMode", sbc_modes);
+
+ return sbc_mode_type;
+}
+
+enum {
+ PROP_0,
+ PROP_MODE,
+};
+
GST_BOILERPLATE(GstSbcEnc, gst_sbc_enc, GstElement, GST_TYPE_ELEMENT);
static const GstElementDetails sbc_enc_details =
@@ -52,7 +77,13 @@ static GstStaticPadTemplate sbc_enc_sink_factory =
static GstStaticPadTemplate sbc_enc_src_factory =
GST_STATIC_PAD_TEMPLATE("src", GST_PAD_SRC, GST_PAD_ALWAYS,
- GST_STATIC_CAPS("audio/x-sbc"));
+ GST_STATIC_CAPS("audio/x-sbc, "
+ "rate = (int) { 16000, 32000, 44100, 48000 }, "
+ "channels = (int) [ 1, 2 ], "
+ "mode = (string) { mono, dual, stereo, joint }, "
+ "blocks = (int) { 4, 8, 12, 16 }, "
+ "subbands = (int) { 4, 8 }, "
+ "allocation = (string) { snr, loudness }"));
static GstFlowReturn sbc_enc_chain(GstPad *pad, GstBuffer *buffer)
{
@@ -148,14 +179,54 @@ static void gst_sbc_enc_base_init(gpointer g_class)
gst_element_class_set_details(element_class, &sbc_enc_details);
}
+static void gst_sbc_enc_set_property(GObject *object, guint prop_id,
+ const GValue *value, GParamSpec *pspec)
+{
+ GstSbcEnc *enc = GST_SBC_ENC(object);
+
+ switch (prop_id) {
+ case PROP_MODE:
+ enc->mode = g_value_get_enum(value);
+ break;
+
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);
+ break;
+ }
+}
+
+static void gst_sbc_enc_get_property(GObject *object, guint prop_id,
+ GValue *value, GParamSpec *pspec)
+{
+ GstSbcEnc *enc = GST_SBC_ENC(object);
+
+ switch (prop_id) {
+ case PROP_MODE:
+ g_value_set_enum(value, enc->mode);
+ break;
+
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);
+ break;
+ }
+}
+
static void gst_sbc_enc_class_init(GstSbcEncClass *klass)
{
+ GObjectClass *object_class = G_OBJECT_CLASS(klass);
GstElementClass *element_class = GST_ELEMENT_CLASS(klass);
parent_class = g_type_class_peek_parent(klass);
+ object_class->set_property = GST_DEBUG_FUNCPTR(gst_sbc_enc_set_property);
+ object_class->get_property = GST_DEBUG_FUNCPTR(gst_sbc_enc_get_property);
+
element_class->change_state = GST_DEBUG_FUNCPTR(sbc_enc_change_state);
+ g_object_class_install_property(object_class, PROP_MODE,
+ g_param_spec_enum("mode", "Mode", "Encoding mode",
+ GST_TYPE_SBC_MODE, 0, G_PARAM_READWRITE));
+
GST_DEBUG_CATEGORY_INIT(sbc_enc_debug, "sbcenc", 0,
"SBC encoding element");
}
diff --git a/audio/gstsbcenc.h b/audio/gstsbcenc.h
index 491135c1..e7daf2d3 100644
--- a/audio/gstsbcenc.h
+++ b/audio/gstsbcenc.h
@@ -47,6 +47,8 @@ struct _GstSbcEnc {
GstPad *sinkpad;
GstPad *srcpad;
+ gint mode;
+
sbc_t sbc;
};