STATUS initTrackData()

in gst/gst-kvs-plugin/src/GstPlugin.c [1314:1408]


STATUS initTrackData(PGstKvsPlugin pGstKvsPlugin)
{
    STATUS retStatus = STATUS_SUCCESS;
    GSList* walk;
    GstCaps* caps;
    gchar* videoContentType = NULL;
    gchar* audioContentType = NULL;
    const gchar* mediaType;

    for (walk = pGstKvsPlugin->collect->data; walk != NULL; walk = g_slist_next(walk)) {
        PGstKvsPluginTrackData pTrackData = (PGstKvsPluginTrackData) walk->data;

        if (pTrackData->trackType == MKV_TRACK_INFO_TYPE_VIDEO) {
            if (pGstKvsPlugin->mediaType == GST_PLUGIN_MEDIA_TYPE_AUDIO_VIDEO) {
                pTrackData->trackId = DEFAULT_VIDEO_TRACK_ID;
            }

            GstCollectData* collect_data = (GstCollectData*) walk->data;

            // extract media type from GstCaps to check whether it's h264 or h265
            caps = gst_pad_get_allowed_caps(collect_data->pad);
            mediaType = gst_structure_get_name(gst_caps_get_structure(caps, 0));
            if (STRNCMP(mediaType, GSTREAMER_MEDIA_TYPE_H264, MAX_GSTREAMER_MEDIA_TYPE_LEN) == 0) {
                // default codec id is for h264 video.
                videoContentType = g_strdup(VIDEO_H264_CONTENT_TYPE);
            } else if (STRNCMP(mediaType, GSTREAMER_MEDIA_TYPE_H265, MAX_GSTREAMER_MEDIA_TYPE_LEN) == 0) {
                g_free(pGstKvsPlugin->gstParams.codecId);
                pGstKvsPlugin->gstParams.codecId = g_strdup(DEFAULT_CODEC_ID_H265);
                videoContentType = g_strdup(VIDEO_H265_CONTENT_TYPE);
            } else {
                // no-op, should result in a caps negotiation error before getting here.
                DLOGE("Error, media type %s not accepted by plugin", mediaType);
                CHK(FALSE, STATUS_INVALID_ARG);
            }
            gst_caps_unref(caps);

        } else if (pTrackData->trackType == MKV_TRACK_INFO_TYPE_AUDIO) {
            if (pGstKvsPlugin->mediaType == GST_PLUGIN_MEDIA_TYPE_AUDIO_VIDEO) {
                pTrackData->trackId = DEFAULT_AUDIO_TRACK_ID;
            }

            GstCollectData* collect_data = (GstCollectData*) walk->data;

            // extract media type from GstCaps to check whether it's h264 or h265
            caps = gst_pad_get_allowed_caps(collect_data->pad);
            mediaType = gst_structure_get_name(gst_caps_get_structure(caps, 0));
            if (STRNCMP(mediaType, GSTREAMER_MEDIA_TYPE_AAC, MAX_GSTREAMER_MEDIA_TYPE_LEN) == 0) {
                // default codec id is for aac audio.
                audioContentType = g_strdup(AUDIO_AAC_CONTENT_TYPE);
            } else if (STRNCMP(mediaType, GSTREAMER_MEDIA_TYPE_ALAW, MAX_GSTREAMER_MEDIA_TYPE_LEN) == 0) {
                g_free(pGstKvsPlugin->audioCodecId);
                pGstKvsPlugin->audioCodecId = g_strdup(DEFAULT_AUDIO_CODEC_ID_PCM);
                audioContentType = g_strdup(AUDIO_ALAW_CONTENT_TYPE);
            } else if (STRNCMP(mediaType, GSTREAMER_MEDIA_TYPE_MULAW, MAX_GSTREAMER_MEDIA_TYPE_LEN) == 0) {
                g_free(pGstKvsPlugin->audioCodecId);
                pGstKvsPlugin->audioCodecId = g_strdup(DEFAULT_AUDIO_CODEC_ID_PCM);
                audioContentType = g_strdup(AUDIO_MULAW_CONTENT_TYPE);
            } else if (STRNCMP(mediaType, GSTREAMER_MEDIA_TYPE_OPUS, MAX_GSTREAMER_MEDIA_TYPE_LEN) == 0) {
                DLOGI("Opus is only supported for WebRTC");
                g_free(pGstKvsPlugin->audioCodecId);
                pGstKvsPlugin->audioCodecId = g_strdup(DEFAULT_AUDIO_CODEC_ID_OPUS);
                audioContentType = g_strdup(AUDIO_OPUS_CONTENT_TYPE);
            } else {
                // no-op, should result in a caps negotiation error before getting here.
                DLOGE("Error, media type %s not accepted by plugin", mediaType);
                CHK(FALSE, STATUS_INVALID_ARG);
            }

            gst_caps_unref(caps);
        }
    }

    switch (pGstKvsPlugin->mediaType) {
        case GST_PLUGIN_MEDIA_TYPE_AUDIO_VIDEO:
            pGstKvsPlugin->gstParams.audioContentType = g_strdup(audioContentType);
            pGstKvsPlugin->gstParams.videoContentType = g_strdup(videoContentType);
            pGstKvsPlugin->gstParams.contentType = g_strjoin(",", videoContentType, audioContentType, NULL);
            break;
        case GST_PLUGIN_MEDIA_TYPE_AUDIO_ONLY:
            pGstKvsPlugin->gstParams.audioContentType = g_strdup(audioContentType);
            pGstKvsPlugin->gstParams.contentType = g_strdup(audioContentType);
            break;
        case GST_PLUGIN_MEDIA_TYPE_VIDEO_ONLY:
            pGstKvsPlugin->gstParams.contentType = g_strdup(videoContentType);
            pGstKvsPlugin->gstParams.videoContentType = g_strdup(videoContentType);
            break;
    }

CleanUp:

    g_free(videoContentType);
    g_free(audioContentType);

    return retStatus;
}