static void gst_speex_dec_init (GstSpeexDec * dec, GstSpeexDecClass * g_class) { dec->enh = DEFAULT_ENH; gst_speex_dec_reset (dec); }
static GstStateChangeReturn speex_dec_change_state (GstElement * element, GstStateChange transition) { GstStateChangeReturn ret; GstSpeexDec *dec = GST_SPEEX_DEC (element); switch (transition) { case GST_STATE_CHANGE_NULL_TO_READY: case GST_STATE_CHANGE_READY_TO_PAUSED: case GST_STATE_CHANGE_PAUSED_TO_PLAYING: default: break; } ret = parent_class->change_state (element, transition); if (ret != GST_STATE_CHANGE_SUCCESS) return ret; switch (transition) { case GST_STATE_CHANGE_PLAYING_TO_PAUSED: break; case GST_STATE_CHANGE_PAUSED_TO_READY: gst_speex_dec_reset (dec); break; case GST_STATE_CHANGE_READY_TO_NULL: break; default: break; } return ret; }
static void gst_speex_dec_init (GstSpeexDec * dec, GstSpeexDecClass * g_class) { dec->sinkpad = gst_pad_new_from_static_template (&speex_dec_sink_factory, "sink"); gst_pad_set_chain_function (dec->sinkpad, GST_DEBUG_FUNCPTR (speex_dec_chain)); gst_pad_set_event_function (dec->sinkpad, GST_DEBUG_FUNCPTR (speex_dec_sink_event)); gst_pad_set_query_type_function (dec->sinkpad, GST_DEBUG_FUNCPTR (speex_get_sink_query_types)); gst_pad_set_query_function (dec->sinkpad, GST_DEBUG_FUNCPTR (speex_dec_sink_query)); gst_element_add_pad (GST_ELEMENT (dec), dec->sinkpad); dec->srcpad = gst_pad_new_from_static_template (&speex_dec_src_factory, "src"); gst_pad_use_fixed_caps (dec->srcpad); gst_pad_set_event_function (dec->srcpad, GST_DEBUG_FUNCPTR (speex_dec_src_event)); gst_pad_set_query_type_function (dec->srcpad, GST_DEBUG_FUNCPTR (speex_get_src_query_types)); gst_pad_set_query_function (dec->srcpad, GST_DEBUG_FUNCPTR (speex_dec_src_query)); gst_element_add_pad (GST_ELEMENT (dec), dec->srcpad); dec->enh = DEFAULT_ENH; gst_speex_dec_reset (dec); }
static gboolean gst_speex_dec_stop (GstAudioDecoder * dec) { GstSpeexDec *sd = GST_SPEEX_DEC (dec); GST_DEBUG_OBJECT (dec, "stop"); gst_speex_dec_reset (sd); return TRUE; }
static void gst_speex_dec_init (GstSpeexDec * dec) { gst_audio_decoder_set_needs_format (GST_AUDIO_DECODER (dec), TRUE); gst_audio_decoder_set_use_default_pad_acceptcaps (GST_AUDIO_DECODER_CAST (dec), TRUE); GST_PAD_SET_ACCEPT_TEMPLATE (GST_AUDIO_DECODER_SINK_PAD (dec)); dec->enh = DEFAULT_ENH; gst_speex_dec_reset (dec); }
static gboolean gst_speex_dec_start (GstAudioDecoder * dec) { GstSpeexDec *sd = GST_SPEEX_DEC (dec); GST_DEBUG_OBJECT (dec, "start"); gst_speex_dec_reset (sd); /* we know about concealment */ gst_audio_decoder_set_plc_aware (dec, TRUE); return TRUE; }
static GstFlowReturn gst_speex_dec_parse_header (GstSpeexDec * dec, GstBuffer * buf) { SpeexHeader *header; GstMapInfo map; GstAudioInfo info; static const GstAudioChannelPosition chan_pos[2][2] = { {GST_AUDIO_CHANNEL_POSITION_MONO}, {GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT, GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT} }; /* get the header */ gst_buffer_map (buf, &map, GST_MAP_READ); header = speex_packet_to_header ((gchar *) map.data, map.size); gst_buffer_unmap (buf, &map); if (!header) goto no_header; if (dec->header) { GST_DEBUG_OBJECT (dec, "Replacing speex-header, resetting state"); gst_speex_dec_reset (dec); } dec->header = header; if (dec->header->mode >= SPEEX_NB_MODES || dec->header->mode < 0) goto mode_too_old; dec->mode = speex_lib_get_mode (dec->header->mode); /* initialize the decoder */ dec->state = speex_decoder_init (dec->mode); if (!dec->state) goto init_failed; speex_decoder_ctl (dec->state, SPEEX_SET_ENH, &dec->enh); speex_decoder_ctl (dec->state, SPEEX_GET_FRAME_SIZE, &dec->frame_size); if (dec->header->nb_channels != 1) { dec->stereo = speex_stereo_state_init (); dec->callback.callback_id = SPEEX_INBAND_STEREO; dec->callback.func = speex_std_stereo_request_handler; dec->callback.data = dec->stereo; speex_decoder_ctl (dec->state, SPEEX_SET_HANDLER, &dec->callback); } speex_decoder_ctl (dec->state, SPEEX_SET_SAMPLING_RATE, &dec->header->rate); dec->frame_duration = gst_util_uint64_scale_int (dec->frame_size, GST_SECOND, dec->header->rate); speex_bits_init (&dec->bits); /* set caps */ gst_audio_info_init (&info); gst_audio_info_set_format (&info, GST_AUDIO_FORMAT_S16, dec->header->rate, dec->header->nb_channels, chan_pos[dec->header->nb_channels - 1]); if (!gst_audio_decoder_set_output_format (GST_AUDIO_DECODER (dec), &info)) goto nego_failed; return GST_FLOW_OK; /* ERRORS */ no_header: { GST_INFO_OBJECT (dec, "couldn't read header"); return GST_FLOW_NO_HEADER; } mode_too_old: { GST_ELEMENT_ERROR (GST_ELEMENT (dec), STREAM, DECODE, (NULL), ("Mode number %d does not (yet/any longer) exist in this version", dec->header->mode)); return GST_FLOW_ERROR; } init_failed: { GST_ELEMENT_ERROR (GST_ELEMENT (dec), STREAM, DECODE, (NULL), ("couldn't initialize decoder")); return GST_FLOW_ERROR; } nego_failed: { GST_ELEMENT_ERROR (GST_ELEMENT (dec), STREAM, DECODE, (NULL), ("couldn't negotiate format")); return GST_FLOW_NOT_NEGOTIATED; } }