}
static void
- create_header_packet (ogg_packet * packet, GstOggPadData * pad)
+ gst_ogg_mux_create_header_packet_with_flags (ogg_packet * packet,
- GstBuffer * buf, gboolean bos, gboolean eos)
++ gboolean bos, gboolean eos)
{
- packet->packet = GST_BUFFER_DATA (buf);
- packet->bytes = GST_BUFFER_SIZE (buf);
packet->granulepos = 0;
/* mark BOS and packet number */
- packet->b_o_s = (pad->packetno == 0);
- packet->packetno = pad->packetno++;
+ packet->b_o_s = bos;
/* mark EOS */
- packet->e_o_s = 0;
+ packet->e_o_s = eos;
+ }
+
+ static void
-gst_ogg_mux_create_header_packet (ogg_packet * packet, GstBuffer * buf,
- GstOggPadData * pad)
++gst_ogg_mux_create_header_packet (ogg_packet * packet, GstOggPadData * pad)
+ {
- gst_ogg_mux_create_header_packet_with_flags (packet, buf, pad->packetno == 0,
- 0);
++ gst_ogg_mux_create_header_packet_with_flags (packet, pad->packetno == 0, 0);
+ packet->packetno = pad->packetno++;
+ }
+
+ static void
+ gst_ogg_mux_submit_skeleton_header_packet (GstOggMux * mux,
+ ogg_stream_state * os, GstBuffer * buf, gboolean bos, gboolean eos)
+ {
+ ogg_packet packet;
- gst_ogg_mux_create_header_packet_with_flags (&packet, buf, bos, eos);
++ gsize size;
++
++ packet.packet = gst_buffer_map (buf, &size, NULL, GST_MAP_READ);
++ packet.bytes = size;
++ gst_ogg_mux_create_header_packet_with_flags (&packet, bos, eos);
+ ogg_stream_packetin (os, &packet);
+ gst_buffer_unref (buf);
+ }
+
+ static void
+ gst_ogg_mux_make_fishead (GstOggMux * mux, ogg_stream_state * os)
+ {
+ GstByteWriter bw;
+ GstBuffer *fishead;
+
+ GST_DEBUG_OBJECT (mux, "Creating fishead");
+
- fishead = gst_buffer_new_and_alloc (64);
- gst_byte_writer_init_with_buffer (&bw, fishead, TRUE);
++ gst_byte_writer_init_with_size (&bw, 64, TRUE);
+ gst_byte_writer_put_string_utf8 (&bw, "fishead");
+ gst_byte_writer_put_int16_le (&bw, 3); /* version major */
+ gst_byte_writer_put_int16_le (&bw, 0); /* version minor */
+ gst_byte_writer_put_int64_le (&bw, 0); /* presentation time numerator */
+ gst_byte_writer_put_int64_le (&bw, 1000); /* ...and denominator */
+ gst_byte_writer_put_int64_le (&bw, 0); /* base time numerator */
+ gst_byte_writer_put_int64_le (&bw, 1000); /* ...and denominator */
+ gst_byte_writer_fill (&bw, ' ', 20); /* UTC time */
- g_assert (gst_byte_writer_get_pos (&bw) == GST_BUFFER_SIZE (fishead));
++ g_assert (gst_byte_writer_get_pos (&bw) == 64);
++ fishead = gst_byte_writer_reset_and_get_buffer (&bw);
+ gst_ogg_mux_submit_skeleton_header_packet (mux, os, fishead, 1, 0);
+ }
+
+ static void
+ gst_ogg_mux_byte_writer_put_string_utf8 (GstByteWriter * bw, const char *s)
+ {
+ gst_byte_writer_put_data (bw, (const guint8 *) s, strlen (s));
+ }
+
+ static void
+ gst_ogg_mux_make_fisbone (GstOggMux * mux, ogg_stream_state * os,
+ GstOggPadData * pad)
+ {
+ GstByteWriter bw;
+
+ GST_DEBUG_OBJECT (mux,
+ "Creating %s fisbone for serial %08x",
+ gst_ogg_stream_get_media_type (&pad->map), pad->map.serialno);
+
+ gst_byte_writer_init (&bw);
+ gst_byte_writer_put_string_utf8 (&bw, "fisbone");
+ gst_byte_writer_put_int32_le (&bw, 44); /* offset to message headers */
+ gst_byte_writer_put_uint32_le (&bw, pad->map.serialno);
+ gst_byte_writer_put_uint32_le (&bw, pad->map.n_header_packets);
+ gst_byte_writer_put_uint64_le (&bw, pad->map.granulerate_n);
+ gst_byte_writer_put_uint64_le (&bw, pad->map.granulerate_d);
+ gst_byte_writer_put_uint64_le (&bw, 0); /* base granule */
+ gst_byte_writer_put_uint32_le (&bw, pad->map.preroll);
+ gst_byte_writer_put_uint8 (&bw, pad->map.granuleshift);
+ gst_byte_writer_fill (&bw, 0, 3); /* padding */
+ /* message header fields - MIME type for now */
+ gst_ogg_mux_byte_writer_put_string_utf8 (&bw, "Content-Type: ");
+ gst_ogg_mux_byte_writer_put_string_utf8 (&bw,
+ gst_ogg_stream_get_media_type (&pad->map));
+ gst_ogg_mux_byte_writer_put_string_utf8 (&bw, "\r\n");
+
+ gst_ogg_mux_submit_skeleton_header_packet (mux, os,
+ gst_byte_writer_reset_and_get_buffer (&bw), 0, 0);
+ }
+
+ static void
+ gst_ogg_mux_make_fistail (GstOggMux * mux, ogg_stream_state * os)
+ {
+ GST_DEBUG_OBJECT (mux, "Creating fistail");
+
+ gst_ogg_mux_submit_skeleton_header_packet (mux, os,
+ gst_buffer_new_and_alloc (0), 0, 1);
}
/*
}
/* create a packet from the buffer */
- gst_ogg_mux_create_header_packet (&packet, buf, pad);
+ packet.packet = gst_buffer_map (buf, &size, NULL, GST_MAP_READ);
+ packet.bytes = size;
+
- create_header_packet (&packet, pad);
++ gst_ogg_mux_create_header_packet (&packet, pad);
/* swap the packet in */
ogg_stream_packetin (&pad->map.stream, &packet);
hwalk = hwalk->next;
/* create a packet from the buffer */
- gst_ogg_mux_create_header_packet (&packet, buf, pad);
+ packet.packet = gst_buffer_map (buf, &size, NULL, GST_MAP_READ);
+ packet.bytes = size;
+
- create_header_packet (&packet, pad);
++ gst_ogg_mux_create_header_packet (&packet, pad);
/* swap the packet in */
ogg_stream_packetin (&pad->map.stream, &packet);
if (vorbisenc->expected_ts != GST_CLOCK_TIME_NONE &&
timestamp < vorbisenc->expected_ts) {
+ int threesample = GST_SECOND / vorbisenc->frequency * 3;
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));
+ /* Don't freak out on tiny jitters; use the same < 3 sample
+ tolerance as in the discontinuous detection */
+ if ((GstClockTimeDiff) (vorbisenc->expected_ts - timestamp) > threesample) {
- size = gst_buffer_get_size (buffer);
+ 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));
- diff_bytes =
- GST_CLOCK_TIME_TO_FRAMES (diff,
- vorbisenc->frequency) * vorbisenc->channels * sizeof (gfloat);
- if (diff_bytes >= size) {
- gst_buffer_unref (buffer);
- return GST_FLOW_OK;
++ 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_resize (buffer, diff_bytes, size - diff_bytes);
+
+ if (GST_BUFFER_DURATION_IS_VALID (buffer))
+ GST_BUFFER_DURATION (buffer) -= diff;
}
- buffer = gst_buffer_make_writable (buffer);
- gst_buffer_resize (buffer, diff_bytes, size - diff_bytes);
+ /* adjust the input timestamp in either case */
GST_BUFFER_TIMESTAMP (buffer) += diff;
- if (GST_BUFFER_DURATION_IS_VALID (buffer))
- GST_BUFFER_DURATION (buffer) -= diff;
}
if (gst_vorbis_enc_buffer_check_discontinuous (vorbisenc, timestamp,