From: Vyacheslav Valkovoy Date: Thu, 17 Mar 2016 16:28:35 +0000 (+0200) Subject: Modifying set/get pad_format() X-Git-Tag: submit/tizen/20160322.083744~1^2 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=c45d536e7a402c27ad9d0c241e01304c17aa07ee;p=platform%2Fcore%2Fapi%2Fmediastreamer.git Modifying set/get pad_format() Change-Id: I5f9b4cd759496ab7a98bdd5f9b760cc1fcbe0556 Signed-off-by: Vyacheslav Valkovoy --- diff --git a/include/media_streamer_util.h b/include/media_streamer_util.h index 99010a9..9644286 100644 --- a/include/media_streamer_util.h +++ b/include/media_streamer_util.h @@ -113,6 +113,16 @@ typedef struct __media_streamer_ini { } media_streamer_ini_t; +/** + * @brief Media Streamer format type handle. + * + * @since_tizen 3.0 + */ +typedef struct { + media_format_mimetype_e format; + char *format_name; +} format_s; + /** * @brief Media Streamer signal structure. * @@ -264,6 +274,13 @@ gboolean __ms_destroy_ini_dictionary(dictionary *dict); */ gchar *__ms_ini_get_string(dictionary *dict, const char *ini_path, char *default_str); +/** + * @brief Converts Media Format mime type into Caps media format string. + * + * @since_tizen 3.0 + */ +const gchar *__ms_convert_mime_to_string_format(media_format_mimetype_e mime); + /** * @brief Converts Media Format mime type into Caps media format string. * @@ -283,7 +300,7 @@ const gchar *__ms_convert_mime_to_rtp_format(media_format_mimetype_e mime); * * @since_tizen 3.0 */ -media_format_mimetype_e __ms_convert_string_format_to_mime(const char *format_type); +media_format_mimetype_e __ms_convert_string_format_to_media_format(const char *format_type); /** * @brief Creates Media streamer signal structure, diff --git a/src/media_streamer.c b/src/media_streamer.c index da8a1e4..1110273 100644 --- a/src/media_streamer.c +++ b/src/media_streamer.c @@ -589,8 +589,24 @@ int media_streamer_node_link(media_streamer_node_h src_node, const char *src_pad gchar *src_element_name = gst_element_get_name(ms_src_node->gst_element); gchar *sink_element_name = gst_element_get_name(ms_dest_node->gst_element); - gboolean link_ret = gst_element_link_pads(ms_src_node->gst_element, src_pad_name, - ms_dest_node->gst_element, sink_pad_name); + GstCaps *src_pad_caps = NULL; + GstCaps *sink_pad_caps = NULL; + GValue *val = NULL; + + val = (GValue *) g_object_get_data(G_OBJECT(ms_src_node->gst_element), src_pad_name); + if (val) { + src_pad_caps = GST_CAPS(gst_value_get_caps(val)); + ms_info("Pad [%s] of node [%s] was set with caps [%s]\n", src_pad_name, ms_src_node->name, gst_caps_to_string(src_pad_caps)); + } + + val = (GValue *) g_object_get_data(G_OBJECT(ms_dest_node->gst_element), sink_pad_name); + if (val) { + sink_pad_caps = GST_CAPS(gst_value_get_caps(val)); + ms_info("Pad [%s] of node [%s] was set with caps [%s]\n", src_pad_name, ms_src_node->name, gst_caps_to_string(sink_pad_caps)); + } + + gboolean link_ret = gst_element_link_pads_filtered(ms_src_node->gst_element, src_pad_name, + ms_dest_node->gst_element, sink_pad_name, src_pad_caps ? src_pad_caps : sink_pad_caps); if (!link_ret) { ms_error("Can not link [%s]->%s pad to [%s]->%s pad, ret code [%d] ", ms_src_node->name, src_pad_name, ms_dest_node->name, sink_pad_name, link_ret); ret = MEDIA_STREAMER_ERROR_INVALID_OPERATION; diff --git a/src/media_streamer_gst.c b/src/media_streamer_gst.c index deef712..900bd1d 100755 --- a/src/media_streamer_gst.c +++ b/src/media_streamer_gst.c @@ -83,37 +83,6 @@ static gboolean __ms_add_ghostpad(GstElement *gst_element, const char *pad_name, return ret; } -static GObject *__ms_get_property_owner(GstElement *element, const gchar *key, GValue *value) -{ - GParamSpec *param = NULL; - GObject *obj = NULL; - - if (GST_IS_CHILD_PROXY(element)) { - int i; - const int childs_count = gst_child_proxy_get_children_count(GST_CHILD_PROXY(element)); - - for (i = 0; (i < childs_count) && (param == NULL); ++i) { - obj = gst_child_proxy_get_child_by_index(GST_CHILD_PROXY(element), i); - param = g_object_class_find_property(G_OBJECT_GET_CLASS(obj), key); - } - ms_retvm_if(param == NULL || obj == NULL, NULL, "Error: Bin object does not have property [%s].", key); - } else { - obj = G_OBJECT(element); - param = g_object_class_find_property(G_OBJECT_GET_CLASS(obj), key); - } - - g_value_init(value, param->value_type); - - if (!(param->flags & G_PARAM_WRITABLE)) { - /* Skip properties which user can not change. */ - ms_error("Error: node param [%s] is not writable!", key); - return NULL; - } - ms_info("%-20s: %s\n", g_param_spec_get_name(param), g_param_spec_get_blurb(param)); - - return obj; -} - /* This unlinks from its peer and ghostpads on its way */ static gboolean __ms_pad_peer_unlink(GstPad *pad) { @@ -1452,43 +1421,33 @@ int __ms_pipeline_create(media_streamer_s *ms_streamer) static GstCaps *__ms_create_caps_from_fmt(media_format_h fmt) { GstCaps *caps = NULL; + gchar *caps_name = NULL; media_format_mimetype_e mime; - gchar *format_name = NULL; - int width; - int height; - int avg_bps; - int max_bps; - int channel; - int samplerate; - int bit; - - if (media_format_get_video_info(fmt, &mime, &width, &height, &avg_bps, &max_bps) == MEDIA_PACKET_ERROR_NONE) { - - ms_info("Creating video Caps from media format [width=%d, height=%d, bps=%d, mime=%d]", width, height, avg_bps, mime); - - if (mime & MEDIA_FORMAT_RAW) { - format_name = g_strdup(__ms_convert_mime_to_string(mime)); - caps = gst_caps_new_simple("video/x-raw", "framerate", GST_TYPE_FRACTION, max_bps, avg_bps, "format", G_TYPE_STRING, format_name, "width", G_TYPE_INT, width, "height", G_TYPE_INT, height, NULL); - } else { - /*mime & MEDIA_FORMAT_ENCODED */ - format_name = g_strdup_printf("video/x-%s", __ms_convert_mime_to_string(mime)); - caps = gst_caps_new_simple(format_name, "framerate", GST_TYPE_FRACTION, max_bps, avg_bps, "width", G_TYPE_INT, width, "height", G_TYPE_INT, height, NULL); - } - - } else if (media_format_get_audio_info(fmt, &mime, &channel, &samplerate, &bit, &avg_bps) == MEDIA_PACKET_ERROR_NONE) { - ms_info("Creating audio Caps from media format [channel=%d, samplerate=%d, bit=%d, avg_bps=%d, mime=%d]", channel, samplerate, bit, avg_bps, mime); - - if (mime & MEDIA_FORMAT_RAW) { - format_name = g_strdup(__ms_convert_mime_to_string(mime)); - caps = gst_caps_new_simple("audio/x-raw", "channels", G_TYPE_INT, channel, "format", G_TYPE_STRING, format_name, "rate", G_TYPE_INT, samplerate, NULL); - } else { - ms_error("Encoded audio formats does not supported yet."); - } - } else { - ms_error("Failed getting media info from fmt."); - } - MS_SAFE_GFREE(format_name); - + int width, height, avg_bps, max_bps, channel, samplerate, bit; + + if (!media_format_get_audio_info(fmt, &mime, &channel, &samplerate, &bit, &avg_bps)) { + if (MEDIA_FORMAT_RAW == (mime & MEDIA_FORMAT_RAW)) + caps = gst_caps_new_simple("audio/x-raw", "channels", G_TYPE_INT, channel, "format", + G_TYPE_STRING, __ms_convert_mime_to_string_format(mime), "rate", G_TYPE_INT, samplerate, NULL); + else if (MEDIA_FORMAT_ENCODED == (mime & MEDIA_FORMAT_ENCODED)) + caps = gst_caps_new_simple(__ms_convert_mime_to_string_format(mime), "channels",G_TYPE_INT, channel, "rate", G_TYPE_INT, samplerate, NULL); + caps_name = gst_caps_to_string(caps); + ms_info("Creating Audio Caps from media format [%s]", caps_name); + + } else if (!media_format_get_video_info(fmt, &mime, &width, &height, &avg_bps, &max_bps)) { + if (MEDIA_FORMAT_RAW == (mime & MEDIA_FORMAT_RAW)) + caps = gst_caps_new_simple("video/x-raw", "framerate", GST_TYPE_FRACTION, max_bps, + avg_bps, "format", G_TYPE_STRING, __ms_convert_mime_to_string_format(mime), "width", G_TYPE_INT, width, "height", G_TYPE_INT, height, NULL); + else if (MEDIA_FORMAT_ENCODED == (mime & MEDIA_FORMAT_ENCODED)) + caps = gst_caps_new_simple(__ms_convert_mime_to_string_format(mime), "framerate", GST_TYPE_FRACTION, max_bps, + avg_bps, "width", G_TYPE_INT, width, "height", G_TYPE_INT, height, NULL); + caps_name = gst_caps_to_string(caps); + ms_info("Creating Video Caps from media format [%s]", caps_name); + + } else + ms_error("Error getting media format information"); + + MS_SAFE_GFREE(caps_name); return caps; } @@ -1524,14 +1483,14 @@ static media_format_h __ms_create_fmt_from_caps(GstCaps *caps) gst_structure_get_fraction(pad_struct, "framerate", &max_bps, &avg_bps); gst_structure_get_int(pad_struct, "height", &height); - media_format_set_video_mime(fmt, __ms_convert_string_format_to_mime(pad_format)); + media_format_set_video_mime(fmt, __ms_convert_string_format_to_media_format(pad_format)); media_format_set_video_width(fmt, width); media_format_set_video_height(fmt, height); media_format_set_video_avg_bps(fmt, avg_bps); media_format_set_video_max_bps(fmt, max_bps); } else if (MS_ELEMENT_IS_AUDIO(pad_type)) { int channels, bps; - media_format_set_audio_mime(fmt, __ms_convert_string_format_to_mime(pad_format)); + media_format_set_audio_mime(fmt, __ms_convert_string_format_to_media_format(pad_format)); gst_structure_get_int(pad_struct, "channels", &channels); media_format_set_audio_channel(fmt, channels); gst_structure_get_int(pad_struct, "rate", &bps); @@ -1590,38 +1549,33 @@ int __ms_element_pad_names(GstElement *gst_element, GstPadDirection pad_type, ch int __ms_element_get_pad_fmt(GstElement *gst_element, const char *pad_name, media_format_h *fmt) { GstCaps *allowed_caps = NULL; - GstCaps *property_caps = NULL; - GValue value = G_VALUE_INIT; + GstCaps *format_caps = NULL; ms_retvm_if(gst_element == NULL, MEDIA_STREAMER_ERROR_INVALID_PARAMETER, "Element handle is NULL"); GstPad *pad = gst_element_get_static_pad(gst_element, pad_name); ms_retvm_if(pad == NULL, MEDIA_STREAMER_ERROR_INVALID_OPERATION, "Fail to get pad [%s] from element [%s].", pad_name, GST_ELEMENT_NAME(gst_element)); - GParamSpec *param = g_object_class_find_property(G_OBJECT_GET_CLASS(gst_element), "caps"); - if (param) { - g_value_init(&value, param->value_type); - if (param->flags & G_PARAM_READWRITE) { - g_object_get_property(G_OBJECT(gst_element), "caps", &value); - property_caps = GST_CAPS(gst_value_get_caps(&value)); - } - g_value_unset(&value); - } + GValue *value = (GValue *) g_object_get_data(G_OBJECT(gst_element), pad_name); + if (value) + format_caps = GST_CAPS(gst_value_get_caps(value)); + else + ms_info(" No any format is set for pad [%s]", pad_name); int ret = MEDIA_STREAMER_ERROR_NONE; allowed_caps = gst_pad_get_allowed_caps(pad); if (allowed_caps) { if (gst_caps_is_empty(allowed_caps) || gst_caps_is_any(allowed_caps)) { - if (property_caps) - *fmt = __ms_create_fmt_from_caps(property_caps); + if (format_caps) + *fmt = __ms_create_fmt_from_caps(format_caps); else ret = MEDIA_STREAMER_ERROR_INVALID_OPERATION; } else { *fmt = __ms_create_fmt_from_caps(allowed_caps); } } else { - if (property_caps) - *fmt = __ms_create_fmt_from_caps(property_caps); + if (format_caps) + *fmt = __ms_create_fmt_from_caps(format_caps); else ret = MEDIA_STREAMER_ERROR_INVALID_OPERATION; } @@ -1635,19 +1589,31 @@ int __ms_element_get_pad_fmt(GstElement *gst_element, const char *pad_name, medi int __ms_element_set_fmt(media_streamer_node_s *node, const char *pad_name, media_format_h fmt) { - ms_retvm_if(!node || !pad_name || !fmt, MEDIA_STREAMER_ERROR_INVALID_PARAMETER, "Handle is NULL"); + ms_retvm_if(!node || !pad_name || !fmt, MEDIA_STREAMER_ERROR_INVALID_PARAMETER, "Handle is NULL"); + gboolean can_accept = FALSE; - GValue value = G_VALUE_INIT; - GObject *obj = __ms_get_property_owner(node->gst_element, "caps", &value); - ms_retvm_if(!obj, MEDIA_STREAMER_ERROR_INVALID_PARAMETER, "Can't find object"); + GstCaps *fmt_caps = __ms_create_caps_from_fmt(fmt); + ms_retvm_if(!fmt_caps, MEDIA_STREAMER_ERROR_INVALID_OPERATION, "Can't convert fmt into Caps"); - GstCaps *caps = __ms_create_caps_from_fmt(fmt); - ms_retvm_if(!caps, MEDIA_STREAMER_ERROR_INVALID_PARAMETER, "Can't convert fmt into Caps"); + GstElementFactory *factory = gst_element_get_factory(node->gst_element); + GstPad *node_pad = gst_element_get_static_pad(node->gst_element, pad_name); + + if (GST_PAD_IS_SRC(node_pad)) + can_accept = gst_element_factory_can_src_any_caps(factory, fmt_caps); + else if (GST_PAD_IS_SINK(node_pad)) + can_accept = gst_element_factory_can_sink_any_caps(factory, fmt_caps); + else + ms_error(" Node [%s] doesn`t have valid pad [%s]", node->name, pad_name); - gst_value_set_caps(&value, caps); - g_object_set_property(obj, "caps", &value); - g_value_unset(&value); - gst_caps_unref(caps); + if (!can_accept) { + if (fmt_caps) + gst_caps_unref(fmt_caps); + ms_error("Node`s pad [%s] can`t be set with the given format", pad_name); + return MEDIA_STREAMER_ERROR_INVALID_OPERATION; + } else { + MS_SET_INT_CAPS_PARAM(node->gst_element, pad_name, fmt_caps); + ms_info("Pad [%s] of node [%s] was set with given format", pad_name, node->name); + } return MEDIA_STREAMER_ERROR_NONE; } diff --git a/src/media_streamer_node.c b/src/media_streamer_node.c index 29e6d7f..222780e 100755 --- a/src/media_streamer_node.c +++ b/src/media_streamer_node.c @@ -468,6 +468,10 @@ static void _src_node_prepare(const GValue *item, gpointer user_data) media_streamer_s *ms_streamer = (media_streamer_s *) user_data; GstElement *src_element = GST_ELEMENT(g_value_get_object(item)); + media_streamer_node_s *found_node = (media_streamer_node_s *) g_hash_table_lookup(ms_streamer->nodes_table, GST_ELEMENT_NAME(src_element)); + if (!found_node) + return; + ms_retm_if(!ms_streamer || !src_element, "Handle is NULL"); ms_debug("Autoplug: found src element [%s]", GST_ELEMENT_NAME(src_element)); @@ -489,7 +493,7 @@ static void _src_node_prepare(const GValue *item, gpointer user_data) if (MS_ELEMENT_IS_VIDEO(new_pad_type) || MS_ELEMENT_IS_IMAGE(new_pad_type)) { found_element = __ms_combine_next_element(src_element, src_pad, ms_streamer->topology_bin, NULL, NULL, DEFAULT_FILTER); GstCaps *videoCaps = gst_caps_from_string(MEDIA_STREAMER_DEFAULT_CAMERA_FORMAT); - g_object_set(G_OBJECT(found_element), "caps", videoCaps,NULL); + g_object_set(G_OBJECT(found_element), "caps", videoCaps, NULL); gst_caps_unref(videoCaps); found_element = __ms_combine_next_element(found_element, NULL, ms_streamer->topology_bin, MEDIA_STREAMER_BIN_KLASS, "video_encoder", NULL); found_element = __ms_combine_next_element(found_element, NULL, ms_streamer->topology_bin, MEDIA_STREAMER_PAYLOADER_KLASS, NULL, NULL); diff --git a/src/media_streamer_util.c b/src/media_streamer_util.c index 98cab1d..8ed41a3 100644 --- a/src/media_streamer_util.c +++ b/src/media_streamer_util.c @@ -19,6 +19,60 @@ #include #include +format_s format_table[] = { + /* Audio - ENCODED */ + {MEDIA_FORMAT_L16, "audio/x-raw"}, + {MEDIA_FORMAT_ALAW, "audio/x-alaw"}, + {MEDIA_FORMAT_ULAW, "audio/x-mulaw"}, + {MEDIA_FORMAT_AMR, "audio/AMR"}, + {MEDIA_FORMAT_AMR_NB, "audio/AMR"}, + {MEDIA_FORMAT_AMR_WB, "audio/AMR-WB"}, + {MEDIA_FORMAT_G729, "audio/G729"}, + {MEDIA_FORMAT_AAC, "audio/mpeg"}, + {MEDIA_FORMAT_AAC_LC, "audio/mpeg"}, + {MEDIA_FORMAT_AAC_HE, "audio/mpeg"}, + {MEDIA_FORMAT_AAC_HE_PS, "audio/mpeg"}, + {MEDIA_FORMAT_MP3, "audio/mpeg"}, + /* Audio - RAW */ + {MEDIA_FORMAT_PCM, "S16LE"}, + /* {MEDIA_FORMAT_PCMA, "audio/x-alaw"}, */ + /* {MEDIA_FORMAT_PCMU, "audio/x-mulaw"}, */ + /* Video - ENCODED */ + {MEDIA_FORMAT_H261, "video/x-h261"}, + {MEDIA_FORMAT_H263, "video/x-h263"}, + {MEDIA_FORMAT_H263P, "video/x-h263"}, + {MEDIA_FORMAT_H264_SP, "video/x-h264"}, + {MEDIA_FORMAT_H264_MP, "video/x-h264"}, + {MEDIA_FORMAT_H264_HP, "video/x-h264"}, + {MEDIA_FORMAT_MJPEG, "image/jpeg"}, + {MEDIA_FORMAT_MPEG1, "video/mpeg"}, + {MEDIA_FORMAT_MPEG2_SP, "video/mpeg"}, + {MEDIA_FORMAT_MPEG2_MP, "video/mpeg"}, + {MEDIA_FORMAT_MPEG2_HP, "video/mpeg"}, + {MEDIA_FORMAT_MPEG4_SP, "video/mpeg"}, + {MEDIA_FORMAT_MPEG4_ASP, "video/mpeg"}, + {MEDIA_FORMAT_HEVC, "video/x-h265"}, + {MEDIA_FORMAT_VP8, "video/x-vp8"}, + {MEDIA_FORMAT_VP9, "video/x-vp9"}, + {MEDIA_FORMAT_VC1, "video/x-wmv"}, + /* Video - RAW */ + {MEDIA_FORMAT_I420, "I420"}, + {MEDIA_FORMAT_NV12, "NV12"}, + {MEDIA_FORMAT_NV12T, "NV12T"}, + {MEDIA_FORMAT_YV12, "YV12"}, + {MEDIA_FORMAT_NV21, "NV21"}, + {MEDIA_FORMAT_NV16, "NV16"}, + {MEDIA_FORMAT_YUYV, "YUYV"}, + {MEDIA_FORMAT_UYVY, "UYVY"}, + {MEDIA_FORMAT_422P, "422P"}, + {MEDIA_FORMAT_RGB565, "RGB565"}, + {MEDIA_FORMAT_RGB888, "RGB888"}, + {MEDIA_FORMAT_RGBA, "RGBA"}, + {MEDIA_FORMAT_ARGB, "ARGB"}, + {MEDIA_FORMAT_NATIVE_VIDEO, "NATIVE_VIDEO"}, + {MEDIA_FORMAT_MAX, NULL} +}; + static void __ms_check_ini_status(void); gchar *__ms_ini_get_string(dictionary *dict, const char *ini_path, char *default_str) @@ -145,6 +199,20 @@ static void __ms_check_ini_status(void) } } +const gchar *__ms_convert_mime_to_string_format(media_format_mimetype_e mime) +{ + gchar *format_name = NULL; + int it_format; + for (it_format = 0; format_table[it_format].format != MEDIA_FORMAT_MAX; it_format++) { + if (mime == format_table[it_format].format) { + format_name = format_table[it_format].format_name; + break; + } + } + + return format_name; +} + const gchar *__ms_convert_mime_to_string(media_format_mimetype_e mime) { switch (mime) { @@ -186,22 +254,18 @@ const gchar *__ms_convert_mime_to_rtp_format(media_format_mimetype_e mime) } } -media_format_mimetype_e __ms_convert_string_format_to_mime(const char *format_type) +media_format_mimetype_e __ms_convert_string_format_to_media_format(const char *format_type) { - if (g_strrstr(format_type, "I420")) { - return MEDIA_FORMAT_I420; - } else if (g_strrstr(format_type, "YV12")) { - return MEDIA_FORMAT_YV12; - } else if (g_strrstr(format_type, "h263")) { - return MEDIA_FORMAT_H263; - } else if (g_strrstr(format_type, "h264")) { - return MEDIA_FORMAT_H264_SP; - } else if (g_strrstr(format_type, DEFAULT_AUDIO)) { - return MEDIA_FORMAT_PCM; - } else { - ms_error("Invalid or Unsupported media format [%s].", format_type); - return MEDIA_FORMAT_NONE; + media_format_mimetype_e mime = 0; + int it_format; + for (it_format = 0; format_table[it_format].format != MEDIA_FORMAT_MAX; it_format++) { + if (g_strrstr(format_type, format_table[it_format].format_name)) { + mime = format_table[it_format].format; + break; + } } + + return mime; } void __ms_signal_create(GList **sig_list, GstElement *obj, const char *sig_name, GCallback cb, gpointer user_data)