qtdemux: fix crash when qtdemux dispose (free spherical_metadata) 80/159280/4 accepted/tizen/unified/20171212.171911 submit/tizen/20171212.053432
authorGilbok Lee <gilbok.lee@samsung.com>
Wed, 8 Nov 2017 02:37:11 +0000 (11:37 +0900)
committerGilbok Lee <gilbok.lee@samsung.com>
Tue, 14 Nov 2017 03:08:32 +0000 (12:08 +0900)
Change-Id: I25eefeb0ed68ef9f567fb8ec6e71f13ddc6b2628

gst/isomp4/qtdemux.c [changed mode: 0644->0755]
gst/isomp4/qtdemux.h [changed mode: 0644->0755]

old mode 100644 (file)
new mode 100755 (executable)
index 49a924e..2948c68
@@ -121,7 +121,6 @@ struct _QtDemuxSample
 };
 
 #ifdef TIZEN_FEATURE_QTDEMUX_MODIFICATION
-typedef struct _QtDemuxSphericalMetadata QtDemuxSphericalMetadata;
 
 struct _QtDemuxSphericalMetadata
 {
@@ -145,8 +144,6 @@ struct _QtDemuxSphericalMetadata
   QTDEMUX_AMBISONIC_FORMAT ambisonic_format;
   QTDEMUX_AMBISONIC_ORDER ambisonic_order;
 };
-
-QtDemuxSphericalMetadata *spherical_metadata;
 #endif /* TIZEN_FEATURE_QTDEMUX_MODIFICATION */
 
 /* Macros for converting to/from timescale */
@@ -645,29 +642,29 @@ gst_qtdemux_init (GstQTDemux * qtdemux)
   qtdemux->flowcombiner = gst_flow_combiner_new ();
 
 #ifdef TIZEN_FEATURE_QTDEMUX_MODIFICATION
-  spherical_metadata = (QtDemuxSphericalMetadata *)
+  qtdemux->spherical_metadata = (QtDemuxSphericalMetadata *)
       malloc (sizeof (QtDemuxSphericalMetadata));
 
