Add bitpool capability.

This commit is contained in:
Luiz Augusto von Dentz 2007-10-29 15:02:26 +00:00
parent 973d90d520
commit ea39736b35
5 changed files with 42 additions and 6 deletions

View File

@ -112,7 +112,8 @@ static GstStaticPadTemplate a2dp_sink_factory =
"mode = (string) { mono, dual, stereo, joint }, "
"blocks = (int) { 4, 8, 12, 16 }, "
"subbands = (int) { 4, 8 }, "
"allocation = (string) { snr, loudness }; "
"allocation = (string) { snr, loudness },"
"bitpool = (int) [ 2, 64 ]; "
"audio/mpeg, "
"mpegversion = (int) 1, "
"layer = (int) [ 1, 3 ], "
@ -335,7 +336,9 @@ static gboolean gst_a2dp_sink_init_pkt_conf(GstA2dpSink *sink,
value = gst_structure_get_value(structure, "blocks");
sbc->blocks = g_value_get_int(value);
sbc->bitpool = 32;
value = gst_structure_get_value(structure, "bitpool");
sbc->bitpool = g_value_get_int(value);
pkt->length = sizeof(*cfg) + sizeof(*sbc);
pkt->type = PKT_TYPE_CFG_REQ;

View File

@ -33,6 +33,7 @@
#define SBC_ENC_DEFAULT_MODE CFG_MODE_AUTO
#define SBC_ENC_DEFAULT_BLOCKS 16
#define SBC_ENC_DEFAULT_SUB_BANDS 8
#define SBC_ENC_DEFAULT_BITPOOL 53
#define SBC_ENC_DEFAULT_ALLOCATION CFG_ALLOCATION_AUTO
GST_DEBUG_CATEGORY_STATIC(sbc_enc_debug);
@ -111,7 +112,8 @@ static GstStaticPadTemplate sbc_enc_src_factory =
"mode = (string) { mono, dual, stereo, joint }, "
"blocks = (int) { 4, 8, 12, 16 }, "
"subbands = (int) { 4, 8 }, "
"allocation = (string) { snr, loudness }"));
"allocation = (string) { snr, loudness },"
"bitpool = (int) [ 2, 64 ]"));
static GstCaps* sbc_enc_generate_srcpad_caps(GstSbcEnc *enc, GstCaps *caps)
@ -145,6 +147,8 @@ static GstCaps* sbc_enc_generate_srcpad_caps(GstSbcEnc *enc, GstCaps *caps)
else
enc->sbc.allocation = enc->allocation;
enc->sbc.bitpool = SBC_ENC_DEFAULT_BITPOOL;
mode = gst_sbc_get_mode_string(enc->sbc.joint);
allocation = gst_sbc_get_allocation_string(enc->sbc.allocation);
@ -155,6 +159,7 @@ static GstCaps* sbc_enc_generate_srcpad_caps(GstSbcEnc *enc, GstCaps *caps)
"subbands", G_TYPE_INT, enc->sbc.subbands,
"blocks", G_TYPE_INT, enc->sbc.blocks,
"allocation", G_TYPE_STRING, allocation,
"bitpool", G_TYPE_INT, enc->sbc.bitpool,
NULL);
return src_caps;

View File

@ -53,16 +53,17 @@ static GstStaticPadTemplate sbc_parse_src_factory =
"mode = (string) { mono, dual, stereo, joint }, "
"blocks = (int) { 4, 8, 12, 16 }, "
"subbands = (int) { 4, 8 }, "
"allocation = (string) { snr, loudness }"));
"allocation = (string) { snr, loudness },"
"bitpool = (int) [ 2, 64 ]"));
/* reates a fixed caps from the caps given. */
/* Creates a fixed caps from the caps given. */
static GstCaps* sbc_parse_select_caps(GstSbcParse *parse, GstCaps *caps)
{
GstCaps *result;
GstStructure *structure;
const GValue *value;
gboolean error = FALSE;
gint temp, rate, channels, blocks, subbands;
gint temp, rate, channels, blocks, subbands, bitpool;
const gchar* allocation = NULL;
const gchar* mode = NULL;
const gchar* error_message = NULL;
@ -133,6 +134,20 @@ static GstCaps* sbc_parse_select_caps(GstSbcParse *parse, GstCaps *caps)
subbands = temp;
}
if (!gst_structure_has_field(structure, "bitpool")) {
error = TRUE;
error_message = "no bitpool";
goto error;
} else {
value = gst_structure_get_value(structure, "bitpool");
if (GST_VALUE_HOLDS_INT_RANGE(value)) {
temp = gst_sbc_select_bitpool_from_range(value);
} else {
temp = g_value_get_int(value);
}
bitpool = temp;
}
if (!gst_structure_has_field(structure, "allocation")) {
error = TRUE;
error_message = "no allocation.";
@ -173,11 +188,13 @@ error:
"blocks", G_TYPE_INT, blocks,
"subbands", G_TYPE_INT, subbands,
"allocation", G_TYPE_STRING, allocation,
"bitpool", G_TYPE_INT, bitpool,
NULL);
parse->sbc.rate = rate;
parse->sbc.channels = channels;
parse->sbc.blocks = blocks;
parse->sbc.subbands = subbands;
parse->sbc.bitpool = bitpool;
parse->sbc.joint = gst_sbc_get_mode_int(mode);
parse->sbc.allocation = gst_sbc_get_allocation_mode_int(allocation);

View File

@ -104,6 +104,15 @@ gint gst_sbc_select_subbands_from_range(const GValue *value)
return gst_value_get_int_range_max(value);
}
/*
* Selects one bitpool option from a range
* TODO - use a better approach to this (it is selecting the maximum value)
*/
gint gst_sbc_select_bitpool_from_range(const GValue *value)
{
return gst_value_get_int_range_max(value);
}
/*
* Selects one allocation mode from the ones on the list
* TODO - use a better approach

View File

@ -35,6 +35,8 @@ gint gst_sbc_select_blocks_from_range(const GValue *value);
gint gst_sbc_select_subbands_from_list(const GValue *value);
gint gst_sbc_select_subbands_from_range(const GValue *value);
gint gst_sbc_select_bitpool_from_range(const GValue *value);
const gchar *gst_sbc_get_allocation_from_list(const GValue *value);
gint gst_sbc_get_allocation_mode_int(const gchar *allocation);
const gchar *gst_sbc_get_allocation_string(int alloc);