vorbisenc: push an updated segment stop time when we know it
authorVincent Penquerc'h <vincent.penquerch@collabora.co.uk>
Thu, 5 Jun 2014 13:50:15 +0000 (14:50 +0100)
committerVincent Penquerc'h <vincent.penquerch@collabora.co.uk>
Thu, 30 Oct 2014 14:28:39 +0000 (14:28 +0000)
When encoding, libvorbis will tell us how many samples are encoded
in the buffer it returns. This number may be less than the maximum
of samples in the block, if this is the last packet. In we have no
segment end time, we set it to the end time of that last sample to
tell downstream that the buffer contains less samples.

ext/vorbis/gstvorbisenc.c

index cdb9273..8dec477 100644 (file)
@@ -800,6 +800,27 @@ gst_vorbis_enc_output_buffers (GstVorbisEnc * vorbisenc)
     while (vorbis_bitrate_flushpacket (&vorbisenc->vd, &op)) {
       GstBuffer *buf;
 
+      if (op.e_o_s) {
+        GstAudioEncoder *enc = GST_AUDIO_ENCODER (vorbisenc);
+        GstClockTime duration;
+
+        GST_DEBUG_OBJECT (vorbisenc, "Got EOS packet from libvorbis");
+        GST_AUDIO_ENCODER_STREAM_LOCK (enc);
+        if (!GST_CLOCK_TIME_IS_VALID (enc->output_segment.stop)) {
+          GST_DEBUG_OBJECT (vorbisenc,
+              "Output segment has no end time, setting");
+          duration =
+              gst_util_uint64_scale (op.granulepos, GST_SECOND,
+              vorbisenc->frequency);
+          enc->output_segment.stop = enc->output_segment.start + duration;
+          GST_DEBUG_OBJECT (enc, "new output segment %" GST_SEGMENT_FORMAT,
+              &enc->output_segment);
+          gst_pad_push_event (GST_AUDIO_ENCODER_SRC_PAD (enc),
+              gst_event_new_segment (&enc->output_segment));
+        }
+        GST_AUDIO_ENCODER_STREAM_UNLOCK (enc);
+      }
+
       GST_LOG_OBJECT (vorbisenc, "pushing out a data packet");
       buf =
           gst_audio_encoder_allocate_output_buffer (GST_AUDIO_ENCODER