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