From 04f74e5642975832b9b5c04460a05760df4b5bb4 Mon Sep 17 00:00:00 2001 From: Wim Taymans Date: Mon, 28 Mar 2011 10:20:06 +0200 Subject: [PATCH] plugins: more porting --- ext/vorbis/gstvorbisdec.c | 25 ++++++++++++++----------- ext/vorbis/gstvorbisdeclib.h | 31 +++++++++++++++++++++++++------ ext/vorbis/gstvorbisenc.c | 35 +++++++++++++++++++++-------------- ext/vorbis/gstvorbisparse.c | 37 +++++++++++++++++++++---------------- ext/vorbis/gstvorbistag.c | 12 ++++++++++-- tools/gst-discoverer.c | 4 +++- 6 files changed, 94 insertions(+), 50 deletions(-) diff --git a/ext/vorbis/gstvorbisdec.c b/ext/vorbis/gstvorbisdec.c index 33f4184..95a0f95 100644 --- a/ext/vorbis/gstvorbisdec.c +++ b/ext/vorbis/gstvorbisdec.c @@ -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))); diff --git a/ext/vorbis/gstvorbisdeclib.h b/ext/vorbis/gstvorbisdeclib.h index c82f0c8..23e291d 100644 --- a/ext/vorbis/gstvorbisdeclib.h +++ b/ext/vorbis/gstvorbisdeclib.h @@ -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) { diff --git a/ext/vorbis/gstvorbisenc.c b/ext/vorbis/gstvorbisenc.c index 9cdf484..0fb3de7 100644 --- a/ext/vorbis/gstvorbisenc.c +++ b/ext/vorbis/gstvorbisenc.c @@ -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); diff --git a/ext/vorbis/gstvorbisparse.c b/ext/vorbis/gstvorbisparse.c index 53fd7b1..99f1d2e 100644 --- a/ext/vorbis/gstvorbisparse.c +++ b/ext/vorbis/gstvorbisparse.c @@ -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) { diff --git a/ext/vorbis/gstvorbistag.c b/ext/vorbis/gstvorbistag.c index 8a2db41..0553f6a 100644 --- a/ext/vorbis/gstvorbistag.c +++ b/ext/vorbis/gstvorbistag.c @@ -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); diff --git a/tools/gst-discoverer.c b/tools/gst-discoverer.c index 00d2d0f..bcadc1b 100644 --- a/tools/gst-discoverer.c +++ b/tools/gst-discoverer.c @@ -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 ("", GST_BUFFER_SIZE (buf)); + ser = + g_strdup_printf ("", + gst_buffer_get_size (buf)); } else ser = gst_value_serialize (value); -- 2.7.4