-  if (spherical_metadata) {
-    spherical_metadata->is_spherical = FALSE;
-    spherical_metadata->is_stitched = FALSE;
-    spherical_metadata->stitching_software = NULL;
-    spherical_metadata->projection_type = NULL;
-    spherical_metadata->stereo_mode = NULL;
-    spherical_metadata->source_count = 0;
-    spherical_metadata->init_view_heading = 0;
-    spherical_metadata->init_view_pitch = 0;
-    spherical_metadata->init_view_roll = 0;
-    spherical_metadata->timestamp = 0;
-    spherical_metadata->full_pano_width_pixels = 0;
-    spherical_metadata->full_pano_height_pixels = 0;
-    spherical_metadata->cropped_area_image_width = 0;
-    spherical_metadata->cropped_area_image_height = 0;
-    spherical_metadata->cropped_area_left = 0;
-    spherical_metadata->cropped_area_top = 0;
-    spherical_metadata->ambisonic_type = QTDEMUX_AMBISONIC_TYPE_UNKNOWN;
-    spherical_metadata->ambisonic_format = QTDEMUX_AMBISONIC_TYPE_UNKNOWN;
-    spherical_metadata->ambisonic_order = QTDEMUX_AMBISONIC_ORDER_UNKNOWN;
+  if (qtdemux->spherical_metadata) {
+    qtdemux->spherical_metadata->is_spherical = FALSE;
+    qtdemux->spherical_metadata->is_stitched = FALSE;
+    qtdemux->spherical_metadata->stitching_software = NULL;
+    qtdemux->spherical_metadata->projection_type = NULL;
+    qtdemux->spherical_metadata->stereo_mode = NULL;
+    qtdemux->spherical_metadata->source_count = 0;
+    qtdemux->spherical_metadata->init_view_heading = 0;
+    qtdemux->spherical_metadata->init_view_pitch = 0;
+    qtdemux->spherical_metadata->init_view_roll = 0;
+    qtdemux->spherical_metadata->timestamp = 0;
+    qtdemux->spherical_metadata->full_pano_width_pixels = 0;
+    qtdemux->spherical_metadata->full_pano_height_pixels = 0;
+    qtdemux->spherical_metadata->cropped_area_image_width = 0;
+    qtdemux->spherical_metadata->cropped_area_image_height = 0;
+    qtdemux->spherical_metadata->cropped_area_left = 0;
+    qtdemux->spherical_metadata->cropped_area_top = 0;
+    qtdemux->spherical_metadata->ambisonic_type = QTDEMUX_AMBISONIC_TYPE_UNKNOWN;
+    qtdemux->spherical_metadata->ambisonic_format = QTDEMUX_AMBISONIC_TYPE_UNKNOWN;
+    qtdemux->spherical_metadata->ambisonic_order = QTDEMUX_AMBISONIC_ORDER_UNKNOWN;
   }
 #endif /* TIZEN_FEATURE_QTDEMUX_MODIFICATION */
 
@@ -680,14 +677,17 @@ gst_qtdemux_dispose (GObject * object)
   GstQTDemux *qtdemux = GST_QTDEMUX (object);
 
 #ifdef TIZEN_FEATURE_QTDEMUX_MODIFICATION
-  if (spherical_metadata->stitching_software)
-    free(spherical_metadata->stitching_software);
-  if (spherical_metadata->projection_type)
-    free(spherical_metadata->projection_type);
-  if (spherical_metadata->stereo_mode)
-    free(spherical_metadata->stereo_mode);
-  if (spherical_metadata)
-    free(spherical_metadata);
+  if (qtdemux->spherical_metadata) {
+    if (qtdemux->spherical_metadata->stitching_software)
+      free(qtdemux->spherical_metadata->stitching_software);
+    if (qtdemux->spherical_metadata->projection_type)
+      free(qtdemux->spherical_metadata->projection_type);
+    if (qtdemux->spherical_metadata->stereo_mode)
+      free(qtdemux->spherical_metadata->stereo_mode);
+
+    free(qtdemux->spherical_metadata);
+    qtdemux->spherical_metadata = NULL;
+  }
 #endif /* TIZEN_FEATURE_QTDEMUX_MODIFICATION */
 
   if (qtdemux->adapter) {
@@ -2614,8 +2614,7 @@ _get_bool_value_from_xml_string (GstQTDemux * qtdemux,
 }
 
 static void
-_parse_spatial_video_metadata_from_xml_string (GstQTDemux * qtdemux,
-    const char *xmlStr, QtDemuxSphericalMetadata * spherical_metadata)
+_parse_spatial_video_metadata_from_xml_string (GstQTDemux * qtdemux, const char *xmlStr)
 {
   const char is_spherical_str[] = "<GSpherical:Spherical>";
   const char is_stitched_str[] = "<GSpherical:Stitched>";
@@ -2636,6 +2635,8 @@ _parse_spatial_video_metadata_from_xml_string (GstQTDemux * qtdemux,
   const char cropped_area_left_str[] = "<GSpherical:CroppedAreaLeftPixels>";
   const char cropped_area_top_str[] = "<GSpherical:CroppedAreaTopPixels>";
 
+  QtDemuxSphericalMetadata * spherical_metadata = qtdemux->spherical_metadata;
+
   _get_bool_value_from_xml_string (qtdemux, xmlStr, is_spherical_str,
       (gboolean *) & spherical_metadata->is_spherical);
   _get_bool_value_from_xml_string (qtdemux, xmlStr, is_stitched_str,
@@ -2781,10 +2782,10 @@ gst_tag_register_spherical_tags (void) {
 }
 
 static void
-_send_message_to_bus (GstQTDemux * qtdemux,
-    QtDemuxSphericalMetadata * spherical_metadata)
+_send_spherical_metadata_msg_to_bus (GstQTDemux * qtdemux)
 {
   GstTagList *taglist;
+  QtDemuxSphericalMetadata *spherical_metadata = qtdemux->spherical_metadata;
 
   GST_DEBUG_OBJECT (qtdemux, "is_spherical = %d",
       spherical_metadata->is_spherical);
@@ -2913,23 +2914,23 @@ qtdemux_parse_SA3D (GstQTDemux * qtdemux, const guint8 * buffer, gint length)
 
   if (version == RFC_AMBISONIC_SA3DBOX_VERSION_SUPPORTED) {
     if (ambisonic_type == RFC_AMBISONIC_TYPE_PERIPHONIC)
-      spherical_metadata->ambisonic_type = QTDEMUX_AMBISONIC_TYPE_PERIPHONIC;
+      qtdemux->spherical_metadata->ambisonic_type = QTDEMUX_AMBISONIC_TYPE_PERIPHONIC;
 
     if (ambisonic_order == RFC_AMBISONIC_ORDER_FOA) {
       if (num_channels == 4) {
-        spherical_metadata->ambisonic_order = QTDEMUX_AMBISONIC_ORDER_FOA;
+        qtdemux->spherical_metadata->ambisonic_order = QTDEMUX_AMBISONIC_ORDER_FOA;
 
         if ((ambisonic_channel_ordering == RFC_AMBISONIC_CHANNEL_ORDERING_ACN)
             && (ambisonic_normalization == RFC_AMBISONIC_NORMALIZATION_SN3D)
             && (channel_map[0] == 0) && (channel_map[1] == 1)
             && (channel_map[2] == 2) && (channel_map[3] == 3))
-          spherical_metadata->ambisonic_format = QTDEMUX_AMBISONIC_FORMAT_AMBIX;
+          qtdemux->spherical_metadata->ambisonic_format = QTDEMUX_AMBISONIC_FORMAT_AMBIX;
 
         if ((ambisonic_channel_ordering == RFC_AMBISONIC_CHANNEL_ORDERING_FUMA)
             && (ambisonic_normalization == RFC_AMBISONIC_NORMALIZATION_FUMA)
             && (channel_map[0] == 0) && (channel_map[1] == 3)
             && (channel_map[2] == 1) && (channel_map[3] == 2))
-          spherical_metadata->ambisonic_format = QTDEMUX_AMBISONIC_FORMAT_AMB;
+          qtdemux->spherical_metadata->ambisonic_format = QTDEMUX_AMBISONIC_FORMAT_AMB;
       }
     }
   }
@@ -2978,9 +2979,8 @@ qtdemux_parse_uuid (GstQTDemux * qtdemux, const guint8 * buffer, gint length)
     contents = (char *) (buffer + offset + 16);
     GST_DEBUG_OBJECT (qtdemux, "contents: %s\n", contents);
 
-    if (spherical_metadata)
-      _parse_spatial_video_metadata_from_xml_string (qtdemux, contents,
-          spherical_metadata);
+    if (qtdemux->spherical_metadata)
+      _parse_spatial_video_metadata_from_xml_string (qtdemux, contents);
 
     return;
   }
@@ -4485,8 +4485,8 @@ beach:
   if (ret == GST_FLOW_EOS && (qtdemux->got_moov || qtdemux->media_caps)) {
     /* digested all data, show what we have */
 #ifdef TIZEN_FEATURE_QTDEMUX_MODIFICATION
-    if (spherical_metadata)
-      _send_message_to_bus (qtdemux, spherical_metadata);
+    if (qtdemux->spherical_metadata)
+      _send_spherical_metadata_msg_to_bus (qtdemux);
 #endif /* TIZEN_FEATURE_QTDEMUX_MODIFICATION */
     qtdemux_prepare_streams (qtdemux);
     ret = qtdemux_expose_streams (qtdemux);
old mode 100644 (file)
new mode 100755 (executable)
index 8f0553b..e5b3881
@@ -53,6 +53,9 @@ GST_DEBUG_CATEGORY_EXTERN (qtdemux_debug);
 typedef struct _GstQTDemux GstQTDemux;
 typedef struct _GstQTDemuxClass GstQTDemuxClass;
 typedef struct _QtDemuxStream QtDemuxStream;
+#ifdef TIZEN_FEATURE_QTDEMUX_MODIFICATION
+typedef struct _QtDemuxSphericalMetadata QtDemuxSphericalMetadata;
+#endif
 
 struct _GstQTDemux {
   GstElement element;
@@ -143,12 +146,15 @@ struct _GstQTDemux {
                       * requiring qtdemux to expose and create the streams */
   guint64 fragment_start;
   guint64 fragment_start_offset;
-    
+
   gint64 chapters_track_id;
 
   /* protection support */
   GPtrArray *protection_system_ids; /* Holds identifiers of all content protection systems for all tracks */
   GQueue protection_event_queue; /* holds copy of upstream protection events */
+#ifdef TIZEN_FEATURE_QTDEMUX_MODIFICATION
+  QtDemuxSphericalMetadata *spherical_metadata;
+#endif
 };
 
 struct _GstQTDemuxClass {