GstElement *__ms_video_encoder_element_create(node_plug_s *plug_info, media_streamer_node_type_e type)
{
+ GstElement *video_scale = NULL;
+ GstElement *video_convert = NULL;
+ GstElement *encoder_elem = NULL;
+ GstElement *encoder_parser = NULL;
+ GstElement *encoder_bin = NULL;
+ gboolean gst_ret = FALSE;
+ const gchar *src_type = NULL;
+ node_plug_s encoder_info = {0,};
+ node_plug_s parser_info = {0,};
+ node_info_s node_info = {MEDIA_STREAMER_PARSER_KLASS, DEFAULT_VIDEO_PARSER};
+ media_format_mimetype_e encoder_type = MEDIA_FORMAT_MAX;
+
GstCaps *enc_caps = plug_info->src_caps;
if (!enc_caps) {
enc_caps = gst_caps_from_string(MEDIA_STREAMER_DEFAULT_VIDEO_FORMAT);
}
/* Creating Scaler, Converter */
- GstElement *video_scale = __ms_element_create(DEFAULT_VIDEO_SCALE, NULL);
- GstElement *video_convert = __ms_element_create(DEFAULT_VIDEO_CONVERT, NULL);
+ video_scale = __ms_element_create(DEFAULT_VIDEO_SCALE, NULL);
+ video_convert = __ms_element_create(DEFAULT_VIDEO_CONVERT, NULL);
/* Creating Video Encoder */
- node_info_s *node_klass_type = __ms_node_get_klass_by_its_type(type);
- node_plug_s encoder_info = {node_klass_type, enc_caps, plug_info->sink_caps, NULL};
- GstElement *encoder_elem = __ms_element_create_from_ini(&encoder_info, type);
+ encoder_info.info = __ms_node_get_klass_by_its_type(type);
+ encoder_info.src_caps = enc_caps;
+ encoder_info.sink_caps = plug_info->sink_caps;
+ encoder_info.exclude_names = NULL;
+
+ encoder_elem = __ms_element_create_from_ini(&encoder_info, type);
if (!encoder_elem)
encoder_elem = __ms_element_create_by_registry(&encoder_info, type);
/* Creating Video Parser */
- node_info_s node_info = {MEDIA_STREAMER_PARSER_KLASS, DEFAULT_VIDEO_PARSER};
- node_plug_s parser_info = {&node_info, enc_caps, enc_caps, NULL};
- GstElement *encoder_parser = __ms_element_create_from_ini(&parser_info, MEDIA_STREAMER_NODE_TYPE_PARSER);
+ parser_info.info = &node_info;
+ parser_info.src_caps = enc_caps;
+ parser_info.sink_caps = enc_caps;
+ parser_info.exclude_names = NULL;
+
+ encoder_parser = __ms_element_create_from_ini(&parser_info, MEDIA_STREAMER_NODE_TYPE_PARSER);
if (!encoder_parser)
encoder_parser = __ms_element_create_by_registry(&parser_info, MEDIA_STREAMER_NODE_TYPE_PARSER);
/* Creating bin - Video Encoder */
- gboolean gst_ret = FALSE;
- GstElement *encoder_bin = gst_bin_new("video_encoder");
- ms_retvm_if(!video_convert || !video_scale || !encoder_elem || !encoder_bin || !encoder_parser, (GstElement *) NULL, "Error: creating elements for video encoder bin");
+ encoder_bin = gst_bin_new("video_encoder");
+
+ if (!video_convert || !video_scale || !encoder_elem || !encoder_parser || !encoder_bin) {
+ ms_error("Error: creating elements for video encoder bin");
+ goto ERROR;
+ }
/* Settings if H264 format is set*/
- const gchar *src_type;
MS_GET_CAPS_TYPE(enc_caps, src_type);
- media_format_mimetype_e encoder_type = __ms_convert_string_format_to_media_format(src_type);
+ encoder_type = __ms_convert_string_format_to_media_format(src_type);
if (encoder_type == MEDIA_FORMAT_H264_SP) {
g_object_set(GST_OBJECT(encoder_parser), "config-interval", H264_PARSER_CONFIG_INTERVAL, NULL);
g_object_set(G_OBJECT(encoder_elem), "tune", H264_ENCODER_ZEROLATENCY, NULL);
if (gst_ret != TRUE) {
ms_error("Failed to link elements into encoder_bin");
MS_SAFE_UNREF(encoder_bin);
+ return NULL;
}
__ms_add_ghostpad(encoder_parser, "src", encoder_bin, "src");
__ms_add_ghostpad(video_convert, "sink", encoder_bin, "sink");
return encoder_bin;
+
+ERROR:
+
+ MS_SAFE_UNREF(video_convert);
+ MS_SAFE_UNREF(video_scale);
+ MS_SAFE_UNREF(encoder_elem);
+ MS_SAFE_UNREF(encoder_parser);
+ MS_SAFE_UNREF(encoder_bin);
+
+ return NULL;
}
GstElement *__ms_video_decoder_element_create(node_plug_s *plug_info, media_streamer_node_type_e type)
{
+ gboolean is_hw_codec = FALSE;
+ GstElement *last_elem = NULL;
+ GstElement *decoder_elem = NULL;
+ GstElement *decoder_parser = NULL;
+ GstElement *decoder_queue = NULL;
+ GstElement *video_conv = NULL;
+ GstElement *video_scale = NULL;
+ GstElement *decoder_bin = NULL;
+ node_plug_s decoder_info = {0,};
+ node_plug_s parser_info = {0,};
+ node_info_s nodes_info = {MEDIA_STREAMER_PARSER_KLASS, DEFAULT_VIDEO_PARSER};
+ media_format_mimetype_e decoder_type = MEDIA_FORMAT_MAX;
+ gboolean gst_ret = FALSE;
+ const gchar *sink_type = NULL;
+
GstCaps *dec_caps = plug_info->sink_caps;
if (!dec_caps) {
dec_caps = gst_caps_from_string(MEDIA_STREAMER_DEFAULT_VIDEO_FORMAT);
ms_debug("No Video decoding format is set! Deafault will be: [%s]", MEDIA_STREAMER_DEFAULT_VIDEO_FORMAT);
}
- gboolean is_hw_codec = FALSE;
- GstElement *last_elem = NULL;
-
/* Creating Video Decoder */
- node_info_s *node_klass_type = __ms_node_get_klass_by_its_type(type);
- node_plug_s decoder_info = {node_klass_type, plug_info->src_caps, dec_caps, NULL};
- GstElement *decoder_elem = __ms_element_create_from_ini(&decoder_info, MEDIA_STREAMER_NODE_TYPE_VIDEO_DECODER);
+ decoder_info.info = __ms_node_get_klass_by_its_type(type);;
+ decoder_info.src_caps = plug_info->src_caps;
+ decoder_info.sink_caps = dec_caps;
+ decoder_info.exclude_names = NULL;
+
+ decoder_elem = __ms_element_create_from_ini(&decoder_info, MEDIA_STREAMER_NODE_TYPE_VIDEO_DECODER);
if (!decoder_elem)
decoder_elem = __ms_element_create_by_registry(&decoder_info, MEDIA_STREAMER_NODE_TYPE_VIDEO_DECODER);
/* Creating Video Parser */
- node_info_s nodes_info = {MEDIA_STREAMER_PARSER_KLASS, DEFAULT_VIDEO_PARSER};
- node_plug_s parser_info = {&nodes_info, dec_caps, dec_caps, NULL};
- GstElement *decoder_parser = __ms_element_create_from_ini(&parser_info, MEDIA_STREAMER_NODE_TYPE_PARSER);
+ parser_info.info = &nodes_info;
+ parser_info.src_caps = dec_caps;
+ parser_info.sink_caps = dec_caps;
+ parser_info.exclude_names = NULL;
+
+ decoder_parser = __ms_element_create_from_ini(&parser_info, MEDIA_STREAMER_NODE_TYPE_PARSER);
if (!decoder_parser)
decoder_parser = __ms_element_create_by_registry(&parser_info, MEDIA_STREAMER_NODE_TYPE_PARSER);
/* Settings if H264 format is set*/
- const gchar *sink_type;
MS_GET_CAPS_TYPE(dec_caps, sink_type);
- media_format_mimetype_e decoder_type = __ms_convert_string_format_to_media_format(sink_type);
+ decoder_type = __ms_convert_string_format_to_media_format(sink_type);
if (decoder_type == MEDIA_FORMAT_H264_SP)
g_object_set(G_OBJECT(decoder_parser), "config-interval", H264_PARSER_CONFIG_INTERVAL, NULL);
is_hw_codec = TRUE;
/* Creating bin - Video Decoder */
- gboolean gst_ret = FALSE;
- GstElement *decoder_bin = gst_bin_new("video_decoder");
- GstElement *decoder_queue = __ms_element_create("queue", NULL);
- ms_retvm_if(!decoder_elem || !decoder_queue || !decoder_bin || !decoder_parser, (GstElement *) NULL, "Error: creating elements for video decoder bin");
+ decoder_queue = __ms_element_create("queue", NULL);
+ decoder_bin = gst_bin_new("video_decoder");
+
+ if (!decoder_elem || !decoder_queue || !decoder_parser || !decoder_bin) {
+ ms_error("Error: creating elements for video decoder bin");
+ goto ERROR;
+ }
/* Adding elements to bin Audio Encoder */
gst_bin_add_many(GST_BIN(decoder_bin), decoder_queue, decoder_elem, decoder_parser, NULL);
last_elem = decoder_elem;
if (!is_hw_codec) {
- GstElement *video_conv = __ms_element_create("videoconvert", NULL);
- GstElement *video_scale = __ms_element_create("videoscale", NULL);
- ms_retvm_if(!video_conv || !video_scale, (GstElement *) NULL, "Error: creating elements for video decoder bin");
+ video_conv = __ms_element_create("videoconvert", NULL);
+ video_scale = __ms_element_create("videoscale", NULL);
+ if (!video_conv || !video_scale) {
+ ms_error("Error: creating elements for video decoder bin");
+ goto ERROR;
+ }
+
gst_bin_add_many(GST_BIN(decoder_bin), video_conv, video_scale, NULL);
gst_ret = gst_element_link_many(decoder_elem, video_conv, video_scale, NULL);
if (gst_ret != TRUE) {
__ms_add_ghostpad(decoder_queue, "sink", decoder_bin, "sink");
return decoder_bin;
+
+ERROR:
+
+ MS_SAFE_UNREF(decoder_elem);
+ MS_SAFE_UNREF(decoder_queue);
+ MS_SAFE_UNREF(decoder_parser);
+ MS_SAFE_UNREF(video_conv);
+ MS_SAFE_UNREF(video_scale);
+ MS_SAFE_UNREF(decoder_bin);
+
+ return NULL;
}
GstElement *__ms_audio_encoder_element_create(node_plug_s *plug_info, media_streamer_node_type_e type)
{
- GstCaps *enc_caps = plug_info->src_caps;
+ gboolean gst_ret = FALSE;
+ GstElement *audio_convert = NULL;
+ GstElement *audio_resample = NULL;
+ GstElement *audio_filter = NULL;
+ GstElement *audio_postenc_convert = NULL;
+ GstElement *audio_encoder = NULL;
+ GstElement *audio_enc_bin = NULL;
+ node_plug_s plug_info_encoder = {0,};
gchar *encoder_name = NULL;
+ GstCaps *audioCaps = NULL;
+
+ GstCaps *enc_caps = plug_info->src_caps;
if (!enc_caps) {
enc_caps = gst_caps_from_string(MEDIA_STREAMER_DEFAULT_AUDIO_FORMAT);
ms_debug("No Audio encoding format is set! Deafault will be: [%s]", MEDIA_STREAMER_DEFAULT_AUDIO_FORMAT);
}
- gboolean gst_ret = FALSE;
-
/* Creating Converter, Resampler, Filter */
- GstElement *audio_convert = __ms_element_create(DEFAULT_AUDIO_CONVERT, NULL);
- GstElement *audio_resample = __ms_element_create(DEFAULT_AUDIO_RESAMPLE, NULL);
- GstElement *audio_filter = __ms_element_create(DEFAULT_FILTER, NULL);
- GstElement *audio_postenc_convert = __ms_element_create(DEFAULT_AUDIO_CONVERT, NULL);
+ audio_convert = __ms_element_create(DEFAULT_AUDIO_CONVERT, NULL);
+ audio_resample = __ms_element_create(DEFAULT_AUDIO_RESAMPLE, NULL);
+ audio_filter = __ms_element_create(DEFAULT_FILTER, NULL);
+ audio_postenc_convert = __ms_element_create(DEFAULT_AUDIO_CONVERT, NULL);
/* Creating Audio Encoder */
- node_info_s *node_klass_type = __ms_node_get_klass_by_its_type(type);
- node_plug_s plug_info_encoder = {node_klass_type, enc_caps, plug_info->sink_caps, NULL};
- GstElement *audio_encoder = __ms_element_create_from_ini(&plug_info_encoder, type);
+ plug_info_encoder.info = __ms_node_get_klass_by_its_type(type);
+ plug_info_encoder.src_caps = enc_caps;
+ plug_info_encoder.sink_caps = plug_info->sink_caps;
+ plug_info_encoder.exclude_names = NULL;
+
+ audio_encoder = __ms_element_create_from_ini(&plug_info_encoder, type);
if (!audio_encoder)
audio_encoder = __ms_element_create_by_registry(&plug_info_encoder, type);
MS_SAFE_GFREE(encoder_name);
/* Creating bin - Audio Encoder */
- GstElement *audio_enc_bin = gst_bin_new("audio_encoder");
- ms_retvm_if(!audio_convert || !audio_postenc_convert || !audio_filter || !audio_encoder || !audio_enc_bin, (GstElement *) NULL, "Error: creating elements for encoder bin");
+ audio_enc_bin = gst_bin_new("audio_encoder");
+ if (!audio_convert || !audio_postenc_convert || !audio_filter || !audio_resample || !audio_encoder || !audio_enc_bin) {
+ ms_error("Error: creating elements for audio encoder bin");
+ goto ERROR;
+ }
- GstCaps *audioCaps = gst_caps_from_string(MEDIA_STREAMER_DEFAULT_AUDIO_RAW_FORMAT);
+ audioCaps = gst_caps_from_string(MEDIA_STREAMER_DEFAULT_AUDIO_RAW_FORMAT);
g_object_set(G_OBJECT(audio_filter), "caps", audioCaps, NULL);
gst_caps_unref(audioCaps);
__ms_add_ghostpad(audio_convert, "sink", audio_enc_bin, "sink");
return audio_enc_bin;
+ERROR:
+
+ MS_SAFE_UNREF(audio_convert);
+ MS_SAFE_UNREF(audio_resample);
+ MS_SAFE_UNREF(audio_postenc_convert);
+ MS_SAFE_UNREF(audio_filter);
+ MS_SAFE_UNREF(audio_encoder);
+ MS_SAFE_UNREF(audio_enc_bin);
+
+ return NULL;
+
}
GstElement *__ms_audio_decoder_element_create(node_plug_s *plug_info, media_streamer_node_type_e type)
{
+ gboolean gst_ret = FALSE;
+ GstElement *decoder_bin = NULL;
+ GstElement *decoder_elem = NULL;
+ GstElement *decoder_parser = NULL;
+ GstElement *decoder_queue = NULL;
+ GstElement *audio_conv = NULL;
+ GstElement *audio_resample = NULL;
+ node_plug_s decoder_info = {0,};
+ node_plug_s parser_info = {0,};
+ node_info_s nodes_info = {MEDIA_STREAMER_PARSER_KLASS, DEFAULT_AUDIO_PARSER};
+
GstCaps *dec_caps = plug_info->sink_caps;
if (!dec_caps) {
dec_caps = gst_caps_from_string(MEDIA_STREAMER_DEFAULT_AUDIO_FORMAT);
}
/* Creating Audio Decoder */
- node_info_s *node_klass_type = __ms_node_get_klass_by_its_type(type);
- node_plug_s decoder_info = {node_klass_type, plug_info->src_caps, dec_caps, NULL};
- GstElement *decoder_elem = __ms_element_create_from_ini(&decoder_info, MEDIA_STREAMER_NODE_TYPE_AUDIO_DECODER);
+ decoder_info.info = __ms_node_get_klass_by_its_type(type);
+ decoder_info.src_caps = plug_info->src_caps;
+ decoder_info.sink_caps = dec_caps;
+ decoder_info.exclude_names = NULL;
+
+ decoder_elem = __ms_element_create_from_ini(&decoder_info, MEDIA_STREAMER_NODE_TYPE_AUDIO_DECODER);
if (!decoder_elem)
decoder_elem = __ms_element_create_by_registry(&decoder_info, MEDIA_STREAMER_NODE_TYPE_AUDIO_DECODER);
/* Creating Audio Parser */
- node_info_s nodes_info = {MEDIA_STREAMER_PARSER_KLASS, DEFAULT_AUDIO_PARSER};
- node_plug_s parser_info = {&nodes_info, dec_caps, dec_caps, NULL};
- GstElement *decoder_parser = __ms_element_create_from_ini(&parser_info, MEDIA_STREAMER_NODE_TYPE_PARSER);
+ parser_info.info = &nodes_info;
+ parser_info.src_caps = dec_caps;
+ parser_info.sink_caps = dec_caps;
+ parser_info.exclude_names = NULL;
+
+ decoder_parser = __ms_element_create_from_ini(&parser_info, MEDIA_STREAMER_NODE_TYPE_PARSER);
if (!decoder_parser)
decoder_parser = __ms_element_create_by_registry(&parser_info, MEDIA_STREAMER_NODE_TYPE_PARSER);
/* Creating bin - Audio Decoder */
- gboolean gst_ret = FALSE;
- GstElement *decoder_bin = gst_bin_new("audio_decoder");
- GstElement *decoder_queue = __ms_element_create("queue", NULL);
- ms_retvm_if(!decoder_elem || !decoder_queue || !decoder_bin || !decoder_parser, (GstElement *) NULL, "Error: creating elements for audio decoder bin");
+ decoder_bin = gst_bin_new("audio_decoder");
+ decoder_queue = __ms_element_create("queue", NULL);
+ if (!decoder_elem || !decoder_queue || !decoder_parser || !decoder_bin) {
+ ms_error("Error: creating elements for audio decoder bin");
+ goto ERROR;
+ }
/* Adding elements to bin Audio Encoder */
gst_bin_add_many(GST_BIN(decoder_bin), decoder_queue, decoder_elem, decoder_parser, NULL);
return NULL;
}
- GstElement *audio_conv = __ms_element_create("audioconvert", NULL);
- GstElement *audio_resample = __ms_element_create("audioresample", NULL);
- ms_retvm_if(!audio_conv || !audio_resample, (GstElement *) NULL, "Error: creating elements for audio decoder bin");
+ audio_conv = __ms_element_create("audioconvert", NULL);
+ audio_resample = __ms_element_create("audioresample", NULL);
+ if (!audio_conv || !audio_resample) {
+ ms_error("Error: creating elements for audio decoder bin");
+ goto ERROR;
+ }
+
gst_bin_add_many(GST_BIN(decoder_bin), audio_conv, audio_resample, NULL);
gst_ret = gst_element_link_many(decoder_elem, audio_conv, audio_resample, NULL);
if (gst_ret != TRUE) {
__ms_add_ghostpad(decoder_queue, "sink", decoder_bin, "sink");
return decoder_bin;
+ERROR:
+
+ MS_SAFE_UNREF(decoder_elem);
+ MS_SAFE_UNREF(decoder_queue);
+ MS_SAFE_UNREF(decoder_parser);
+ MS_SAFE_UNREF(audio_conv);
+ MS_SAFE_UNREF(audio_resample);
+ MS_SAFE_UNREF(decoder_bin);
+
+ return NULL;
}
GstElement *__ms_rtp_element_create(void)
if (ms_streamer->ini.gst_args) {
int i = 0;
for ( ; ms_streamer->ini.gst_args[i]; ++i) {
+ if (*argc <= i+1) {
+ ms_error("need to check, prevent overrun");
+ break;
+ }
argv[i+1] = ms_streamer->ini.gst_args[i];
ms_debug("Add [%s] gstreamer parameter.", argv[i+1]);
}