diff options
Diffstat (limited to 'audio/gstsbcdec.c')
| -rw-r--r-- | audio/gstsbcdec.c | 45 | 
1 files changed, 28 insertions, 17 deletions
| diff --git a/audio/gstsbcdec.c b/audio/gstsbcdec.c index 8c27daba..a686a406 100644 --- a/audio/gstsbcdec.c +++ b/audio/gstsbcdec.c @@ -80,26 +80,12 @@ static GstFlowReturn sbc_dec_chain(GstPad *pad, GstBuffer *buffer)  	while (offset < size) {  		GstBuffer *output;  		GstPadTemplate *template; -		GstCaps *caps, *temp; +		GstCaps *caps;  		int consumed; -		caps = gst_caps_new_simple("audio/x-raw-int", -				"rate", G_TYPE_INT, dec->sbc.rate, -				"channels", G_TYPE_INT, dec->sbc.channels, -				NULL); - -		template = gst_static_pad_template_get(&sbc_dec_src_factory); - -		temp = gst_caps_intersect(caps, -					gst_pad_template_get_caps(template)); - -		gst_caps_unref(caps); -  		res = gst_pad_alloc_buffer_and_set_caps(dec->srcpad,  						GST_BUFFER_OFFSET_NONE, -						codesize, temp, &output); - -		gst_caps_unref(temp); +						codesize, NULL, &output);  		if (res != GST_FLOW_OK)  			goto done; @@ -110,7 +96,25 @@ static GstFlowReturn sbc_dec_chain(GstPad *pad, GstBuffer *buffer)  		if (consumed <= 0)  			break; -		GST_BUFFER_TIMESTAMP(output) = GST_BUFFER_TIMESTAMP(buffer); +		/* we will reuse the same caps object */ +		if (dec->outcaps == NULL) { +			caps = gst_caps_new_simple("audio/x-raw-int", +					"rate", G_TYPE_INT, dec->sbc.rate, +					"channels", G_TYPE_INT, dec->sbc.channels, +					NULL); + +			template = gst_static_pad_template_get(&sbc_dec_src_factory); + +			dec->outcaps = gst_caps_intersect(caps, +						gst_pad_template_get_caps(template)); + +			gst_caps_unref(caps); +		} + +		gst_buffer_set_caps(output, dec->outcaps); + +		/* FIXME get a real timestamp */ +		GST_BUFFER_TIMESTAMP(output) = GST_CLOCK_TIME_NONE;  		res = gst_pad_push(dec->srcpad, output);  		if (res != GST_FLOW_OK) @@ -143,6 +147,7 @@ static GstStateChangeReturn sbc_dec_change_state(GstElement *element,  			dec->buffer = NULL;  		}  		sbc_init(&dec->sbc, 0); +		dec->outcaps = NULL;  		break;  	case GST_STATE_CHANGE_PAUSED_TO_READY: @@ -152,6 +157,10 @@ static GstStateChangeReturn sbc_dec_change_state(GstElement *element,  			dec->buffer = NULL;  		}  		sbc_finish(&dec->sbc); +		if (dec->outcaps) { +			gst_caps_unref(dec->outcaps); +			dec->outcaps = NULL; +		}  		break;  	default: @@ -197,6 +206,8 @@ static void gst_sbc_dec_init(GstSbcDec *self, GstSbcDecClass *klass)  	self->srcpad = gst_pad_new_from_static_template(  			&sbc_dec_src_factory, "src");  	gst_element_add_pad(GST_ELEMENT(self), self->srcpad); + +	self->outcaps = NULL;  }  gboolean gst_sbc_dec_plugin_init (GstPlugin * plugin) | 
