static gboolean gst_speex_enc_sink_setcaps (GstPad * pad, GstCaps * caps) { GstSpeexEnc *enc; GstStructure *structure; enc = GST_SPEEX_ENC (GST_PAD_PARENT (pad)); enc->setup = FALSE; structure = gst_caps_get_structure (caps, 0); gst_structure_get_int (structure, "channels", &enc->channels); gst_structure_get_int (structure, "rate", &enc->rate); gst_speex_enc_setup (enc); return enc->setup; }
static gboolean gst_speex_enc_set_format (GstAudioEncoder * benc, GstAudioInfo * info) { GstSpeexEnc *enc; enc = GST_SPEEX_ENC (benc); enc->channels = GST_AUDIO_INFO_CHANNELS (info); enc->rate = GST_AUDIO_INFO_RATE (info); /* handle reconfigure */ if (enc->state) { speex_encoder_destroy (enc->state); enc->state = NULL; } if (!gst_speex_enc_setup (enc)) return FALSE; /* feedback to base class */ gst_audio_encoder_set_latency (benc, gst_speex_enc_get_latency (enc), gst_speex_enc_get_latency (enc)); gst_audio_encoder_set_lookahead (benc, enc->lookahead); if (enc->nframes == 0) { /* as many frames as available input allows */ gst_audio_encoder_set_frame_samples_min (benc, enc->frame_size); gst_audio_encoder_set_frame_samples_max (benc, enc->frame_size); gst_audio_encoder_set_frame_max (benc, 0); } else { /* exactly as many frames as configured */ gst_audio_encoder_set_frame_samples_min (benc, enc->frame_size * enc->nframes); gst_audio_encoder_set_frame_samples_max (benc, enc->frame_size * enc->nframes); gst_audio_encoder_set_frame_max (benc, 1); } return TRUE; }