in source/src/AppRtspSrc.c [401:461]
static STATUS createAudioAppSink(PRtspSrcContext pRtspSrcContext, GstElement** ppAudioQueue, PCHAR name)
{
STATUS retStatus = STATUS_SUCCESS;
PCodecStreamConf pCodecStreamConf;
CHAR elementName[APP_MEDIA_GST_ELEMENT_NAME_MAX_LEN];
GstElement* pipeline;
GstElement* audioQueue = NULL;
GstElement *audioDepay = NULL, *audioFilter = NULL, *audioAppSink = NULL;
GstCaps* audioCaps = NULL;
MUTEX_LOCK(pRtspSrcContext->codecConfLock);
pCodecStreamConf = &pRtspSrcContext->codecConfiguration.audioStream;
pipeline = (GstElement*) pRtspSrcContext->codecConfiguration.pipeline;
SNPRINTF(elementName, APP_MEDIA_GST_ELEMENT_NAME_MAX_LEN, "audioQueue%s", name);
audioQueue = app_gst_element_factory_make(GST_ELEMENT_FACTORY_NAME_QUEUE, elementName);
if (pCodecStreamConf->codec == RTC_CODEC_OPUS) {
audioDepay = app_gst_element_factory_make(GST_ELEMENT_FACTORY_NAME_RTP_DEPAY_OPUS, "audioDepay");
audioCaps = app_gst_caps_new_simple("audio/x-opus", "rate", G_TYPE_INT, 48000, "channels", G_TYPE_INT, 2, NULL);
} else if (pCodecStreamConf->codec == RTC_CODEC_MULAW) {
audioDepay = app_gst_element_factory_make(GST_ELEMENT_FACTORY_NAME_RTP_DEPAY_PCMU, "audioDepay");
audioCaps = app_gst_caps_new_simple("audio/x-mulaw", "rate", G_TYPE_INT, 8000, "channels", G_TYPE_INT, 1, NULL);
} else {
// This case is RTC_CODEC_ALAW.
audioDepay = app_gst_element_factory_make(GST_ELEMENT_FACTORY_NAME_RTP_DEPAY_PCMA, "audioDepay");
audioCaps = app_gst_caps_new_simple("audio/x-alaw", "rate", G_TYPE_INT, 8000, "channels", G_TYPE_INT, 1, NULL);
}
CHK(audioCaps != NULL, STATUS_MEDIA_AUDIO_CAPS);
audioFilter = app_gst_element_factory_make(GST_ELEMENT_FACTORY_NAME_CAPS_FILTER, "audioFilter");
audioAppSink = app_gst_element_factory_make(GST_ELEMENT_FACTORY_NAME_APP_SINK, "audioAppSink");
CHK(audioQueue != NULL, STATUS_MEDIA_AUDIO_QUEUE);
CHK((audioDepay != NULL) && (audioFilter != NULL) && (audioAppSink != NULL), STATUS_MEDIA_AUDIO_ELEMENT);
app_g_object_set(APP_G_OBJECT(audioFilter), "caps", audioCaps, NULL);
app_gst_caps_unref(audioCaps);
audioCaps = NULL;
app_g_object_set(APP_G_OBJECT(audioAppSink), "emit-signals", TRUE, "sync", FALSE, NULL);
app_g_signal_connect(audioAppSink, GST_SIGNAL_CALLBACK_NEW_SAMPLE, G_CALLBACK(onNewSampleFromAudioAppSink), pRtspSrcContext);
app_gst_bin_add_many(APP_GST_BIN(pipeline), audioQueue, audioDepay, audioFilter, audioAppSink, NULL);
CHK(app_gst_element_link_many(audioQueue, audioDepay, audioFilter, audioAppSink, NULL), STATUS_MEDIA_AUDIO_LINK);
CleanUp:
// release the resource when we fail to create the pipeline.
if (STATUS_FAILED(retStatus)) {
app_gst_object_unref(audioQueue);
audioQueue = NULL;
app_gst_object_unref(audioDepay);
app_gst_object_unref(audioFilter);
app_gst_object_unref(audioAppSink);
}
MUTEX_UNLOCK(pRtspSrcContext->codecConfLock);
*ppAudioQueue = audioQueue;
return retStatus;
}