mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2025-04-14 03:54:11 +00:00
plugins: more porting
This commit is contained in:
parent
eba165191f
commit
04f74e5642
6 changed files with 94 additions and 50 deletions
|
@ -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)));
|
||||
|
||||
|
|
|
@ -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)
|
||||
{
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
Loading…
Reference in a new issue