static STATUS createAudioAppSink()

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;
}