Merge branch 'master' into 0.11
[platform/upstream/gstreamer.git] / ext / ogg / gstoggstream.c
index 96cd581..49fe255 100644 (file)
@@ -325,19 +325,14 @@ static gboolean
 tag_list_from_vorbiscomment_packet (ogg_packet * packet,
     const guint8 * id_data, const guint id_data_length, GstTagList ** tags)
 {
-  GstBuffer *buf = NULL;
   gchar *encoder = NULL;
   GstTagList *list;
   gboolean ret = TRUE;
 
   g_return_val_if_fail (tags != NULL, FALSE);
 
-  buf = gst_buffer_new ();
-  GST_BUFFER_DATA (buf) = (guint8 *) packet->packet;
-  GST_BUFFER_SIZE (buf) = packet->bytes;
-
-  list = gst_tag_list_from_vorbiscomment_buffer (buf, id_data, id_data_length,
-      &encoder);
+  list = gst_tag_list_from_vorbiscomment (packet->packet, packet->bytes,
+      id_data, id_data_length, &encoder);
 
   if (!list) {
     GST_WARNING ("failed to decode vorbis comments");
@@ -357,8 +352,6 @@ exit:
     gst_tag_list_free (*tags);
   *tags = list;
 
-  gst_buffer_unref (buf);
-
   return ret;
 }
 
@@ -409,7 +402,7 @@ setup_theora_mapper (GstOggStream * pad, ogg_packet * packet)
   pad->theora_has_zero_keyoffset =
       ((vmaj << 16) | (vmin << 8) | vrev) < 0x030201;
 
-  pad->caps = gst_caps_new_simple ("video/x-theora", NULL);
+  pad->caps = gst_caps_new_empty_simple ("video/x-theora");
 
   if (w > 0 && h > 0) {
     gst_caps_set_simple (pad->caps, "width", G_TYPE_INT, w, "height",
@@ -472,7 +465,7 @@ extract_tags_theora (GstOggStream * pad, ogg_packet * packet)
         (const guint8 *) "\201theora", 7, &pad->taglist);
 
     if (!pad->taglist)
-      pad->taglist = gst_tag_list_new ();
+      pad->taglist = gst_tag_list_new_empty ();
 
     if (pad->bitrate)
       gst_tag_list_add (pad->taglist, GST_TAG_MERGE_REPLACE,
@@ -786,7 +779,7 @@ extract_tags_vorbis (GstOggStream * pad, ogg_packet * packet)
         (const guint8 *) "\003vorbis", 7, &pad->taglist);
 
     if (!pad->taglist)
-      pad->taglist = gst_tag_list_new ();
+      pad->taglist = gst_tag_list_new_empty ();
 
     gst_tag_list_add (pad->taglist, GST_TAG_MERGE_REPLACE,
         GST_TAG_ENCODER_VERSION, pad->version, NULL);
@@ -877,7 +870,7 @@ extract_tags_count (GstOggStream * pad, ogg_packet * packet)
     tag_list_from_vorbiscomment_packet (packet, NULL, 0, &pad->taglist);
 
     if (!pad->taglist)
-      pad->taglist = gst_tag_list_new ();
+      pad->taglist = gst_tag_list_new_empty ();
 
     if (pad->bitrate)
       gst_tag_list_add (pad->taglist, GST_TAG_MERGE_REPLACE,
@@ -897,7 +890,7 @@ setup_fLaC_mapper (GstOggStream * pad, ogg_packet * packet)
 
   pad->n_header_packets = 3;
 
-  pad->caps = gst_caps_new_simple ("audio/x-flac", NULL);
+  pad->caps = gst_caps_new_empty_simple ("audio/x-flac");
 
   return TRUE;
 }
@@ -1103,7 +1096,7 @@ setup_fishead_mapper (GstOggStream * pad, ogg_packet * packet)
   pad->is_skeleton = TRUE;
   pad->is_sparse = TRUE;
 
-  pad->caps = gst_caps_new_simple ("application/x-ogg-skeleton", NULL);
+  pad->caps = gst_caps_new_empty_simple ("application/x-ogg-skeleton");
 
   return TRUE;
 }
@@ -1444,12 +1437,14 @@ setup_ogmaudio_mapper (GstOggStream * pad, ogg_packet * packet)
 {
   guint8 *data = packet->packet;
   guint32 fourcc;
+  gchar *fstr;
 
   pad->granulerate_n = GST_READ_UINT64_LE (data + 25);
   pad->granulerate_d = 1;
 
   fourcc = GST_READ_UINT32_LE (data + 9);
-  GST_DEBUG ("fourcc: %" GST_FOURCC_FORMAT, GST_FOURCC_ARGS (fourcc));
+  fstr = g_strdup_printf ("%" GST_FOURCC_FORMAT, GST_FOURCC_ARGS (fourcc));
+  GST_DEBUG ("fourcc: %s", fstr);
 
   pad->caps = gst_riff_create_audio_caps (fourcc, NULL, NULL, NULL, NULL, NULL);
 
@@ -1462,9 +1457,10 @@ setup_ogmaudio_mapper (GstOggStream * pad, ogg_packet * packet)
         "rate", G_TYPE_INT, pad->granulerate_n, NULL);
   } else {
     pad->caps = gst_caps_new_simple ("audio/x-ogm-unknown",
-        "fourcc", GST_TYPE_FOURCC, fourcc,
+        "fourcc", G_TYPE_STRING, fstr,
         "rate", G_TYPE_INT, pad->granulerate_n, NULL);
   }
