eqMerge remote-tracking branch 'origin/master' into 0.11
[platform/upstream/gstreamer.git] / gst / matroska / matroska-mux.c
index 5fe25f9..442f64e 100644 (file)
@@ -668,6 +668,17 @@ gst_matroska_mux_handle_src_event (GstPad * pad, GstObject * parent,
   return gst_pad_event_default (pad, parent, event);
 }
 
+
+static void
+gst_matroska_mux_free_codec_priv (GstMatroskaTrackContext * context)
+{
+  if (context->codec_priv != NULL) {
+    g_free (context->codec_priv);
+    context->codec_priv = NULL;
+    context->codec_priv_size = 0;
+  }
+}
+
 static void
 gst_matroska_mux_build_vobsub_private (GstMatroskaTrackContext * context,
     const guint * clut)
@@ -695,7 +706,7 @@ gst_matroska_mux_build_vobsub_private (GstMatroskaTrackContext * context,
   sclut = g_strjoinv (",", clutv);
 
   /* build codec private; only palette for now */
-  g_free (context->codec_priv);
+  gst_matroska_mux_free_codec_priv (context);
   context->codec_priv = (guint8 *) g_strdup_printf ("palette: %s", sclut);
   /* include terminating 0 */
   context->codec_priv_size = strlen ((gchar *) context->codec_priv) + 1;
@@ -1046,18 +1057,13 @@ skip_details:
 
     gst_matroska_mux_set_codec_id (context,
         GST_MATROSKA_CODEC_ID_VIDEO_VFW_FOURCC);
+    gst_matroska_mux_free_codec_priv (context);
     context->codec_priv = (gpointer) bih;
     context->codec_priv_size = size;
   } else if (!strcmp (mimetype, "video/x-h264")) {
     gst_matroska_mux_set_codec_id (context,
         GST_MATROSKA_CODEC_ID_VIDEO_MPEG4_AVC);
-
-    if (context->codec_priv != NULL) {
-      g_free (context->codec_priv);
-      context->codec_priv = NULL;
-      context->codec_priv_size = 0;
-    }
-
+    gst_matroska_mux_free_codec_priv (context);
     /* Create avcC header */
     if (codec_buf != NULL) {
       context->codec_priv_size = gst_buffer_get_size (codec_buf);
@@ -1069,11 +1075,7 @@ skip_details:
 
     gst_matroska_mux_set_codec_id (context, GST_MATROSKA_CODEC_ID_VIDEO_THEORA);
 
-    if (context->codec_priv != NULL) {
-      g_free (context->codec_priv);
-      context->codec_priv = NULL;
-      context->codec_priv_size = 0;
-    }
+    gst_matroska_mux_free_codec_priv (context);
 
     streamheader = gst_structure_get_value (structure, "streamheader");
     if (!theora_streamheader_to_codecdata (streamheader, context)) {
@@ -1108,6 +1110,7 @@ skip_details:
 
     /* global headers may be in codec data */
     if (codec_buf != NULL) {
+      gst_matroska_mux_free_codec_priv (context);
       context->codec_priv_size = gst_buffer_get_size (codec_buf);
       context->codec_priv = g_malloc0 (context->codec_priv_size);
       gst_buffer_extract (codec_buf, 0, context->codec_priv, -1);
@@ -1154,6 +1157,7 @@ skip_details:
 
       gst_buffer_extract (codec_data_buf, 0, priv_data, -1);
 
+      gst_matroska_mux_free_codec_priv (context);
       context->codec_priv = priv_data;
       context->codec_priv_size = priv_data_size;
     }
@@ -1237,6 +1241,7 @@ xiphN_streamheader_to_codecdata (const GValue * streamheader,
     offset += gst_buffer_get_size (buf[i]);
   }
 
+  gst_matroska_mux_free_codec_priv (context);
   context->codec_priv = priv_data;
   context->codec_priv_size = priv_data_size;
 
@@ -1421,6 +1426,7 @@ flac_streamheader_to_codecdata (const GValue * streamheader,
     return FALSE;
   }
 
+  gst_matroska_mux_free_codec_priv (context);
   context->codec_priv_size = gst_buffer_get_size (buffer) - 9;
   context->codec_priv = g_malloc (context->codec_priv_size);
   gst_buffer_extract (buffer, 9, context->codec_priv, -1);
@@ -1430,9 +1436,7 @@ flac_streamheader_to_codecdata (const GValue * streamheader,
     bufval = &g_array_index (bufarr, GValue, i);
 
     if (G_VALUE_TYPE (bufval) != GST_TYPE_BUFFER) {
-      g_free (context->codec_priv);
-      context->codec_priv = NULL;
-      context->codec_priv_size = 0;
+      gst_matroska_mux_free_codec_priv (context);
       GST_WARNING ("streamheaders array does not contain GstBuffers");
       return FALSE;
     }
@@ -1487,6 +1491,7 @@ speex_streamheader_to_codecdata (const GValue * streamheader,
     return FALSE;
   }
 
+  gst_matroska_mux_free_codec_priv (context);
   context->codec_priv_size = gst_buffer_get_size (buffer);
   context->codec_priv = g_malloc (context->codec_priv_size);
   gst_buffer_extract (buffer, 0, context->codec_priv, -1);
@@ -1494,9 +1499,7 @@ speex_streamheader_to_codecdata (const GValue * streamheader,
   bufval = &g_array_index (bufarr, GValue, 1);
 
   if (G_VALUE_TYPE (bufval) != GST_TYPE_BUFFER) {
-    g_free (context->codec_priv);
-    context->codec_priv = NULL;
-    context->codec_priv_size = 0;
+    gst_matroska_mux_free_codec_priv (context);
     GST_WARNING ("streamheaders array does not contain GstBuffers");
     return FALSE;
   }
@@ -1729,11 +1732,7 @@ gst_matroska_mux_audio_pad_setcaps (GstPad * pad, GstCaps * caps)
 
     gst_matroska_mux_set_codec_id (context, GST_MATROSKA_CODEC_ID_AUDIO_VORBIS);
 
-    if (context->codec_priv != NULL) {
-      g_free (context->codec_priv);
-      context->codec_priv = NULL;
-      context->codec_priv_size = 0;
-    }
+    gst_matroska_mux_free_codec_priv (context);
 
     streamheader = gst_structure_get_value (structure, "streamheader");
     if (!vorbis_streamheader_to_codecdata (streamheader, context)) {
@@ -1745,11 +1744,8 @@ gst_matroska_mux_audio_pad_setcaps (GstPad * pad, GstCaps * caps)
     const GValue *streamheader;
 
     gst_matroska_mux_set_codec_id (context, GST_MATROSKA_CODEC_ID_AUDIO_FLAC);
-    if (context->codec_priv != NULL) {
-      g_free (context->codec_priv);
-      context->codec_priv = NULL;
-      context->codec_priv_size = 0;
-    }
+
+    gst_matroska_mux_free_codec_priv (context);
 
     streamheader = gst_structure_get_value (structure, "streamheader");
     if (!flac_streamheader_to_codecdata (streamheader, context)) {
@@ -1761,11 +1757,7 @@ gst_matroska_mux_audio_pad_setcaps (GstPad * pad, GstCaps * caps)
     const GValue *streamheader;
 
     gst_matroska_mux_set_codec_id (context, GST_MATROSKA_CODEC_ID_AUDIO_SPEEX);
-    if (context->codec_priv != NULL) {
-      g_free (context->codec_priv);
-      context->codec_priv = NULL;
-      context->codec_priv_size = 0;
-    }
+    gst_matroska_mux_free_codec_priv (context);
 
     streamheader = gst_structure_get_value (structure, "streamheader");
     if (!speex_streamheader_to_codecdata (streamheader, context)) {
@@ -1823,6 +1815,8 @@ gst_matroska_mux_audio_pad_setcaps (GstPad * pad, GstCaps * caps)
 
       gst_buffer_extract (codec_data_buf, 0, priv_data, -1);
 
+      gst_matroska_mux_free_codec_priv (context);
+
       context->codec_priv = priv_data;
       context->codec_priv_size = priv_data_size;
     }
@@ -1907,6 +1901,7 @@ gst_matroska_mux_audio_pad_setcaps (GstPad * pad, GstCaps * caps)
     }
 
     gst_matroska_mux_set_codec_id (context, GST_MATROSKA_CODEC_ID_AUDIO_ACM);
+    gst_matroska_mux_free_codec_priv (context);
     context->codec_priv = (gpointer) codec_priv;
     context->codec_priv_size = codec_priv_size;
   }
@@ -1981,11 +1976,7 @@ gst_matroska_mux_subtitle_pad_setcaps (GstPad * pad, GstCaps * caps)
     gst_matroska_mux_set_codec_id (context,
         GST_MATROSKA_CODEC_ID_SUBTITLE_KATE);
 
-    if (context->codec_priv != NULL) {
-      g_free (context->codec_priv);
-      context->codec_priv = NULL;
-      context->codec_priv_size = 0;
-    }
+    gst_matroska_mux_free_codec_priv (context);
 
     streamheader = gst_structure_get_value (structure, "streamheader");
     if (!kate_streamheader_to_codecdata (streamheader, context)) {
@@ -2030,8 +2021,7 @@ gst_matroska_mux_subtitle_pad_setcaps (GstPad * pad, GstCaps * caps)
       return TRUE;
     }
 
-    if (context->codec_priv != NULL)
-      g_free (context->codec_priv);
+    gst_matroska_mux_free_codec_priv (context);
 
     priv_data = g_malloc0 (priv_data_size);
     memcpy (priv_data, priv_buffer_data, priv_data_size);