mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-11-27 12:11:13 +00:00
vorbisenc: push an updated segment stop time when we know it
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.
This commit is contained in:
parent
aa5b5b9085
commit
a16cd5d2a5
1 changed files with 21 additions and 0 deletions
|
@ -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
|
||||
|
|
Loading…
Reference in a new issue