+  g_free (fstr);
 
   pad->n_header_packets = 1;
   pad->is_ogm = TRUE;
@@ -1479,6 +1475,7 @@ setup_ogmvideo_mapper (GstOggStream * pad, ogg_packet * packet)
   guint32 fourcc;
   int width, height;
   gint64 time_unit;
+  gchar *fstr;
 
   GST_DEBUG ("time unit %d", GST_READ_UINT32_LE (data + 16));
   GST_DEBUG ("samples per unit %d", GST_READ_UINT32_LE (data + 24));
@@ -1498,13 +1495,14 @@ setup_ogmvideo_mapper (GstOggStream * pad, ogg_packet * packet)
   fourcc = GST_READ_UINT32_LE (data + 9);
   width = GST_READ_UINT32_LE (data + 45);
   height = GST_READ_UINT32_LE (data + 49);
-  GST_DEBUG ("fourcc: %" GST_FOURCC_FORMAT, GST_FOURCC_ARGS (fourcc));
+  fstr = g_strdup_printf ("%" GST_FOURCC_FORMAT, GST_FOURCC_ARGS (fourcc));
+  GST_DEBUG ("fourcc: %s", fstr);
 
   pad->caps = gst_riff_create_video_caps (fourcc, NULL, NULL, NULL, NULL, NULL);
 
   if (pad->caps == NULL) {
     pad->caps = gst_caps_new_simple ("video/x-ogm-unknown",
-        "fourcc", GST_TYPE_FOURCC, fourcc,
+        "fourcc", G_TYPE_STRING, fstr,
         "framerate", GST_TYPE_FRACTION, pad->granulerate_n,
         pad->granulerate_d, NULL);
   } else {
@@ -1514,6 +1512,7 @@ setup_ogmvideo_mapper (GstOggStream * pad, ogg_packet * packet)
         "width", G_TYPE_INT, width, "height", G_TYPE_INT, height, NULL);
   }
   GST_DEBUG ("caps: %" GST_PTR_FORMAT, pad->caps);
+  g_free (fstr);
 
   pad->n_header_packets = 1;
   pad->frame_size = 1;
@@ -1542,7 +1541,7 @@ setup_ogmtext_mapper (GstOggStream * pad, ogg_packet * packet)
   if (pad->granulerate_d <= 0)
     return FALSE;
 
-  pad->caps = gst_caps_new_simple ("text/plain", NULL);
+  pad->caps = gst_caps_new_empty_simple ("text/plain");
 
   pad->n_header_packets = 1;
   pad->is_ogm = TRUE;
