⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 gstsbcenc.c

📁 这是Linux环境下的蓝牙源代码
💻 C
📖 第 1 页 / 共 2 页
字号:
	src_caps = sbc_enc_get_fixed_srcpad_caps(enc);	if (!src_caps)		return FALSE;	res = gst_pad_set_caps(enc->srcpad, src_caps);	gst_caps_unref(src_caps);	return res;}gboolean gst_sbc_enc_fill_sbc_params(GstSbcEnc *enc, GstCaps *caps){	if (!gst_caps_is_fixed(caps)) {		GST_DEBUG_OBJECT(enc, "didn't receive fixed caps, "				"returning false");		return FALSE;	}	if (!gst_sbc_util_fill_sbc_params(&enc->sbc, caps))		return FALSE;	if (enc->rate != 0 && gst_sbc_parse_rate_from_sbc(enc->sbc.frequency)				 != enc->rate)		goto fail;	if (enc->channels != 0 && gst_sbc_get_channel_number(enc->sbc.mode)				!= enc->channels)		goto fail;	if (enc->blocks != 0 && gst_sbc_parse_blocks_from_sbc(enc->sbc.blocks)				 != enc->blocks)		goto fail;	if (enc->subbands != 0 && gst_sbc_parse_subbands_from_sbc(				enc->sbc.subbands) != enc->subbands)		goto fail;	if (enc->mode != SBC_ENC_DEFAULT_MODE && enc->sbc.mode != enc->mode)		goto fail;	if (enc->allocation != SBC_AM_AUTO &&				enc->sbc.allocation != enc->allocation)		goto fail;	if (enc->bitpool != SBC_ENC_BITPOOL_AUTO &&				enc->sbc.bitpool != enc->bitpool)		goto fail;	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);	GST_DEBUG_OBJECT(enc, "codesize: %d, frame_length: %d, frame_duration:"			" %d", enc->codesize, enc->frame_length,			enc->frame_duration);	return TRUE;fail:	memset(&enc->sbc, 0, sizeof(sbc_t));	return FALSE;}static GstFlowReturn sbc_enc_chain(GstPad *pad, GstBuffer *buffer){	GstSbcEnc *enc = GST_SBC_ENC(gst_pad_get_parent(pad));	GstAdapter *adapter = enc->adapter;	GstFlowReturn res = GST_FLOW_OK;	gst_adapter_push(adapter, buffer);	while (gst_adapter_available(adapter) >= enc->codesize &&			res == GST_FLOW_OK) {		GstBuffer *output;		GstCaps *caps;		const guint8 *data;		gint consumed;		caps = GST_PAD_CAPS(enc->srcpad);		res = gst_pad_alloc_buffer_and_set_caps(enc->srcpad,						GST_BUFFER_OFFSET_NONE,						enc->frame_length, caps,						&output);		if (res != GST_FLOW_OK)			goto done;		data = gst_adapter_peek(adapter, enc->codesize);		consumed = sbc_encode(&enc->sbc, (gpointer) data,					enc->codesize,					GST_BUFFER_DATA(output),					GST_BUFFER_SIZE(output), NULL);		if (consumed <= 0) {			GST_DEBUG_OBJECT (enc, "comsumed < 0, codesize: %d",					enc->codesize);			break;		}		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)			goto done;	}done:	gst_object_unref(enc);	return res;}static GstStateChangeReturn sbc_enc_change_state(GstElement *element,						GstStateChange transition){	GstSbcEnc *enc = GST_SBC_ENC(element);	switch (transition) {	case GST_STATE_CHANGE_READY_TO_PAUSED:		GST_DEBUG("Setup subband codec");		sbc_init(&enc->sbc, 0);		break;	case GST_STATE_CHANGE_PAUSED_TO_READY:		GST_DEBUG("Finish subband codec");		sbc_finish(&enc->sbc);		break;	default:		break;	}	return parent_class->change_state(element, transition);}static void gst_sbc_enc_dispose(GObject *object){	GstSbcEnc *enc = GST_SBC_ENC(object);	if (enc->adapter != NULL)		g_object_unref (G_OBJECT (enc->adapter));	enc->adapter = NULL;}static void gst_sbc_enc_base_init(gpointer g_class){	GstElementClass *element_class = GST_ELEMENT_CLASS(g_class);	gst_element_class_add_pad_template(element_class,		gst_static_pad_template_get(&sbc_enc_sink_factory));	gst_element_class_add_pad_template(element_class,		gst_static_pad_template_get(&sbc_enc_src_factory));	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);	/* changes to those properties will only happen on the next caps	 * negotiation */	switch (prop_id) {	case PROP_MODE:		enc->mode = g_value_get_enum(value);		break;	case PROP_ALLOCATION:		enc->allocation = g_value_get_enum(value);		break;	case PROP_BLOCKS:		enc->blocks = g_value_get_enum(value);		break;	case PROP_SUBBANDS:		enc->subbands = g_value_get_enum(value);		break;	case PROP_BITPOOL:		enc->bitpool = g_value_get_int(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;	case PROP_ALLOCATION:		g_value_set_enum(value, enc->allocation);		break;	case PROP_BLOCKS:		g_value_set_enum(value, enc->blocks);		break;	case PROP_SUBBANDS:		g_value_set_enum(value, enc->subbands);		break;	case PROP_BITPOOL:		g_value_set_int(value, enc->bitpool);		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);	object_class->dispose = GST_DEBUG_FUNCPTR(gst_sbc_enc_dispose);	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,				SBC_ENC_DEFAULT_MODE, G_PARAM_READWRITE));	g_object_class_install_property(object_class, PROP_ALLOCATION,			g_param_spec_enum("allocation", "Allocation",				"Allocation method", GST_TYPE_SBC_ALLOCATION,				SBC_ENC_DEFAULT_ALLOCATION, G_PARAM_READWRITE));	g_object_class_install_property(object_class, PROP_BLOCKS,			g_param_spec_enum("blocks", "Blocks",				"Blocks", GST_TYPE_SBC_BLOCKS,				SBC_ENC_DEFAULT_BLOCKS, G_PARAM_READWRITE));	g_object_class_install_property(object_class, PROP_SUBBANDS,			g_param_spec_enum("subbands", "Sub bands",				"Number of sub bands", GST_TYPE_SBC_SUBBANDS,				SBC_ENC_DEFAULT_SUB_BANDS, G_PARAM_READWRITE));	g_object_class_install_property(object_class, PROP_BITPOOL,			g_param_spec_int("bitpool", "Bitpool",				"Bitpool (use 1 for automatic selection)",				SBC_ENC_BITPOOL_AUTO, SBC_ENC_BITPOOL_MAX,				SBC_ENC_BITPOOL_AUTO, G_PARAM_READWRITE));	GST_DEBUG_CATEGORY_INIT(sbc_enc_debug, "sbcenc", 0,						"SBC encoding element");}static void gst_sbc_enc_init(GstSbcEnc *self, GstSbcEncClass *klass){	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));	gst_element_add_pad(GST_ELEMENT(self), self->srcpad);	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;	self->mode = SBC_ENC_DEFAULT_MODE;	self->allocation = SBC_ENC_DEFAULT_ALLOCATION;	self->rate = SBC_ENC_DEFAULT_RATE;	self->channels = SBC_ENC_DEFAULT_CHANNELS;	self->bitpool = SBC_ENC_BITPOOL_AUTO;	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);}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -