summaryrefslogtreecommitdiffstats
path: root/audio/gstsbcenc.c
diff options
context:
space:
mode:
authorLuiz Augusto von Dentz <luiz.dentz@openbossa.org>2008-01-23 13:14:02 +0000
committerLuiz Augusto von Dentz <luiz.dentz@openbossa.org>2008-01-23 13:14:02 +0000
commita0af7ee44534dad8f35a4142c6a22177e54ffc57 (patch)
treec6a475d035e40f617a213a9ad5327a7eb5d01388 /audio/gstsbcenc.c
parent1cacae6dd9f44d0e403aa29e45eb3d20e7127f68 (diff)
Make a2dpsink to act like a bin and split the payloader.
Diffstat (limited to 'audio/gstsbcenc.c')
-rw-r--r--audio/gstsbcenc.c131
1 files changed, 46 insertions, 85 deletions
diff --git a/audio/gstsbcenc.c b/audio/gstsbcenc.c
index 185151f5..08ddc14f 100644
--- a/audio/gstsbcenc.c
+++ b/audio/gstsbcenc.c
@@ -120,32 +120,6 @@ static GstStaticPadTemplate sbc_enc_src_factory =
gboolean gst_sbc_enc_fill_sbc_params(GstSbcEnc *enc, GstCaps *caps);
-static void sbc_enc_set_structure_int_param(GstSbcEnc *enc,
- GstStructure *structure, const gchar* field,
- gint field_value)
-{
- GValue *value;
-
- value = g_new0(GValue,1);
- value = g_value_init(value, G_TYPE_INT);
- g_value_set_int(value, field_value);
- gst_structure_set_value(structure, field, value);
- g_free(value);
-}
-
-static void sbc_enc_set_structure_string_param(GstSbcEnc *enc,
- GstStructure *structure, const gchar* field,
- const gchar* field_value)
-{
- GValue *value;
-
- value = g_new0(GValue,1);
- value = g_value_init(value, G_TYPE_STRING);
- g_value_set_string(value, field_value);
- gst_structure_set_value(structure, field, value);
- g_free(value);
-}
-
static GstCaps* sbc_enc_generate_srcpad_caps(GstSbcEnc *enc)
{
GstCaps* src_caps;
@@ -153,45 +127,49 @@ static GstCaps* sbc_enc_generate_srcpad_caps(GstSbcEnc *enc)
GEnumValue *enum_value;
GEnumClass *enum_class;
gchar* temp;
+ GValue *value;
src_caps = gst_caps_copy(gst_pad_get_pad_template_caps(enc->srcpad));
structure = gst_caps_get_structure(src_caps, 0);
+ value = g_new0(GValue, 1);
+
if (enc->rate != 0)
- sbc_enc_set_structure_int_param(enc, structure, "rate",
- enc->rate);
+ gst_sbc_util_set_structure_int_param(structure, "rate",
+ enc->rate, value);
if (enc->channels != 0)
- sbc_enc_set_structure_int_param(enc, structure, "channels",
- enc->channels);
+ gst_sbc_util_set_structure_int_param(structure, "channels",
+ enc->channels, value);
if (enc->subbands != 0)
- sbc_enc_set_structure_int_param(enc, structure, "subbands",
- enc->subbands);
+ gst_sbc_util_set_structure_int_param(structure, "subbands",
+ enc->subbands, value);
if (enc->blocks != 0)
- sbc_enc_set_structure_int_param(enc, structure, "blocks",
- enc->blocks);
+ gst_sbc_util_set_structure_int_param(structure, "blocks",
+ enc->blocks, value);
if (enc->mode != BT_A2DP_CHANNEL_MODE_AUTO) {
enum_class = g_type_class_ref(GST_TYPE_SBC_MODE);
enum_value = g_enum_get_value(enum_class, enc->mode);
- sbc_enc_set_structure_string_param(enc, structure, "mode",
- enum_value->value_nick);
+ gst_sbc_util_set_structure_string_param(structure, "mode",
+ enum_value->value_nick, value);
g_type_class_unref(enum_class);
}
if (enc->allocation != BT_A2DP_ALLOCATION_AUTO) {
enum_class = g_type_class_ref(GST_TYPE_SBC_ALLOCATION);
enum_value = g_enum_get_value(enum_class, enc->allocation);
- sbc_enc_set_structure_string_param(enc, structure, "allocation",
- enum_value->value_nick);
+ gst_sbc_util_set_structure_string_param(structure, "allocation",
+ enum_value->value_nick, value);
g_type_class_unref(enum_class);
}
temp = gst_caps_to_string(src_caps);
GST_DEBUG_OBJECT(enc, "Srcpad caps: %s", temp);
g_free(temp);
+ g_free(value);
return src_caps;
}
@@ -207,23 +185,10 @@ static GstCaps* sbc_enc_src_getcaps (GstPad * pad)
static gboolean sbc_enc_src_setcaps (GstPad *pad, GstCaps *caps)
{
- GstCaps* srcpad_caps;
- GstCaps* temp_caps;
- gboolean res = TRUE;
GstSbcEnc *enc = GST_SBC_ENC(GST_PAD_PARENT(pad));
GST_LOG_OBJECT(enc, "setting srcpad caps");
- srcpad_caps = sbc_enc_generate_srcpad_caps(enc);
- temp_caps = gst_caps_intersect(srcpad_caps, caps);
- if (temp_caps == GST_CAPS_NONE)
- res = FALSE;
-
- gst_caps_unref(temp_caps);
- gst_caps_unref(srcpad_caps);
-
- g_return_val_if_fail(res, FALSE);
-
return gst_sbc_enc_fill_sbc_params(enc, caps);
}
@@ -313,38 +278,16 @@ error:
gboolean gst_sbc_enc_fill_sbc_params(GstSbcEnc *enc, GstCaps *caps)
{
- GstStructure *structure;
- gint rate, channels, subbands, blocks, bitpool;
- const gchar* mode;
- const gchar* allocation;
-
- g_assert(gst_caps_is_fixed(caps));
- structure = gst_caps_get_structure(caps, 0);
-
- if (!gst_structure_get_int(structure, "rate", &rate))
- return FALSE;
- if (!gst_structure_get_int(structure, "channels", &channels))
- return FALSE;
- if (!gst_structure_get_int(structure, "subbands", &subbands))
- return FALSE;
- if (!gst_structure_get_int(structure, "blocks", &blocks))
- return FALSE;
- if (!gst_structure_get_int(structure, "bitpool", &bitpool))
+ if (!gst_sbc_util_fill_sbc_params(&enc->sbc, caps))
return FALSE;
- if (!(mode = gst_structure_get_string(structure, "mode")))
- return FALSE;
- if (!(allocation = gst_structure_get_string(structure, "allocation")))
- return FALSE;
-
- enc->rate = enc->sbc.rate = rate;
- enc->channels = enc->sbc.channels = channels;
- enc->blocks = enc->sbc.blocks = blocks;
- enc->subbands = enc->sbc.subbands = subbands;
- enc->sbc.bitpool = bitpool;
- enc->mode = enc->sbc.joint = gst_sbc_get_mode_int(mode);
- enc->allocation = enc->sbc.allocation = gst_sbc_get_allocation_mode_int(allocation);
+ enc->rate = enc->sbc.rate;
+ enc->channels = enc->sbc.channels;
+ enc->blocks = enc->sbc.blocks;
+ enc->subbands = enc->sbc.subbands;
+ enc->mode = enc->sbc.joint;
+ enc->allocation = enc->sbc.allocation;
enc->codesize = sbc_get_codesize(&enc->sbc);
enc->frame_length = sbc_get_frame_length(&enc->sbc);
enc->frame_duration = sbc_get_frame_duration(&enc->sbc);
@@ -390,6 +333,8 @@ static GstFlowReturn sbc_enc_chain(GstPad *pad, GstBuffer *buffer)
gst_adapter_flush(adapter, consumed);
GST_BUFFER_TIMESTAMP(output) = GST_BUFFER_TIMESTAMP(buffer);
+ /* we have only 1 frame */
+ GST_BUFFER_DURATION(output) = enc->frame_duration;
res = gst_pad_push(enc->srcpad, output);
if (res != GST_FLOW_OK)
@@ -559,17 +504,22 @@ static void gst_sbc_enc_class_init(GstSbcEncClass *klass)
static void gst_sbc_enc_init(GstSbcEnc *self, GstSbcEncClass *klass)
{
- self->sinkpad = gst_pad_new_from_static_template(&sbc_enc_sink_factory, "sink");
+ self->sinkpad = gst_pad_new_from_static_template(
+ &sbc_enc_sink_factory, "sink");
gst_pad_set_setcaps_function (self->sinkpad,
GST_DEBUG_FUNCPTR (sbc_enc_sink_setcaps));
gst_element_add_pad(GST_ELEMENT(self), self->sinkpad);
- self->srcpad = gst_pad_new_from_static_template(&sbc_enc_src_factory, "src");
- gst_pad_set_getcaps_function(self->srcpad, GST_DEBUG_FUNCPTR(sbc_enc_src_getcaps));
- gst_pad_set_setcaps_function(self->srcpad, GST_DEBUG_FUNCPTR(sbc_enc_src_setcaps));
+ self->srcpad = gst_pad_new_from_static_template(
+ &sbc_enc_src_factory, "src");
+ gst_pad_set_getcaps_function(self->srcpad,
+ GST_DEBUG_FUNCPTR(sbc_enc_src_getcaps));
+ gst_pad_set_setcaps_function(self->srcpad,
+ GST_DEBUG_FUNCPTR(sbc_enc_src_setcaps));
gst_element_add_pad(GST_ELEMENT(self), self->srcpad);
- gst_pad_set_chain_function(self->sinkpad, GST_DEBUG_FUNCPTR(sbc_enc_chain));
+ gst_pad_set_chain_function(self->sinkpad,
+ GST_DEBUG_FUNCPTR(sbc_enc_chain));
self->subbands = SBC_ENC_DEFAULT_SUB_BANDS;
self->blocks = SBC_ENC_DEFAULT_BLOCKS;
@@ -578,5 +528,16 @@ static void gst_sbc_enc_init(GstSbcEnc *self, GstSbcEncClass *klass)
self->rate = SBC_ENC_DEFAULT_RATE;
self->channels = SBC_ENC_DEFAULT_CHANNELS;
+ self->frame_length = 0;
+ self->frame_duration = 0;
+
self->adapter = gst_adapter_new();
}
+
+gboolean gst_sbc_enc_plugin_init (GstPlugin * plugin)
+{
+ return gst_element_register (plugin, "sbcenc",
+ GST_RANK_NONE, GST_TYPE_SBC_ENC);
+}
+
+