@@ -1594,88 +1593,64 @@ setup_pcm_mapper (GstOggStream * pad, ogg_packet * packet)
 
   switch (format) {
     case OGGPCM_FMT_S8:
-      caps = gst_caps_new_simple ("audio/x-raw-int",
-          "depth", G_TYPE_INT, 8,
-          "width", G_TYPE_INT, 8, "signed", G_TYPE_BOOLEAN, TRUE, NULL);
+      caps = gst_caps_new_simple ("audio/x-raw",
+          "format", G_TYPE_STRING, "S8", NULL);
       break;
     case OGGPCM_FMT_U8:
-      caps = gst_caps_new_simple ("audio/x-raw-int",
-          "depth", G_TYPE_INT, 8,
-          "width", G_TYPE_INT, 8, "signed", G_TYPE_BOOLEAN, FALSE, NULL);
+      caps = gst_caps_new_simple ("audio/x-raw",
+          "format", G_TYPE_STRING, "U8", NULL);
       break;
     case OGGPCM_FMT_S16_LE:
-      caps = gst_caps_new_simple ("audio/x-raw-int",
-          "depth", G_TYPE_INT, 16,
-          "width", G_TYPE_INT, 16,
-          "endianness", G_TYPE_INT, G_LITTLE_ENDIAN,
-          "signed", G_TYPE_BOOLEAN, TRUE, NULL);
+      caps = gst_caps_new_simple ("audio/x-raw",
+          "format", G_TYPE_STRING, "S16LE", NULL);
       break;
     case OGGPCM_FMT_S16_BE:
-      caps = gst_caps_new_simple ("audio/x-raw-int",
-          "depth", G_TYPE_INT, 16,
-          "width", G_TYPE_INT, 16,
-          "endianness", G_TYPE_INT, G_BIG_ENDIAN,
-          "signed", G_TYPE_BOOLEAN, TRUE, NULL);
+      caps = gst_caps_new_simple ("audio/x-raw",
+          "format", G_TYPE_STRING, "S16BE", NULL);
       break;
     case OGGPCM_FMT_S24_LE:
-      caps = gst_caps_new_simple ("audio/x-raw-int",
-          "depth", G_TYPE_INT, 24,
-          "width", G_TYPE_INT, 24,
-          "endianness", G_TYPE_INT, G_LITTLE_ENDIAN,
-          "signed", G_TYPE_BOOLEAN, TRUE, NULL);
+      caps = gst_caps_new_simple ("audio/x-raw",
+          "format", G_TYPE_STRING, "S24LE", NULL);
       break;
     case OGGPCM_FMT_S24_BE:
-      caps = gst_caps_new_simple ("audio/x-raw-int",
-          "depth", G_TYPE_INT, 24,
-          "width", G_TYPE_INT, 24,
-          "endianness", G_TYPE_INT, G_BIG_ENDIAN,
-          "signed", G_TYPE_BOOLEAN, TRUE, NULL);
+      caps = gst_caps_new_simple ("audio/x-raw",
+          "format", G_TYPE_STRING, "S24BE", NULL);
       break;
     case OGGPCM_FMT_S32_LE:
-      caps = gst_caps_new_simple ("audio/x-raw-int",
-          "depth", G_TYPE_INT, 32,
-          "width", G_TYPE_INT, 32,
-          "endianness", G_TYPE_INT, G_LITTLE_ENDIAN,
-          "signed", G_TYPE_BOOLEAN, TRUE, NULL);
+      caps = gst_caps_new_simple ("audio/x-raw",
+          "format", G_TYPE_STRING, "S32LE", NULL);
       break;
     case OGGPCM_FMT_S32_BE:
-      caps = gst_caps_new_simple ("audio/x-raw-int",
-          "depth", G_TYPE_INT, 32,
-          "width", G_TYPE_INT, 32,
-          "endianness", G_TYPE_INT, G_BIG_ENDIAN,
-          "signed", G_TYPE_BOOLEAN, TRUE, NULL);
+      caps = gst_caps_new_simple ("audio/x-raw",
+          "format", G_TYPE_STRING, "S32BE", NULL);
       break;
     case OGGPCM_FMT_ULAW:
-      caps = gst_caps_new_simple ("audio/x-mulaw", NULL);
+      caps = gst_caps_new_empty_simple ("audio/x-mulaw");
       break;
     case OGGPCM_FMT_ALAW:
-      caps = gst_caps_new_simple ("audio/x-alaw", NULL);
+      caps = gst_caps_new_empty_simple ("audio/x-alaw");
       break;
     case OGGPCM_FMT_FLT32_LE:
-      caps = gst_caps_new_simple ("audio/x-raw-float",
-          "width", G_TYPE_INT, 32,
-          "endianness", G_TYPE_INT, G_LITTLE_ENDIAN, NULL);
+      caps = gst_caps_new_simple ("audio/x-raw",
+          "format", G_TYPE_STRING, "F32LE", NULL);
       break;
     case OGGPCM_FMT_FLT32_BE:
-      caps = gst_caps_new_simple ("audio/x-raw-float",
-          "width", G_TYPE_INT, 32,
-          "endianness", G_TYPE_INT, G_BIG_ENDIAN, NULL);
+      caps = gst_caps_new_simple ("audio/x-raw",
+          "format", G_TYPE_STRING, "F32BE", NULL);
       break;
     case OGGPCM_FMT_FLT64_LE:
-      caps = gst_caps_new_simple ("audio/x-raw-float",
-          "width", G_TYPE_INT, 64,
-          "endianness", G_TYPE_INT, G_LITTLE_ENDIAN, NULL);
+      caps = gst_caps_new_simple ("audio/x-raw",
+          "format", G_TYPE_STRING, "F64LE", NULL);
       break;
     case OGGPCM_FMT_FLT64_BE:
-      caps = gst_caps_new_simple ("audio/x-raw-float",
-          "width", G_TYPE_INT, 64,
-          "endianness", G_TYPE_INT, G_BIG_ENDIAN, NULL);
+      caps = gst_caps_new_simple ("audio/x-raw",
+          "format", G_TYPE_STRING, "F64BE", NULL);
       break;
     default:
       return FALSE;
   }
 
