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;
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)));

View 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)
{

View 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);

View 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) {

View 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);

View 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);