plugins: more porting

This commit is contained in:
Wim Taymans 2011-03-28 10:20:06 +02:00
parent eba165191f
commit 04f74e5642
6 changed files with 94 additions and 50 deletions

View File

@ -629,16 +629,16 @@ vorbis_handle_comment_packet (GstVorbisDec * vd, ogg_packet * packet)
guint bitrate = 0; guint bitrate = 0;
gchar *encoder = NULL; gchar *encoder = NULL;
GstTagList *list, *old_list; GstTagList *list, *old_list;
GstBuffer *buf; guint8 *data;
gsize size;
GST_DEBUG_OBJECT (vd, "parsing comment packet"); GST_DEBUG_OBJECT (vd, "parsing comment packet");
buf = gst_buffer_new (); data = gst_ogg_packet_data (packet);
GST_BUFFER_DATA (buf) = gst_ogg_packet_data (packet); size = gst_ogg_packet_size (packet);
GST_BUFFER_SIZE (buf) = gst_ogg_packet_size (packet);
list = list =
gst_tag_list_from_vorbiscomment_buffer (buf, (guint8 *) "\003vorbis", 7, gst_tag_list_from_vorbiscomment (data, size, (guint8 *) "\003vorbis", 7,
&encoder); &encoder);
old_list = vd->taglist; old_list = vd->taglist;
@ -647,7 +647,6 @@ vorbis_handle_comment_packet (GstVorbisDec * vd, ogg_packet * packet)
if (old_list) if (old_list)
gst_tag_list_free (old_list); gst_tag_list_free (old_list);
gst_tag_list_free (list); gst_tag_list_free (list);
gst_buffer_unref (buf);
if (!vd->taglist) { if (!vd->taglist) {
GST_ERROR_OBJECT (vd, "couldn't decode comments"); GST_ERROR_OBJECT (vd, "couldn't decode comments");
@ -859,7 +858,8 @@ vorbis_handle_data_packet (GstVorbisDec * vd, ogg_packet * packet,
guint sample_count; guint sample_count;
GstBuffer *out = NULL; GstBuffer *out = NULL;
GstFlowReturn result; GstFlowReturn result;
gint size; guint8 *data;
gsize size;
if (G_UNLIKELY (!vd->initialized)) if (G_UNLIKELY (!vd->initialized))
goto not_initialized; goto not_initialized;
@ -899,11 +899,12 @@ vorbis_handle_data_packet (GstVorbisDec * vd, ogg_packet * packet,
goto wrong_samples; goto wrong_samples;
/* copy samples in buffer */ /* 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); sample_count, vd->vi.channels, vd->width);
GST_LOG_OBJECT (vd, "setting output size to %d", size); 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 */ /* this should not overflow */
if (duration == -1) if (duration == -1)
@ -961,7 +962,7 @@ vorbis_dec_decode_buffer (GstVorbisDec * vd, GstBuffer * buffer)
GstFlowReturn result = GST_FLOW_OK; GstFlowReturn result = GST_FLOW_OK;
/* make ogg_packet out of the buffer */ /* 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); packet = gst_ogg_packet_from_wrapper (&packet_wrapper);
/* set some more stuff */ /* set some more stuff */
packet->granulepos = -1; packet->granulepos = -1;
@ -997,6 +998,8 @@ vorbis_dec_decode_buffer (GstVorbisDec * vd, GstBuffer * buffer)
} }
done: done:
gst_ogg_packet_wrapper_unmap (&packet_wrapper, buffer);
return result; return result;
empty_buffer: empty_buffer:
@ -1153,7 +1156,7 @@ vorbis_dec_chain_reverse (GstVorbisDec * vd, gboolean discont, GstBuffer * buf)
if (G_LIKELY (buf)) { if (G_LIKELY (buf)) {
GST_DEBUG_OBJECT (vd, GST_DEBUG_OBJECT (vd,
"gathering buffer %p of size %u, time %" GST_TIME_FORMAT "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_TIMESTAMP (buf)),
GST_TIME_ARGS (GST_BUFFER_DURATION (buf))); GST_TIME_ARGS (GST_BUFFER_DURATION (buf)));

View File

@ -60,10 +60,18 @@ gst_ogg_packet_size (ogg_packet * p)
} }
static inline void 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); gsize size;
packet->bytes = GST_BUFFER_SIZE (buffer);
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 * static inline ogg_packet *
@ -121,14 +129,15 @@ gst_ogg_packet_size (ogg_packet * p)
} }
static inline void static inline void
gst_ogg_packet_wrapper_from_buffer (ogg_packet_wrapper * packet, gst_ogg_packet_wrapper_map (ogg_packet_wrapper * packet,
GstBuffer * buffer) GstBuffer * buffer)
{ {
ogg_reference *ref = &packet->ref; ogg_reference *ref = &packet->ref;
ogg_buffer *buf = &packet->buf; ogg_buffer *buf = &packet->buf;
gsize size;
buf->data = GST_BUFFER_DATA (buffer); buf->data = gst_buffer_map (buffer, &size, NULL, GST_MAP_READ);
buf->size = GST_BUFFER_SIZE (buffer); buf->size = size;
buf->refcount = 1; buf->refcount = 1;
buf->ptr.owner = NULL; buf->ptr.owner = NULL;
buf->ptr.next = NULL; buf->ptr.next = NULL;
@ -142,6 +151,16 @@ gst_ogg_packet_wrapper_from_buffer (ogg_packet_wrapper * packet,
packet->packet.bytes = ref->length; 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 * static inline ogg_packet *
gst_ogg_packet_from_wrapper (ogg_packet_wrapper * packet) gst_ogg_packet_from_wrapper (ogg_packet_wrapper * packet)
{ {

View File

@ -826,7 +826,7 @@ gst_vorbis_enc_buffer_from_packet (GstVorbisEnc * vorbisenc,
GstBuffer *outbuf; GstBuffer *outbuf;
outbuf = gst_buffer_new_and_alloc (packet->bytes); 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 /* see ext/ogg/README; OFFSET_END takes "our" granulepos, OFFSET its
* time representation */ * time representation */
GST_BUFFER_OFFSET_END (outbuf) = packet->granulepos + 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_buffer_set_caps (outbuf, vorbisenc->srccaps);
GST_LOG_OBJECT (vorbisenc, "encoded buffer of %d bytes", GST_LOG_OBJECT (vorbisenc, "encoded buffer of %d bytes",
GST_BUFFER_SIZE (outbuf)); gst_buffer_get_size (outbuf));
return outbuf; return outbuf;
} }
@ -864,7 +864,7 @@ gst_vorbis_enc_buffer_from_header_packet (GstVorbisEnc * vorbisenc,
GstBuffer *outbuf; GstBuffer *outbuf;
outbuf = gst_buffer_new_and_alloc (packet->bytes); 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 (outbuf) = vorbisenc->bytes_out;
GST_BUFFER_OFFSET_END (outbuf) = 0; GST_BUFFER_OFFSET_END (outbuf) = 0;
GST_BUFFER_TIMESTAMP (outbuf) = GST_CLOCK_TIME_NONE; 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_buffer_set_caps (outbuf, vorbisenc->srccaps);
GST_DEBUG ("created header packet buffer, %d bytes", GST_DEBUG ("created header packet buffer, %d bytes",
GST_BUFFER_SIZE (outbuf)); gst_buffer_get_size (outbuf));
return outbuf; return outbuf;
} }
@ -881,7 +881,7 @@ gst_vorbis_enc_buffer_from_header_packet (GstVorbisEnc * vorbisenc,
static GstFlowReturn static GstFlowReturn
gst_vorbis_enc_push_buffer (GstVorbisEnc * vorbisenc, GstBuffer * buffer) 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, GST_DEBUG_OBJECT (vorbisenc,
"Pushing buffer with GP %" G_GINT64_FORMAT ", ts %" GST_TIME_FORMAT, "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; GstVorbisEnc *vorbisenc;
GstFlowReturn ret = GST_FLOW_OK; GstFlowReturn ret = GST_FLOW_OK;
gfloat *data; gfloat *data, *ptr;
gulong size; gulong size;
gulong i, j; gulong i, j;
float **vorbis_buffer; float **vorbis_buffer;
@ -1046,6 +1046,7 @@ gst_vorbis_enc_chain (GstPad * pad, GstBuffer * buffer)
gboolean first = FALSE; gboolean first = FALSE;
GstClockTime timestamp = GST_CLOCK_TIME_NONE; GstClockTime timestamp = GST_CLOCK_TIME_NONE;
GstClockTime running_time = GST_CLOCK_TIME_NONE; GstClockTime running_time = GST_CLOCK_TIME_NONE;
gsize bsize;
vorbisenc = GST_VORBISENC (GST_PAD_PARENT (pad)); vorbisenc = GST_VORBISENC (GST_PAD_PARENT (pad));
@ -1137,22 +1138,24 @@ gst_vorbis_enc_chain (GstPad * pad, GstBuffer * buffer)
timestamp < vorbisenc->expected_ts) { timestamp < vorbisenc->expected_ts) {
guint64 diff = vorbisenc->expected_ts - timestamp; guint64 diff = vorbisenc->expected_ts - timestamp;
guint64 diff_bytes; guint64 diff_bytes;
gsize size;
GST_WARNING_OBJECT (vorbisenc, "Buffer is older than previous " GST_WARNING_OBJECT (vorbisenc, "Buffer is older than previous "
"timestamp + duration (%" GST_TIME_FORMAT "< %" GST_TIME_FORMAT "timestamp + duration (%" GST_TIME_FORMAT "< %" GST_TIME_FORMAT
"), cannot handle. Clipping buffer.", "), cannot handle. Clipping buffer.",
GST_TIME_ARGS (timestamp), GST_TIME_ARGS (vorbisenc->expected_ts)); GST_TIME_ARGS (timestamp), GST_TIME_ARGS (vorbisenc->expected_ts));
size = gst_buffer_get_size (buffer);
diff_bytes = diff_bytes =
GST_CLOCK_TIME_TO_FRAMES (diff, GST_CLOCK_TIME_TO_FRAMES (diff,
vorbisenc->frequency) * vorbisenc->channels * sizeof (gfloat); vorbisenc->frequency) * vorbisenc->channels * sizeof (gfloat);
if (diff_bytes >= GST_BUFFER_SIZE (buffer)) { if (diff_bytes >= size) {
gst_buffer_unref (buffer); gst_buffer_unref (buffer);
return GST_FLOW_OK; return GST_FLOW_OK;
} }
buffer = gst_buffer_make_metadata_writable (buffer); buffer = gst_buffer_make_writable (buffer);
GST_BUFFER_DATA (buffer) += diff_bytes; gst_buffer_trim (buffer, diff_bytes, size - diff_bytes);
GST_BUFFER_SIZE (buffer) -= diff_bytes;
GST_BUFFER_TIMESTAMP (buffer) += diff; GST_BUFFER_TIMESTAMP (buffer) += diff;
if (GST_BUFFER_DURATION_IS_VALID (buffer)) 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 */ /* 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); gst_buffer_unref (buffer);
return GST_FLOW_OK; return GST_FLOW_OK;
} }
/* data to encode */ /* data to encode */
data = (gfloat *) GST_BUFFER_DATA (buffer); size = bsize / (vorbisenc->channels * sizeof (float));
size = GST_BUFFER_SIZE (buffer) / (vorbisenc->channels * sizeof (float));
ptr = data;
/* expose the buffer to submit data */ /* expose the buffer to submit data */
vorbis_buffer = vorbis_analysis_buffer (&vorbisenc->vd, size); 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 */ /* deinterleave samples, write the buffer data */
for (i = 0; i < size; i++) { for (i = 0; i < size; i++) {
for (j = 0; j < vorbisenc->channels; j++) { 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 */ /* tell the library how much we actually submitted */
vorbis_analysis_wrote (&vorbisenc->vd, size); vorbis_analysis_wrote (&vorbisenc->vd, size);
gst_buffer_unmap (buffer, data, bsize);
GST_LOG_OBJECT (vorbisenc, "wrote %lu samples to vorbis", size); GST_LOG_OBJECT (vorbisenc, "wrote %lu samples to vorbis", size);

View File

@ -191,6 +191,7 @@ vorbis_parse_push_headers (GstVorbisParse * parse)
GstCaps *caps; GstCaps *caps;
GstBuffer *outbuf, *outbuf1, *outbuf2, *outbuf3; GstBuffer *outbuf, *outbuf1, *outbuf2, *outbuf3;
ogg_packet packet; ogg_packet packet;
gsize size;
/* get the headers into the caps, passing them to vorbis as we go */ /* get the headers into the caps, passing them to vorbis as we go */
caps = gst_caps_make_writable (gst_pad_get_caps (parse->srcpad)); 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); gst_caps_unref (caps);
outbuf = GST_BUFFER_CAST (parse->streamheader->data); outbuf = GST_BUFFER_CAST (parse->streamheader->data);
packet.packet = GST_BUFFER_DATA (outbuf); packet.packet = gst_buffer_map (outbuf, &size, NULL, GST_MAP_READ);
packet.bytes = GST_BUFFER_SIZE (outbuf); packet.bytes = size;
packet.granulepos = GST_BUFFER_OFFSET_END (outbuf); packet.granulepos = GST_BUFFER_OFFSET_END (outbuf);
packet.packetno = 1; packet.packetno = 1;
packet.e_o_s = 0; packet.e_o_s = 0;
packet.b_o_s = 1; packet.b_o_s = 1;
vorbis_synthesis_headerin (&parse->vi, &parse->vc, &packet); vorbis_synthesis_headerin (&parse->vi, &parse->vc, &packet);
gst_buffer_unmap (outbuf, packet.packet, size);
parse->sample_rate = parse->vi.rate; parse->sample_rate = parse->vi.rate;
outbuf1 = outbuf; outbuf1 = outbuf;
outbuf = GST_BUFFER_CAST (parse->streamheader->next->data); outbuf = GST_BUFFER_CAST (parse->streamheader->next->data);
packet.packet = GST_BUFFER_DATA (outbuf); packet.packet = gst_buffer_map (outbuf, &size, NULL, GST_MAP_READ);
packet.bytes = GST_BUFFER_SIZE (outbuf); packet.bytes = size;
packet.granulepos = GST_BUFFER_OFFSET_END (outbuf); packet.granulepos = GST_BUFFER_OFFSET_END (outbuf);
packet.packetno = 2; packet.packetno = 2;
packet.e_o_s = 0; packet.e_o_s = 0;
packet.b_o_s = 0; packet.b_o_s = 0;
vorbis_synthesis_headerin (&parse->vi, &parse->vc, &packet); vorbis_synthesis_headerin (&parse->vi, &parse->vc, &packet);
gst_buffer_unmap (outbuf, packet.packet, size);
outbuf2 = outbuf; outbuf2 = outbuf;
outbuf = GST_BUFFER_CAST (parse->streamheader->next->next->data); outbuf = GST_BUFFER_CAST (parse->streamheader->next->next->data);
packet.packet = GST_BUFFER_DATA (outbuf); packet.packet = gst_buffer_map (outbuf, &size, NULL, GST_MAP_READ);
packet.bytes = GST_BUFFER_SIZE (outbuf); packet.bytes = size;
packet.granulepos = GST_BUFFER_OFFSET_END (outbuf); packet.granulepos = GST_BUFFER_OFFSET_END (outbuf);
packet.packetno = 3; packet.packetno = 3;
packet.e_o_s = 0; packet.e_o_s = 0;
packet.b_o_s = 0; packet.b_o_s = 0;
vorbis_synthesis_headerin (&parse->vi, &parse->vc, &packet); vorbis_synthesis_headerin (&parse->vi, &parse->vc, &packet);
gst_buffer_unmap (outbuf, packet.packet, size);
outbuf3 = outbuf; outbuf3 = outbuf;
/* first process queued events */ /* first process queued events */
vorbis_parse_drain_event_queue (parse); vorbis_parse_drain_event_queue (parse);
/* push out buffers, ignoring return value... */ /* 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_buffer_set_caps (outbuf1, GST_PAD_CAPS (parse->srcpad));
gst_pad_push (parse->srcpad, outbuf1); 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_buffer_set_caps (outbuf2, GST_PAD_CAPS (parse->srcpad));
gst_pad_push (parse->srcpad, outbuf2); 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_buffer_set_caps (outbuf3, GST_PAD_CAPS (parse->srcpad));
gst_pad_push (parse->srcpad, outbuf3); gst_pad_push (parse->srcpad, outbuf3);
@ -358,16 +362,18 @@ vorbis_parse_queue_buffer (GstVorbisParse * parse, GstBuffer * buf)
GstFlowReturn ret = GST_FLOW_OK; GstFlowReturn ret = GST_FLOW_OK;
long blocksize; long blocksize;
ogg_packet packet; 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.packet = gst_buffer_map (buf, &size, NULL, GST_MAP_READ);
packet.bytes = GST_BUFFER_SIZE (buf); packet.bytes = size;
packet.granulepos = GST_BUFFER_OFFSET_END (buf); packet.granulepos = GST_BUFFER_OFFSET_END (buf);
packet.packetno = parse->packetno + parse->buffer_queue->length; packet.packetno = parse->packetno + parse->buffer_queue->length;
packet.e_o_s = 0; packet.e_o_s = 0;
blocksize = vorbis_packet_blocksize (&parse->vi, &packet); 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 */ /* 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; GstFlowReturn ret;
guint8 *data; guint8 *data;
guint size; gsize size;
gboolean have_header; gboolean have_header;
data = GST_BUFFER_DATA (buf);
size = GST_BUFFER_SIZE (buf);
parse->packetno++; parse->packetno++;
have_header = FALSE; have_header = FALSE;
data = gst_buffer_map (buf, &size, NULL, GST_MAP_READ);
if (size >= 1) { if (size >= 1) {
if (data[0] >= 0x01 && data[0] <= 0x05) if (data[0] >= 0x01 && data[0] <= 0x05)
have_header = TRUE; have_header = TRUE;
} }
gst_buffer_unmap (buf, data, size);
if (have_header) { if (have_header) {
if (!parse->streamheader_sent) { if (!parse->streamheader_sent) {

View File

@ -111,9 +111,17 @@ gst_vorbis_tag_parse_packet (GstVorbisParse * parse, GstBuffer * buffer)
GstVorbisTag *tagger; GstVorbisTag *tagger;
gchar *encoder = NULL; gchar *encoder = NULL;
GstBuffer *new_buf; 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 */ /* 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); 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 = new_buf =
gst_tag_list_to_vorbiscomment_buffer (new_tags, (guint8 *) "\003vorbis", gst_tag_list_to_vorbiscomment_buffer (new_tags, (guint8 *) "\003vorbis",
7, encoder); 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); gst_tag_list_free (new_tags);
g_free (encoder); g_free (encoder);

View File

@ -249,7 +249,9 @@ print_tag_each (GQuark field_id, const GValue * value, gpointer user_data)
ser = g_value_dup_string (value); ser = g_value_dup_string (value);
else if (GST_VALUE_HOLDS_BUFFER (value)) { else if (GST_VALUE_HOLDS_BUFFER (value)) {
GstBuffer *buf = gst_value_get_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 } else
ser = gst_value_serialize (value); ser = gst_value_serialize (value);