-  gst_caps_set_simple (caps, "audio/x-raw-int",
+  gst_caps_set_simple (caps,
       "rate", G_TYPE_INT, pad->granulerate_n,
       "channels", G_TYPE_INT, channels, NULL);
   pad->caps = caps;
@@ -1704,7 +1679,7 @@ setup_cmml_mapper (GstOggStream * pad, ogg_packet * packet)
   GST_DEBUG ("blocksize0: %u", 1 << (data[0] >> 4));
   GST_DEBUG ("blocksize1: %u", 1 << (data[0] & 0x0F));
 
-  pad->caps = gst_caps_new_simple ("text/x-cmml", NULL);
+  pad->caps = gst_caps_new_empty_simple ("text/x-cmml");
   pad->always_flush_page = TRUE;
   pad->is_sparse = TRUE;
 
@@ -1761,9 +1736,9 @@ setup_kate_mapper (GstOggStream * pad, ogg_packet * packet)
   if (strcmp (category, "subtitles") == 0 || strcmp (category, "SUB") == 0 ||
       strcmp (category, "spu-subtitles") == 0 ||
       strcmp (category, "K-SPU") == 0) {
-    pad->caps = gst_caps_new_simple ("subtitle/x-kate", NULL);
+    pad->caps = gst_caps_new_empty_simple ("subtitle/x-kate");
   } else {
-    pad->caps = gst_caps_new_simple ("application/x-kate", NULL);
+    pad->caps = gst_caps_new_empty_simple ("application/x-kate");
   }
 
   pad->is_sparse = TRUE;
@@ -1825,7 +1800,7 @@ extract_tags_kate (GstOggStream * pad, ogg_packet * packet)
       g_strdelimit (language, NULL, '\0');
       canonical = gst_tag_get_language_code_iso_639_1 (language);
       if (canonical) {
-        list = gst_tag_list_new_full (GST_TAG_LANGUAGE_CODE, canonical, NULL);
+        list = gst_tag_list_new (GST_TAG_LANGUAGE_CODE, canonical, NULL);
       } else {
         GST_WARNING ("Unknown or invalid language code %s, ignored", language);
       }
@@ -1988,7 +1963,7 @@ const GstOggMap mappers[] = {
   },
   {
     "PCM     ", 8, 0,
-    "audio/x-raw-int",
+    "audio/x-raw",
     setup_pcm_mapper,
     NULL,
     NULL,
@@ -2204,11 +2179,14 @@ gboolean
 gst_ogg_stream_setup_map_from_caps_headers (GstOggStream * pad,
     const GstCaps * caps)
 {
+  GstBuffer *buf;
   const GstStructure *structure;
-  const GstBuffer *buf;
   const GValue *streamheader;
   const GValue *first_element;
   ogg_packet packet;
+  guint8 *data;
+  gsize size;
+  gboolean ret;
 
   GST_INFO ("Checking streamheader on caps %" GST_PTR_FORMAT, caps);
 
@@ -2241,16 +2219,26 @@ gst_ogg_stream_setup_map_from_caps_headers (GstOggStream * pad,
   }
 
   buf = gst_value_get_buffer (first_element);
-  if (buf == NULL || GST_BUFFER_SIZE (buf) == 0) {
+  if (buf == NULL) {
+    GST_ERROR ("no first streamheader buffer");
+    return FALSE;
+  }
+
+  data = gst_buffer_map (buf, &size, 0, GST_MAP_READ);
+  if (data == NULL || size == 0) {
     GST_ERROR ("invalid first streamheader buffer");
     return FALSE;
   }
 
-  GST_MEMDUMP ("streamheader", GST_BUFFER_DATA (buf), GST_BUFFER_SIZE (buf));
+  GST_MEMDUMP ("streamheader", data, size);
 
-  packet.packet = GST_BUFFER_DATA (buf);
-  packet.bytes = GST_BUFFER_SIZE (buf);
+  packet.packet = data;
+  packet.bytes = size;
 
   GST_INFO ("Found headers on caps, using those to determine type");
-  return gst_ogg_stream_setup_map (pad, &packet);
+  ret = gst_ogg_stream_setup_map (pad, &packet);
+
+  gst_buffer_unmap (buf, data, size);
+
+  return ret;
 }