plugins: more porting
authorWim Taymans <wim.taymans@collabora.co.uk>
Mon, 28 Mar 2011 08:20:06 +0000 (10:20 +0200)
committerWim Taymans <wim.taymans@collabora.co.uk>
Mon, 28 Mar 2011 08:20:06 +0000 (10:20 +0200)
ext/vorbis/gstvorbisdec.c
ext/vorbis/gstvorbisdeclib.h
ext/vorbis/gstvorbisenc.c
ext/vorbis/gstvorbisparse.c
ext/vorbis/gstvorbistag.c
tools/gst-discoverer.c

index 33f4184..95a0f95 100644 (file)
@@ -629,16 +629,16 @@ vorbis_handle_comment_packet (GstVorbisDec * vd, ogg_packet * packet)
   guint bitrate = 0;
   gchar *encoder = NULL;
   GstTagList *list, *old_list;
-  GstBuffer *buf;
+  guint8 *data;
+  gsize size;
 
   GST_DEBUG_OBJECT (vd, "parsing comment packet");
 
-  buf = gst_buffer_new ();
-  GST_BUFFER_DATA (buf) = gst_ogg_packet_data (packet);
-  GST_BUFFER_SIZE (buf) = gst_ogg_packet_size (packet);
+  data = gst_ogg_packet_data (packet);
+  size = gst_ogg_packet_size (packet);
 
   list =
