Merge branch 'master' into 0.11
authorWim Taymans <wim.taymans@collabora.co.uk>
Wed, 24 Aug 2011 09:04:53 +0000 (11:04 +0200)
committerWim Taymans <wim.taymans@collabora.co.uk>
Wed, 24 Aug 2011 09:04:53 +0000 (11:04 +0200)
Conflicts:
ext/ogg/gstoggmux.c
ext/vorbis/gstvorbisenc.c

1  2 
ext/ogg/gstoggdemux.c
ext/ogg/gstoggmux.c
ext/ogg/gstoggstream.c
ext/vorbis/gstvorbisenc.c

Simple merge
@@@ -1075,14 -1130,103 +1084,103 @@@ gst_ogg_mux_set_header_on_caps (GstCap
  }
  
  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);
  }
  
  /*
@@@ -1166,10 -1310,7 +1265,10 @@@ gst_ogg_mux_send_headers (GstOggMux * m
      }
  
      /* 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);
Simple merge
@@@ -1119,30 -1135,36 +1119,38 @@@ gst_vorbis_enc_chain (GstPad * pad, Gst
  
    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,