]> git.sesse.net Git - vlc/commitdiff
x264: use libx264 with 0-started pts values and scale them back
authorIlkka Ollakka <ileoo@videolan.org>
Sun, 13 Jun 2010 12:23:23 +0000 (15:23 +0300)
committerIlkka Ollakka <ileoo@videolan.org>
Sun, 13 Jun 2010 20:34:37 +0000 (23:34 +0300)
I'm not really sure why libx264 sometimes gives negative dts even if
given pts values are >> 0. So until I see why, I think this way works better

modules/codec/x264.c

index ab3c62375bdb78fce50f60c51e26f03032adfed2..f96c22142dcf0d7208799ccb38c6f548c5124e07 100644 (file)
@@ -699,9 +699,9 @@ struct encoder_sys_t
     x264_t          *h;
     x264_param_t    param;
 
-    int64_t  i_initial_delay;
+    mtime_t         i_initial_delay;
 
-    char *psz_stat_name;
+    char            *psz_stat_name;
 };
 
 #ifdef PTW32_STATIC_LIB
@@ -1276,6 +1276,12 @@ static block_t *Encode( encoder_t *p_enc, picture_t *p_pict )
 #endif
     if( likely(p_pict) ) {
        pic.i_pts = p_pict->date;
+       /* scale pts starting from 0 as libx264 seems to return dts values
+          assume that
+        */
+       if( unlikely( p_sys->i_initial_delay == 0 ) )
+           p_sys->i_initial_delay = p_pict->date;
+       pic.i_pts -= p_sys->i_initial_delay;
        pic.img.i_csp = X264_CSP_I420;
        pic.img.i_plane = p_pict->i_planes;
        for( i = 0; i < p_pict->i_planes; i++ )
@@ -1322,16 +1328,7 @@ static block_t *Encode( encoder_t *p_enc, picture_t *p_pict )
         p_enc->fmt_in.video.i_frame_rate_base /
             p_enc->fmt_in.video.i_frame_rate;
 
-    /* libx264 gives pts/dts values from >= 83 onward,
-     * also pts starts from 0 so dts can be negative,
-     * but vlc doesn't handle if dts is < VLC_TS_0 so we
-     * use that offset to get it right for vlc.
-     */
-    if( p_sys->i_initial_delay == 0 && pic.i_dts < VLC_TS_0 )
-    {
-        p_sys->i_initial_delay = -1* pic.i_dts;
-        msg_Dbg( p_enc, "Initial delay is set to %d", p_sys->i_initial_delay );
-    }
+    /* scale pts-values back*/
     p_block->i_pts = pic.i_pts + p_sys->i_initial_delay;
     p_block->i_dts = pic.i_dts + p_sys->i_initial_delay;