-      gst_tag_list_from_vorbiscomment_buffer (buf, (guint8 *) "\003vorbis", 7,
+      gst_tag_list_from_vorbiscomment (data, size, (guint8 *) "\003vorbis", 7,
       &encoder);
 
   old_list = vd->taglist;
@@ -647,7 +647,6 @@ vorbis_handle_comment_packet (GstVorbisDec * vd, ogg_packet * packet)
   if (old_list)
     gst_tag_list_free (old_list);
   gst_tag_list_free (list);
-  gst_buffer_unref (buf);
 
   if (!vd->taglist) {
     GST_ERROR_OBJECT (vd, "couldn't decode comments");
@@ -859,7 +858,8 @@ vorbis_handle_data_packet (GstVorbisDec * vd, ogg_packet * packet,
   guint sample_count;
   GstBuffer *out = NULL;
   GstFlowReturn result;
-  gint size;
+  guint8 *data;
+  gsize size;
 
   if (G_UNLIKELY (!vd->initialized))
     goto not_initialized;
@@ -899,11 +899,12 @@ vorbis_handle_data_packet (GstVorbisDec * vd, ogg_packet * packet,
     goto wrong_samples;
 
   /* copy samples in buffer */
-  vd->copy_samples ((vorbis_sample_t *) GST_BUFFER_DATA (out), pcm,
+  data = gst_buffer_map (out, NULL, NULL, GST_MAP_WRITE);
+  vd->copy_samples ((vorbis_sample_t *) data, pcm,
       sample_count, vd->vi.channels, vd->width);
 
   GST_LOG_OBJECT (vd, "setting output size to %d", size);
-  GST_BUFFER_SIZE (out) = size;
+  gst_buffer_unmap (out, data, size);
 
   /* this should not overflow */
   if (duration == -1)
@@ -961,7 +962,7 @@ vorbis_dec_decode_buffer (GstVorbisDec * vd, GstBuffer * buffer)
   GstFlowReturn result = GST_FLOW_OK;
 
   /* make ogg_packet out of the buffer */
-  gst_ogg_packet_wrapper_from_buffer (&packet_wrapper, buffer);
+  gst_ogg_packet_wrapper_map (&packet_wrapper, buffer);
   packet = gst_ogg_packet_from_wrapper (&packet_wrapper);
   /* set some more stuff */
   packet->granulepos = -1;
@@ -997,6 +998,8 @@ vorbis_dec_decode_buffer (GstVorbisDec * vd, GstBuffer * buffer)
   }
 
 done:
+  gst_ogg_packet_wrapper_unmap (&packet_wrapper, buffer);
+
   return result;
 
 empty_buffer:
@@ -1153,7 +1156,7 @@ vorbis_dec_chain_reverse (GstVorbisDec * vd, gboolean discont, GstBuffer * buf)
   if (G_LIKELY (buf)) {
     GST_DEBUG_OBJECT (vd,
         "gathering buffer %p of size %u, time %" GST_TIME_FORMAT
-        ", dur %" GST_TIME_FORMAT, buf, GST_BUFFER_SIZE (buf),
+        ", dur %" GST_TIME_FORMAT, buf, gst_buffer_get_size (buf),
         GST_TIME_ARGS (GST_BUFFER_TIMESTAMP (buf)),
         GST_TIME_ARGS (GST_BUFFER_DURATION (buf)));
 
index c82f0c8..23e291d 100644 (file)
@@ -60,10 +60,18 @@ gst_ogg_packet_size (ogg_packet * p)
 }
 
 static inline void
-gst_ogg_packet_wrapper_from_buffer (ogg_packet * packet, GstBuffer * buffer)
+gst_ogg_packet_wrapper_map (ogg_packet * packet, GstBuffer * buffer)
 {
-  packet->packet = GST_BUFFER_DATA (buffer);
-  packet->bytes = GST_BUFFER_SIZE (buffer);
+  gsize size;
+
+  packet->packet = gst_buffer_map (buffer, &size, NULL, GST_MAP_READ);
+  packet->bytes = size;
+}
+
+static inline void
+gst_ogg_packet_wrapper_unmap (ogg_packet * packet, GstBuffer * buffer)
+{
+  gst_buffer_unmap (buffer, packet->packet, packet->bytes);
 }
 
 static inline ogg_packet *
@@ -121,14 +129,15 @@ gst_ogg_packet_size (ogg_packet * p)
 }
 
 static inline void
-gst_ogg_packet_wrapper_from_buffer (ogg_packet_wrapper * packet,
+gst_ogg_packet_wrapper_map (ogg_packet_wrapper * packet,
     GstBuffer * buffer)
 {
   ogg_reference *ref = &packet->ref;
   ogg_buffer *buf = &packet->buf;
+  gsize size;
 
-  buf->data = GST_BUFFER_DATA (buffer);
-  buf->size = GST_BUFFER_SIZE (buffer);
+  buf->data = gst_buffer_map (buffer, &size, NULL, GST_MAP_READ);
+  buf->size = size;
   buf->refcount = 1;
   buf->ptr.owner = NULL;
   buf->ptr.next = NULL;
@@ -142,6 +151,16 @@ gst_ogg_packet_wrapper_from_buffer (ogg_packet_wrapper * packet,
   packet->packet.bytes = ref->length;
 }
 
+static inline void
+gst_ogg_packet_wrapper_unmap (ogg_packet_wrapper * packet,
+    GstBuffer * buffer)
+{
+  ogg_reference *ref = &packet->ref;
+  ogg_buffer *buf = &packet->buf;
+
+  gst_buffer_unmap (buffer, buf->data, buf->size);
+}
+
 static inline ogg_packet *
 gst_ogg_packet_from_wrapper (ogg_packet_wrapper * packet)
 {
index 9cdf484..0fb3de7 100644 (file)
@@ -826,7 +826,7 @@ gst_vorbis_enc_buffer_from_packet (GstVorbisEnc * vorbisenc,
   GstBuffer *outbuf;
 
   outbuf = gst_buffer_new_and_alloc (packet->bytes);
-  memcpy (GST_BUFFER_DATA (outbuf), packet->packet, packet->bytes);
+  gst_buffer_fill (outbuf, 0, packet->packet, packet->bytes);
   /* see ext/ogg/README; OFFSET_END takes "our" granulepos, OFFSET its
    * time representation */
   GST_BUFFER_OFFSET_END (outbuf) = packet->granulepos +
@@ -851,7 +851,7 @@ gst_vorbis_enc_buffer_from_packet (GstVorbisEnc * vorbisenc,
   gst_buffer_set_caps (outbuf, vorbisenc->srccaps);
 
   GST_LOG_OBJECT (vorbisenc, "encoded buffer of %d bytes",
-      GST_BUFFER_SIZE (outbuf));
+      gst_buffer_get_size (outbuf));
   return outbuf;
 }
 
@@ -864,7 +864,7 @@ gst_vorbis_enc_buffer_from_header_packet (GstVorbisEnc * vorbisenc,
   GstBuffer *outbuf;
 
   outbuf = gst_buffer_new_and_alloc (packet->bytes);
-  memcpy (GST_BUFFER_DATA (outbuf), packet->packet, packet->bytes);
+  gst_buffer_fill (outbuf, 0, packet->packet, packet->bytes);
   GST_BUFFER_OFFSET (outbuf) = vorbisenc->bytes_out;
   GST_BUFFER_OFFSET_END (outbuf) = 0;
   GST_BUFFER_TIMESTAMP (outbuf) = GST_CLOCK_TIME_NONE;
@@ -873,7 +873,7 @@ gst_vorbis_enc_buffer_from_header_packet (GstVorbisEnc * vorbisenc,
   gst_buffer_set_caps (outbuf, vorbisenc->srccaps);
 
   GST_DEBUG ("created header packet buffer, %d bytes",
-      GST_BUFFER_SIZE (outbuf));
+      gst_buffer_get_size (outbuf));
   return outbuf;
 }
 
@@ -881,7 +881,7 @@ gst_vorbis_enc_buffer_from_header_packet (GstVorbisEnc * vorbisenc,
 static GstFlowReturn
 gst_vorbis_enc_push_buffer (GstVorbisEnc * vorbisenc, GstBuffer * buffer)
 {
-  vorbisenc->bytes_out += GST_BUFFER_SIZE (buffer);
+  vorbisenc->bytes_out += gst_buffer_get_size (buffer);
 
   GST_DEBUG_OBJECT (vorbisenc,
       "Pushing buffer with GP %" G_GINT64_FORMAT ", ts %" GST_TIME_FORMAT,
@@ -1038,7 +1038,7 @@ gst_vorbis_enc_chain (GstPad * pad, GstBuffer * buffer)
 {
   GstVorbisEnc *vorbisenc;
   GstFlowReturn ret = GST_FLOW_OK;
-  gfloat *data;
+  gfloat *data, *ptr;
   gulong size;
   gulong i, j;
   float **vorbis_buffer;
@@ -1046,6 +1046,7 @@ gst_vorbis_enc_chain (GstPad * pad, GstBuffer * buffer)
   gboolean first = FALSE;
   GstClockTime timestamp = GST_CLOCK_TIME_NONE;
   GstClockTime running_time = GST_CLOCK_TIME_NONE;
+  gsize bsize;
 
   vorbisenc = GST_VORBISENC (GST_PAD_PARENT (pad));
 
@@ -1137,22 +1138,24 @@ gst_vorbis_enc_chain (GstPad * pad, GstBuffer * buffer)
       timestamp < vorbisenc->expected_ts) {
     guint64 diff = vorbisenc->expected_ts - timestamp;
     guint64 diff_bytes;
+    gsize size;
 
     GST_WARNING_OBJECT (vorbisenc, "Buffer is older than previous "
         "timestamp + duration (%" GST_TIME_FORMAT "< %" GST_TIME_FORMAT
         "), cannot handle. Clipping buffer.",
         GST_TIME_ARGS (timestamp), GST_TIME_ARGS (vorbisenc->expected_ts));
 
+    size = gst_buffer_get_size (buffer);
+
     diff_bytes =
         GST_CLOCK_TIME_TO_FRAMES (diff,
         vorbisenc->frequency) * vorbisenc->channels * sizeof (gfloat);
-    if (diff_bytes >= GST_BUFFER_SIZE (buffer)) {
+    if (diff_bytes >= size) {
       gst_buffer_unref (buffer);
       return GST_FLOW_OK;
     }
-    buffer = gst_buffer_make_metadata_writable (buffer);
-    GST_BUFFER_DATA (buffer) += diff_bytes;
-    GST_BUFFER_SIZE (buffer) -= diff_bytes;
+    buffer = gst_buffer_make_writable (buffer);
+    gst_buffer_trim (buffer, diff_bytes, size - diff_bytes);
 
     GST_BUFFER_TIMESTAMP (buffer) += diff;
     if (GST_BUFFER_DURATION_IS_VALID (buffer))
@@ -1187,14 +1190,17 @@ gst_vorbis_enc_chain (GstPad * pad, GstBuffer * buffer)
   }
 
   /* Sending zero samples to libvorbis marks EOS, so we mustn't do that */
-  if (GST_BUFFER_SIZE (buffer) == 0) {
+  data = gst_buffer_map (buffer, &bsize, NULL, GST_MAP_WRITE);
+  if (bsize == 0) {
+    gst_buffer_unmap (buffer, data, bsize);
     gst_buffer_unref (buffer);
     return GST_FLOW_OK;
   }
 
   /* data to encode */
-  data = (gfloat *) GST_BUFFER_DATA (buffer);
-  size = GST_BUFFER_SIZE (buffer) / (vorbisenc->channels * sizeof (float));
+  size = bsize / (vorbisenc->channels * sizeof (float));
+
+  ptr = data;
 
   /* expose the buffer to submit data */
   vorbis_buffer = vorbis_analysis_buffer (&vorbisenc->vd, size);
@@ -1202,12 +1208,13 @@ gst_vorbis_enc_chain (GstPad * pad, GstBuffer * buffer)
   /* deinterleave samples, write the buffer data */
   for (i = 0; i < size; i++) {
     for (j = 0; j < vorbisenc->channels; j++) {
-      vorbis_buffer[j][i] = *data++;
+      vorbis_buffer[j][i] = *ptr++;
     }
   }
 
   /* tell the library how much we actually submitted */
   vorbis_analysis_wrote (&vorbisenc->vd, size);
+  gst_buffer_unmap (buffer, data, bsize);
 
   GST_LOG_OBJECT (vorbisenc, "wrote %lu samples to vorbis", size);
 
index 53fd7b1..99f1d2e 100644 (file)
@@ -191,6 +191,7 @@ vorbis_parse_push_headers (GstVorbisParse * parse)
   GstCaps *caps;
   GstBuffer *outbuf, *outbuf1, *outbuf2, *outbuf3;
   ogg_packet packet;
+  gsize size;
 
   /* get the headers into the caps, passing them to vorbis as we go */
   caps = gst_caps_make_writable (gst_pad_get_caps (parse->srcpad));
@@ -200,47 +201,50 @@ vorbis_parse_push_headers (GstVorbisParse * parse)
   gst_caps_unref (caps);
 
   outbuf = GST_BUFFER_CAST (parse->streamheader->data);
-  packet.packet = GST_BUFFER_DATA (outbuf);
-  packet.bytes = GST_BUFFER_SIZE (outbuf);
+  packet.packet = gst_buffer_map (outbuf, &size, NULL, GST_MAP_READ);
+  packet.bytes = size;
   packet.granulepos = GST_BUFFER_OFFSET_END (outbuf);
   packet.packetno = 1;
   packet.e_o_s = 0;
   packet.b_o_s = 1;
   vorbis_synthesis_headerin (&parse->vi, &parse->vc, &packet);
+  gst_buffer_unmap (outbuf, packet.packet, size);
   parse->sample_rate = parse->vi.rate;
   outbuf1 = outbuf;
 
   outbuf = GST_BUFFER_CAST (parse->streamheader->next->data);
-  packet.packet = GST_BUFFER_DATA (outbuf);
-  packet.bytes = GST_BUFFER_SIZE (outbuf);
+  packet.packet = gst_buffer_map (outbuf, &size, NULL, GST_MAP_READ);
+  packet.bytes = size;
   packet.granulepos = GST_BUFFER_OFFSET_END (outbuf);
   packet.packetno = 2;
   packet.e_o_s = 0;
   packet.b_o_s = 0;
   vorbis_synthesis_headerin (&parse->vi, &parse->vc, &packet);
+  gst_buffer_unmap (outbuf, packet.packet, size);
   outbuf2 = outbuf;
 
   outbuf = GST_BUFFER_CAST (parse->streamheader->next->next->data);
-  packet.packet = GST_BUFFER_DATA (outbuf);
-  packet.bytes = GST_BUFFER_SIZE (outbuf);
+  packet.packet = gst_buffer_map (outbuf, &size, NULL, GST_MAP_READ);
+  packet.bytes = size;
   packet.granulepos = GST_BUFFER_OFFSET_END (outbuf);
   packet.packetno = 3;
   packet.e_o_s = 0;
   packet.b_o_s = 0;
   vorbis_synthesis_headerin (&parse->vi, &parse->vc, &packet);
+  gst_buffer_unmap (outbuf, packet.packet, size);
   outbuf3 = outbuf;
 
   /* first process queued events */
   vorbis_parse_drain_event_queue (parse);
 
   /* push out buffers, ignoring return value... */
-  outbuf1 = gst_buffer_make_metadata_writable (outbuf1);
+  outbuf1 = gst_buffer_make_writable (outbuf1);
   gst_buffer_set_caps (outbuf1, GST_PAD_CAPS (parse->srcpad));
   gst_pad_push (parse->srcpad, outbuf1);
-  outbuf2 = gst_buffer_make_metadata_writable (outbuf2);
+  outbuf2 = gst_buffer_make_writable (outbuf2);
   gst_buffer_set_caps (outbuf2, GST_PAD_CAPS (parse->srcpad));
   gst_pad_push (parse->srcpad, outbuf2);
-  outbuf3 = gst_buffer_make_metadata_writable (outbuf3);
+  outbuf3 = gst_buffer_make_writable (outbuf3);
   gst_buffer_set_caps (outbuf3, GST_PAD_CAPS (parse->srcpad));
   gst_pad_push (parse->srcpad, outbuf3);
 
@@ -358,16 +362,18 @@ vorbis_parse_queue_buffer (GstVorbisParse * parse, GstBuffer * buf)
   GstFlowReturn ret = GST_FLOW_OK;
   long blocksize;
   ogg_packet packet;
+  gsize size;
 
-  buf = gst_buffer_make_metadata_writable (buf);
+  buf = gst_buffer_make_writable (buf);
 
-  packet.packet = GST_BUFFER_DATA (buf);
-  packet.bytes = GST_BUFFER_SIZE (buf);
+  packet.packet = gst_buffer_map (buf, &size, NULL, GST_MAP_READ);
+  packet.bytes = size;
   packet.granulepos = GST_BUFFER_OFFSET_END (buf);
   packet.packetno = parse->packetno + parse->buffer_queue->length;
   packet.e_o_s = 0;
 
   blocksize = vorbis_packet_blocksize (&parse->vi, &packet);
+  gst_buffer_unmap (buf, packet.packet, size);
 
   /* temporarily store the sample count in OFFSET -- we overwrite this later */
 
@@ -391,19 +397,18 @@ vorbis_parse_parse_packet (GstVorbisParse * parse, GstBuffer * buf)
 {
   GstFlowReturn ret;
   guint8 *data;
-  guint size;
+  gsize size;
   gboolean have_header;
 
-  data = GST_BUFFER_DATA (buf);
-  size = GST_BUFFER_SIZE (buf);
-
   parse->packetno++;
 
   have_header = FALSE;
+  data = gst_buffer_map (buf, &size, NULL, GST_MAP_READ);
   if (size >= 1) {
     if (data[0] >= 0x01 && data[0] <= 0x05)
       have_header = TRUE;
   }
+  gst_buffer_unmap (buf, data, size);
 
   if (have_header) {
     if (!parse->streamheader_sent) {
index 8a2db41..0553f6a 100644 (file)
@@ -111,9 +111,17 @@ gst_vorbis_tag_parse_packet (GstVorbisParse * parse, GstBuffer * buffer)
   GstVorbisTag *tagger;
   gchar *encoder = NULL;
   GstBuffer *new_buf;
+  guint8 *data;
+  gsize size;
+  gboolean do_parse = FALSE;
 
+  data = gst_buffer_map (buffer, &size, NULL, GST_MAP_READ);
   /* just pass everything except the comments packet */
-  if (GST_BUFFER_SIZE (buffer) >= 1 && GST_BUFFER_DATA (buffer)[0] != 0x03) {
+  if (size >= 1 && data[0] != 0x03)
+    do_parse = TRUE;
+  gst_buffer_unmap (buffer, data, size);
+
+  if (do_parse) {
     return GST_VORBIS_PARSE_CLASS (parent_class)->parse_packet (parse, buffer);
   }
 
@@ -132,7 +140,7 @@ gst_vorbis_tag_parse_packet (GstVorbisParse * parse, GstBuffer * buffer)
   new_buf =
       gst_tag_list_to_vorbiscomment_buffer (new_tags, (guint8 *) "\003vorbis",
       7, encoder);
-  gst_buffer_copy_metadata (new_buf, buffer, GST_BUFFER_COPY_TIMESTAMPS);
+  gst_buffer_copy_into (new_buf, buffer, GST_BUFFER_COPY_TIMESTAMPS, 0, -1);
 
   gst_tag_list_free (new_tags);
   g_free (encoder);
index 00d2d0f..bcadc1b 100644 (file)
@@ -249,7 +249,9 @@ print_tag_each (GQuark field_id, const GValue * value, gpointer user_data)
     ser = g_value_dup_string (value);
   else if (GST_VALUE_HOLDS_BUFFER (value)) {
     GstBuffer *buf = gst_value_get_buffer (value);
-    ser = g_strdup_printf ("<GstBuffer [%d bytes]>", GST_BUFFER_SIZE (buf));
+    ser =
+        g_strdup_printf ("<GstBuffer [%" G_GSIZE_FORMAT " bytes]>",
+        gst_buffer_get_size (buf));
   } else
     ser = gst_value_serialize (value);