plugins: more porting
This commit is contained in:
parent
eba165191f
commit
04f74e5642
@ -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)));
|
||||||
|
|
||||||
|
@ -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)
|
||||||
{
|
{
|
||||||
|
@ -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);
|
||||||
|
|
||||||
|
@ -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) {
|
||||||
|
@ -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);
|
||||||
|
@ -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);
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user