Add element lock state for prevent deadlock 17/146717/11 accepted/tizen/unified/20170904.145508 submit/tizen/20170904.094505
authorGilbok Lee <gilbok.lee@samsung.com>
Wed, 30 Aug 2017 07:14:30 +0000 (16:14 +0900)
committerGilbok Lee <gilbok.lee@samsung.com>
Mon, 4 Sep 2017 08:10:44 +0000 (17:10 +0900)
Add handle NULL check

[Version] 0.1.23
[Profile] Mobile, Wearable, TV
[Issue Type] Fix bugs

Change-Id: Id9ee77adba954eadee1d7a85633763403b8ff4f5

include/mediademuxer_util.h
packaging/capi-mediademuxer.spec
src/port_gst/mediademuxer_port_gst.c

index 01c0670..93c7a58 100755 (executable)
@@ -84,6 +84,14 @@ extern "C" {
                } \
        } while (0)
 
+#define MEDIADEMUXER_CHECK_NULL_VOID(x_var) \
+       do { \
+               if (!x_var) { \
+                       MD_E("[%s] is NULL\n", #x_var); \
+                       return; \
+               } \
+       } while (0)
+
 #define MEDIADEMUXER_CHECK_SET_AND_PRINT(x_var, x_cond, ret, ret_val, err_text) \
        do { \
                if (x_var != x_cond) { \
index 1d022c6..94b2671 100755 (executable)
@@ -1,6 +1,6 @@
 Name:       capi-mediademuxer
 Summary:    A Media Demuxer library in Tizen Native API
-Version:    0.1.22
+Version:    0.1.23
 Release:    1
 Group:      Multimedia/API
 License:    Apache-2.0
index 3cc57aa..4076551 100755 (executable)
@@ -333,6 +333,7 @@ static void __gst_no_more_pad(GstElement *element, gpointer data)
        int loop_track;
        track_info *head_track = &(gst_handle->info);
        track *head = head_track->head;
+       MEDIADEMUXER_CHECK_NULL_VOID(gst_handle);
        gst_handle->selected_tracks =
            (bool *) g_malloc(sizeof(bool) * (gst_handle->total_tracks));
        MD_I("Allocating %p to core->selected_tracks \n", gst_handle->selected_tracks);
@@ -677,7 +678,9 @@ static void __gst_on_pad_added(GstElement *element, GstPad *pad, gpointer data)
        track *tmp = NULL;
        mdgst_handle_t *gst_handle = (mdgst_handle_t *)data;
        track_info *head_track = &(gst_handle->info);
-       GstCaps *caps = gst_pad_get_current_caps(pad);
+       GstCaps *caps = NULL;
+       MEDIADEMUXER_CHECK_NULL_VOID(gst_handle);
+       caps = gst_pad_get_current_caps(pad);
        if (!caps) {
                MD_E("caps is NULL");
                return;
@@ -775,101 +778,114 @@ static void __gst_cb_typefind(GstElement *tf, guint probability,
        GstPad *pad = NULL;
        GstPad *demuxer_pad = NULL;
        GstPad *fake_pad = NULL;
-       gchar *type;
+       gchar *type = NULL;
+       MEDIADEMUXER_CHECK_NULL_VOID(gst_handle);
        type = gst_caps_to_string(caps);
-       if (type) {
-               MD_I("Media type %s found, probability %d%%\n", type, probability);
-               if (strstr(type, "quicktime") || (strstr(type, "audio/x-m4a")) || strstr(type, "x-3gp")
-                               || strstr(type, "ogg") || strstr(type, "flv") || strstr(type, "x-msvideo")) {
-                       gst_handle->is_valid_container = true;
-                       if (strstr(type, "ogg"))
-                               gst_handle->demux = gst_element_factory_make("oggdemux", NULL);
-                       else if (strstr(type, "flv"))
-                               gst_handle->demux = gst_element_factory_make("flvdemux", NULL);
-                       else if (strstr(type, "x-msvideo"))
-                               gst_handle->demux = gst_element_factory_make("avidemux", NULL);
-                       else
-                               gst_handle->demux = gst_element_factory_make("qtdemux", NULL);
 
-                       if (!gst_handle->demux) {
-                               gst_handle->is_valid_container = false;
-                               MD_E("factory not able to create qtdemux\n");
-                               goto ERROR;
-                       } else {
-                               g_signal_connect(gst_handle->demux, "pad-added",
-                                                               G_CALLBACK(__gst_on_pad_added), gst_handle);
-                               g_signal_connect(gst_handle->demux, "no-more-pads",
-                                                               G_CALLBACK(__gst_no_more_pad), gst_handle);
-                               if (!gst_bin_add(GST_BIN(gst_handle->pipeline), gst_handle->demux)) {
-                                       gst_object_unref(gst_handle->demux);
-                                       MD_E("fail add demuxer(%s) in pipeline",
-                                               GST_ELEMENT_NAME(gst_handle->demux));
-                                       goto ERROR;
-                               }
+       if (!type) {
+               MD_E("Fail to get caps string");
+               goto ERROR;
+       }
 
-                               pad = gst_element_get_static_pad(gst_handle->typefind, "src");
-                               if (!pad) {
-                                       MD_E("fail to get typefind src pad.\n");
-                                       goto ERROR;
-                               }
-                               demuxer_pad = gst_element_get_static_pad(gst_handle->demux, "sink");
-                               if (!demuxer_pad) {
-                                       MD_E("fail to get qtdemuc sink pad.\n");
-                                       goto ERROR;
-                               }
-                               fake_pad = gst_element_get_static_pad(gst_handle->fakesink, "sink");
-                               if (!fake_pad) {
-                                       MD_E("fail to get fakesink sink pad.\n");
-                                       goto ERROR;
-                               }
-                               gst_pad_unlink(pad, fake_pad);
-                               MEDIADEMUXER_LINK_PAD(pad, demuxer_pad, ERROR);
-
-                               MEDIADEMUXER_SYNC_STATE_WITH_PARENT(gst_handle->demux, ERROR);
-                               if (pad)
-                                       gst_object_unref(pad);
-                               if (demuxer_pad)
-                                       gst_object_unref(demuxer_pad);
-                               if (fake_pad)
-                                       gst_object_unref(fake_pad);
-                       }
-               } else if ((strstr(type, "adts"))
-                          || (strstr(type, "audio/mpeg"))
-                          || (strstr(type, "audio/x-wav"))
-                          || (strstr(type, "audio/x-flac"))
-                          || (strstr(type, "application/x-id3"))
-                          || (strstr(type, "audio/x-amr-nb-sh"))
-                          || (strstr(type, "audio/x-amr-wb-sh"))) {
-                       MD_I("Audio only format is found\n");
-                       pad = gst_element_get_static_pad(gst_handle->typefind, "src");
-                       if (!pad) {
-                               MD_E("fail to get typefind src pad.\n");
-                               goto ERROR;
-                       }
-                       fake_pad = gst_element_get_static_pad(gst_handle->fakesink, "sink");
-                       if (!fake_pad) {
-                               MD_E("fail to get fakesink sink pad.\n");
-                               goto ERROR;
-                       }
-                       gst_pad_unlink(pad, fake_pad);
-                       if (pad)
-                               gst_object_unref(pad);
-                       if (fake_pad)
-                               gst_object_unref(fake_pad);
+       MD_I("Media type %s found, probability %d%%\n", type, probability);
+       if (strstr(type, "quicktime") || strstr(type, "audio/x-m4a") ||
+               strstr(type, "x-3gp") || strstr(type, "ogg") ||
+               strstr(type, "flv") || strstr(type, "x-msvideo")) {
+               gst_handle->is_valid_container = true;
+               if (strstr(type, "ogg"))
+                       gst_handle->demux = gst_element_factory_make("oggdemux", NULL);
+               else if (strstr(type, "flv"))
+                       gst_handle->demux = gst_element_factory_make("flvdemux", NULL);
+               else if (strstr(type, "x-msvideo"))
+                       gst_handle->demux = gst_element_factory_make("avidemux", NULL);
+               else
+                       gst_handle->demux = gst_element_factory_make("qtdemux", NULL);
 
-                       __gst_create_audio_only_pipeline(data, caps);
-               } else {
+               if (!gst_handle->demux) {
                        gst_handle->is_valid_container = false;
-                       MD_E("Not supported container %s\n", type);
+                       MD_E("factory not able to create qtdemux\n");
+                       goto ERROR;
                }
-               g_free(type);
+               g_signal_connect(gst_handle->demux, "pad-added",
+                                               G_CALLBACK(__gst_on_pad_added), gst_handle);
+               g_signal_connect(gst_handle->demux, "no-more-pads",
+                                               G_CALLBACK(__gst_no_more_pad), gst_handle);
+               gst_element_set_locked_state(gst_handle->demux, TRUE);
+               if (!gst_bin_add(GST_BIN(gst_handle->pipeline), gst_handle->demux)) {
+                       MD_E("fail add demuxer(%s) in pipeline",
+                               GST_ELEMENT_NAME(gst_handle->demux));
+                       gst_object_unref(gst_handle->demux);
+                       gst_handle->demux = NULL;
+                       goto ERROR;
+               }
+
+               pad = gst_element_get_static_pad(gst_handle->typefind, "src");
+               if (!pad) {
+                       MD_E("fail to get typefind src pad.\n");
+                       goto ERROR;
+               }
+               demuxer_pad = gst_element_get_static_pad(gst_handle->demux, "sink");
+               if (!demuxer_pad) {
+                       MD_E("fail to get qtdemuc sink pad.\n");
+                       goto ERROR;
+               }
+               fake_pad = gst_element_get_static_pad(gst_handle->fakesink, "sink");
+               if (!fake_pad) {
+                       MD_E("fail to get fakesink sink pad.\n");
+                       goto ERROR;
+               }
+               gst_pad_unlink(pad, fake_pad);
+               MEDIADEMUXER_LINK_PAD(pad, demuxer_pad, ERROR);
+
+               MEDIADEMUXER_SYNC_STATE_WITH_PARENT(gst_handle->demux, ERROR);
+               gst_element_set_locked_state(gst_handle->demux, FALSE);
+               if (pad)
+                       gst_object_unref(pad);
+               if (demuxer_pad)
+                       gst_object_unref(demuxer_pad);
+               if (fake_pad)
+                       gst_object_unref(fake_pad);
+
+       } else if ((strstr(type, "adts"))
+                  || (strstr(type, "audio/mpeg"))
+                  || (strstr(type, "audio/x-wav"))
+                  || (strstr(type, "audio/x-flac"))
+                  || (strstr(type, "application/x-id3"))
+                  || (strstr(type, "audio/x-amr-nb-sh"))
+                  || (strstr(type, "audio/x-amr-wb-sh"))) {
+               MD_I("Audio only format is found\n");
+               pad = gst_element_get_static_pad(gst_handle->typefind, "src");
+               if (!pad) {
+                       MD_E("fail to get typefind src pad.\n");
+                       goto ERROR;
+               }
+               fake_pad = gst_element_get_static_pad(gst_handle->fakesink, "sink");
+               if (!fake_pad) {
+                       MD_E("fail to get fakesink sink pad.\n");
+                       goto ERROR;
+               }
+               gst_pad_unlink(pad, fake_pad);
+               if (pad)
+                       gst_object_unref(pad);
+               if (fake_pad)
+                       gst_object_unref(fake_pad);
+
+               __gst_create_audio_only_pipeline(data, caps);
+       } else {
+               gst_handle->is_valid_container = false;
+               MD_E("Not supported container %s\n", type);
        }
+
+       g_free(type);
        MEDIADEMUXER_FLEAVE();
        return;
+
 ERROR:
        gst_handle->is_valid_container = false;
        if (type)
                g_free(type);
+       if (gst_handle->demux)
+               gst_element_set_locked_state(gst_handle->demux, FALSE);
        if (pad)
                gst_object_unref(pad);
        if (demuxer_pad)
@@ -1214,7 +1230,7 @@ int _set_mime_video(media_format_h format, track *head)
 
        /* Round off the framerate */
        if (frame_rate_denominator)
-               frame_rate = (int)floor((frame_rate_numerator / frame_rate_denominator) + 0.5);
+               frame_rate = (int)floor(((gdouble)frame_rate_numerator / frame_rate_denominator) + 0.5);
 
        MD_I("set frame rate %d", frame_rate);
        if (media_format_set_video_frame_rate(format, frame_rate)) {
@@ -1766,6 +1782,7 @@ ERROR:
 void  _gst_clear_struct(mdgst_handle_t *gst_handle)
 {
        MEDIADEMUXER_FENTER();
+       MEDIADEMUXER_CHECK_NULL_VOID(gst_handle);
        if (gst_handle->selected_tracks) {
                MD_I("Deallocating gst_handle->selected_tracks %p\n",
                     gst_handle->selected_tracks);