]> git.sesse.net Git - vlc/commitdiff
Fix roundoff issues in i_length.
authorSteinar H. Gunderson <steinar+vlc@gunderson.no>
Fri, 1 Oct 2010 22:06:00 +0000 (00:06 +0200)
committerSteinar H. Gunderson <steinar+vlc@gunderson.no>
Fri, 1 Oct 2010 22:08:45 +0000 (00:08 +0200)
modules/codec/lpcm.c

index 73b90780963d8fed23c889c48ba98d7eac7b6080..2d5c6126f5b2a90bf0286277a1143ad836165053 100644 (file)
@@ -559,9 +559,14 @@ static block_t *EncodeFrames( encoder_t *p_enc, aout_buffer_t *p_aout_buf )
         p_sys->i_buffer_used = 0;
         i_bytes_consumed += i_consume_bytes;
 
-        p_block->i_dts = p_block->i_pts = p_aout_buf->i_pts +
+        /* We need to find i_length by means of next_pts due to possible roundoff errors. */
+        mtime_t this_pts = p_aout_buf->i_pts +
             (i * p_sys->i_frame_samples + i_start_offset) * CLOCK_FREQ / p_sys->i_rate;
-        p_block->i_length = p_sys->i_frame_samples * CLOCK_FREQ / p_sys->i_rate;
+        mtime_t next_pts = p_aout_buf->i_pts +
+            ((i + 1) * p_sys->i_frame_samples + i_start_offset) * CLOCK_FREQ / p_sys->i_rate;
+
+        p_block->i_pts = p_block->i_dts = this_pts;
+        p_block->i_length = next_pts - this_pts;
 
         if( !p_first_block )
             p_first_block = p_last_block = p_block;